From c5324817a2484fbeaf5220753567b3b9d7f3e0cd Mon Sep 17 00:00:00 2001 From: "venbatechnologies@gmail.com" Date: Fri, 24 Nov 2017 15:54:47 +0530 Subject: [PATCH] dompdf added and profile pic changed in pdf --- application/controllers/companycontroller.php | 5 +- application/controllers/payslip.php | 7 +- application/models/payroll_model.php | 8 + application/third_party/dompdf/LICENSE.LGPL | 456 + application/third_party/dompdf/dompdf.php | 328 + .../dompdf/dompdf_config.custom.inc.php | 24 + .../third_party/dompdf/dompdf_config.inc.php | 497 ++ .../include/absolute_positioner.cls.php | 85 + .../dompdf/include/abstract_renderer.cls.php | 890 ++ .../include/attribute_translator.cls.php | 481 ++ .../include/block_frame_decorator.cls.php | 354 + .../include/block_frame_reflower.cls.php | 756 ++ .../dompdf/include/block_positioner.cls.php | 86 + .../dompdf/include/block_renderer.cls.php | 211 + .../include/cached_pdf_decorator.cls.php | 186 + .../third_party/dompdf/include/canvas.cls.php | 328 + .../dompdf/include/canvas_factory.cls.php | 83 + .../dompdf/include/cellmap.cls.php | 730 ++ .../dompdf/include/cpdf_adapter.cls.php | 919 ++ .../dompdf/include/css_color.cls.php | 287 + .../third_party/dompdf/include/dompdf.cls.php | 792 ++ .../dompdf/include/dompdf_exception.cls.php | 60 + .../include/dompdf_internal_exception.cls.php | 59 + .../third_party/dompdf/include/file.skel | 40 + .../dompdf/include/fixed_positioner.cls.php | 117 + .../dompdf/include/font_metrics.cls.php | 299 + .../third_party/dompdf/include/frame.cls.php | 990 +++ .../dompdf/include/frame_decorator.cls.php | 483 ++ .../dompdf/include/frame_factory.cls.php | 207 + .../dompdf/include/frame_reflower.cls.php | 414 + .../dompdf/include/frame_tree.cls.php | 230 + .../dompdf/include/functions.inc.php | 942 +++ .../dompdf/include/gd_adapter.cls.php | 840 ++ .../dompdf/include/image_cache.cls.php | 231 + .../include/image_frame_decorator.cls.php | 116 + .../include/image_frame_reflower.cls.php | 162 + .../dompdf/include/image_renderer.cls.php | 95 + .../include/inline_frame_decorator.cls.php | 112 + .../include/inline_frame_reflower.cls.php | 99 + .../dompdf/include/inline_positioner.cls.php | 102 + .../dompdf/include/inline_renderer.cls.php | 207 + .../include/javascript_embedder.cls.php | 68 + .../list_bullet_frame_decorator.cls.php | 96 + .../list_bullet_frame_reflower.cls.php | 66 + .../list_bullet_image_frame_decorator.cls.php | 188 + .../include/list_bullet_positioner.cls.php | 111 + .../include/list_bullet_renderer.cls.php | 200 + .../include/null_frame_decorator.cls.php | 59 + .../include/null_frame_reflower.cls.php | 54 + .../dompdf/include/null_positioner.cls.php | 56 + .../dompdf/include/page_cache.cls.php | 159 + .../include/page_frame_decorator.cls.php | 583 ++ .../include/page_frame_reflower.cls.php | 245 + .../dompdf/include/pdflib_adapter.cls.php | 1053 +++ .../dompdf/include/php_evaluator.cls.php | 76 + .../dompdf/include/positioner.cls.php | 71 + .../dompdf/include/renderer.cls.php | 293 + .../third_party/dompdf/include/style.cls.php | 2149 +++++ .../dompdf/include/stylesheet.cls.php | 1202 +++ .../table_cell_frame_decorator.cls.php | 135 + .../include/table_cell_frame_reflower.cls.php | 147 + .../include/table_cell_positioner.cls.php | 61 + .../include/table_cell_renderer.cls.php | 185 + .../include/table_frame_decorator.cls.php | 342 + .../include/table_frame_reflower.cls.php | 574 ++ .../include/table_row_frame_decorator.cls.php | 81 + .../include/table_row_frame_reflower.cls.php | 94 + .../table_row_group_frame_decorator.cls.php | 96 + .../table_row_group_frame_reflower.cls.php | 92 + .../include/table_row_positioner.cls.php | 68 + .../dompdf/include/tcpdf_adapter.cls.php | 498 ++ .../include/text_frame_decorator.cls.php | 204 + .../include/text_frame_reflower.cls.php | 440 + .../dompdf/include/text_renderer.cls.php | 182 + .../dompdf/include/ttf_info.cls.php | 306 + application/third_party/dompdf/index.php | 1 + .../third_party/dompdf/lib/class.pdf.php | 4897 +++++++++++ .../dompdf/lib/fonts/Courier-Bold.afm | 344 + .../dompdf/lib/fonts/Courier-BoldOblique.afm | 344 + .../dompdf/lib/fonts/Courier-Oblique.afm | 344 + .../third_party/dompdf/lib/fonts/Courier.afm | 344 + .../dompdf/lib/fonts/Helvetica-Bold.afm | 2829 +++++++ .../dompdf/lib/fonts/Helvetica-Bold.afm.php | 570 ++ .../lib/fonts/Helvetica-BoldOblique.afm | 2829 +++++++ .../dompdf/lib/fonts/Helvetica-Oblique.afm | 3053 +++++++ .../dompdf/lib/fonts/Helvetica.afm | 3053 +++++++ .../dompdf/lib/fonts/Helvetica.afm.php | 570 ++ .../third_party/dompdf/lib/fonts/Symbol.afm | 213 + .../dompdf/lib/fonts/Times-Bold.afm | 2590 ++++++ .../dompdf/lib/fonts/Times-Bold.afm.php | 570 ++ .../dompdf/lib/fonts/Times-BoldItalic.afm | 2386 ++++++ .../dompdf/lib/fonts/Times-BoldItalic.afm.php | 570 ++ .../dompdf/lib/fonts/Times-Italic.afm | 2669 ++++++ .../dompdf/lib/fonts/Times-Italic.afm.php | 570 ++ .../dompdf/lib/fonts/Times-Roman.afm | 2421 ++++++ .../dompdf/lib/fonts/Times-Roman.afm.php | 570 ++ .../dompdf/lib/fonts/ZapfDingbats.afm | 225 + .../fonts/dompdf_font_family_cache.dist.php | 92 + .../third_party/dompdf/lib/fonts/log.htm | 1 + .../dompdf/lib/fonts/mustRead.html | 17 + .../dompdf/lib/res/broken_image.png | Bin 0 -> 267 bytes .../third_party/dompdf/lib/res/html.css | 427 + .../third_party/dompdf/lib/ttf2ufm/README.TXT | 24 + .../dompdf/lib/ttf2ufm/bin/ttf2ufm.exe | Bin 0 -> 355187 bytes .../dompdf/lib/ttf2ufm/src/CHANGES | 0 .../dompdf/lib/ttf2ufm/src/CHANGES.html | 815 ++ .../dompdf/lib/ttf2ufm/src/COPYRIGHT | 87 + .../third_party/dompdf/lib/ttf2ufm/src/FONTS | 462 ++ .../dompdf/lib/ttf2ufm/src/FONTS.hpux | 107 + .../dompdf/lib/ttf2ufm/src/FONTS.hpux.html | 197 + .../dompdf/lib/ttf2ufm/src/FONTS.html | 708 ++ .../dompdf/lib/ttf2ufm/src/Makefile | 279 + .../third_party/dompdf/lib/ttf2ufm/src/README | 814 ++ .../dompdf/lib/ttf2ufm/src/README.FIRST | 4 + .../dompdf/lib/ttf2ufm/src/README.html | 1182 +++ .../dompdf/lib/ttf2ufm/src/app/RPM/Makefile | 279 + .../lib/ttf2ufm/src/app/RPM/ttf2pt1.spec | 40 + .../lib/ttf2ufm/src/app/RPM/ttf2pt1.spec.src | 40 + .../dompdf/lib/ttf2ufm/src/app/TeX/README | 51 + .../lib/ttf2ufm/src/app/TeX/README.html | 80 + .../lib/ttf2ufm/src/app/TeX/cjk-latex-config | 352 + .../ttf2ufm/src/app/TeX/cjk-latex-t1mapgen | 60 + .../dompdf/lib/ttf2ufm/src/app/TeX/sfd2map | 68 + .../dompdf/lib/ttf2ufm/src/app/X11/README | 24 + .../lib/ttf2ufm/src/app/X11/README.html | 41 + .../lib/ttf2ufm/src/app/X11/t1-xf86.334.patch | 199 + .../lib/ttf2ufm/src/app/X11/t1-xf86.39.patch | 252 + .../lib/ttf2ufm/src/app/netscape/Makefile | 5 + .../lib/ttf2ufm/src/app/netscape/README | 180 + .../lib/ttf2ufm/src/app/netscape/README.html | 242 + .../lib/ttf2ufm/src/app/netscape/fontsz.cf | 8 + .../lib/ttf2ufm/src/app/netscape/notscape | 25 + .../lib/ttf2ufm/src/app/netscape/nsfilter | 24 + .../lib/ttf2ufm/src/app/netscape/nsfix.c | 469 ++ .../dompdf/lib/ttf2ufm/src/app/netscape/nspr | 26 + .../lib/ttf2ufm/src/app/netscape/nsprint | 10 + .../lib/ttf2ufm/src/app/netscape/psfonts.cf | 11 + .../third_party/dompdf/lib/ttf2ufm/src/bdf.c | 661 ++ .../dompdf/lib/ttf2ufm/src/bitmap.c | 2633 ++++++ .../dompdf/lib/ttf2ufm/src/byteorder.h | 24 + .../dompdf/lib/ttf2ufm/src/cygbuild.sh | 8 + .../dompdf/lib/ttf2ufm/src/encodings/README | 47 + .../lib/ttf2ufm/src/encodings/README.html | 81 + .../src/encodings/adobestd/adobe-std.tbl | 0 .../ttf2ufm/src/encodings/bulgarian/README | 3 + .../src/encodings/bulgarian/encodings.alias | 4 + .../src/encodings/bulgarian/ibm-1251.tbl | 127 + .../src/encodings/bulgarian/ibm-866.tbl | 128 + .../src/encodings/bulgarian/iso8859-5.tbl | 127 + .../src/encodings/bulgarian/koi8-r.tbl | 128 + .../src/encodings/cyrillic/encodings.alias | 4 + .../src/encodings/cyrillic/ibm-1251.tbl | 127 + .../src/encodings/cyrillic/ibm-866.tbl | 128 + .../src/encodings/cyrillic/iso8859-5.tbl | 127 + .../ttf2ufm/src/encodings/cyrillic/koi8-r.tbl | 128 + .../src/encodings/latin1/iso8859-1.tbl | 0 .../src/encodings/latin2/iso8859-2.tbl | 0 .../ttf2ufm/src/encodings/latin4/iso8859-4 | 0 .../src/encodings/latin4/iso8859-4.tbl | 0 .../ttf2ufm/src/encodings/latin5/iso8859-9 | 0 .../lib/ttf2ufm/src/encodings/russian/README | 3 + .../src/encodings/russian/encodings.alias | 4 + .../src/encodings/russian/ibm-1251.tbl | 127 + .../ttf2ufm/src/encodings/russian/ibm-866.tbl | 128 + .../src/encodings/russian/iso8859-5.tbl | 127 + .../ttf2ufm/src/encodings/russian/koi8-r.tbl | 128 + .../third_party/dompdf/lib/ttf2ufm/src/ft.c | 649 ++ .../dompdf/lib/ttf2ufm/src/global.h | 173 + .../dompdf/lib/ttf2ufm/src/maps/CP1250.map | 254 + .../dompdf/lib/ttf2ufm/src/maps/CP1251.map | 245 + .../lib/ttf2ufm/src/maps/T2A_compact.map | 111 + .../src/maps/adobe-standard-encoding.map | 231 + .../dompdf/lib/ttf2ufm/src/maps/cubg5plus.map | 3184 +++++++ .../dompdf/lib/ttf2ufm/src/maps/cubig5.map | 1861 +++++ .../dompdf/lib/ttf2ufm/src/maps/cugb.map | 1181 +++ .../dompdf/lib/ttf2ufm/src/maps/cugbk.map | 3185 +++++++ .../dompdf/lib/ttf2ufm/src/maps/ubig5.map | 2184 +++++ .../dompdf/lib/ttf2ufm/src/maps/ugb.map | 1236 +++ .../dompdf/lib/ttf2ufm/src/maps/ugbk.map | 3295 ++++++++ .../lib/ttf2ufm/src/maps/unicode-sample.map | 158 + .../dompdf/lib/ttf2ufm/src/other/Makefile | 20 + .../dompdf/lib/ttf2ufm/src/other/README | 127 + .../dompdf/lib/ttf2ufm/src/other/README.html | 176 + .../dompdf/lib/ttf2ufm/src/other/bmpfont.h | 338 + .../dompdf/lib/ttf2ufm/src/other/bz.c | 78 + .../dompdf/lib/ttf2ufm/src/other/bzscreen.c | 220 + .../dompdf/lib/ttf2ufm/src/other/bzscreen.h | 40 + .../dompdf/lib/ttf2ufm/src/other/cmpf.c | 67 + .../dompdf/lib/ttf2ufm/src/other/cntstems.pl | 50 + .../dompdf/lib/ttf2ufm/src/other/dmpf.c | 53 + .../dompdf/lib/ttf2ufm/src/other/lst.pl | 65 + .../dompdf/lib/ttf2ufm/src/other/showdf | 58 + .../dompdf/lib/ttf2ufm/src/other/showg | 633 ++ .../third_party/dompdf/lib/ttf2ufm/src/pt1.c | 7390 +++++++++++++++++ .../third_party/dompdf/lib/ttf2ufm/src/pt1.h | 262 + .../dompdf/lib/ttf2ufm/src/runt1asm.c | 61 + .../dompdf/lib/ttf2ufm/src/scripts/convert | 367 + .../ttf2ufm/src/scripts/convert.cfg.sample | 192 + .../dompdf/lib/ttf2ufm/src/scripts/forceiso | 450 + .../dompdf/lib/ttf2ufm/src/scripts/frommap | 24 + .../dompdf/lib/ttf2ufm/src/scripts/html2man | 231 + .../dompdf/lib/ttf2ufm/src/scripts/inst_dir | 43 + .../dompdf/lib/ttf2ufm/src/scripts/inst_file | 17 + .../dompdf/lib/ttf2ufm/src/scripts/mkrel | 104 + .../dompdf/lib/ttf2ufm/src/scripts/t1fdir | 227 + .../dompdf/lib/ttf2ufm/src/scripts/trans | 164 + .../dompdf/lib/ttf2ufm/src/scripts/unhtml | 22 + .../dompdf/lib/ttf2ufm/src/scripts/x2gs | 118 + .../dompdf/lib/ttf2ufm/src/t1asm.c | 604 ++ .../third_party/dompdf/lib/ttf2ufm/src/ttf.c | 1502 ++++ .../third_party/dompdf/lib/ttf2ufm/src/ttf.h | 172 + .../dompdf/lib/ttf2ufm/src/ttf2pt1.1 | 822 ++ .../dompdf/lib/ttf2ufm/src/ttf2pt1.c | 2694 ++++++ .../dompdf/lib/ttf2ufm/src/ttf2pt1_convert.1 | 506 ++ .../dompdf/lib/ttf2ufm/src/ttf2pt1_x2gs.1 | 313 + .../dompdf/lib/ttf2ufm/src/ttf2ufm | Bin 0 -> 325617 bytes .../dompdf/lib/ttf2ufm/src/version.h | 7 + .../dompdf/lib/ttf2ufm/src/winbuild.bat | 11 + .../dompdf/lib/ttf2ufm/src/windows.h | 93 + application/third_party/dompdf/load_font.php | 227 + .../third_party/dompdf/www/controller.php | 15 + .../dompdf/www/cssSandpaper/css/reset.css | 71 + .../www/cssSandpaper/js/EventHelpers.js | 441 + .../dompdf/www/cssSandpaper/js/cssQuery-p.js | 6 + .../www/cssSandpaper/js/cssSandpaper.js | 2395 ++++++ .../cssSandpaper/js/jcoglan.com/sylvester.js | 1 + .../third_party/dompdf/www/debugger.php | 167 + application/third_party/dompdf/www/demo.php | 84 + .../third_party/dompdf/www/examples.php | 96 + application/third_party/dompdf/www/foot.inc | 10 + application/third_party/dompdf/www/head.inc | 37 + .../dompdf/www/images/arrow_01.gif | Bin 0 -> 237 bytes .../dompdf/www/images/arrow_02.gif | Bin 0 -> 227 bytes .../dompdf/www/images/arrow_03.gif | Bin 0 -> 232 bytes .../dompdf/www/images/arrow_04.gif | Bin 0 -> 251 bytes .../dompdf/www/images/arrow_05.gif | Bin 0 -> 241 bytes .../dompdf/www/images/arrow_06.gif | Bin 0 -> 268 bytes .../third_party/dompdf/www/images/css2.png | Bin 0 -> 392 bytes .../dompdf/www/images/dompdf_simple.png | Bin 0 -> 4861 bytes .../third_party/dompdf/www/images/favicon.ico | Bin 0 -> 1406 bytes .../third_party/dompdf/www/images/favicon.png | Bin 0 -> 308 bytes .../third_party/dompdf/www/images/h_bar.gif | Bin 0 -> 1350 bytes .../dompdf/www/images/left_arrow.gif | Bin 0 -> 276 bytes .../third_party/dompdf/www/images/logo.png | Bin 0 -> 2492 bytes .../third_party/dompdf/www/images/logo.xcf | Bin 0 -> 8524 bytes .../dompdf/www/images/php5-power-micro.png | Bin 0 -> 268 bytes .../dompdf/www/images/small_logo.png | Bin 0 -> 887 bytes .../third_party/dompdf/www/images/star_01.gif | Bin 0 -> 314 bytes .../third_party/dompdf/www/images/star_02.gif | Bin 0 -> 324 bytes .../third_party/dompdf/www/images/star_03.gif | Bin 0 -> 312 bytes .../third_party/dompdf/www/images/star_04.gif | Bin 0 -> 335 bytes .../third_party/dompdf/www/images/star_05.gif | Bin 0 -> 380 bytes .../third_party/dompdf/www/images/title.gif | Bin 0 -> 2992 bytes .../third_party/dompdf/www/images/v_bar.gif | Bin 0 -> 2607 bytes .../third_party/dompdf/www/images/xhtml10.png | Bin 0 -> 481 bytes application/third_party/dompdf/www/index.php | 28 + .../third_party/dompdf/www/jquery-1.4.2.js | 154 + application/third_party/dompdf/www/setup.php | 325 + application/third_party/dompdf/www/style.css | 251 + ...groundcolor_fontdecoration_pageborder.html | 139 + .../dompdf/www/test/css/common.css | 128 + .../dompdf/www/test/css/importabs.css | 2 + .../dompdf/www/test/css/importall.css | 2 + .../dompdf/www/test/css/importdisplay.css | 2 + .../dompdf/www/test/css/importprint.css | 2 + .../dompdf/www/test/css/importsub.css | 2 + .../dompdf/www/test/css/linkall.css | 2 + .../dompdf/www/test/css/linkdefault.css | 2 + .../dompdf/www/test/css/linkdisplay.css | 2 + .../dompdf/www/test/css/linkprint.css | 2 + .../dompdf/www/test/css/print_static.css | 701 ++ .../dompdf/www/test/css_2d_transforms.html | 87 + .../dompdf/www/test/css_baseline.html | 16 + .../dompdf/www/test/css_block_height.html | 14 + .../dompdf/www/test/css_border.html | 124 + .../dompdf/www/test/css_border_values.html | 41 + .../dompdf/www/test/css_color_cmyk.html | 51 + .../dompdf/www/test/css_content.html | 47 + .../dompdf/www/test/css_float.html | 55 + .../dompdf/www/test/css_font_selection.html | 116 + .../dompdf/www/test/css_important_flag.html | 54 + .../dompdf/www/test/css_letter_spacing.html | 102 + .../dompdf/www/test/css_line_height.html | 63 + .../dompdf/www/test/css_margin.html | 38 + .../dompdf/www/test/css_media.html | 150 + .../dompdf/www/test/css_multiple_class.html | 18 + .../dompdf/www/test/css_opacity.html | 107 + .../dompdf/www/test/css_outline.html | 77 + .../dompdf/www/test/css_overflow_hidden.html | 38 + .../dompdf/www/test/css_position_all.html | 379 + .../dompdf/www/test/css_position_fixed.html | 215 + .../dompdf/www/test/css_selectors.html | 53 + .../dompdf/www/test/css_table_height.html | 15 + .../dompdf/www/test/css_text_align.html | 61 + .../dompdf/www/test/css_z_index.html | 40 + .../third_party/dompdf/www/test/demo_01.html | 214 + .../dompdf/www/test/dom_anchor_link.html | 210 + .../third_party/dompdf/www/test/dom_br.html | 46 + .../dompdf/www/test/dom_large_table.html | 2198 +++++ .../dompdf/www/test/dom_long_table.php | 43 + .../third_party/dompdf/www/test/dom_nbsp.html | 6 + .../dompdf/www/test/dom_nested_table.html | 62 + .../third_party/dompdf/www/test/dom_ol.html | 148 + .../dompdf/www/test/dom_simple_ul.html | 39 + .../dompdf/www/test/dom_table.html | 106 + .../dompdf/www/test/dom_table_01.html | 24 + .../dompdf/www/test/dom_table_image.html | 19 + .../third_party/dompdf/www/test/dom_ul.html | 312 + .../dompdf/www/test/encoding_entities.html | 14 + .../dompdf/www/test/encoding_latin1.html | 1162 +++ .../dompdf/www/test/encoding_special.html | 570 ++ .../dompdf/www/test/encoding_symbols.html | 1400 ++++ .../dompdf/www/test/encoding_unicode.html | 8 + .../www/test/encoding_unicode_wrapping.html | 13 + .../dompdf/www/test/encoding_utf-8.html | 793 ++ .../dompdf/www/test/encoding_utf-8_w3.html | 220 + .../dompdf/www/test/image_background.html | 68 + .../dompdf/www/test/image_basic.html | 20 + .../dompdf/www/test/image_bmp.html | 130 + .../dompdf/www/test/image_datauri.html | 35 + .../dompdf/www/test/image_gif.html | 9 + .../dompdf/www/test/image_remote.html | 21 + .../www/test/image_transparent_gif.html | 23 + .../www/test/image_transparent_png.html | 189 + .../dompdf/www/test/image_variants.html | 149 + .../dompdf/www/test/images/bmp/test1.bmp | Bin 0 -> 1086 bytes .../dompdf/www/test/images/bmp/test1.png | Bin 0 -> 642 bytes .../dompdf/www/test/images/bmp/test16.bmp | Bin 0 -> 16438 bytes .../dompdf/www/test/images/bmp/test16.png | Bin 0 -> 717 bytes .../www/test/images/bmp/test16bf555.bmp | Bin 0 -> 16450 bytes .../www/test/images/bmp/test16bf555.png | Bin 0 -> 717 bytes .../www/test/images/bmp/test16bf565.bmp | Bin 0 -> 16450 bytes .../www/test/images/bmp/test16bf565.png | Bin 0 -> 790 bytes .../dompdf/www/test/images/bmp/test24.bmp | Bin 0 -> 24630 bytes .../dompdf/www/test/images/bmp/test24.png | Bin 0 -> 533 bytes .../dompdf/www/test/images/bmp/test32.bmp | Bin 0 -> 32566 bytes .../dompdf/www/test/images/bmp/test32.png | Bin 0 -> 533 bytes .../dompdf/www/test/images/bmp/test32bf.bmp | Bin 0 -> 32578 bytes .../dompdf/www/test/images/bmp/test32bf.png | Bin 0 -> 533 bytes .../dompdf/www/test/images/bmp/test32bfv4.bmp | Bin 0 -> 232874 bytes .../dompdf/www/test/images/bmp/test32bfv4.png | Bin 0 -> 126387 bytes .../dompdf/www/test/images/bmp/test32v5.bmp | Bin 0 -> 174858 bytes .../dompdf/www/test/images/bmp/test32v5.png | Bin 0 -> 115023 bytes .../dompdf/www/test/images/bmp/test4.bmp | Bin 0 -> 4214 bytes .../dompdf/www/test/images/bmp/test4.png | Bin 0 -> 472 bytes .../dompdf/www/test/images/bmp/test4os2v2.bmp | Bin 0 -> 3486 bytes .../dompdf/www/test/images/bmp/test4os2v2.png | Bin 0 -> 8711 bytes .../dompdf/www/test/images/bmp/test8.bmp | Bin 0 -> 9270 bytes .../dompdf/www/test/images/bmp/test8.png | Bin 0 -> 557 bytes .../dompdf/www/test/images/bmp/test8os2.bmp | Bin 0 -> 8986 bytes .../dompdf/www/test/images/bmp/test8os2.png | Bin 0 -> 557 bytes .../www/test/images/bmp/testcompress4.bmp | Bin 0 -> 922 bytes .../www/test/images/bmp/testcompress4.png | Bin 0 -> 472 bytes .../www/test/images/bmp/testcompress8.bmp | Bin 0 -> 1820 bytes .../www/test/images/bmp/testcompress8.png | Bin 0 -> 557 bytes .../dompdf/www/test/images/bmp/trans.bmp | Bin 0 -> 218606 bytes .../dompdf/www/test/images/bmp/trans.png | Bin 0 -> 9461 bytes .../dompdf/www/test/images/cmyk_test2.jpg | Bin 0 -> 607209 bytes .../dompdf/www/test/images/dokuwiki-128.png | Bin 0 -> 33615 bytes .../dompdf/www/test/images/dompdf_simple.png | Bin 0 -> 4739 bytes .../dompdf/www/test/images/goldengate.jpg | Bin 0 -> 21766 bytes .../dompdf/www/test/images/green.gif | Bin 0 -> 314 bytes .../dompdf/www/test/images/html.png | Bin 0 -> 748 bytes .../dompdf/www/test/images/pdf.png | Bin 0 -> 663 bytes .../dompdf/www/test/images/php.gif | Bin 0 -> 2523 bytes .../dompdf/www/test/images/png.png | Bin 0 -> 1001 bytes .../dompdf/www/test/images/png/gray16a.png | Bin 0 -> 256 bytes .../dompdf/www/test/images/png/gray16a_bk.png | Bin 0 -> 270 bytes .../dompdf/www/test/images/png/gray16b.png | Bin 0 -> 196 bytes .../dompdf/www/test/images/png/gray16b_bk.png | Bin 0 -> 210 bytes .../dompdf/www/test/images/png/gray8a.png | Bin 0 -> 187 bytes .../dompdf/www/test/images/png/gray8a_bk.png | Bin 0 -> 201 bytes .../dompdf/www/test/images/png/gray8b.png | Bin 0 -> 155 bytes .../dompdf/www/test/images/png/gray8b_bk.png | Bin 0 -> 169 bytes .../dompdf/www/test/images/png/pal.png | Bin 0 -> 1136 bytes .../dompdf/www/test/images/png/pal_bk.png | Bin 0 -> 1152 bytes .../www/test/images/png/pal_bk_notrns.png | Bin 0 -> 948 bytes .../dompdf/www/test/images/png/palb.png | Bin 0 -> 157 bytes .../www/test/images/png/result_16ns.gif | Bin 0 -> 2958 bytes .../www/test/images/png/result_1trns.gif | Bin 0 -> 2460 bytes .../dompdf/www/test/images/png/result_bla.gif | Bin 0 -> 2413 bytes .../www/test/images/png/result_dith.gif | Bin 0 -> 2065 bytes .../dompdf/www/test/images/png/result_gra.gif | Bin 0 -> 2821 bytes .../dompdf/www/test/images/png/result_mag.gif | Bin 0 -> 2978 bytes .../www/test/images/png/result_magthr1.gif | Bin 0 -> 3019 bytes .../dompdf/www/test/images/png/result_no.gif | Bin 0 -> 1410 bytes .../www/test/images/png/result_nsbug.gif | Bin 0 -> 1412 bytes .../dompdf/www/test/images/png/result_ok.gif | Bin 0 -> 3547 bytes .../www/test/images/png/result_oprbug.gif | Bin 0 -> 2427 bytes .../www/test/images/png/result_thr1.gif | Bin 0 -> 2490 bytes .../www/test/images/png/result_thr128.gif | Bin 0 -> 2036 bytes .../www/test/images/png/result_thr255.gif | Bin 0 -> 1574 bytes .../dompdf/www/test/images/png/result_whi.gif | Bin 0 -> 2453 bytes .../dompdf/www/test/images/png/result_yel.gif | Bin 0 -> 2963 bytes .../www/test/images/png/result_yelthr1.gif | Bin 0 -> 3007 bytes .../www/test/images/png/resultb_bla.gif | Bin 0 -> 1383 bytes .../www/test/images/png/resultb_bug.gif | Bin 0 -> 1541 bytes .../www/test/images/png/resultb_mag.gif | Bin 0 -> 1442 bytes .../www/test/images/png/resultb_moz2.gif | Bin 0 -> 1683 bytes .../dompdf/www/test/images/png/resultb_no.gif | Bin 0 -> 1724 bytes .../dompdf/www/test/images/png/resultb_ok.gif | Bin 0 -> 1569 bytes .../www/test/images/png/resultb_whi.gif | Bin 0 -> 1413 bytes .../www/test/images/png/resultb_yel.gif | Bin 0 -> 1442 bytes .../www/test/images/png/resultg_bla.gif | Bin 0 -> 2256 bytes .../www/test/images/png/resultg_dgr.gif | Bin 0 -> 2576 bytes .../www/test/images/png/resultg_lgr.gif | Bin 0 -> 2551 bytes .../dompdf/www/test/images/png/resultg_no.gif | Bin 0 -> 1371 bytes .../dompdf/www/test/images/png/resultga.gif | Bin 0 -> 3573 bytes .../dompdf/www/test/images/png/resultgb.gif | Bin 0 -> 1538 bytes .../www/test/images/png/resultgb_dgr.gif | Bin 0 -> 1406 bytes .../www/test/images/png/resultgb_no.gif | Bin 0 -> 1345 bytes .../www/test/images/png/resultpb_no.gif | Bin 0 -> 1437 bytes .../dompdf/www/test/images/png/rgb16_t.png | Bin 0 -> 304 bytes .../dompdf/www/test/images/png/rgb16_t_bk.png | Bin 0 -> 322 bytes .../dompdf/www/test/images/png/rgb8_t.png | Bin 0 -> 215 bytes .../dompdf/www/test/images/png/rgb8_t_bk.png | Bin 0 -> 233 bytes .../dompdf/www/test/images/png/rgba16.png | Bin 0 -> 318 bytes .../dompdf/www/test/images/png/rgba16_bk.png | Bin 0 -> 336 bytes .../dompdf/www/test/images/png/rgba8.png | Bin 0 -> 270 bytes .../dompdf/www/test/images/png/rgba8_bk.png | Bin 0 -> 288 bytes .../dompdf/www/test/images/png/stripe.gif | Bin 0 -> 946 bytes .../dompdf/www/test/images/smiley.png | Bin 0 -> 730 bytes .../dompdf/www/test/images/what_ordered.gif | Bin 0 -> 33998 bytes .../dompdf/www/test/page_pages.html | 201 + .../dompdf/www/test/quirks_center_table.html | 19 + .../dompdf/www/test/quirks_font_tag.html | 70 + .../www/test/quirks_html_attributes.html | 55 + .../dompdf/www/test/script_javascript.html | 24 + .../dompdf/www/test/script_php.php | 28 + application/views/MaterialIssueList.php | 2 +- application/views/attendance.php | 5 +- application/views/companyview.php | 77 +- application/views/includes/pdfheader.php | 9 +- application/views/loanreports.php | 2 +- application/views/pfreportprint.php | 3 +- 435 files changed, 120425 insertions(+), 62 deletions(-) create mode 100755 application/third_party/dompdf/LICENSE.LGPL create mode 100755 application/third_party/dompdf/dompdf.php create mode 100755 application/third_party/dompdf/dompdf_config.custom.inc.php create mode 100755 application/third_party/dompdf/dompdf_config.inc.php create mode 100755 application/third_party/dompdf/include/absolute_positioner.cls.php create mode 100755 application/third_party/dompdf/include/abstract_renderer.cls.php create mode 100755 application/third_party/dompdf/include/attribute_translator.cls.php create mode 100755 application/third_party/dompdf/include/block_frame_decorator.cls.php create mode 100755 application/third_party/dompdf/include/block_frame_reflower.cls.php create mode 100755 application/third_party/dompdf/include/block_positioner.cls.php create mode 100755 application/third_party/dompdf/include/block_renderer.cls.php create mode 100755 application/third_party/dompdf/include/cached_pdf_decorator.cls.php create mode 100755 application/third_party/dompdf/include/canvas.cls.php create mode 100755 application/third_party/dompdf/include/canvas_factory.cls.php create mode 100755 application/third_party/dompdf/include/cellmap.cls.php create mode 100755 application/third_party/dompdf/include/cpdf_adapter.cls.php create mode 100755 application/third_party/dompdf/include/css_color.cls.php create mode 100755 application/third_party/dompdf/include/dompdf.cls.php create mode 100755 application/third_party/dompdf/include/dompdf_exception.cls.php create mode 100755 application/third_party/dompdf/include/dompdf_internal_exception.cls.php create mode 100755 application/third_party/dompdf/include/file.skel create mode 100755 application/third_party/dompdf/include/fixed_positioner.cls.php create mode 100755 application/third_party/dompdf/include/font_metrics.cls.php create mode 100755 application/third_party/dompdf/include/frame.cls.php create mode 100755 application/third_party/dompdf/include/frame_decorator.cls.php create mode 100755 application/third_party/dompdf/include/frame_factory.cls.php create mode 100755 application/third_party/dompdf/include/frame_reflower.cls.php create mode 100755 application/third_party/dompdf/include/frame_tree.cls.php create mode 100755 application/third_party/dompdf/include/functions.inc.php create mode 100755 application/third_party/dompdf/include/gd_adapter.cls.php create mode 100755 application/third_party/dompdf/include/image_cache.cls.php create mode 100755 application/third_party/dompdf/include/image_frame_decorator.cls.php create mode 100755 application/third_party/dompdf/include/image_frame_reflower.cls.php create mode 100755 application/third_party/dompdf/include/image_renderer.cls.php create mode 100755 application/third_party/dompdf/include/inline_frame_decorator.cls.php create mode 100755 application/third_party/dompdf/include/inline_frame_reflower.cls.php create mode 100755 application/third_party/dompdf/include/inline_positioner.cls.php create mode 100755 application/third_party/dompdf/include/inline_renderer.cls.php create mode 100755 application/third_party/dompdf/include/javascript_embedder.cls.php create mode 100755 application/third_party/dompdf/include/list_bullet_frame_decorator.cls.php create mode 100755 application/third_party/dompdf/include/list_bullet_frame_reflower.cls.php create mode 100755 application/third_party/dompdf/include/list_bullet_image_frame_decorator.cls.php create mode 100755 application/third_party/dompdf/include/list_bullet_positioner.cls.php create mode 100755 application/third_party/dompdf/include/list_bullet_renderer.cls.php create mode 100755 application/third_party/dompdf/include/null_frame_decorator.cls.php create mode 100755 application/third_party/dompdf/include/null_frame_reflower.cls.php create mode 100755 application/third_party/dompdf/include/null_positioner.cls.php create mode 100755 application/third_party/dompdf/include/page_cache.cls.php create mode 100755 application/third_party/dompdf/include/page_frame_decorator.cls.php create mode 100755 application/third_party/dompdf/include/page_frame_reflower.cls.php create mode 100755 application/third_party/dompdf/include/pdflib_adapter.cls.php create mode 100755 application/third_party/dompdf/include/php_evaluator.cls.php create mode 100755 application/third_party/dompdf/include/positioner.cls.php create mode 100755 application/third_party/dompdf/include/renderer.cls.php create mode 100755 application/third_party/dompdf/include/style.cls.php create mode 100755 application/third_party/dompdf/include/stylesheet.cls.php create mode 100755 application/third_party/dompdf/include/table_cell_frame_decorator.cls.php create mode 100755 application/third_party/dompdf/include/table_cell_frame_reflower.cls.php create mode 100755 application/third_party/dompdf/include/table_cell_positioner.cls.php create mode 100755 application/third_party/dompdf/include/table_cell_renderer.cls.php create mode 100755 application/third_party/dompdf/include/table_frame_decorator.cls.php create mode 100755 application/third_party/dompdf/include/table_frame_reflower.cls.php create mode 100755 application/third_party/dompdf/include/table_row_frame_decorator.cls.php create mode 100755 application/third_party/dompdf/include/table_row_frame_reflower.cls.php create mode 100755 application/third_party/dompdf/include/table_row_group_frame_decorator.cls.php create mode 100755 application/third_party/dompdf/include/table_row_group_frame_reflower.cls.php create mode 100755 application/third_party/dompdf/include/table_row_positioner.cls.php create mode 100755 application/third_party/dompdf/include/tcpdf_adapter.cls.php create mode 100755 application/third_party/dompdf/include/text_frame_decorator.cls.php create mode 100755 application/third_party/dompdf/include/text_frame_reflower.cls.php create mode 100755 application/third_party/dompdf/include/text_renderer.cls.php create mode 100755 application/third_party/dompdf/include/ttf_info.cls.php create mode 100755 application/third_party/dompdf/index.php create mode 100755 application/third_party/dompdf/lib/class.pdf.php create mode 100755 application/third_party/dompdf/lib/fonts/Courier-Bold.afm create mode 100755 application/third_party/dompdf/lib/fonts/Courier-BoldOblique.afm create mode 100755 application/third_party/dompdf/lib/fonts/Courier-Oblique.afm create mode 100755 application/third_party/dompdf/lib/fonts/Courier.afm create mode 100755 application/third_party/dompdf/lib/fonts/Helvetica-Bold.afm create mode 100755 application/third_party/dompdf/lib/fonts/Helvetica-Bold.afm.php create mode 100755 application/third_party/dompdf/lib/fonts/Helvetica-BoldOblique.afm create mode 100755 application/third_party/dompdf/lib/fonts/Helvetica-Oblique.afm create mode 100755 application/third_party/dompdf/lib/fonts/Helvetica.afm create mode 100755 application/third_party/dompdf/lib/fonts/Helvetica.afm.php create mode 100755 application/third_party/dompdf/lib/fonts/Symbol.afm create mode 100755 application/third_party/dompdf/lib/fonts/Times-Bold.afm create mode 100755 application/third_party/dompdf/lib/fonts/Times-Bold.afm.php create mode 100755 application/third_party/dompdf/lib/fonts/Times-BoldItalic.afm create mode 100755 application/third_party/dompdf/lib/fonts/Times-BoldItalic.afm.php create mode 100755 application/third_party/dompdf/lib/fonts/Times-Italic.afm create mode 100755 application/third_party/dompdf/lib/fonts/Times-Italic.afm.php create mode 100755 application/third_party/dompdf/lib/fonts/Times-Roman.afm create mode 100755 application/third_party/dompdf/lib/fonts/Times-Roman.afm.php create mode 100755 application/third_party/dompdf/lib/fonts/ZapfDingbats.afm create mode 100755 application/third_party/dompdf/lib/fonts/dompdf_font_family_cache.dist.php create mode 100755 application/third_party/dompdf/lib/fonts/log.htm create mode 100755 application/third_party/dompdf/lib/fonts/mustRead.html create mode 100755 application/third_party/dompdf/lib/res/broken_image.png create mode 100755 application/third_party/dompdf/lib/res/html.css create mode 100755 application/third_party/dompdf/lib/ttf2ufm/README.TXT create mode 100755 application/third_party/dompdf/lib/ttf2ufm/bin/ttf2ufm.exe create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/CHANGES create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/CHANGES.html create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/COPYRIGHT create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/FONTS create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/FONTS.hpux create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/FONTS.hpux.html create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/FONTS.html create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/Makefile create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/README create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/README.FIRST create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/README.html create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/Makefile create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/ttf2pt1.spec create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/ttf2pt1.spec.src create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/README create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/README.html create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/cjk-latex-config create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/cjk-latex-t1mapgen create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/sfd2map create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/X11/README create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/X11/README.html create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/X11/t1-xf86.334.patch create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/X11/t1-xf86.39.patch create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/Makefile create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/README create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/README.html create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/fontsz.cf create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/notscape create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/nsfilter create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/nsfix.c create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/nspr create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/nsprint create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/psfonts.cf create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/bdf.c create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/bitmap.c create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/byteorder.h create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/cygbuild.sh create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/README create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/README.html create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/adobestd/adobe-std.tbl create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/README create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/encodings.alias create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/ibm-1251.tbl create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/ibm-866.tbl create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/iso8859-5.tbl create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/koi8-r.tbl create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/encodings.alias create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/ibm-1251.tbl create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/ibm-866.tbl create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/iso8859-5.tbl create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/koi8-r.tbl create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin1/iso8859-1.tbl create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin2/iso8859-2.tbl create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin4/iso8859-4 create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin4/iso8859-4.tbl create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin5/iso8859-9 create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/README create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/encodings.alias create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/ibm-1251.tbl create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/ibm-866.tbl create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/iso8859-5.tbl create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/koi8-r.tbl create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/ft.c create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/global.h create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/maps/CP1250.map create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/maps/CP1251.map create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/maps/T2A_compact.map create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/maps/adobe-standard-encoding.map create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/maps/cubg5plus.map create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/maps/cubig5.map create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/maps/cugb.map create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/maps/cugbk.map create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/maps/ubig5.map create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/maps/ugb.map create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/maps/ugbk.map create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/maps/unicode-sample.map create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/other/Makefile create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/other/README create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/other/README.html create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/other/bmpfont.h create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/other/bz.c create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/other/bzscreen.c create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/other/bzscreen.h create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/other/cmpf.c create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/other/cntstems.pl create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/other/dmpf.c create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/other/lst.pl create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/other/showdf create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/other/showg create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/pt1.c create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/pt1.h create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/runt1asm.c create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/scripts/convert create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/scripts/convert.cfg.sample create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/scripts/forceiso create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/scripts/frommap create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/scripts/html2man create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/scripts/inst_dir create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/scripts/inst_file create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/scripts/mkrel create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/scripts/t1fdir create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/scripts/trans create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/scripts/unhtml create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/scripts/x2gs create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/t1asm.c create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/ttf.c create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/ttf.h create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1.1 create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1.c create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1_convert.1 create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1_x2gs.1 create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/ttf2ufm create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/version.h create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/winbuild.bat create mode 100755 application/third_party/dompdf/lib/ttf2ufm/src/windows.h create mode 100755 application/third_party/dompdf/load_font.php create mode 100755 application/third_party/dompdf/www/controller.php create mode 100755 application/third_party/dompdf/www/cssSandpaper/css/reset.css create mode 100755 application/third_party/dompdf/www/cssSandpaper/js/EventHelpers.js create mode 100755 application/third_party/dompdf/www/cssSandpaper/js/cssQuery-p.js create mode 100755 application/third_party/dompdf/www/cssSandpaper/js/cssSandpaper.js create mode 100755 application/third_party/dompdf/www/cssSandpaper/js/jcoglan.com/sylvester.js create mode 100755 application/third_party/dompdf/www/debugger.php create mode 100755 application/third_party/dompdf/www/demo.php create mode 100755 application/third_party/dompdf/www/examples.php create mode 100755 application/third_party/dompdf/www/foot.inc create mode 100755 application/third_party/dompdf/www/head.inc create mode 100755 application/third_party/dompdf/www/images/arrow_01.gif create mode 100755 application/third_party/dompdf/www/images/arrow_02.gif create mode 100755 application/third_party/dompdf/www/images/arrow_03.gif create mode 100755 application/third_party/dompdf/www/images/arrow_04.gif create mode 100755 application/third_party/dompdf/www/images/arrow_05.gif create mode 100755 application/third_party/dompdf/www/images/arrow_06.gif create mode 100755 application/third_party/dompdf/www/images/css2.png create mode 100755 application/third_party/dompdf/www/images/dompdf_simple.png create mode 100755 application/third_party/dompdf/www/images/favicon.ico create mode 100755 application/third_party/dompdf/www/images/favicon.png create mode 100755 application/third_party/dompdf/www/images/h_bar.gif create mode 100755 application/third_party/dompdf/www/images/left_arrow.gif create mode 100755 application/third_party/dompdf/www/images/logo.png create mode 100755 application/third_party/dompdf/www/images/logo.xcf create mode 100755 application/third_party/dompdf/www/images/php5-power-micro.png create mode 100755 application/third_party/dompdf/www/images/small_logo.png create mode 100755 application/third_party/dompdf/www/images/star_01.gif create mode 100755 application/third_party/dompdf/www/images/star_02.gif create mode 100755 application/third_party/dompdf/www/images/star_03.gif create mode 100755 application/third_party/dompdf/www/images/star_04.gif create mode 100755 application/third_party/dompdf/www/images/star_05.gif create mode 100755 application/third_party/dompdf/www/images/title.gif create mode 100755 application/third_party/dompdf/www/images/v_bar.gif create mode 100755 application/third_party/dompdf/www/images/xhtml10.png create mode 100755 application/third_party/dompdf/www/index.php create mode 100755 application/third_party/dompdf/www/jquery-1.4.2.js create mode 100755 application/third_party/dompdf/www/setup.php create mode 100755 application/third_party/dompdf/www/style.css create mode 100755 application/third_party/dompdf/www/test/backgroundcolor_fontdecoration_pageborder.html create mode 100755 application/third_party/dompdf/www/test/css/common.css create mode 100755 application/third_party/dompdf/www/test/css/importabs.css create mode 100755 application/third_party/dompdf/www/test/css/importall.css create mode 100755 application/third_party/dompdf/www/test/css/importdisplay.css create mode 100755 application/third_party/dompdf/www/test/css/importprint.css create mode 100755 application/third_party/dompdf/www/test/css/importsub.css create mode 100755 application/third_party/dompdf/www/test/css/linkall.css create mode 100755 application/third_party/dompdf/www/test/css/linkdefault.css create mode 100755 application/third_party/dompdf/www/test/css/linkdisplay.css create mode 100755 application/third_party/dompdf/www/test/css/linkprint.css create mode 100755 application/third_party/dompdf/www/test/css/print_static.css create mode 100755 application/third_party/dompdf/www/test/css_2d_transforms.html create mode 100755 application/third_party/dompdf/www/test/css_baseline.html create mode 100755 application/third_party/dompdf/www/test/css_block_height.html create mode 100755 application/third_party/dompdf/www/test/css_border.html create mode 100755 application/third_party/dompdf/www/test/css_border_values.html create mode 100755 application/third_party/dompdf/www/test/css_color_cmyk.html create mode 100755 application/third_party/dompdf/www/test/css_content.html create mode 100755 application/third_party/dompdf/www/test/css_float.html create mode 100755 application/third_party/dompdf/www/test/css_font_selection.html create mode 100755 application/third_party/dompdf/www/test/css_important_flag.html create mode 100755 application/third_party/dompdf/www/test/css_letter_spacing.html create mode 100755 application/third_party/dompdf/www/test/css_line_height.html create mode 100755 application/third_party/dompdf/www/test/css_margin.html create mode 100755 application/third_party/dompdf/www/test/css_media.html create mode 100755 application/third_party/dompdf/www/test/css_multiple_class.html create mode 100755 application/third_party/dompdf/www/test/css_opacity.html create mode 100755 application/third_party/dompdf/www/test/css_outline.html create mode 100755 application/third_party/dompdf/www/test/css_overflow_hidden.html create mode 100755 application/third_party/dompdf/www/test/css_position_all.html create mode 100755 application/third_party/dompdf/www/test/css_position_fixed.html create mode 100755 application/third_party/dompdf/www/test/css_selectors.html create mode 100755 application/third_party/dompdf/www/test/css_table_height.html create mode 100755 application/third_party/dompdf/www/test/css_text_align.html create mode 100755 application/third_party/dompdf/www/test/css_z_index.html create mode 100755 application/third_party/dompdf/www/test/demo_01.html create mode 100755 application/third_party/dompdf/www/test/dom_anchor_link.html create mode 100755 application/third_party/dompdf/www/test/dom_br.html create mode 100755 application/third_party/dompdf/www/test/dom_large_table.html create mode 100755 application/third_party/dompdf/www/test/dom_long_table.php create mode 100755 application/third_party/dompdf/www/test/dom_nbsp.html create mode 100755 application/third_party/dompdf/www/test/dom_nested_table.html create mode 100755 application/third_party/dompdf/www/test/dom_ol.html create mode 100755 application/third_party/dompdf/www/test/dom_simple_ul.html create mode 100755 application/third_party/dompdf/www/test/dom_table.html create mode 100755 application/third_party/dompdf/www/test/dom_table_01.html create mode 100755 application/third_party/dompdf/www/test/dom_table_image.html create mode 100755 application/third_party/dompdf/www/test/dom_ul.html create mode 100755 application/third_party/dompdf/www/test/encoding_entities.html create mode 100755 application/third_party/dompdf/www/test/encoding_latin1.html create mode 100755 application/third_party/dompdf/www/test/encoding_special.html create mode 100755 application/third_party/dompdf/www/test/encoding_symbols.html create mode 100755 application/third_party/dompdf/www/test/encoding_unicode.html create mode 100755 application/third_party/dompdf/www/test/encoding_unicode_wrapping.html create mode 100755 application/third_party/dompdf/www/test/encoding_utf-8.html create mode 100755 application/third_party/dompdf/www/test/encoding_utf-8_w3.html create mode 100755 application/third_party/dompdf/www/test/image_background.html create mode 100755 application/third_party/dompdf/www/test/image_basic.html create mode 100755 application/third_party/dompdf/www/test/image_bmp.html create mode 100755 application/third_party/dompdf/www/test/image_datauri.html create mode 100755 application/third_party/dompdf/www/test/image_gif.html create mode 100755 application/third_party/dompdf/www/test/image_remote.html create mode 100755 application/third_party/dompdf/www/test/image_transparent_gif.html create mode 100755 application/third_party/dompdf/www/test/image_transparent_png.html create mode 100755 application/third_party/dompdf/www/test/image_variants.html create mode 100755 application/third_party/dompdf/www/test/images/bmp/test1.bmp create mode 100755 application/third_party/dompdf/www/test/images/bmp/test1.png create mode 100755 application/third_party/dompdf/www/test/images/bmp/test16.bmp create mode 100755 application/third_party/dompdf/www/test/images/bmp/test16.png create mode 100755 application/third_party/dompdf/www/test/images/bmp/test16bf555.bmp create mode 100755 application/third_party/dompdf/www/test/images/bmp/test16bf555.png create mode 100755 application/third_party/dompdf/www/test/images/bmp/test16bf565.bmp create mode 100755 application/third_party/dompdf/www/test/images/bmp/test16bf565.png create mode 100755 application/third_party/dompdf/www/test/images/bmp/test24.bmp create mode 100755 application/third_party/dompdf/www/test/images/bmp/test24.png create mode 100755 application/third_party/dompdf/www/test/images/bmp/test32.bmp create mode 100755 application/third_party/dompdf/www/test/images/bmp/test32.png create mode 100755 application/third_party/dompdf/www/test/images/bmp/test32bf.bmp create mode 100755 application/third_party/dompdf/www/test/images/bmp/test32bf.png create mode 100755 application/third_party/dompdf/www/test/images/bmp/test32bfv4.bmp create mode 100755 application/third_party/dompdf/www/test/images/bmp/test32bfv4.png create mode 100755 application/third_party/dompdf/www/test/images/bmp/test32v5.bmp create mode 100755 application/third_party/dompdf/www/test/images/bmp/test32v5.png create mode 100755 application/third_party/dompdf/www/test/images/bmp/test4.bmp create mode 100755 application/third_party/dompdf/www/test/images/bmp/test4.png create mode 100755 application/third_party/dompdf/www/test/images/bmp/test4os2v2.bmp create mode 100755 application/third_party/dompdf/www/test/images/bmp/test4os2v2.png create mode 100755 application/third_party/dompdf/www/test/images/bmp/test8.bmp create mode 100755 application/third_party/dompdf/www/test/images/bmp/test8.png create mode 100755 application/third_party/dompdf/www/test/images/bmp/test8os2.bmp create mode 100755 application/third_party/dompdf/www/test/images/bmp/test8os2.png create mode 100755 application/third_party/dompdf/www/test/images/bmp/testcompress4.bmp create mode 100755 application/third_party/dompdf/www/test/images/bmp/testcompress4.png create mode 100755 application/third_party/dompdf/www/test/images/bmp/testcompress8.bmp create mode 100755 application/third_party/dompdf/www/test/images/bmp/testcompress8.png create mode 100755 application/third_party/dompdf/www/test/images/bmp/trans.bmp create mode 100755 application/third_party/dompdf/www/test/images/bmp/trans.png create mode 100755 application/third_party/dompdf/www/test/images/cmyk_test2.jpg create mode 100755 application/third_party/dompdf/www/test/images/dokuwiki-128.png create mode 100755 application/third_party/dompdf/www/test/images/dompdf_simple.png create mode 100755 application/third_party/dompdf/www/test/images/goldengate.jpg create mode 100755 application/third_party/dompdf/www/test/images/green.gif create mode 100755 application/third_party/dompdf/www/test/images/html.png create mode 100755 application/third_party/dompdf/www/test/images/pdf.png create mode 100755 application/third_party/dompdf/www/test/images/php.gif create mode 100755 application/third_party/dompdf/www/test/images/png.png create mode 100755 application/third_party/dompdf/www/test/images/png/gray16a.png create mode 100755 application/third_party/dompdf/www/test/images/png/gray16a_bk.png create mode 100755 application/third_party/dompdf/www/test/images/png/gray16b.png create mode 100755 application/third_party/dompdf/www/test/images/png/gray16b_bk.png create mode 100755 application/third_party/dompdf/www/test/images/png/gray8a.png create mode 100755 application/third_party/dompdf/www/test/images/png/gray8a_bk.png create mode 100755 application/third_party/dompdf/www/test/images/png/gray8b.png create mode 100755 application/third_party/dompdf/www/test/images/png/gray8b_bk.png create mode 100755 application/third_party/dompdf/www/test/images/png/pal.png create mode 100755 application/third_party/dompdf/www/test/images/png/pal_bk.png create mode 100755 application/third_party/dompdf/www/test/images/png/pal_bk_notrns.png create mode 100755 application/third_party/dompdf/www/test/images/png/palb.png create mode 100755 application/third_party/dompdf/www/test/images/png/result_16ns.gif create mode 100755 application/third_party/dompdf/www/test/images/png/result_1trns.gif create mode 100755 application/third_party/dompdf/www/test/images/png/result_bla.gif create mode 100755 application/third_party/dompdf/www/test/images/png/result_dith.gif create mode 100755 application/third_party/dompdf/www/test/images/png/result_gra.gif create mode 100755 application/third_party/dompdf/www/test/images/png/result_mag.gif create mode 100755 application/third_party/dompdf/www/test/images/png/result_magthr1.gif create mode 100755 application/third_party/dompdf/www/test/images/png/result_no.gif create mode 100755 application/third_party/dompdf/www/test/images/png/result_nsbug.gif create mode 100755 application/third_party/dompdf/www/test/images/png/result_ok.gif create mode 100755 application/third_party/dompdf/www/test/images/png/result_oprbug.gif create mode 100755 application/third_party/dompdf/www/test/images/png/result_thr1.gif create mode 100755 application/third_party/dompdf/www/test/images/png/result_thr128.gif create mode 100755 application/third_party/dompdf/www/test/images/png/result_thr255.gif create mode 100755 application/third_party/dompdf/www/test/images/png/result_whi.gif create mode 100755 application/third_party/dompdf/www/test/images/png/result_yel.gif create mode 100755 application/third_party/dompdf/www/test/images/png/result_yelthr1.gif create mode 100755 application/third_party/dompdf/www/test/images/png/resultb_bla.gif create mode 100755 application/third_party/dompdf/www/test/images/png/resultb_bug.gif create mode 100755 application/third_party/dompdf/www/test/images/png/resultb_mag.gif create mode 100755 application/third_party/dompdf/www/test/images/png/resultb_moz2.gif create mode 100755 application/third_party/dompdf/www/test/images/png/resultb_no.gif create mode 100755 application/third_party/dompdf/www/test/images/png/resultb_ok.gif create mode 100755 application/third_party/dompdf/www/test/images/png/resultb_whi.gif create mode 100755 application/third_party/dompdf/www/test/images/png/resultb_yel.gif create mode 100755 application/third_party/dompdf/www/test/images/png/resultg_bla.gif create mode 100755 application/third_party/dompdf/www/test/images/png/resultg_dgr.gif create mode 100755 application/third_party/dompdf/www/test/images/png/resultg_lgr.gif create mode 100755 application/third_party/dompdf/www/test/images/png/resultg_no.gif create mode 100755 application/third_party/dompdf/www/test/images/png/resultga.gif create mode 100755 application/third_party/dompdf/www/test/images/png/resultgb.gif create mode 100755 application/third_party/dompdf/www/test/images/png/resultgb_dgr.gif create mode 100755 application/third_party/dompdf/www/test/images/png/resultgb_no.gif create mode 100755 application/third_party/dompdf/www/test/images/png/resultpb_no.gif create mode 100755 application/third_party/dompdf/www/test/images/png/rgb16_t.png create mode 100755 application/third_party/dompdf/www/test/images/png/rgb16_t_bk.png create mode 100755 application/third_party/dompdf/www/test/images/png/rgb8_t.png create mode 100755 application/third_party/dompdf/www/test/images/png/rgb8_t_bk.png create mode 100755 application/third_party/dompdf/www/test/images/png/rgba16.png create mode 100755 application/third_party/dompdf/www/test/images/png/rgba16_bk.png create mode 100755 application/third_party/dompdf/www/test/images/png/rgba8.png create mode 100755 application/third_party/dompdf/www/test/images/png/rgba8_bk.png create mode 100755 application/third_party/dompdf/www/test/images/png/stripe.gif create mode 100755 application/third_party/dompdf/www/test/images/smiley.png create mode 100755 application/third_party/dompdf/www/test/images/what_ordered.gif create mode 100755 application/third_party/dompdf/www/test/page_pages.html create mode 100755 application/third_party/dompdf/www/test/quirks_center_table.html create mode 100755 application/third_party/dompdf/www/test/quirks_font_tag.html create mode 100755 application/third_party/dompdf/www/test/quirks_html_attributes.html create mode 100755 application/third_party/dompdf/www/test/script_javascript.html create mode 100755 application/third_party/dompdf/www/test/script_php.php diff --git a/application/controllers/companycontroller.php b/application/controllers/companycontroller.php index e2d0e793..bb7df7a9 100644 --- a/application/controllers/companycontroller.php +++ b/application/controllers/companycontroller.php @@ -62,8 +62,9 @@ class companycontroller extends BaseController $bankname = $tv['BankName']; $ifsccode = $tv['IFSC']; $bankaddress = $tv['BankAddress']; + $bankaccno = $tv['BankAccountNumber']; $bankstate = $tv['IsActive']; - if($bankstate == 'Yes') + if(strtoupper($bankstate) == 'YES' ) { $isactive = 1; } @@ -71,7 +72,7 @@ class companycontroller extends BaseController $isactive = 0; } - $Bank = array('Bank_name'=>$bankname,'IFSC'=>$ifsccode,'Address'=>$bankaddress,'Is_Active'=>$isactive); + $Bank = array('Bank_name'=>$bankname,'IFSC'=>$ifsccode,'Address'=>$bankaddress,'Is_Active'=>$isactive,'Bank_Accno'=>$bankaccno); $result = $this->companydetailsmodel->BankDetails($Bank); } diff --git a/application/controllers/payslip.php b/application/controllers/payslip.php index 2a7a35fa..179d63e5 100644 --- a/application/controllers/payslip.php +++ b/application/controllers/payslip.php @@ -89,6 +89,7 @@ function phpAlert($msg) { } $totamtwords = $this->convertNumber($totalamt); $data['bankdetails']=$this->payroll_model->getBankInfo($bank); + $data['companyinformation']=$this->payroll_model->getCompanyInfo(); $data['Totalamount']=$totalamt; $data['Totalamtwords']=$totamtwords; @@ -420,7 +421,7 @@ function phpAlert($msg) { if(empty($this->input->post('finyear'))) { - echo "DEFAULT LOAD"; + // echo "DEFAULT LOAD"; $year = date("Y"); $month = date("m"); $currentyear = ''; @@ -445,7 +446,7 @@ function phpAlert($msg) { if(!empty($this->input->post('finyear'))) { - echo "FIN YEAR WITH SOURCE"; + //echo "FIN YEAR WITH SOURCE"; $source = $this->input->post('source'); $data['selsource'] =$source; $finyear = $this->input->post('finyear'); @@ -458,7 +459,7 @@ function phpAlert($msg) { - echo $currentyear.'-'.$nxtyear; + // echo $currentyear.'-'.$nxtyear; // echo "Company"; $data['loanrecords'] = $this->payroll_model->getLoanReport($source,$currentyear,$nxtyear); // print_r($data['loanrecords']); diff --git a/application/models/payroll_model.php b/application/models/payroll_model.php index 342665ca..3b3d0ea3 100644 --- a/application/models/payroll_model.php +++ b/application/models/payroll_model.php @@ -193,6 +193,14 @@ class Payroll_model extends CI_Model } $query = $this->db->get(); return $query->result(); + } + function getCompanyInfo() + { + $this->db->select('*'); + $this->db->from('T_Company_Details'); + $query = $this->db->get(); + $result = $query->result(); + return $result; } function getReportforBank($bank,$payon) diff --git a/application/third_party/dompdf/LICENSE.LGPL b/application/third_party/dompdf/LICENSE.LGPL new file mode 100755 index 00000000..6ef5de82 --- /dev/null +++ b/application/third_party/dompdf/LICENSE.LGPL @@ -0,0 +1,456 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. \ No newline at end of file diff --git a/application/third_party/dompdf/dompdf.php b/application/third_party/dompdf/dompdf.php new file mode 100755 index 00000000..73310f25 --- /dev/null +++ b/application/third_party/dompdf/dompdf.php @@ -0,0 +1,328 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * dompdf.php is a simple script to drive DOMPDF. It can be executed from + * a browser or from the command line. + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: dompdf.php 301 2010-08-23 21:00:51Z fabien.menager $ */ + +/** + * Display command line usage: + * + * Usage: ./dompdf.php [options] html_file + * + * html_file can be a filename, a url if fopen_wrappers are enabled, or the '-' + * character to read from standard input. + * + * Options: + * -h Show this message + * -l list available paper sizes + * -p size paper size; something like 'letter', 'A4', 'legal', etc. The default is + * 'letter' + * -o orientation either 'portrait' or 'landscape'. Default is 'portrait'. + * -b path set the 'document root' of the html_file. Relative urls (for + * stylesheets) are resolved using this directory. Default is the + * directory of html_file. + * -f file the output filename. Default is the input [html_file].pdf. + * -v verbose: display html parsing warnings and file not found errors. + * -d very verbose: display oodles of debugging output: every frame in the + * tree is printed to stdout. + * -t comma separated list of debugging types (page-break,reflow,split) + * -r write the render time to the log file + * + * + */ +function dompdf_usage() { + echo + "\nUsage: {$_SERVER["argv"][0]} [options] html_file\n\n". + "html_file can be a filename, a url if fopen_wrappers are enabled, or the '-' \n". + "character to read from standard input.\n\n". + "Options:\n". + " -h\t\tShow this message\n". + " -l\t\tlist available paper sizes\n". + " -p size\tpaper size; something like 'letter', 'A4', 'legal', etc. The default is\n". + " \t\t'" . DOMPDF_DEFAULT_PAPER_SIZE . "'\n". + " -o orientation\teither 'portrait' or 'landscape'. Default is 'portrait'.\n". + " -b path\tset the 'document root' of the html_file. Relative urls (for \n". + " \tstylesheets) are resolved using this directory. Default is the \n". + " \tdirectory of html_file.\n". + " -f file\tthe output filename. Default is the input [html_file].pdf.\n". + " -v \tverbose: display html parsing warnings and file not found errors.\n". + " -d \tvery verbose: display oodles of debugging output: every frame\n". + " \tin the tree printed to stdout.\n". + " -t comma separated list of debugging types (page-break,reflow,split)\n\n"; +} + +function getoptions() { + + $opts = array(); + + if ( $_SERVER["argc"] == 1 ) + return $opts; + + $i = 1; + while ($i < $_SERVER["argc"]) { + + switch ($_SERVER["argv"][$i]) { + + case "--help": + case "-h": + $opts["h"] = true; + $i++; + break; + + case "-l": + $opts["l"] = true; + $i++; + break; + + case "-p": + if ( !isset($_SERVER["argv"][$i+1]) ) + die("-p switch requires a size parameter\n"); + $opts["p"] = $_SERVER["argv"][$i+1]; + $i += 2; + break; + + case "-o": + if ( !isset($_SERVER["argv"][$i+1]) ) + die("-o switch requires an orientation parameter\n"); + $opts["o"] = $_SERVER["argv"][$i+1]; + $i += 2; + break; + + case "-b": + if ( !isset($_SERVER["argv"][$i+1]) ) + die("-b switch requires a path parameter\n"); + $opts["b"] = $_SERVER["argv"][$i+1]; + $i += 2; + break; + + case "-f": + if ( !isset($_SERVER["argv"][$i+1]) ) + die("-f switch requires a filename parameter\n"); + $opts["f"] = $_SERVER["argv"][$i+1]; + $i += 2; + break; + + case "-v": + $opts["v"] = true; + $i++; + break; + + case "-d": + $opts["d"] = true; + $i++; + break; + + case "-t": + if ( !isset($_SERVER['argv'][$i + 1]) ) + die("-t switch requires a comma separated list of types\n"); + $opts["t"] = $_SERVER['argv'][$i+1]; + $i += 2; + break; + + default: + $opts["filename"] = $_SERVER["argv"][$i]; + $i++; + break; + } + + } + return $opts; +} + +require_once("dompdf_config.inc.php"); +global $_dompdf_show_warnings, $_dompdf_debug, $_DOMPDF_DEBUG_TYPES; + +$sapi = php_sapi_name(); +$options = array(); + +switch ( $sapi ) { + + case "cli": + + $opts = getoptions(); + + if ( isset($opts["h"]) || (!isset($opts["filename"]) && !isset($opts["l"])) ) { + dompdf_usage(); + exit; + } + + if ( isset($opts["l"]) ) { + echo "\nUnderstood paper sizes:\n"; + + foreach (array_keys(CPDF_Adapter::$PAPER_SIZES) as $size) + echo " " . mb_strtoupper($size) . "\n"; + exit; + } + $file = $opts["filename"]; + + if ( isset($opts["p"]) ) + $paper = $opts["p"]; + else + $paper = DOMPDF_DEFAULT_PAPER_SIZE; + + if ( isset($opts["o"]) ) + $orientation = $opts["o"]; + else + $orientation = "portrait"; + + if ( isset($opts["b"]) ) + $base_path = $opts["b"]; + + if ( isset($opts["f"]) ) + $outfile = $opts["f"]; + else { + if ( $file === "-" ) + $outfile = "dompdf_out.pdf"; + else + $outfile = str_ireplace(array(".html", ".htm", ".php"), "", $file) . ".pdf"; + } + + if ( isset($opts["v"]) ) + $_dompdf_show_warnings = true; + + if ( isset($opts["d"]) ) { + $_dompdf_show_warnings = true; + $_dompdf_debug = true; + } + + if ( isset($opts['t']) ) { + $arr = split(',',$opts['t']); + $types = array(); + foreach ($arr as $type) + $types[ trim($type) ] = 1; + $_DOMPDF_DEBUG_TYPES = $types; + } + + $save_file = true; + + break; + + default: + + if ( isset($_GET["input_file"]) ) + $file = rawurldecode($_GET["input_file"]); + else + throw new DOMPDF_Exception("An input file is required (i.e. input_file _GET variable)."); + + if ( isset($_GET["paper"]) ) + $paper = rawurldecode($_GET["paper"]); + else + $paper = DOMPDF_DEFAULT_PAPER_SIZE; + + if ( isset($_GET["orientation"]) ) + $orientation = rawurldecode($_GET["orientation"]); + else + $orientation = "portrait"; + + if ( isset($_GET["base_path"]) ) { + $base_path = rawurldecode($_GET["base_path"]); + $file = $base_path . $file; # Set the input file + } + + if ( isset($_GET["options"]) ) { + $options = $_GET["options"]; + } + + $file_parts = explode_url($file); + /* Check to see if the input file is local and, if so, that the base path falls within that specified by DOMDPF_CHROOT */ + if(($file_parts['protocol'] == '' || $file_parts['protocol'] === 'file://')) { + $file = realpath($file); + if (strpos($file, DOMPDF_CHROOT) !== 0) { + throw new DOMPDF_Exception("Permission denied on $file."); + } + } + + $outfile = "dompdf_out.pdf"; # Don't allow them to set the output file + $save_file = false; # Don't save the file + + break; +} + +$dompdf = new DOMPDF(); + +if ( $file === "-" ) { + $str = ""; + while ( !feof(STDIN) ) + $str .= fread(STDIN, 4096); + + $dompdf->load_html($str); + +} else + $dompdf->load_html_file($file); + +if ( isset($base_path) ) { + $dompdf->set_base_path($base_path); +} + +$dompdf->set_paper($paper, $orientation); + +$dompdf->render(); + +if ( $_dompdf_show_warnings ) { + global $_dompdf_warnings; + foreach ($_dompdf_warnings as $msg) + echo $msg . "\n"; + echo $dompdf->get_canvas()->get_cpdf()->messages; + flush(); +} + +if ( $save_file ) { +// if ( !is_writable($outfile) ) +// throw new DOMPDF_Exception("'$outfile' is not writable."); + if ( strtolower(DOMPDF_PDF_BACKEND) === "gd" ) + $outfile = str_replace(".pdf", ".png", $outfile); + + list($proto, $host, $path, $file) = explode_url($outfile); + if ( $proto != "" ) // i.e. not file:// + $outfile = $file; // just save it locally, FIXME? could save it like wget: ./host/basepath/file + + $outfile = realpath(dirname($outfile)) . DIRECTORY_SEPARATOR . basename($outfile); + + if ( strpos($outfile, DOMPDF_CHROOT) !== 0 ) + throw new DOMPDF_Exception("Permission denied."); + + file_put_contents($outfile, $dompdf->output( array("compress" => 0) )); + exit(0); +} + +if ( !headers_sent() ) { + $dompdf->stream($outfile, $options); +} diff --git a/application/third_party/dompdf/dompdf_config.custom.inc.php b/application/third_party/dompdf/dompdf_config.custom.inc.php new file mode 100755 index 00000000..609a7ab6 --- /dev/null +++ b/application/third_party/dompdf/dompdf_config.custom.inc.php @@ -0,0 +1,24 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - Allow overriding of configuration settings by calling php script. + * This allows replacing of dompdf by a new version in an application + * without any modification, + * - Optionally separate font cache folder from font folder. + * This allows write protecting the entire installation + * - Add settings to enable/disable additional debug output categories + * - Change some defaults to more practical values + * - Add comments about configuration parameter implications + */ + +/* $Id: dompdf_config.inc.php 363 2011-02-17 21:18:25Z fabien.menager $ */ + +//error_reporting(E_STRICT | E_ALL | E_DEPRECATED); +//ini_set("display_errors", 1); + +/** + * The root of your DOMPDF installation + */ +define("DOMPDF_DIR", str_replace(DIRECTORY_SEPARATOR, '/', realpath(dirname(__FILE__)))); + +/** + * The location of the DOMPDF include directory + */ +define("DOMPDF_INC_DIR", DOMPDF_DIR . "/include"); + +/** + * The location of the DOMPDF lib directory + */ +define("DOMPDF_LIB_DIR", DOMPDF_DIR . "/lib"); + +/** + * Some installations don't have $_SERVER['DOCUMENT_ROOT'] + * http://fyneworks.blogspot.com/2007/08/php-documentroot-in-iis-windows-servers.html + */ +if( !isset($_SERVER['DOCUMENT_ROOT']) ) { + $path = ""; + + if ( isset($_SERVER['SCRIPT_FILENAME']) ) + $path = $_SERVER['SCRIPT_FILENAME']; + elseif ( isset($_SERVER['PATH_TRANSLATED']) ) + $path = str_replace('\\\\', '\\', $_SERVER['PATH_TRANSLATED']); + + $_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/', substr($path, 0, 0-strlen($_SERVER['PHP_SELF']))); +} + +/** Include the custom config file if it exists */ +if ( file_exists(DOMPDF_DIR . "/dompdf_config.custom.inc.php") ){ + require_once(DOMPDF_DIR . "/dompdf_config.custom.inc.php"); +} + +//FIXME: Some function definitions rely on the constants defined by DOMPDF. However, might this location prove problematic? +require_once(DOMPDF_INC_DIR . "/functions.inc.php"); + +/** + * The location of the DOMPDF font directory + * + * If DOMPDF_FONT_DIR identical to DOMPDF_FONT_CACHE or user executing DOMPDF from the CLI, + * this directory must be writable by the webserver process (). + * *Please note the trailing slash.* + * + * Notes regarding fonts: + * Additional .afm font metrics can be added by executing load_font.php from command line. + * Converting ttf fonts to afm requires the external tool referenced by TTF2AFM + * + * Only the original "Base 14 fonts" are present on all pdf viewers. Additional fonts must + * be embedded in the pdf file or the PDF may not display correctly. This can significantly + * increase file size and could violate copyright provisions of a font. Font embedding is + * not currently supported (? via HT). + * + * Any font specification in the source HTML is translated to the closest font available + * in the font directory. + * + * The pdf standard "Base 14 fonts" are: + * Courier, Courier-Bold, Courier-BoldOblique, Courier-Oblique, + * Helvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique, + * Times-Roman, Times-Bold, Times-BoldItalic, Times-Italic, + * Symbol, + * ZapfDingbats, + * + * *Please note the trailing slash.* + */ +def("DOMPDF_FONT_DIR", DOMPDF_DIR . "/lib/fonts/"); + +/** + * The location of the DOMPDF font cache directory + * + * Note this directory must be writable by the webserver process + * This folder must already exist! + * It contains the .afm files, on demand parsed, converted to php syntax and cached + * This folder can be the same as DOMPDF_FONT_DIR + */ +def("DOMPDF_FONT_CACHE", DOMPDF_FONT_DIR); + +/** + * The location of a temporary directory. + * + * The directory specified must be writeable by the webserver process. + * The temporary directory is required to download remote images and when + * using the PFDLib back end. + */ +def("DOMPDF_TEMP_DIR", sys_get_temp_dir()); + +/** + * ==== IMPORTANT ==== + * + * dompdf's "chroot": Prevents dompdf from accessing system files or other + * files on the webserver. All local files opened by dompdf must be in a + * subdirectory of this directory. DO NOT set it to '/' since this could + * allow an attacker to use dompdf to read any files on the server. This + * should be an absolute path. + * This is only checked on command line call by dompdf.php, but not by + * direct class use like: + * $dompdf = new DOMPDF(); $dompdf->load_html($htmldata); $dompdf->render(); $pdfdata = $dompdf->output(); + */ +def("DOMPDF_CHROOT", realpath(DOMPDF_DIR)); + +/** + * Whether to use Unicode fonts or not. + * + * When set to true the PDF backend must be set to "CPDF" and fonts must be + * loaded via the modified ttf2ufm tool included with dompdf (see below). + * Unicode font metric files (with .ufm extensions) must be created with + * ttf2ufm. load_font.php should do this for you if the TTF2AFM define below + * points to the modified ttf2ufm tool included with dompdf. + * + * When enabled, dompdf can support all Unicode glyphs. Any glyphs used in a + * document must be present in your fonts, however. + */ +def("DOMPDF_UNICODE_ENABLED", true); + +/** + * The path to the tt2pt1 utility (used to convert ttf to afm) + * + * Not strictly necessary, but useful if you would like to install + * additional fonts using the {@link load_font.php} utility. + * + * Windows users should use something like this: + * define("TTF2AFM", "C:\\Program Files\\Ttf2Pt1\\bin\\ttf2pt1.exe"); + * + * @link http://ttf2pt1.sourceforge.net/ + */ +if ( strpos(PHP_OS, "WIN") === false ) + def("TTF2AFM", DOMPDF_LIB_DIR ."/ttf2ufm/ttf2ufm-src/ttf2pt1"); +else + def("TTF2AFM", "C:\\Program Files\\GnuWin32\\bin\\ttf2pt1.exe"); + +/** + * The PDF rendering backend to use + * + * Valid settings are 'PDFLib', 'CPDF' (the bundled R&OS PDF class), 'GD' and + * 'auto'. 'auto' will look for PDFLib and use it if found, or if not it will + * fall back on CPDF. 'GD' renders PDFs to graphic files. {@link + * Canvas_Factory} ultimately determines which rendering class to instantiate + * based on this setting. + * + * Both PDFLib & CPDF rendering backends provide sufficient rendering + * capabilities for dompdf, however additional features (e.g. object, + * image and font support, etc.) differ between backends. Please see + * {@link PDFLib_Adapter} for more information on the PDFLib backend + * and {@link CPDF_Adapter} and lib/class.pdf.php for more information + * on CPDF. Also see the documentation for each backend at the links + * below. + * + * The GD rendering backend is a little different than PDFLib and + * CPDF. Several features of CPDF and PDFLib are not supported or do + * not make any sense when creating image files. For example, + * multiple pages are not supported, nor are PDF 'objects'. Have a + * look at {@link GD_Adapter} for more information. GD support is new + * and experimental, so use it at your own risk. + * + * @link http://www.pdflib.com + * @link http://www.ros.co.nz/pdf + * @link http://www.php.net/image + */ +def("DOMPDF_PDF_BACKEND", "CPDF"); + +/** + * PDFlib license key + * + * If you are using a licensed, commercial version of PDFlib, specify + * your license key here. If you are using PDFlib-Lite or are evaluating + * the commercial version of PDFlib, comment out this setting. + * + * @link http://www.pdflib.com + * + * If pdflib present in web server and auto or selected explicitely above, + * a real license code must exist! + */ +#def("DOMPDF_PDFLIB_LICENSE", "your license key here"); + +/** + * html target media view which should be rendered into pdf. + * List of types and parsing rules for future extensions: + * http://www.w3.org/TR/REC-html40/types.html + * screen, tty, tv, projection, handheld, print, braille, aural, all + * Note: aural is deprecated in CSS 2.1 because it is replaced by speech in CSS 3. + * Note, even though the generated pdf file is intended for print output, + * the desired content might be different (e.g. screen or projection view of html file). + * Therefore allow specification of content here. + */ +def("DOMPDF_DEFAULT_MEDIA_TYPE", "screen"); + +/** + * The default paper size. + * + * North America standard is "letter"; other countries generally "a4" + * + * @see CPDF_Adapter::PAPER_SIZES for valid sizes + */ +def("DOMPDF_DEFAULT_PAPER_SIZE", "letter"); + +/** + * The default font family + * + * Used if no suitable fonts can be found. This must exist in the font folder. + * @var string + */ +def("DOMPDF_DEFAULT_FONT", "serif"); + +/** + * Image DPI setting + * + * This setting determines the default DPI setting for images and fonts. The + * DPI may be overridden for inline images by explictly setting the + * image's width & height style attributes (i.e. if the image's native + * width is 600 pixels and you specify the image's width as 72 points, + * the image will have a DPI of 600 in the rendered PDF. The DPI of + * background images can not be overridden and is controlled entirely + * via this parameter. + * + * For the purposes of DOMPDF, pixels per inch (PPI) = dots per inch (DPI). + * If a size in html is given as px (or without unit as image size), + * this tells the corresponding size in pt. + * This adjusts the relative sizes to be similar to the rendering of the + * html page in a reference browser. + * + * In pdf, always 1 pt = 1/72 inch + * + * Rendering resolution of various browsers in px per inch: + * Windows Firefox and Internet Explorer: + * SystemControl->Display properties->FontResolution: Default:96, largefonts:120, custom:? + * Linux Firefox: + * about:config *resolution: Default:96 + * (xorg screen dimension in mm and Desktop font dpi settings are ignored) + * + * Take care about extra font/image zoom factor of browser. + * + * In images, size in pixel attribute, img css style, are overriding + * the real image dimension in px for rendering. + * + * @var int + */ +def("DOMPDF_DPI", 96); + +/** + * Enable inline PHP + * + * If this setting is set to true then DOMPDF will automatically evaluate + * inline PHP contained within tags. + * + * Enabling this for documents you do not trust (e.g. arbitrary remote html + * pages) is a security risk. Set this option to false if you wish to process + * untrusted documents. + * + * @var bool + */ +def("DOMPDF_ENABLE_PHP", false); + +/** + * Enable inline Javascript + * + * If this setting is set to true then DOMPDF will automatically insert + * JavaScript code contained within tags. + * + * @var bool + */ +def("DOMPDF_ENABLE_JAVASCRIPT", true); + +/** + * Enable remote file access + * + * If this setting is set to true, DOMPDF will access remote sites for + * images and CSS files as required. + * This is required for part of test case www/test/image_variants.html through www/examples.php + * + * Attention! + * This can be a security risk, in particular in combination with DOMPDF_ENABLE_PHP and + * allowing remote access to dompdf.php or on allowing remote html code to be passed to + * $dompdf = new DOMPDF(); $dompdf->load_html(...); + * This allows anonymous users to download legally doubtful internet content which on + * tracing back appears to being downloaded by your server, or allows malicious php code + * in remote html pages to be executed by your server with your account privileges. + * + * @var bool + */ +def("DOMPDF_ENABLE_REMOTE", false); + +/** + * The debug output log + * @var string + */ +def("DOMPDF_LOG_OUTPUT_FILE", DOMPDF_FONT_DIR."log.htm"); + +/** + * A ratio applied to the fonts height to be more like browsers' line height + */ +def("DOMPDF_FONT_HEIGHT_RATIO", 1.1); + +/** + * Enable CSS float + * + * Allows people to disabled CSS float support + * @var bool + */ +def("DOMPDF_ENABLE_CSS_FLOAT", false); + +/** + * DOMPDF autoload function + * + * If you have an existing autoload function, add a call to this function + * from your existing __autoload() implementation. + * + * @param string $class + */ +function DOMPDF_autoload($class) { + $filename = DOMPDF_INC_DIR . "/" . mb_strtolower($class) . ".cls.php"; + + if ( is_file($filename) ) + require_once($filename); +} + +// If SPL autoload functions are available (PHP >= 5.1.2) +if ( function_exists("spl_autoload_register") ) { + $autoload = "DOMPDF_autoload"; + $funcs = spl_autoload_functions(); + + // No functions currently in the stack. + if ( $funcs === false ) { + spl_autoload_register($autoload); + } + + // If PHP >= 5.3 the $prepend argument is available + else if ( version_compare(PHP_VERSION, '5.3', '>=') ) { + spl_autoload_register($autoload, true, true); + } + + else { + // Unregister existing autoloaders... + $compat = version_compare(PHP_VERSION, '5.1.2', '<=') && + version_compare(PHP_VERSION, '5.1.0', '>='); + + foreach ($funcs as $func) { + if (is_array($func)) { + // :TRICKY: There are some compatibility issues and some + // places where we need to error out + $reflector = new ReflectionMethod($func[0], $func[1]); + if (!$reflector->isStatic()) { + throw new Exception('This function is not compatible with non-static object methods due to PHP Bug #44144.'); + } + + // Suprisingly, spl_autoload_register supports the + // Class::staticMethod callback format, although call_user_func doesn't + if ($compat) $func = implode('::', $func); + } + + spl_autoload_unregister($func); + } + + // Register the new one, thus putting it at the front of the stack... + spl_autoload_register($autoload); + + // Now, go back and re-register all of our old ones. + foreach ($funcs as $func) { + spl_autoload_register($func); + } + + // Be polite and ensure that userland autoload gets retained + if ( function_exists("__autoload") ) { + spl_autoload_register("__autoload"); + } + } +} + +else if ( !function_exists("__autoload") ) { + /** + * Default __autoload() function + * + * @param string $class + */ + function __autoload($class) { + DOMPDF_autoload($class); + } +} + +// ### End of user-configurable options ### + + +/** + * Ensure that PHP is working with text internally using UTF8 character encoding. + */ +mb_internal_encoding('UTF-8'); + +/** + * Global array of warnings generated by DomDocument parser and + * stylesheet class + * + * @var array + */ +global $_dompdf_warnings; +$_dompdf_warnings = array(); + +/** + * If true, $_dompdf_warnings is dumped on script termination when using + * dompdf/dompdf.php or after rendering when using the DOMPDF class. + * When using the class, setting this value to true will prevent you from + * streaming the PDF. + * + * @var bool + */ +global $_dompdf_show_warnings; +$_dompdf_show_warnings = false; + +/** + * If true, the entire tree is dumped to stdout in dompdf.cls.php. + * Setting this value to true will prevent you from streaming the PDF. + * + * @var bool + */ +global $_dompdf_debug; +$_dompdf_debug = false; + +/** + * Array of enabled debug message types + * + * @var array + */ +global $_DOMPDF_DEBUG_TYPES; +$_DOMPDF_DEBUG_TYPES = array(); //array("page-break" => 1); + +/* Optionally enable different classes of debug output before the pdf content. + * Visible if displaying pdf as text, + * E.g. on repeated display of same pdf in browser when pdf is not taken out of + * the browser cache and the premature output prevents setting of the mime type. + */ +def('DEBUGPNG', false); +def('DEBUGKEEPTEMP', false); +def('DEBUGCSS', false); + +/* Layout debugging. Will display rectangles around different block levels. + * Visible in the PDF itself. + */ +def('DEBUG_LAYOUT', false); +def('DEBUG_LAYOUT_LINES', true); +def('DEBUG_LAYOUT_BLOCKS', true); +def('DEBUG_LAYOUT_INLINE', true); +def('DEBUG_LAYOUT_PADDINGBOX', true); diff --git a/application/third_party/dompdf/include/absolute_positioner.cls.php b/application/third_party/dompdf/include/absolute_positioner.cls.php new file mode 100755 index 00000000..ff8b6fa7 --- /dev/null +++ b/application/third_party/dompdf/include/absolute_positioner.cls.php @@ -0,0 +1,85 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id */ + +/** + * Positions absolutly positioned frames + */ +class Absolute_Positioner extends Positioner { + + function __construct(Frame_Decorator $frame) { parent::__construct($frame); } + + function position() { + + $frame = $this->_frame; + $style = $frame->get_style(); + $cb = $frame->get_containing_block(); + + $top = $style->length_in_pt($style->top, $cb["h"]); + $right = $style->length_in_pt($style->right, $cb["w"]); + $bottom = $style->length_in_pt($style->bottom, $cb["h"]); + $left = $style->length_in_pt($style->left, $cb["w"]); + + $p = $frame->find_positionned_parent(); + + if ( $p ) { + // Get the parent's padding box (see http://www.w3.org/TR/CSS21/visuren.html#propdef-top) + list($x, $y, $w, $h) = $p->get_padding_box(); + } else { + $x = $cb["x"]; + $y = $cb["y"]; + } + + if ( $top !== "auto" ) { + $y += $top; + } else if ( $bottom !== "auto" ) { + // FIXME: need to know this frame's height before we can do this correctly + } + + if ( $left !== "auto" ) { + $x += $left; + } else if ( $right !== "auto" ) { + // FIXME: need to know this frame's width before we can do this correctly + } + + $frame->set_position($x, $y); + + } +} \ No newline at end of file diff --git a/application/third_party/dompdf/include/abstract_renderer.cls.php b/application/third_party/dompdf/include/abstract_renderer.cls.php new file mode 100755 index 00000000..979e30e6 --- /dev/null +++ b/application/third_party/dompdf/include/abstract_renderer.cls.php @@ -0,0 +1,890 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - On background image + * - Clip invisible areas from background images, then merge identical + * image/size/offset to a single image. + * - Fix rounding of background image size. + * - Fix background image position given as percent + * - Check if identical image is already cached by cpdf. Then do not create + * duplicates to save memory and CPU time + * - Fix skipping of image repetition if area is too small + * - Do not create temporary files, but pass gd object directly + */ + +/* $Id: abstract_renderer.cls.php 361 2011-02-16 21:03:05Z fabien.menager $ */ + +/** + * Base renderer class + * + * @access private + * @package dompdf + */ +abstract class Abstract_Renderer { + + /** + * Rendering backend + * + * @var Canvas + */ + protected $_canvas; + + /** + * Current dompdf instance + * + * @var DOMPDF + */ + protected $_dompdf; + + /** + * Class constructor + * + * @param DOMPDF $dompdf The current dompdf instance + */ + function __construct(DOMPDF $dompdf) { + $this->_dompdf = $dompdf; + $this->_canvas = $dompdf->get_canvas(); + } + + /** + * Render a frame. + * + * Specialized in child classes + * + * @param Frame $frame The frame to render + */ + abstract function render(Frame $frame); + + //........................................................................ + + /** + * Render a background image over a rectangular area + * + * @param string $img The background image to load + * @param float $x The left edge of the rectangular area + * @param float $y The top edge of the rectangular area + * @param float $width The width of the rectangular area + * @param float $height The height of the rectangular area + * @param Style $style The associated Style object + */ + protected function _background_image($url, $x, $y, $width, $height, $style) { + $sheet = $style->get_stylesheet(); + + // Skip degenerate cases + if ( $width == 0 || $height == 0 ) + return; + + //debugpng + if (DEBUGPNG) print '[_background_image '.$url.']'; + + list($img, $ext) = Image_Cache::resolve_url($url, + $sheet->get_protocol(), + $sheet->get_host(), + $sheet->get_base_path()); + + // Bail if the image is no good + if ( $img === DOMPDF_LIB_DIR . "/res/broken_image.png" ) + return; + + //Try to optimize away reading and composing of same background multiple times + //Postponing read with imagecreatefrom ...() + //final composition paramters and name not known yet + //Therefore read dimension directly from file, instead of creating gd object first. + //$img_w = imagesx($src); $img_h = imagesy($src); + + list($img_w, $img_h) = dompdf_getimagesize($img); + if (!isset($img_w) || $img_w == 0 || !isset($img_h) || $img_h == 0) { + return; + } + + $repeat = $style->background_repeat; + $bg_color = $style->background_color; + + //Increase background resolution and dependent box size according to image resolution to be placed in + //Then image can be copied in without resize + $bg_width = round((float)($width * DOMPDF_DPI) / 72); + $bg_height = round((float)($height * DOMPDF_DPI) / 72); + + //Need %bg_x, $bg_y as background pos, where img starts, converted to pixel + + list($bg_x, $bg_y) = $style->background_position; + + if ( is_percent($bg_x) ) { + // The point $bg_x % from the left edge of the image is placed + // $bg_x % from the left edge of the background rectangle + $p = ((float)$bg_x)/100.0; + $x1 = $p * $img_w; + $x2 = $p * $bg_width; + + $bg_x = round($x2 - $x1); + } else { + $bg_x = round((float)($style->length_in_pt($bg_x)*DOMPDF_DPI) / 72); + } + + if ( is_percent($bg_y) ) { + // The point $bg_y % from the left edge of the image is placed + // $bg_y % from the left edge of the background rectangle + $p = ((float)$bg_y)/100.0; + $y1 = $p * $img_h; + $y2 = $p * $bg_height; + + $bg_y = round($y2 - $y1); + } else { + $bg_y = round((float)($style->length_in_pt($bg_y)*DOMPDF_DPI) / 72); + } + + //clip background to the image area on partial repeat. Nothing to do if img off area + //On repeat, normalize start position to the tile at immediate left/top or 0/0 of area + //On no repeat with positive offset: move size/start to have offset==0 + //Handle x/y Dimensions separately + + if ( $repeat !== "repeat" && $repeat !== "repeat-x" ) { + //No repeat x + if ($bg_x < 0) { + $bg_width = $img_w + $bg_x; + } else { + $x += ($bg_x * 72)/DOMPDF_DPI; + $bg_width = $bg_width - $bg_x; + if ($bg_width > $img_w) { + $bg_width = $img_w; + } + $bg_x = 0; + } + if ($bg_width <= 0) { + return; + } + $width = (float)($bg_width * 72)/DOMPDF_DPI; + } else { + //repeat x + if ($bg_x < 0) { + $bg_x = - ((-$bg_x) % $img_w); + } else { + $bg_x = $bg_x % $img_w; + if ($bg_x > 0) { + $bg_x -= $img_w; + } + } + } + + if ( $repeat !== "repeat" && $repeat !== "repeat-y" ) { + //no repeat y + if ($bg_y < 0) { + $bg_height = $img_h + $bg_y; + } else { + $y += ($bg_y * 72)/DOMPDF_DPI; + $bg_height = $bg_height - $bg_y; + if ($bg_height > $img_h) { + $bg_height = $img_h; + } + $bg_y = 0; + } + if ($bg_height <= 0) { + return; + } + $height = (float)($bg_height * 72)/DOMPDF_DPI; + } else { + //repeat y + if ($bg_y < 0) { + $bg_y = - ((-$bg_y) % $img_h); + } else { + $bg_y = $bg_y % $img_h; + if ($bg_y > 0) { + $bg_y -= $img_h; + } + } + } + + //Optimization, if repeat has no effect + if ( $repeat === "repeat" && $bg_y <= 0 && $img_h+$bg_y >= $bg_height ) { + $repeat = "repeat-x"; + } + if ( $repeat === "repeat" && $bg_x <= 0 && $img_w+$bg_x >= $bg_width ) { + $repeat = "repeat-y"; + } + if ( ($repeat === "repeat-x" && $bg_x <= 0 && $img_w+$bg_x >= $bg_width) || + ($repeat === "repeat-y" && $bg_y <= 0 && $img_h+$bg_y >= $bg_height) ) { + $repeat = "no-repeat"; + } + + //Use filename as indicator only + //different names for different variants to have different copies in the pdf + //This is not dependent of background color of box! .'_'.(is_array($bg_color) ? $bg_color["hex"] : $bg_color) + //Note: Here, bg_* are the start values, not end values after going through the tile loops! + + $filedummy = $img; + + /* + //Make shorter strings with limited characters for cache associative array index - needed? + //Strip common base path - server root, explicite temp, default temp; remove unwanted characters; + $filedummy = strtr($filedummy,"\\:","//"); + $p = strtr($_SERVER["DOCUMENT_ROOT"],"\\:","//"); + $l = strlen($p); + if ( substr($filedummy,0,$l) == $p) { + $filedummy = substr($filedummy,$l); + } else { + $p = strtr(DOMPDF_TEMP_DIR,"\\:","//"); + $l = strlen($p); + if ( substr($filedummy,0,$l) == $p) { + $filedummy = substr($filedummy,$l); + } else { + $p = strtr(sys_get_temp_dir(),"\\:","//"); + $l = strlen($p); + if ( substr($filedummy,0,$l) == $p) { + $filedummy = substr($filedummy,$l); + } + } + } + */ + + $filedummy .= '_'.$bg_width.'_'.$bg_height.'_'.$bg_x.'_'.$bg_y.'_'.$repeat; + //debugpng + //if (DEBUGPNG) print '
[_background_image name '.$filedummy.']
'; + + //Optimization to avoid multiple times rendering the same image. + //If check functions are existing and identical image already cached, + //then skip creation of duplicate, because it is not needed by addImagePng + if ( method_exists( $this->_canvas, "get_cpdf" ) && + method_exists( $this->_canvas->get_cpdf(), "addImagePng" ) && + method_exists( $this->_canvas->get_cpdf(), "image_iscached" ) && + $this->_canvas->get_cpdf()->image_iscached($filedummy) ) { + $bg = null; + + //debugpng + //if (DEBUGPNG) print '[_background_image skip]'; + } + + else { + + // Create a new image to fit over the background rectangle + $bg = imagecreatetruecolor($bg_width, $bg_height); + + //anyway default + //imagealphablending($img, true); + + switch (strtolower($ext)) { + case "png": + $src = imagecreatefrompng($img); + break; + + case "jpg": + case "jpeg": + $src = imagecreatefromjpeg($img); + break; + + case "gif": + $src = imagecreatefromgif($img); + break; + + case "bmp": + $src = imagecreatefrombmp($img); + break; + + default: return; // Unsupported image type + } + + if ($src == null) { + return; + } + + //Background color if box is not relevant here + //Non transparent image: box clipped to real size. Background non relevant. + //Transparent image: The image controls the transparency and lets shine through whatever background. + //However on transparent imaage preset the composed image with the transparency color, + //to keep the transparency when copying over the non transparent parts of the tiles. + $ti = imagecolortransparent($src); + + if ($ti >= 0) { + $tc = imagecolorsforindex($src,$ti); + $ti = imagecolorallocate($bg,$tc['red'],$tc['green'],$tc['blue']); + imagefill($bg,0,0,$ti); + imagecolortransparent($bg, $ti); + } + + //This has only an effect for the non repeatable dimension. + //compute start of src and dest coordinates of the single copy + if ( $bg_x < 0 ) { + $dst_x = 0; + $src_x = -$bg_x; + } else { + $src_x = 0; + $dst_x = $bg_x; + } + + if ( $bg_y < 0 ) { + $dst_y = 0; + $src_y = -$bg_y; + } else { + $src_y = 0; + $dst_y = $bg_y; + } + + //For historical reasons exchange meanings of variables: + //start_* will be the start values, while bg_* will be the temporary start values in the loops + $start_x = $bg_x; + $start_y = $bg_y; + + // Copy regions from the source image to the background + if ( $repeat === "no-repeat" ) { + + // Simply place the image on the background + imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $img_h); + + } else if ( $repeat === "repeat-x" ) { + + for ( $bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w ) { + if ( $bg_x < 0 ) { + $dst_x = 0; + $src_x = -$bg_x; + $w = $img_w + $bg_x; + } else { + $dst_x = $bg_x; + $src_x = 0; + $w = $img_w; + } + imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $img_h); + } + + } else if ( $repeat === "repeat-y" ) { + + for ( $bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h ) { + if ( $bg_y < 0 ) { + $dst_y = 0; + $src_y = -$bg_y; + $h = $img_h + $bg_y; + } else { + $dst_y = $bg_y; + $src_y = 0; + $h = $img_h; + } + imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $h); + + } + + } else if ( $repeat === "repeat" ) { + + for ( $bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h ) { + for ( $bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w ) { + + if ( $bg_x < 0 ) { + $dst_x = 0; + $src_x = -$bg_x; + $w = $img_w + $bg_x; + } else { + $dst_x = $bg_x; + $src_x = 0; + $w = $img_w; + } + + if ( $bg_y < 0 ) { + $dst_y = 0; + $src_y = -$bg_y; + $h = $img_h + $bg_y; + } else { + $dst_y = $bg_y; + $src_y = 0; + $h = $img_h; + } + imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $h); + } + } + } + + else { + print 'Unknown repeat!'; + } + + imagedestroy($src); + + } /* End optimize away creation of duplicates */ + + //img: image url string + //img_w, img_h: original image size in px + //width, height: box size in pt + //bg_width, bg_height: box size in px + //x, y: left/top edge of box on page in pt + //start_x, start_y: placement of image relativ to pattern + //$repeat: repeat mode + //$bg: GD object of result image + //$src: GD object of original image + //When using cpdf and optimization to direct png creation from gd object is available, + //don't create temp file, but place gd object directly into the pdf + if ( method_exists( $this->_canvas, "get_cpdf" ) && + method_exists( $this->_canvas->get_cpdf(), "addImagePng" ) ) { + // Note: CPDF_Adapter image converts y position + $this->_canvas->get_cpdf()->addImagePng($filedummy, $x, $this->_canvas->get_height() - $y - $height, $width, $height, $bg); + } + + else { + $tmp_file = tempnam(DOMPDF_TEMP_DIR, "bg_dompdf_img_").'.png'; + //debugpng + if (DEBUGPNG) print '[_background_image '.$tmp_file.']'; + + imagepng($bg, $tmp_file); + $this->_canvas->image($tmp_file, "png", $x, $y, $width, $height); + imagedestroy($bg); + + //debugpng + if (DEBUGPNG) print '[_background_image unlink '.$tmp_file.']'; + + if (!DEBUGKEEPTEMP) + unlink($tmp_file); + } + } + + protected function _get_dash_pattern($style, $width) { + $pattern = array(); + + switch ($style) { + default: + /*case "solid": + case "double": + case "groove": + case "inset": + case "outset": + case "ridge":*/ + case "none": break; + + case "dotted": + if ( $width < 2 ) + $pattern = array($width, 2); + else + $pattern = array($width); + break; + + case "dashed": + $pattern = array(3 * $width); + break; + } + + return $pattern; + } + + protected function _border_none($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") { + return; + } + + // Border rendering functions + protected function _border_dotted($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") { + list($top, $right, $bottom, $left) = $widths; + + $pattern = $this->_get_dash_pattern("dotted", $$side); + + switch ($side) { + + case "top": + $delta = $top / 2; + case "bottom": + $delta = isset($delta) ? $delta : -$bottom / 2; + $this->_canvas->line($x, $y + $delta, $x + $length, $y + $delta, $color, $$side, $pattern); + break; + + case "left": + $delta = $left / 2; + case "right": + $delta = isset($delta) ? $delta : - $right / 2; + $this->_canvas->line($x + $delta, $y, $x + $delta, $y + $length, $color, $$side, $pattern); + break; + + default: + return; + + } + } + + + protected function _border_dashed($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") { + list($top, $right, $bottom, $left) = $widths; + + $pattern = $this->_get_dash_pattern("dashed", $$side); + + switch ($side) { + + case "top": + $delta = $top / 2; + case "bottom": + $delta = isset($delta) ? $delta : -$bottom / 2; + $this->_canvas->line($x, $y + $delta, $x + $length, $y + $delta, $color, $$side, $pattern); + break; + + case "left": + $delta = $left / 2; + case "right": + $delta = isset($delta) ? $delta : - $right / 2; + $this->_canvas->line($x + $delta, $y, $x + $delta, $y + $length, $color, $$side, $pattern); + break; + + default: + return; + } + + } + + + protected function _border_solid($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") { + list($top, $right, $bottom, $left) = $widths; + + // All this polygon business is for beveled corners... + switch ($side) { + + case "top": + if ( $corner_style === "bevel" ) { + + $points = array($x, $y, + $x + $length, $y, + $x + $length - $right, $y + $top, + $x + $left, $y + $top); + $this->_canvas->polygon($points, $color, null, null, true); + } else + $this->_canvas->filled_rectangle($x, $y, $length, $top, $color); + + break; + + case "bottom": + if ( $corner_style === "bevel" ) { + $points = array($x, $y, + $x + $length, $y, + $x + $length - $right, $y - $bottom, + $x + $left, $y - $bottom); + $this->_canvas->polygon($points, $color, null, null, true); + } else + $this->_canvas->filled_rectangle($x, $y - $bottom, $length, $bottom, $color); + + break; + + case "left": + if ( $corner_style === "bevel" ) { + $points = array($x, $y, + $x, $y + $length, + $x + $left, $y + $length - $bottom, + $x + $left, $y + $top); + $this->_canvas->polygon($points, $color, null, null, true); + } else + $this->_canvas->filled_rectangle($x, $y, $left, $length, $color); + + break; + + case "right": + if ( $corner_style === "bevel" ) { + $points = array($x, $y, + $x, $y + $length, + $x - $right, $y + $length - $bottom, + $x - $right, $y + $top); + $this->_canvas->polygon($points, $color, null, null, true); + } else + $this->_canvas->filled_rectangle($x - $right, $y, $right, $length, $color); + + break; + + default: + return; + + } + + } + + + protected function _border_double($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") { + list($top, $right, $bottom, $left) = $widths; + + $line_width = $$side / 4; + + // We draw the outermost edge first. Points are ordered: outer left, + // outer right, inner right, inner left, or outer top, outer bottom, + // inner bottom, inner top. + switch ($side) { + + case "top": + if ( $corner_style === "bevel" ) { + $left_line_width = $left / 4; + $right_line_width = $right / 4; + + $points = array($x, $y, + $x + $length, $y, + $x + $length - $right_line_width, $y + $line_width, + $x + $left_line_width, $y + $line_width,); + $this->_canvas->polygon($points, $color, null, null, true); + + $points = array($x + $left - $left_line_width, $y + $top - $line_width, + $x + $length - $right + $right_line_width, $y + $top - $line_width, + $x + $length - $right, $y + $top, + $x + $left, $y + $top); + $this->_canvas->polygon($points, $color, null, null, true); + + } else { + $this->_canvas->filled_rectangle($x, $y, $length, $line_width, $color); + $this->_canvas->filled_rectangle($x, $y + $top - $line_width, $length, $line_width, $color); + + } + break; + + case "bottom": + if ( $corner_style === "bevel" ) { + $left_line_width = $left / 4; + $right_line_width = $right / 4; + + $points = array($x, $y, + $x + $length, $y, + $x + $length - $right_line_width, $y - $line_width, + $x + $left_line_width, $y - $line_width); + $this->_canvas->polygon($points, $color, null, null, true); + + $points = array($x + $left - $left_line_width, $y - $bottom + $line_width, + $x + $length - $right + $right_line_width, $y - $bottom + $line_width, + $x + $length - $right, $y - $bottom, + $x + $left, $y - $bottom); + $this->_canvas->polygon($points, $color, null, null, true); + + } else { + $this->_canvas->filled_rectangle($x, $y - $line_width, $length, $line_width, $color); + $this->_canvas->filled_rectangle($x, $y - $bottom, $length, $line_width, $color); + } + + break; + + case "left": + if ( $corner_style === "bevel" ) { + $top_line_width = $top / 4; + $bottom_line_width = $bottom / 4; + + $points = array($x, $y, + $x, $y + $length, + $x + $line_width, $y + $length - $bottom_line_width, + $x + $line_width, $y + $top_line_width); + $this->_canvas->polygon($points, $color, null, null, true); + + $points = array($x + $left - $line_width, $y + $top - $top_line_width, + $x + $left - $line_width, $y + $length - $bottom + $bottom_line_width, + $x + $left, $y + $length - $bottom, + $x + $left, $y + $top); + $this->_canvas->polygon($points, $color, null, null, true); + + } else { + $this->_canvas->filled_rectangle($x, $y, $line_width, $length, $color); + $this->_canvas->filled_rectangle($x + $left - $line_width, $y, $line_width, $length, $color); + } + + break; + + case "right": + if ( $corner_style === "bevel" ) { + $top_line_width = $top / 4; + $bottom_line_width = $bottom / 4; + + + $points = array($x, $y, + $x, $y + $length, + $x - $line_width, $y + $length - $bottom_line_width, + $x - $line_width, $y + $top_line_width); + $this->_canvas->polygon($points, $color, null, null, true); + + $points = array($x - $right + $line_width, $y + $top - $top_line_width, + $x - $right + $line_width, $y + $length - $bottom + $bottom_line_width, + $x - $right, $y + $length - $bottom, + $x - $right, $y + $top); + $this->_canvas->polygon($points, $color, null, null, true); + + } else { + $this->_canvas->filled_rectangle($x - $line_width, $y, $line_width, $length, $color); + $this->_canvas->filled_rectangle($x - $right, $y, $line_width, $length, $color); + } + + break; + + default: + return; + + } + + } + + protected function _border_groove($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") { + list($top, $right, $bottom, $left) = $widths; + + $half_widths = array($top / 2, $right / 2, $bottom / 2, $left / 2); + + $this->_border_inset($x, $y, $length, $color, $half_widths, $side); + + switch ($side) { + + case "top": + $x += $left / 2; + $y += $top / 2; + $length -= $left / 2 + $right / 2; + break; + + case "bottom": + $x += $left / 2; + $y -= $bottom / 2; + $length -= $left / 2 + $right / 2; + break; + + case "left": + $x += $left / 2; + $y += $top / 2; + $length -= $top / 2 + $bottom / 2; + break; + + case "right": + $x -= $right / 2; + $y += $top / 2; + $length -= $top / 2 + $bottom / 2; + break; + + default: + return; + + } + + $this->_border_outset($x, $y, $length, $color, $half_widths, $side); + + } + + protected function _border_ridge($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") { + list($top, $right, $bottom, $left) = $widths; + + $half_widths = array($top / 2, $right / 2, $bottom / 2, $left / 2); + + $this->_border_outset($x, $y, $length, $color, $half_widths, $side); + + switch ($side) { + + case "top": + $x += $left / 2; + $y += $top / 2; + $length -= $left / 2 + $right / 2; + break; + + case "bottom": + $x += $left / 2; + $y -= $bottom / 2; + $length -= $left / 2 + $right / 2; + break; + + case "left": + $x += $left / 2; + $y += $top / 2; + $length -= $top / 2 + $bottom / 2; + break; + + case "right": + $x -= $right / 2; + $y += $top / 2; + $length -= $top / 2 + $bottom / 2; + break; + + default: + return; + + } + + $this->_border_inset($x, $y, $length, $color, $half_widths, $side); + + } + + protected function _tint($c) { + if ( !is_numeric($c) ) + return $c; + + return min(1, $c + 0.16); + } + + protected function _shade($c) { + if ( !is_numeric($c) ) + return $c; + + return max(0, $c - 0.33); + } + + protected function _border_inset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") { + list($top, $right, $bottom, $left) = $widths; + + switch ($side) { + + case "top": + case "left": + $shade = array_map(array($this, "_shade"), $color); + $this->_border_solid($x, $y, $length, $shade, $widths, $side); + break; + + case "bottom": + case "right": + $tint = array_map(array($this, "_tint"), $color); + $this->_border_solid($x, $y, $length, $tint, $widths, $side); + break; + + default: + return; + } + } + + protected function _border_outset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") { + list($top, $right, $bottom, $left) = $widths; + + switch ($side) { + case "top": + case "left": + $tint = array_map(array($this, "_tint"), $color); + $this->_border_solid($x, $y, $length, $tint, $widths, $side); + break; + + case "bottom": + case "right": + $shade = array_map(array($this, "_shade"), $color); + $this->_border_solid($x, $y, $length, $shade, $widths, $side); + break; + + default: + return; + + } + } + + protected function _set_opacity($opacity) { + if ( is_numeric($opacity) && $opacity <= 1.0 && $opacity >= 0.0 ) { + $this->_canvas->set_opacity( $opacity ); + } + } + + protected function _debug_layout($box, $color = "red", $style = array()) { + $this->_canvas->rectangle($box[0], $box[1], $box[2], $box[3], CSS_Color::parse($color), 0.1, $style); + } + //........................................................................ +} diff --git a/application/third_party/dompdf/include/attribute_translator.cls.php b/application/third_party/dompdf/include/attribute_translator.cls.php new file mode 100755 index 00000000..87503fea --- /dev/null +++ b/application/third_party/dompdf/include/attribute_translator.cls.php @@ -0,0 +1,481 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: attribute_translator.cls.php 346 2011-01-09 13:23:22Z fabien.menager $ */ + +/** + * Translates HTML 4.0 attributes into CSS rules + * + * @access private + * @package dompdf + */ +class Attribute_Translator { + + // Munged data originally from + // http://www.w3.org/TR/REC-html40/index/attributes.html + // + // thank you var_export() :D + static private $__ATTRIBUTE_LOOKUP = array( + //'caption' => array ( 'align' => '', ), + 'img' => array( + 'align' => array( + 'bottom' => 'vertical-align: baseline;', + 'middle' => 'vertical-align: middle;', + 'top' => 'vertical-align: top;', + 'left' => 'float: left;', + 'right' => 'float: right;' + ), + 'border' => 'border-width: %0.2F px;', + 'height' => 'height: %s px;', + 'hspace' => 'padding-left: %1$0.2F px; padding-right: %1$0.2F px;', + 'vspace' => 'padding-top: %1$0.2F px; padding-bottom: %1$0.2F px;', + 'width' => 'width: %s px;', + ), + 'table' => array( + 'align' => array( + 'left' => 'margin-left: 0; margin-right: auto;', + 'center' => 'margin-left: auto; margin-right: auto;', + 'right' => 'margin-left: auto; margin-right: 0;' + ), + 'bgcolor' => 'background-color: %s;', + 'border' => '!set_table_border', + 'cellpadding' => '!set_table_cellpadding', + 'cellspacing' => 'border-spacing: %0.2F; border-collapse: separate;', + 'frame' => array( + 'void' => 'border-style: none;', + 'above' => 'border-top-style: solid;', + 'below' => 'border-bottom-style: solid;', + 'hsides' => 'border-left-style: solid; border-right-style: solid;', + 'vsides' => 'border-top-style: solid; border-bottom-style: solid;', + 'lhs' => 'border-left-style: solid;', + 'rhs' => 'border-right-style: solid;', + 'box' => 'border-style: solid;', + 'border' => 'border-style: solid;' + ), + 'rules' => '!set_table_rules', + 'width' => 'width: %s;', + ), + 'hr' => array( + 'align' => '!set_hr_align', // Need to grab width to set 'left' & 'right' correctly + 'noshade' => 'border-style: solid;', + 'size' => 'border-width: %0.2F px;', + 'width' => 'width: %s;', + ), + 'div' => array( + 'align' => 'text-align: %s;', + ), + 'h1' => array( + 'align' => 'text-align: %s;', + ), + 'h2' => array( + 'align' => 'text-align: %s;', + ), + 'h3' => array( + 'align' => 'text-align: %s;', + ), + 'h4' => array( + 'align' => 'text-align: %s;', + ), + 'h5' => array( + 'align' => 'text-align: %s;', + ), + 'h6' => array( + 'align' => 'text-align: %s;', + ), + 'p' => array( + 'align' => 'text-align: %s;', + ), +// 'col' => array( +// 'align' => '', +// 'valign' => '', +// ), +// 'colgroup' => array( +// 'align' => '', +// 'valign' => '', +// ), + 'tbody' => array( + 'align' => '!set_table_row_align', + 'valign' => '!set_table_row_valign', + ), + 'td' => array( + 'align' => 'text-align: %s;', + 'bgcolor' => 'background-color: %s;', + 'height' => 'height: %s;', + 'nowrap' => 'white-space: nowrap;', + 'valign' => 'vertical-align: %s;', + 'width' => 'width: %s;', + ), + 'tfoot' => array( + 'align' => '!set_table_row_align', + 'valign' => '!set_table_row_valign', + ), + 'th' => array( + 'align' => 'text-align: %s;', + 'bgcolor' => 'background-color: %s;', + 'height' => 'height: %s;', + 'nowrap' => 'white-space: nowrap;', + 'valign' => 'vertical-align: %s;', + 'width' => 'width: %s;', + ), + 'thead' => array( + 'align' => '!set_table_row_align', + 'valign' => '!set_table_row_valign', + ), + 'tr' => array( + 'align' => '!set_table_row_align', + 'bgcolor' => '!set_table_row_bgcolor', + 'valign' => '!set_table_row_valign', + ), + 'body' => array( + 'background' => 'background-image: url(%s);', + 'bgcolor' => 'background-color: %s;', + 'link' => '!set_body_link', + 'text' => 'color: %s;', + ), + 'br' => array( + 'clear' => 'clear: %s;', + ), + 'basefont' => array( + 'color' => 'color: %s;', + 'face' => 'font-family: %s;', + 'size' => '!set_basefont_size', + ), + 'font' => array( + 'color' => 'color: %s;', + 'face' => 'font-family: %s;', + 'size' => '!set_font_size', + ), + 'dir' => array( + 'compact' => 'margin: 0.5em 0;', + ), + 'dl' => array( + 'compact' => 'margin: 0.5em 0;', + ), + 'menu' => array( + 'compact' => 'margin: 0.5em 0;', + ), + 'ol' => array( + 'compact' => 'margin: 0.5em 0;', + 'start' => 'counter-reset: -dompdf-default-counter %d;', + 'type' => 'list-style-type: %s;', + ), + 'ul' => array( + 'compact' => 'margin: 0.5em 0;', + 'type' => 'list-style-type: %s;', + ), + 'li' => array( + 'type' => 'list-style-type: %s;', + 'value' => 'counter-reset: -dompdf-default-counter %d;', + ), + 'pre' => array( + 'width' => 'width: %s;', + ), + ); + + + static protected $_last_basefont_size = 3; + static protected $_font_size_lookup = array( + // For basefont support + -3 => "4pt", + -2 => "5pt", + -1 => "6pt", + 0 => "7pt", + + 1 => "8pt", + 2 => "10pt", + 3 => "12pt", + 4 => "14pt", + 5 => "18pt", + 6 => "24pt", + 7 => "34pt", + + // For basefont support + 8 => "48pt", + 9 => "44pt", + 10 => "52pt", + 11 => "60pt", + ); + + + static function translate_attributes($frame) { + $node = $frame->get_node(); + $tag = $node->tagName; + + if ( !isset(self::$__ATTRIBUTE_LOOKUP[$tag]) ) + return; + + $valid_attrs = self::$__ATTRIBUTE_LOOKUP[$tag]; + $attrs = $node->attributes; + $style = rtrim($node->getAttribute("style"), "; "); + if ( $style != "" ) + $style .= ";"; + + foreach ($attrs as $attr => $attr_node ) { + if ( !isset($valid_attrs[$attr]) ) + continue; + + $value = $attr_node->value; + + $target = $valid_attrs[$attr]; + + // Look up $value in $target, if $target is an array: + if ( is_array($target) ) { + + if ( isset($target[$value]) ) + $style .= " " . self::_resolve_target($node, $target[$value], $value); + + } else { + // otherwise use target directly + $style .= " " . self::_resolve_target($node, $target, $value); + } + } + if ( !is_null($style) ) { + $style = ltrim($style); + $node->setAttribute("style", $style); + } + + } + + static protected function _resolve_target($node, $target, $value) { + if ( $target[0] === "!" ) { + // Function call + $func = "_" . mb_substr($target, 1); + return self::$func($node, $value); + } + + return $value ? sprintf($target, $value) : ""; + } + + //..................................................................... + + static protected function _set_table_cellpadding($node, $value) { + $td_list = $node->getElementsByTagName("td"); + foreach ($td_list as $td) { + $style = rtrim($td->getAttribute("style"), ";"); + $style .= "; padding: $value" . "px;"; + $style = ltrim($style, ";"); + $td->setAttribute("style", $style); + } + return null; + } + + static protected function _set_table_border($node, $value) { + $td_list = $node->getElementsByTagName("td"); + foreach ($td_list as $td) { + $style = $td->getAttribute("style"); + if ( strpos($style, "border") !== false ) + continue; + $style = rtrim($style, ";"); + $style .= "; border-width: " . ($value > 0 ? 1 : 0) . "pt; border-style: inset;"; + $style = ltrim($style, ";"); + $td->setAttribute("style", $style); + } + + $th_list = $node->getElementsByTagName("th"); + foreach ($th_list as $th) { + $style = $th->getAttribute("style"); + if ( strpos($style, "border") !== false ) + continue; + $style = rtrim($style, ";"); + $style .= "; border-width: " . ($value > 0 ? 1 : 0) . "pt; border-style: inset;"; + $style = ltrim($style, ";"); + $th->setAttribute("style", $style); + } + + $style = rtrim($node->getAttribute("style"),";"); + $style .= "; border-width: $value" . "px; "; + return ltrim($style, "; "); + } + + static protected function _set_table_cellspacing($node, $value) { + $style = rtrim($node->getAttribute($style), ";"); + + if ( $value == 0 ) + $style .= "; border-collapse: collapse;"; + + else + $style = "; border-collapse: separate;"; + + return ltrim($style, ";"); + } + + static protected function _set_table_rules($node, $value) { + $new_style = "; border-collapse: collapse;"; + switch ($value) { + case "none": + $new_style .= "border-style: none;"; + break; + + case "groups": + // FIXME: unsupported + return; + + case "rows": + $new_style .= "border-style: solid none solid none; border-width: 1px; "; + break; + + case "cols": + $new_style .= "border-style: none solid none solid; border-width: 1px; "; + break; + + case "all": + $new_style .= "border-style: solid; border-width: 1px; "; + break; + + default: + // Invalid value + return null; + } + + $td_list = $node->getElementsByTagName("td"); + + foreach ($td_list as $td) { + $style = $td->getAttribute("style"); + $style .= $new_style; + $td->setAttribute("style", $style); + } + return null; + } + + static protected function _set_hr_align($node, $value) { + $style = rtrim($node->getAttribute("style"),";"); + $width = $node->getAttribute("width"); + if ( $width == "" ) + $width = "100%"; + + $remainder = 100 - (double)rtrim($width, "% "); + + switch ($value) { + case "left": + $style .= "; margin-right: $remainder %;"; + break; + + case "right": + $style .= "; margin-left: $remainder %;"; + break; + + case "center": + $style .= "; margin-left: auto; margin-right: auto;"; + break; + + default: + return null; + } + return ltrim($style, "; "); + } + + static protected function _set_table_row_align($node, $value) { + + $td_list = $node->getElementsByTagName("td"); + + foreach ($td_list as $td) { + $style = rtrim($td->getAttribute("style"), ";"); + $style .= "; text-align: $value;"; + $style = ltrim($style, "; "); + $td->setAttribute("style", $style); + } + + return null; + } + + static protected function _set_table_row_valign($node, $value) { + + $td_list = $node->getElementsByTagName("td"); + + foreach ($td_list as $td) { + $style = rtrim($td->getAttribute("style"), ";"); + $style .= "; vertical-align: $value;"; + $style = ltrim($style, "; "); + $td->setAttribute("style", $style); + } + + return null; + } + + static protected function _set_table_row_bgcolor($node, $value) { + + $td_list = $node->getElementsByTagName("td"); + + foreach ($td_list as $td) { + $style = rtrim($td->getAttribute("style"), ";"); + $style .= "; background-color: $value;"; + $style = ltrim($style, "; "); + $td->setAttribute("style", $style); + } + + return null; + } + + static protected function _set_body_link($node, $value) { + + $a_list = $node->getElementsByTagName("a"); + + foreach ($a_list as $a) { + $style = rtrim($a->getAttribute("style"), ";"); + $style .= "; color: $value;"; + $style = ltrim($style, "; "); + $a->setAttribute("style", $style); + } + + return null; + } + + static protected function _set_basefont_size($node, $value) { + // FIXME: ? we don't actually set the font size of anything here, just + // the base size for later modification by tags. + self::$_last_basefont_size = $value; + return null; + } + + static protected function _set_font_size($node, $value) { + $style = $node->getAttribute("style"); + + if ( $value[0] === "-" || $value[0] === "+" ) + $value = self::$_last_basefont_size + (int)$value; + + if ( isset(self::$_font_size_lookup[$value]) ) + $style .= "; font-size: " . self::$_font_size_lookup[$value] . ";"; + else + $style .= "; font-size: $value;"; + + return ltrim($style, "; "); + + } + +} diff --git a/application/third_party/dompdf/include/block_frame_decorator.cls.php b/application/third_party/dompdf/include/block_frame_decorator.cls.php new file mode 100755 index 00000000..c03ff7b9 --- /dev/null +++ b/application/third_party/dompdf/include/block_frame_decorator.cls.php @@ -0,0 +1,354 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: block_frame_decorator.cls.php 358 2011-01-30 22:22:47Z fabien.menager $ */ + +/** + * Decorates frames for block layout + * + * @access private + * @package dompdf + */ +class Block_Frame_Decorator extends Frame_Decorator { + + const DEFAULT_COUNTER = "-dompdf-default-counter"; + + protected $_lines; // array( [num] => array([frames] => array(), + // y, w, h) ) + protected $_counters; // array([id] => counter_value) (for generated content) + protected $_cl; // current line index + + static protected $_initial_line_state = array( + "frames" => array(), + "wc" => 0, + "y" => null, + "w" => 0, + "h" => 0, + "left" => 0, + "right" => 0, + "tallest_frame" => null, + "br" => false, + ); + + //........................................................................ + + function __construct(Frame $frame, DOMPDF $dompdf) { + parent::__construct($frame, $dompdf); + + $this->_lines = array(self::$_initial_line_state); + + $this->_counters = array(self::DEFAULT_COUNTER => 0); + $this->_cl = 0; + } + + //........................................................................ + + function reset() { + parent::reset(); + + $this->_lines = array(self::$_initial_line_state); + + $this->_counters = array(self::DEFAULT_COUNTER => 0); + $this->_cl = 0; + } + + //........................................................................ + + // Accessor methods + + function get_current_line($i = null) { + $cl = $this->_lines[$this->_cl]; + if ( isset($i) ) + return $cl[$i]; + return $cl; + } + + function get_current_line_number() { + return $this->_cl; + } + + function get_lines() { return $this->_lines; } + + //........................................................................ + + // Set methods + function set_current_line($y = null, $w = null, $h = null, $tallest_frame = null, $left = null, $right = null) { + $this->set_line($this->_cl, $y, $w, $h, $tallest_frame, $left, $right); + } + + function clear_line($i) { + if ( isset($this->_lines[$i]) ) + unset($this->_lines[$i]); + } + + function set_line($lineno, $y = null, $w = null, $h = null, $tallest_frame = null, $left = null, $right = null) { + + if ( is_array($y) ) + extract($y); + + if (is_numeric($y)) + $this->_lines[$lineno]["y"] = $y; + + if (is_numeric($w)) + $this->_lines[$lineno]["w"] = $w; + + if (is_numeric($h)) + $this->_lines[$lineno]["h"] = $h; + + if ($tallest_frame && $tallest_frame instanceof Frame) + $this->_lines[$lineno]["tallest_frame"] = $tallest_frame; + + if (is_numeric($left)) + $this->_lines[$lineno]["left"] = $left; + + if (is_numeric($right)) + $this->_lines[$lineno]["right"] = $right; + } + + + function add_frame_to_line(Frame $frame) { + $style = $frame->get_style(); + + if ( in_array($style->position, array("absolute", "fixed")) || + (DOMPDF_ENABLE_CSS_FLOAT && $style->float !== "none") ) { + return; + } + + $frame->set_containing_line($this->_lines[$this->_cl]); + + /* + // Adds a new line after a block, only if certain conditions are met + if ((($frame instanceof Inline_Frame_Decorator && $frame->get_node()->nodeName !== "br") || + $frame instanceof Text_Frame_Decorator && trim($frame->get_text())) && + ($frame->get_prev_sibling() && $frame->get_prev_sibling()->get_style()->display === "block" && + $this->_lines[$this->_cl]["w"] > 0 )) { + + $this->maximize_line_height( $style->length_in_pt($style->line_height), $frame ); + $this->add_line(); + + // Add each child of the inline frame to the line individually + foreach ($frame->get_children() as $child) + $this->add_frame_to_line( $child ); + } + else*/ + + // Handle inline frames (which are effectively wrappers) + if ( $frame instanceof Inline_Frame_Decorator ) { + + // Handle line breaks + if ( $frame->get_node()->nodeName === "br" ) { + $this->maximize_line_height( $style->length_in_pt($style->line_height), $frame ); + $this->add_line(true); + } + + return; + } + + // Trim leading text if this is an empty line. Kinda a hack to put it here, + // but what can you do... + if ( $this->_lines[$this->_cl]["w"] == 0 && + $frame->get_node()->nodeName === "#text" && + ($style->white_space !== "pre" || + $style->white_space !== "pre-wrap") ) { + + $frame->set_text( ltrim($frame->get_text()) ); + $frame->recalculate_width(); + } + + $w = $frame->get_margin_width(); + + if ( $w == 0 ) + return; + + // Debugging code: + /* + pre_r("\n

Adding frame to line:

"); + + // pre_r("Me: " . $this->get_node()->nodeName . " (" . spl_object_hash($this->get_node()) . ")"); + // pre_r("Node: " . $frame->get_node()->nodeName . " (" . spl_object_hash($frame->get_node()) . ")"); + if ( $frame->get_node()->nodeName === "#text" ) + pre_r('"'.$frame->get_node()->nodeValue.'"'); + + pre_r("Line width: " . $this->_lines[$this->_cl]["w"]); + pre_r("Frame: " . get_class($frame)); + pre_r("Frame width: " . $w); + pre_r("Frame height: " . $frame->get_margin_height()); + pre_r("Containing block width: " . $this->get_containing_block("w")); + */ + // End debugging + + $line = $this->_lines[$this->_cl]; + if ( $line["left"] + $line["w"] + $line["right"] + $w > $this->get_containing_block("w")) + $this->add_line(); + + $frame->position(); + + $current_line = &$this->_lines[$this->_cl]; + + $current_line["frames"][] = $frame; + + if ( $frame->get_node()->nodeName === "#text") + $current_line["wc"] += count(preg_split("/\s+/", trim($frame->get_text()))); + + $this->increase_line_width($w); + + $this->maximize_line_height($frame->get_margin_height(), $frame); + } + + function remove_frames_from_line(Frame $frame) { + // Search backwards through the lines for $frame + $i = $this->_cl; + + while ($i >= 0) { + if ( ($j = in_array($frame, $this->_lines[$i]["frames"], true)) !== false ) + break; + $i--; + } + + if ( $j === false ) + return; + + // Remove $frame and all frames that follow + while ($j < count($this->_lines[$i]["frames"])) { + $f = $this->_lines[$i]["frames"][$j]; + $this->_lines[$i]["frames"][$j] = null; + unset($this->_lines[$i]["frames"][$j]); + $j++; + $this->_lines[$i]["w"] -= $f->get_margin_width(); + } + + // Recalculate the height of the line + $h = 0; + foreach ($this->_lines[$i]["frames"] as $f) + $h = max( $h, $f->get_margin_height() ); + + $this->_lines[$i]["h"] = $h; + + // Remove all lines that follow + while ($this->_cl > $i) { + $this->_lines[ $this->_cl ] = null; + unset($this->_lines[ $this->_cl ]); + $this->_cl--; + } + } + + function increase_line_width($w) { + $this->_lines[ $this->_cl ]["w"] += $w; + } + + function maximize_line_height($val, Frame $frame) { + if ( $val > $this->_lines[ $this->_cl ]["h"] ) { + $this->_lines[ $this->_cl ]["tallest_frame"] = $frame; + $this->_lines[ $this->_cl ]["h"] = $val; + } + } + + function add_line($br = false) { + +// if ( $this->_lines[$this->_cl]["h"] == 0 ) //count($this->_lines[$i]["frames"]) == 0 || +// return; + + $this->_lines[$this->_cl]["br"] = $br; + $y = $this->_lines[$this->_cl]["y"] + $this->_lines[$this->_cl]["h"]; + + $new_line = self::$_initial_line_state; + $new_line["y"] = $y; + + $this->_lines[ ++$this->_cl ] = $new_line; + } + + //........................................................................ + + function reset_counter($id = self::DEFAULT_COUNTER, $value = 0) { + $this->_counters[$id] = $value; + } + + function increment_counter($id = self::DEFAULT_COUNTER, $increment = 1) { + if ( !isset($this->_counters[$id]) ) + $this->_counters[$id] = $increment; + else + $this->_counters[$id] += $increment; + } + + // TODO: What version is the best : this one or the one in List_Bullet_Renderer ? + function counter_value($id = self::DEFAULT_COUNTER, $type = "decimal") { + $type = mb_strtolower($type); + + if ( $id === "page" ) { + $value = $this->get_dompdf()->get_canvas()->get_page_number(); + } + elseif ( !isset($this->_counters[$id]) ) { + $this->_counters[$id] = 0; + $value = 0; + } + else { + $value = $this->_counters[$id]; + } + + switch ($type) { + + default: + case "decimal": + return $value; + + case "decimal-leading-zero": + return str_pad($value, 2, "0"); + + case "lower-roman": + return dec2roman($value); + + case "upper-roman": + return mb_strtoupper(dec2roman($value)); + + case "lower-latin": + case "lower-alpha": + return chr( ($value % 26) + ord('a') - 1); + + case "upper-latin": + case "upper-alpha": + return chr( ($value % 26) + ord('A') - 1); + + case "lower-greek": + return unichr($value + 944); + + case "upper-greek": + return unichr($value + 912); + } + } +} diff --git a/application/third_party/dompdf/include/block_frame_reflower.cls.php b/application/third_party/dompdf/include/block_frame_reflower.cls.php new file mode 100755 index 00000000..c2350bd9 --- /dev/null +++ b/application/third_party/dompdf/include/block_frame_reflower.cls.php @@ -0,0 +1,756 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: block_frame_reflower.cls.php 358 2011-01-30 22:22:47Z fabien.menager $ */ + +/** + * Reflows block frames + * + * @access private + * @package dompdf + */ +class Block_Frame_Reflower extends Frame_Reflower { + // Minimum line width to justify, as fraction of available width + const MIN_JUSTIFY_WIDTH = 0.80; + + /** + * @var Block_Frame_Decorator + */ + protected $_frame; + + function __construct(Block_Frame_Decorator $frame) { parent::__construct($frame); } + + /** + * Calculate the ideal used value for the width property as per: + * http://www.w3.org/TR/CSS21/visudet.html#Computing_widths_and_margins + * + * @param float $width + * @return array + */ + protected function _calculate_width($width) { + $style = $this->_frame->get_style(); + $w = $this->_frame->get_containing_block("w"); + + if( $style->position === "fixed" ) + $w = $this->_frame->get_parent()->get_containing_block("w"); + + $rm = $style->length_in_pt($style->margin_right, $w); + $lm = $style->length_in_pt($style->margin_left, $w); + + $left = $style->length_in_pt($style->left, $w); + $right = $style->length_in_pt($style->right, $w); + + // Handle 'auto' values + $dims = array($style->border_left_width, + $style->border_right_width, + $style->padding_left, + $style->padding_right, + $width !== "auto" ? $width : 0, + $rm !== "auto" ? $rm : 0, + $lm !== "auto" ? $lm : 0); + + // absolutely positioned boxes take the 'left' and 'right' properties into account + if ( $style->position === "absolute" || $style->position === "fixed" ) { + $absolute = true; + $dims[] = $left !== "auto" ? $left : 0; + $dims[] = $right !== "auto" ? $right : 0; + } else { + $absolute = false; + } + + $sum = $style->length_in_pt($dims, $w); + + // Compare to the containing block + $diff = $w - $sum; + + if ( $diff > 0 ) { + + if ( $absolute ) { + + // resolve auto properties: see + // http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-width + + if ( $width === "auto" && $left === "auto" && $right === "auto" ) { + + if ( $lm === "auto" ) + $lm = 0; + if ( $rm === "auto" ) + $rm = 0; + + // Technically, the width should be "shrink-to-fit" i.e. based on the + // preferred width of the content... a little too costly here as a + // special case. Just get the width to take up the slack: + $left = 0; + $right = 0; + $width = $diff; + + } else if ( $width === "auto" ) { + + if ( $lm === "auto" ) + $lm = 0; + if ( $rm === "auto" ) + $rm = 0; + if ( $left === "auto" ) + $left = 0; + if ( $right === "auto" ) + $right = 0; + + $width = $diff; + + } else if ( $left === "auto" ) { + + if ( $lm === "auto" ) + $lm = 0; + if ( $rm === "auto" ) + $rm = 0; + if ( $right === "auto" ) + $right = 0; + + $left = $diff; + + } else if ( $right === "auto" ) { + + if ( $lm === "auto" ) + $lm = 0; + if ( $rm === "auto" ) + $rm = 0; + + $right = $diff; + } + + } else { + + // Find auto properties and get them to take up the slack + if ( $width === "auto" ) + $width = $diff; + + else if ( $lm === "auto" && $rm === "auto" ) + $lm = $rm = round($diff / 2); + + else if ( $lm === "auto" ) + $lm = $diff; + + else if ( $rm === "auto" ) + $rm = $diff; + } + + } else if ($diff < 0) { + + // We are over constrained--set margin-right to the difference + $rm = $diff; + + } + + return array("width"=> $width, "margin_left" => $lm, "margin_right" => $rm, "left" => $left, "right" => $right); + } + + /** + * Call the above function, but resolve max/min widths + * @return array + */ + protected function _calculate_restricted_width() { + $frame = $this->_frame; + $style = $frame->get_style(); + $cb = $frame->get_containing_block(); + + if ( $style->position === "fixed" ) + $cb = $frame->get_root()->get_containing_block(); + + //if ( $style->position === "absolute" ) + // $cb = $frame->find_positionned_parent()->get_containing_block(); + + if ( !isset($cb["w"]) ) + throw new DOMPDF_Exception("Box property calculation requires containing block width"); + + // Treat width 100% as auto + if ( $style->width === "100%" ) { + $width = "auto"; + } + else { + $width = $style->length_in_pt($style->width, $cb["w"]); + } + extract($this->_calculate_width($width)); + + // Handle min/max width + $min_width = $style->length_in_pt($style->min_width, $cb["w"]); + $max_width = $style->length_in_pt($style->max_width, $cb["w"]); + + if ( $max_width !== "none" && $min_width > $max_width) + // Swap 'em + list($max_width, $min_width) = array($min_width, $max_width); + + if ( $max_width !== "none" && $width > $max_width ) + extract($this->_calculate_width($max_width)); + + if ( $width < $min_width ) + extract($this->_calculate_width($min_width)); + + return array($width, $margin_left, $margin_right, $left, $right); + + } + + /** + * Determine the unrestricted height of content within the block + * by adding each line's height + * @return float + */ + protected function _calculate_content_height() { + $height = 0; + + foreach ($this->_frame->get_lines() as $line) { + $height += $line["h"]; + } + + return $height; + } + + /** + * Determine the frame's restricted height + * @return array + */ + protected function _calculate_restricted_height() { + $style = $this->_frame->get_style(); + $content_height = $this->_calculate_content_height(); + $cb = $this->_frame->get_containing_block(); + + $height = $style->length_in_pt($style->height, $cb["h"]); + + $top = $style->length_in_pt($style->top, $cb["h"]); + $bottom = $style->length_in_pt($style->bottom, $cb["h"]); + + $margin_top = $style->length_in_pt($style->margin_top, $cb["h"]); + $margin_bottom = $style->length_in_pt($style->margin_bottom, $cb["h"]); + + if ( $style->position === "absolute" || $style->position === "fixed" ) { + + // see http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-height + + $dims = array($top !== "auto" ? $top : 0, + $style->margin_top !== "auto" ? $style->margin_top : 0, + $style->padding_top, + $style->border_top_width, + $height !== "auto" ? $height : 0, + $style->border_bottom_width, + $style->padding_bottom, + $style->margin_bottom !== "auto" ? $style->margin_bottom : 0, + $bottom !== "auto" ? $bottom : 0); + + $sum = $style->length_in_pt($dims, $cb["h"]); + + $diff = $cb["h"] - $sum; + + if ( $diff > 0 ) { + + if ( $height === "auto" && $top === "auto" && $bottom === "auto" ) { + + if ( $margin_top === "auto" ) + $margin_top = 0; + if ( $margin_bottom === "auto" ) + $margin_bottom = 0; + + $height = $diff; + + } else if ( $height === "auto" && $top === "auto" ) { + + if ( $margin_top === "auto" ) + $margin_top = 0; + if ( $margin_bottom === "auto" ) + $margin_bottom = 0; + + $height = $content_height; + $top = $diff - $content_height; + + } else if ( $height === "auto" && $bottom === "auto" ) { + + if ( $margin_top === "auto" ) + $margin_top = 0; + if ( $margin_bottom === "auto" ) + $margin_bottom = 0; + + $height = $content_height; + $bottom = $diff - $content_height; + + } else if ( $top === "auto" && $bottom === "auto" ) { + + if ( $margin_top === "auto" ) + $margin_top = 0; + if ( $margin_bottom === "auto" ) + $margin_bottom = 0; + + $bottom = $diff; + + } else if ( $top === "auto" ) { + + if ( $margin_top === "auto" ) + $margin_top = 0; + if ( $margin_bottom === "auto" ) + $margin_bottom = 0; + + $top = $diff; + + } else if ( $height === "auto" ) { + + if ( $margin_top === "auto" ) + $margin_top = 0; + if ( $margin_bottom === "auto" ) + $margin_bottom = 0; + + $height = $diff; + + } else if ( $bottom === "auto" ) { + + if ( $margin_top === "auto" ) + $margin_top = 0; + if ( $margin_bottom === "auto" ) + $margin_bottom = 0; + + $bottom = $diff; + + } else { + + if ( $style->overflow === "visible" ) { + + // set all autos to zero + if ( $margin_top === "auto" ) + $margin_top = 0; + if ( $margin_bottom === "auto" ) + $margin_bottom = 0; + if ( $top === "auto" ) + $top = 0; + if ( $bottom === "auto" ) + $bottom = 0; + if ( $height === "auto" ) + $height = $content_height; + + } + + // FIXME: overflow hidden + } + + } + + } else { + + // Expand the height if overflow is visible + if ( $height === "auto" && $content_height > $height /* && $style->overflow === "visible" */) + $height = $content_height; + + // FIXME: this should probably be moved to a seperate function as per + // _calculate_restricted_width + + // Only handle min/max height if the height is independent of the frame's content + if ( !($style->overflow === "visible" || + ($style->overflow === "hidden" && $height === "auto")) ) { + + $min_height = $style->min_height; + $max_height = $style->max_height; + + if ( isset($cb["h"]) ) { + $min_height = $style->length_in_pt($min_height, $cb["h"]); + $max_height = $style->length_in_pt($max_height, $cb["h"]); + + } else if ( isset($cb["w"]) ) { + + if ( mb_strpos($min_height, "%") !== false ) + $min_height = 0; + else + $min_height = $style->length_in_pt($min_height, $cb["w"]); + + if ( mb_strpos($max_height, "%") !== false ) + $max_height = "none"; + else + $max_height = $style->length_in_pt($max_height, $cb["w"]); + } + + if ( $max_height !== "none" && $min_height > $max_height ) + // Swap 'em + list($max_height, $min_height) = array($min_height, $max_height); + + if ( $max_height !== "none" && $height > $max_height ) + $height = $max_height; + + if ( $height < $min_height ) + $height = $min_height; + } + + } + + return array($height, $margin_top, $margin_bottom, $top, $bottom); + + } + + /** + * Adjust the justification of each of our lines. + * http://www.w3.org/TR/CSS21/text.html#propdef-text-align + */ + protected function _text_align() { + $style = $this->_frame->get_style(); + $w = $this->_frame->get_containing_block("w"); + $width = $style->length_in_pt($style->width, $w); + switch ($style->text_align) { + + default: + case "left": + foreach ($this->_frame->get_lines() as $line) { + if ( !$line["left"] ) continue; + foreach($line["frames"] as $frame) { + if ( $frame instanceof Block_Frame_Decorator) continue; + $frame->set_position( $frame->get_position("x") + $line["left"] ); + } + } + return; + + case "right": + foreach ($this->_frame->get_lines() as $line) { + // Move each child over by $dx + $dx = $width - $line["w"] - $line["right"]; + + foreach($line["frames"] as $frame) { + // Block frames are not aligned by text-align + if ($frame instanceof Block_Frame_Decorator) continue; + + $frame->set_position( $frame->get_position("x") + $dx ); + } + } + break; + + + case "justify": + // We justify all lines except the last one + $lines = $this->_frame->get_lines(); // needs to be a variable (strict standards) + $lines = array_splice($lines, 0, -1); + + foreach($lines as $i => $line) { + if ( $line["br"] ) { + unset($lines[$i]); + } + } + + // One space character's width. Will be used to get a more accurate spacing + $space_width = Font_Metrics::get_text_width(" ", $style->font_family, $style->font_size); + + foreach ($lines as $i => $line) { + if ( $line["left"] ) { + foreach($line["frames"] as $frame) { + if ( !$frame instanceof Text_Frame_Decorator ) + continue; + + $frame->set_position( $frame->get_position("x") + $line["left"] ); + } + } + + // Only set the spacing if the line is long enough. This is really + // just an aesthetic choice ;) + //if ( $line["left"] + $line["w"] + $line["right"] > self::MIN_JUSTIFY_WIDTH * $width ) { + + // Set the spacing for each child + if ( $line["wc"] > 1 ) + $spacing = ($width - ($line["left"] + $line["w"] + $line["right"]) + $space_width) / ($line["wc"] - 1); + else + $spacing = 0; + + $dx = 0; + foreach($line["frames"] as $frame) { + if ( !$frame instanceof Text_Frame_Decorator ) + continue; + + $text = $frame->get_text(); + $spaces = mb_substr_count($text, " "); + + $char_spacing = $style->length_in_pt($style->letter_spacing); + $_spacing = $spacing + $char_spacing; + + $frame->set_position( $frame->get_position("x") + $dx ); + $frame->set_text_spacing($_spacing); + + $dx += $spaces * $_spacing; + } + + // The line (should) now occupy the entire width + $this->_frame->set_line($i, null, $width); + + //} + } + break; + + case "center": + case "centre": + foreach ($this->_frame->get_lines() as $line) { + // Centre each line by moving each frame in the line by: + $dx = ($width + $line["left"] - $line["w"] - $line["right"] ) / 2; + + foreach ($line["frames"] as $frame) { + // Block frames are not aligned by text-align + if ($frame instanceof Block_Frame_Decorator) continue; + + $frame->set_position( $frame->get_position("x") + $dx ); + } + } + break; + } + } + + /** + * Align inline children vertically. + * Aligns each child vertically after each line is reflowed + */ + function vertical_align() { + + foreach ( $this->_frame->get_lines() as $i => $line ) { + + $height = $line["h"]; + + foreach ( $line["frames"] as $frame ) { + $style = $frame->get_style(); + + if ( $style->display !== "inline" && $style->display !== "text" ) + continue; + + // FIXME? + if ( $this instanceof Table_Cell_Frame_Reflower ) + $align = $frame->get_frame()->get_style()->vertical_align; + else + $align = $frame->get_frame()->get_parent()->get_style()->vertical_align; + + $frame_h = $frame->get_margin_height(); + $y = $line["y"]; + + switch ($align) { + + case "baseline": + $y += $height - $frame_h; + break; + + case "middle": + $y += ($height + $frame_h) / 2; + break; + + case "sub": + $y += 0.2 * $height; + break; + + case "super": + $y += -0.3 * $height; + break; + + case "text-top": + case "top": // Not strictly accurate, but good enough for now + break; + + case "text-bottom": + case "bottom": + $y += $height - $frame_h; + break; + } + + $x = $frame->get_position("x"); + $frame->set_position($x, $y); + + } + } + } + + function reflow(Frame_Decorator $block = null) { + + // Check if a page break is forced + $page = $this->_frame->get_root(); + $page->check_forced_page_break($this->_frame); + + // Bail if the page is full + if ( $page->is_full() ) + return; + + // Generated content + $this->_set_content(); + + // Collapse margins if required + $this->_collapse_margins(); + + $style = $this->_frame->get_style(); + $cb = $this->_frame->get_containing_block(); + + if ( $style->counter_increment && ($increment = $style->counter_increment) !== "none" ) + $this->_frame->increment_counter($increment); + + if ( $style->position === "fixed" ) + $cb = $this->_frame->get_root()->get_containing_block(); + + // Determine the constraints imposed by this frame: calculate the width + // of the content area: + list($w, $left_margin, $right_margin, $left, $right) = $this->_calculate_restricted_width(); + + // Store the calculated properties + $style->width = $w . "pt"; + $style->margin_left = $left_margin."pt"; + $style->margin_right = $right_margin."pt"; + $style->left = $left ."pt"; + $style->right = $right . "pt"; + + // Update the position + $this->_frame->position(); + list($x, $y) = $this->_frame->get_position(); + + // Adjust the first line based on the text-indent property + $indent = $style->length_in_pt($style->text_indent, $cb["w"]); + $this->_frame->increase_line_width($indent); + + // Determine the content edge + $top = $style->length_in_pt(array($style->margin_top, + $style->padding_top, + $style->border_top_width), $cb["h"]); + + $bottom = $style->length_in_pt(array($style->border_bottom_width, + $style->margin_bottom, + $style->padding_bottom), $cb["h"]); + + $cb_x = $x + $left_margin + $style->length_in_pt(array($style->border_left_width, + $style->padding_left), $cb["w"]); + + $cb_y = $y + $top; + + $cb_h = ($cb["h"] + $cb["y"]) - $bottom - $cb_y; + + // Set the y position of the first line in this block + $this->_frame->set_current_line($cb_y); + + $floating_children = array(); + + // Set the containing blocks and reflow each child + foreach ( $this->_frame->get_children() as $child ) { + + // Bail out if the page is full + if ( $page->is_full() ) + break; + + // Floating siblings + if ( DOMPDF_ENABLE_CSS_FLOAT && count($floating_children) ) { + $offset_left = 0; + $offset_right = 0; + + // We need to reflow the child to know its initial x position + $child->set_containing_block($cb_x, $cb_y, $w, $cb_h); + $child->reflow($this->_frame); + + $current_line = $this->_frame->get_current_line(); + + foreach ( $floating_children as $child_key => $floating_child ) { + $float = $floating_child->get_style()->float; + $floating_width = $floating_child->get_margin_width(); + $floating_x = $floating_child->get_position("x"); + + if ( $float === "left" ) { + if ($current_line["left"] + $child->get_position("x") > $floating_x + $floating_width) continue; + } + else { + if ($current_line["left"] + $child->get_position("x") + $child->get_margin_width() < $w - $floating_width - $current_line["right"]) continue; + } + + // If the child is still shifted by the floating element + if ( $floating_child->get_position("y") + $floating_child->get_margin_height() > $current_line["y"] ) { + if ( $float === "left" ) + $offset_left += $floating_width; + else + $offset_right += $floating_width; + } + + // else, the floating element won't shift anymore + else { + unset($floating_children[$child_key]); + } + } + + if ( $offset_left ) + $this->_frame->set_current_line(array("left" => $offset_left)); + + if ( $offset_right ) + $this->_frame->set_current_line(array("right" => $offset_right)); + } + + $child->set_containing_block($cb_x, $cb_y, $w, $cb_h); + $child->reflow($this->_frame); + + // Don't add the child to the line if a page break has occurred + if ( $page->check_page_break($child) ) + break; + + $child_style = $child->get_style(); + + if ( DOMPDF_ENABLE_CSS_FLOAT && $child_style->float !== "none") { + $floating_children[] = $child; + + // Remove next frame's beginning whitespace + $next = $child->get_next_sibling(); + if ( $next && $next instanceof Text_Frame_Decorator) { + $next->set_text(ltrim($next->get_text())); + } + + $float_x = $cb_x; + $float_y = $this->_frame->get_current_line("y"); + + $child_style = $child->get_style(); + + switch( $child_style->float ) { + case "left": break; + case "right": + $width = $w; + $float_x += ($width - $child->get_margin_width()); + break; + } + + $child->set_position($float_x, $float_y); + } + + } + + // Determine our height + list($height, $margin_top, $margin_bottom, $top, $bottom) = $this->_calculate_restricted_height(); + $style->height = $height; + $style->margin_top = $margin_top; + $style->margin_bottom = $margin_bottom; + $style->top = $top; + $style->bottom = $bottom; + + $this->_text_align(); + $this->vertical_align(); + + if ( $block ) { + $block->add_frame_to_line($this->_frame); + } + } +} diff --git a/application/third_party/dompdf/include/block_positioner.cls.php b/application/third_party/dompdf/include/block_positioner.cls.php new file mode 100755 index 00000000..2f81caa0 --- /dev/null +++ b/application/third_party/dompdf/include/block_positioner.cls.php @@ -0,0 +1,86 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: block_positioner.cls.php 356 2011-01-28 08:56:10Z fabien.menager $ */ + +/** + * Positions block frames + * + * @access private + * @package dompdf + */ +class Block_Positioner extends Positioner { + + + function __construct(Frame_Decorator $frame) { parent::__construct($frame); } + + //........................................................................ + + function position() { + $frame = $this->_frame; + $style = $frame->get_style(); + $cb = $frame->get_containing_block(); + $p = $frame->find_block_parent(); + + if ( $p ) { + $float = $style->float; + if ( !DOMPDF_ENABLE_CSS_FLOAT || !$float || $float === "none" ) { + $p->add_line(); + } + $y = $p->get_current_line("y"); + + } else + $y = $cb["y"]; + + $x = $cb["x"]; + + // Relative positionning + if ( $style->position === "relative" ) { + $top = $style->length_in_pt($style->top, $cb["h"]); + //$right = $style->length_in_pt($style->right, $cb["w"]); + //$bottom = $style->length_in_pt($style->bottom, $cb["h"]); + $left = $style->length_in_pt($style->left, $cb["w"]); + + $x += $left; + $y += $top; + } + + $frame->set_position($x, $y); + } +} diff --git a/application/third_party/dompdf/include/block_renderer.cls.php b/application/third_party/dompdf/include/block_renderer.cls.php new file mode 100755 index 00000000..6506b240 --- /dev/null +++ b/application/third_party/dompdf/include/block_renderer.cls.php @@ -0,0 +1,211 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: block_renderer.cls.php 346 2011-01-09 13:23:22Z fabien.menager $ */ + +/** + * Renders block frames + * + * @access private + * @package dompdf + */ +class Block_Renderer extends Abstract_Renderer { + + //........................................................................ + + function render(Frame $frame) { + $style = $frame->get_style(); + list($x, $y, $w, $h) = $frame->get_padding_box(); + + $this->_set_opacity( $frame->get_opacity( $style->opacity ) ); + + // Draw our background, border and content + if ( ($bg = $style->background_color) !== "transparent" ) { + $this->_canvas->filled_rectangle( $x, $y, $w, $h, $bg ); + } + + if ( ($url = $style->background_image) && $url !== "none" ) + $this->_background_image($url, $x, $y, $w, $h, $style); + + $this->_render_border($frame); + $this->_render_outline($frame); + + if (DEBUG_LAYOUT && DEBUG_LAYOUT_BLOCKS) { + $this->_debug_layout($frame->get_border_box(), "red"); + if (DEBUG_LAYOUT_PADDINGBOX) { + $this->_debug_layout($frame->get_padding_box(), "red", array(0.5, 0.5)); + } + } + + if (DEBUG_LAYOUT && DEBUG_LAYOUT_LINES && $frame->get_decorator()) { + foreach ($frame->get_decorator()->get_lines() as $line) { + $frame->_debug_layout(array($line["x"], $line["y"], $line["w"], $line["h"]), "orange"); + } + } + } + + protected function _render_border(Frame_Decorator $frame, $corner_style = "bevel") { + $style = $frame->get_style(); + $bbox = $frame->get_border_box(); + $bp = $style->get_border_properties(); + + // If all the borders are "solid" with the same color and style, we'd better draw a rectangle + if ( + in_array($bp["top"]["style"], array("solid", "dashed", "dotted")) && + $bp["top"] == $bp["right"] && + $bp["right"] == $bp["bottom"] && + $bp["bottom"] == $bp["left"] + ) { + $props = $bp["top"]; + if ( $props["color"] === "transparent" || $props["width"] <= 0 ) return; + + list($x, $y, $w, $h) = $bbox; + $width = $style->length_in_pt($props["width"]); + $pattern = $this->_get_dash_pattern($props["style"], $width); + $this->_canvas->rectangle($x + $width / 2, $y + $width / 2, $w - $width, $h - $width, $props["color"], $width, $pattern); + return; + } + + $widths = array($style->length_in_pt($bp["top"]["width"]), + $style->length_in_pt($bp["right"]["width"]), + $style->length_in_pt($bp["bottom"]["width"]), + $style->length_in_pt($bp["left"]["width"])); + + foreach ($bp as $side => $props) { + list($x, $y, $w, $h) = $bbox; + + if ( !$props["style"] || + $props["style"] === "none" || + $props["width"] <= 0 || + $props["color"] == "transparent" ) + continue; + + switch($side) { + case "top": + $length = $w; + break; + + case "bottom": + $length = $w; + $y += $h; + break; + + case "left": + $length = $h; + break; + + case "right": + $length = $h; + $x += $w; + break; + default: + break; + } + $method = "_border_" . $props["style"]; + + $this->$method($x, $y, $length, $props["color"], $widths, $side, $corner_style); + } + } + + protected function _render_outline(Frame_Decorator $frame, $corner_style = "bevel") { + $style = $frame->get_style(); + + $props = array( + "width" => $style->outline_width, + "style" => $style->outline_style, + "color" => $style->outline_color, + ); + + if ( !$props["style"] || $props["style"] === "none" || $props["width"] <= 0 ) + return; + + $bbox = $frame->get_border_box(); + $offset = $style->length_in_pt($props["width"]); + $pattern = $this->_get_dash_pattern($props["style"], $offset); + + // If the outline style is "solid" we'd better draw a rectangle + if ( in_array($props["style"], array("solid", "dashed", "dotted")) ) { + $bbox[0] -= $offset / 2; + $bbox[1] -= $offset / 2; + $bbox[2] += $offset; + $bbox[3] += $offset; + + list($x, $y, $w, $h) = $bbox; + $this->_canvas->rectangle($x, $y, $w, $h, $props["color"], $offset, $pattern); + return; + } + + $bbox[0] -= $offset; + $bbox[1] -= $offset; + $bbox[2] += $offset * 2; + $bbox[3] += $offset * 2; + + $method = "_border_" . $props["style"]; + $widths = array_fill(0, 4, $props["width"]); + $sides = array("top", "right", "left", "bottom"); + + foreach ($sides as $side) { + list($x, $y, $w, $h) = $bbox; + + switch($side) { + case "top": + $length = $w; + break; + + case "bottom": + $length = $w; + $y += $h; + break; + + case "left": + $length = $h; + break; + + case "right": + $length = $h; + $x += $w; + break; + default: + break; + } + + $this->$method($x, $y, $length, $props["color"], $widths, $side, $corner_style); + } + } +} diff --git a/application/third_party/dompdf/include/cached_pdf_decorator.cls.php b/application/third_party/dompdf/include/cached_pdf_decorator.cls.php new file mode 100755 index 00000000..53790401 --- /dev/null +++ b/application/third_party/dompdf/include/cached_pdf_decorator.cls.php @@ -0,0 +1,186 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: cached_pdf_decorator.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Caching canvas implementation + * + * Each rendered page is serialized and stored in the {@link Page_Cache}. + * This is useful for static forms/pages that do not need to be re-rendered + * all the time. + * + * This class decorates normal CPDF_Adapters. It is currently completely + * experimental. + * + * @access private + * @package dompdf + */ +class Cached_PDF_Decorator extends CPDF_Adapter implements Canvas { + protected $_pdf; + protected $_cache_id; + protected $_current_page_id; + protected $_fonts; // fonts used in this document + + function __construct($cache_id, CPDF_Adapter $pdf) { + $this->_pdf = $pdf; + $this->_cache_id = $cache_id; + $this->_fonts = array(); + + $this->_current_page_id = $this->_pdf->open_object(); + } + + //........................................................................ + + function get_cpdf() { return $this->_pdf->get_cpdf(); } + + function open_object() { $this->_pdf->open_object(); } + function reopen_object() { return $this->_pdf->reopen_object(); } + + function close_object() { $this->_pdf->close_object(); } + + function add_object($object, $where = 'all') { $this->_pdf->add_object($object, $where); } + + function serialize_object($id) { $this->_pdf->serialize_object($id); } + + function reopen_serialized_object($obj) { $this->_pdf->reopen_serialized_object($obj); } + + //........................................................................ + + function get_width() { return $this->_pdf->get_width(); } + function get_height() { return $this->_pdf->get_height(); } + function get_page_number() { return $this->_pdf->get_page_number(); } + function get_page_count() { return $this->_pdf->get_page_count(); } + + function set_page_number($num) { $this->_pdf->set_page_number($num); } + function set_page_count($count) { $this->_pdf->set_page_count($count); } + + function line($x1, $y1, $x2, $y2, $color, $width, $style = array()) { + $this->_pdf->line($x1, $y1, $x2, $y2, $color, $width, $style); + } + + function rectangle($x1, $y1, $w, $h, $color, $width, $style = array()) { + $this->_pdf->rectangle($x1, $y1, $w, $h, $color, $width, $style); + } + + function filled_rectangle($x1, $y1, $w, $h, $color) { + $this->_pdf->filled_rectangle($x1, $y1, $w, $h, $color); + } + + function polygon($points, $color, $width = null, $style = array(), $fill = false) { + $this->_pdf->polygon($points, $color, $width, $style, $fill); + } + + function circle($x, $y, $r1, $color, $width = null, $style = null, $fill = false) { + $this->_pdf->circle($x, $y, $r1, $color, $width, $style, $fill); + } + + function image($img_url, $x, $y, $w = null, $h = null) { + $this->_pdf->image($img_url, $x, $y, $w, $h); + } + + function text($x, $y, $text, $font, $size, $color = array(0,0,0), $adjust = 0, $angle = 0) { + $this->_fonts[$font] = true; + $this->_pdf->text($x, $y, $text, $font, $size, $color, $adjust, $angle); + } + + function page_text($x, $y, $text, $font, $size, $color = array(0,0,0), $adjust = 0, $angle = 0) { + + // We want to remove this from cached pages since it may not be correct + $this->_pdf->close_object(); + $this->_pdf->page_text($x, $y, $text, $font, $size, $color, $adjust, $angle); + $this->_pdf->reopen_object($this->_current_page_id); + } + + function page_script($script, $type = 'text/php') { + + // We want to remove this from cached pages since it may not be correct + $this->_pdf->close_object(); + $this->_pdf->page_script($script, $type); + $this->_pdf->reopen_object($this->_current_page_id); + } + + function new_page() { + $this->_pdf->close_object(); + + // Add the object to the current page + $this->_pdf->add_object($this->_current_page_id, "add"); + $this->_pdf->new_page(); + + Page_Cache::store_page($this->_cache_id, + $this->_pdf->get_page_number() - 1, + $this->_pdf->serialize_object($this->_current_page_id)); + + $this->_current_page_id = $this->_pdf->open_object(); + return $this->_current_page_id; + } + + function stream($filename) { + // Store the last page in the page cache + if ( !is_null($this->_current_page_id) ) { + $this->_pdf->close_object(); + $this->_pdf->add_object($this->_current_page_id, "add"); + Page_Cache::store_page($this->_cache_id, + $this->_pdf->get_page_number(), + $this->_pdf->serialize_object($this->_current_page_id)); + Page_Cache::store_fonts($this->_cache_id, $this->_fonts); + $this->_current_page_id = null; + } + + $this->_pdf->stream($filename); + + } + + function &output() { + // Store the last page in the page cache + if ( !is_null($this->_current_page_id) ) { + $this->_pdf->close_object(); + $this->_pdf->add_object($this->_current_page_id, "add"); + Page_Cache::store_page($this->_cache_id, + $this->_pdf->get_page_number(), + $this->_pdf->serialize_object($this->_current_page_id)); + $this->_current_page_id = null; + } + + return $this->_pdf->output(); + } + + function get_messages() { return $this->_pdf->get_messages(); } + +} diff --git a/application/third_party/dompdf/include/canvas.cls.php b/application/third_party/dompdf/include/canvas.cls.php new file mode 100755 index 00000000..cbc0d9c9 --- /dev/null +++ b/application/third_party/dompdf/include/canvas.cls.php @@ -0,0 +1,328 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: canvas.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Main rendering interface + * + * Currently {@link CPDF_Adapter}, {@link PDFLib_Adapter}, {@link TCPDF_Adapter}, and {@link GD_Adapter} + * implement this interface. + * + * Implementations should measure x and y increasing to the left and down, + * respectively, with the origin in the top left corner. Implementations + * are free to use a unit other than points for length, but I can't + * guarantee that the results will look any good. + * + * @package dompdf + */ +interface Canvas { + + /** + * Returns the current page number + * + * @return int + */ + function get_page_number(); + + /** + * Returns the total number of pages + * + * @return int + */ + function get_page_count(); + + /** + * Sets the total number of pages + * + * @param int $count + */ + function set_page_count($count); + + /** + * Draws a line from x1,y1 to x2,y2 + * + * See {@link Style::munge_colour()} for the format of the colour array. + * See {@link Cpdf::setLineStyle()} for a description of the format of the + * $style parameter (aka dash). + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @param array $color + * @param float $width + * @param array $style + */ + function line($x1, $y1, $x2, $y2, $color, $width, $style = null); + + /** + * Draws a rectangle at x1,y1 with width w and height h + * + * See {@link Style::munge_colour()} for the format of the colour array. + * See {@link Cpdf::setLineStyle()} for a description of the $style + * parameter (aka dash) + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + * @param array $color + * @param float $width + * @param array $style + */ + function rectangle($x1, $y1, $w, $h, $color, $width, $style = null); + + /** + * Draws a filled rectangle at x1,y1 with width w and height h + * + * See {@link Style::munge_colour()} for the format of the colour array. + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + * @param array $color + */ + function filled_rectangle($x1, $y1, $w, $h, $color); + + /** + * Starts a clipping rectangle at x1,y1 with width w and height h + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + */ + function clipping_rectangle($x1, $y1, $w, $h); + + /** + * Ends the last clipping shape + */ + function clipping_end(); + + /** + * Save current state + */ + function save(); + + /** + * Restore last state + */ + function restore(); + + /** + * Rotate + */ + function rotate($angle, $x, $y); + + /** + * Skew + */ + function skew($angle_x, $angle_y, $x, $y); + + /** + * Scale + */ + function scale($s_x, $s_y, $x, $y); + + /** + * Translate + */ + function translate($t_x, $t_y); + + /** + * Transform + */ + function transform($a, $b, $c, $d, $e, $f); + + /** + * Draws a polygon + * + * The polygon is formed by joining all the points stored in the $points + * array. $points has the following structure: + * + * array(0 => x1, + * 1 => y1, + * 2 => x2, + * 3 => y2, + * ... + * ); + * + * + * See {@link Style::munge_colour()} for the format of the colour array. + * See {@link Cpdf::setLineStyle()} for a description of the $style + * parameter (aka dash) + * + * @param array $points + * @param array $color + * @param float $width + * @param array $style + * @param bool $fill Fills the polygon if true + */ + function polygon($points, $color, $width = null, $style = null, $fill = false); + + /** + * Draws a circle at $x,$y with radius $r + * + * See {@link Style::munge_colour()} for the format of the colour array. + * See {@link Cpdf::setLineStyle()} for a description of the $style + * parameter (aka dash) + * + * @param float $x + * @param float $y + * @param float $r + * @param array $color + * @param float $width + * @param array $style + * @param bool $fill Fills the circle if true + */ + function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false); + + /** + * Add an image to the pdf. + * + * The image is placed at the specified x and y coordinates with the + * given width and height. + * + * @param string $img_url the path to the image + * @param string $img_type the type (e.g. extension) of the image + * @param float $x x position + * @param float $y y position + * @param int $w width (in pixels) + * @param int $h height (in pixels) + */ + function image($img_url, $img_type, $x, $y, $w, $h); + + /** + * Writes text at the specified x and y coordinates + * + * See {@link Style::munge_colour()} for the format of the colour array. + * + * @param float $x + * @param float $y + * @param string $text the text to write + * @param string $font the font file to use + * @param float $size the font size, in points + * @param array $color + * @param float $word_space word spacing adjustment + * @param float $char_space whar spacing adjustment + * @param float $angle angle + */ + function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0, $char_space = 0, $angle = 0); + + /** + * Add a named destination (similar to ... in html) + * + * @param string $anchorname The name of the named destination + */ + function add_named_dest($anchorname); + + /** + * Add a link to the pdf + * + * @param string $url The url to link to + * @param float $x The x position of the link + * @param float $y The y position of the link + * @param float $width The width of the link + * @param float $height The height of the link + */ + function add_link($url, $x, $y, $width, $height); + + /** + * Add meta information to the pdf + * + * @param string $label label of the value (Creator, Producer, etc.) + * @param string $value the text to set + */ + function add_info($name, $value); + + /** + * Calculates text size, in points + * + * @param string $text the text to be sized + * @param string $font the desired font + * @param float $size the desired font size + * @param float $spacing word spacing, if any + * @return float + */ + function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0); + + /** + * Calculates font height, in points + * + * @param string $font + * @param float $size + * @return float + */ + function get_font_height($font, $size); + + /** + * Sets the opacity + * + * @param float $opacity + * @param string $mode + * @return float + */ + function set_opacity($opacity, $mode = "Normal"); + + /** + * Starts a new page + * + * Subsequent drawing operations will appear on the new page. + */ + function new_page(); + + /** + * Streams the PDF directly to the browser + * + * @param string $filename the name of the PDF file + * @param array $options associative array, 'Attachment' => 0 or 1, 'compress' => 1 or 0 + */ + function stream($filename, $options = null); + + /** + * Returns the PDF as a string + * + * @param array $options associative array: 'compress' => 1 or 0 + * @return string + */ + function output($options = null); + +} diff --git a/application/third_party/dompdf/include/canvas_factory.cls.php b/application/third_party/dompdf/include/canvas_factory.cls.php new file mode 100755 index 00000000..4dc4070a --- /dev/null +++ b/application/third_party/dompdf/include/canvas_factory.cls.php @@ -0,0 +1,83 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: canvas_factory.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Create canvas instances + * + * The canvas factory creates canvas instances based on the + * availability of rendering backends and config options. + * + * @package dompdf + */ +class Canvas_Factory { + + /** + * Constructor is private: this is a static class + */ + private function __construct() { } + + static function get_instance($paper = null, $orientation = null, $class = null) { + + $backend = strtolower(DOMPDF_PDF_BACKEND); + + if ( isset($class) && class_exists($class, false) ) + $class .= "_Adapter"; + + else if ( (DOMPDF_PDF_BACKEND === "auto" || $backend === "pdflib" ) && + class_exists("PDFLib", false) ) + $class = "PDFLib_Adapter"; + + else if ( (DOMPDF_PDF_BACKEND === "auto" || $backend === "cpdf") ) + $class = "CPDF_Adapter"; + + else if ( ( $backend === "tcpdf") ) + $class = "TCPDF_Adapter"; + + else if ( $backend === "gd" ) + $class = "GD_Adapter"; + + else + $class = "CPDF_Adapter"; + + return new $class($paper, $orientation); + + } +} diff --git a/application/third_party/dompdf/include/cellmap.cls.php b/application/third_party/dompdf/include/cellmap.cls.php new file mode 100755 index 00000000..03f9c03a --- /dev/null +++ b/application/third_party/dompdf/include/cellmap.cls.php @@ -0,0 +1,730 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: cellmap.cls.php 283 2010-07-19 17:57:40Z fabien.menager $ */ + +/** + * Maps table cells to the table grid. + * + * This class resolves borders in tables with collapsed borders and helps + * place row & column spanned table cells. + * + * @access private + * @package dompdf + */ +class Cellmap { + + /** + * Border style weight lookup for collapsed border resolution. + * + * @var array + */ + static protected $_BORDER_STYLE_SCORE = array("inset" => 1, + "groove" => 2, + "outset" => 3, + "ridge" => 4, + "dotted" => 5, + "dashed" => 6, + "solid" => 7, + "double" => 8, + "none" => 0); + + /** + * The table object this cellmap is attached to. + * + * @var Table_Frame_Decorator + */ + protected $_table; + + /** + * The total number of rows in the table + * + * @var int + */ + protected $_num_rows; + + /** + * The total number of columns in the table + * + * @var int + */ + protected $_num_cols; + + /** + * 2D array mapping to frames + * + * @var array + */ + protected $_cells; + + /** + * 1D array of column dimensions + * + * @var array + */ + protected $_columns; + + /** + * 1D array of row dimensions + * + * @var array + */ + protected $_rows; + + /** + * 2D array of border specs + * + * @var array + */ + protected $_borders; + + /** + * 1D Array mapping frames to (multiple) pairs, keyed on + * frame_id. + * + * @var array + */ + protected $_frames; + + /** + * Current column when adding cells, 0-based + * + * @var int + */ + private $__col; + + /** + * Current row when adding cells, 0-based + * + * @var int + */ + private $__row; + + //........................................................................ + + function __construct(Table_Frame_Decorator $table) { + $this->_table = $table; + $this->reset(); + } + + function __destruct() { + clear_object($this); + } + //........................................................................ + + function reset() { + $this->_num_rows = 0; + $this->_num_cols = 0; + + $this->_cells = array(); + $this->_frames = array(); + + $this->_columns = array(); + $this->_rows = array(); + + $this->_borders = array(); + + $this->__col = $this->__row = 0; + } + + //........................................................................ + + function get_num_rows() { return $this->_num_rows; } + function get_num_cols() { return $this->_num_cols; } + + function &get_columns() { + return $this->_columns; + } + + function &get_column($i) { + if ( !isset($this->_columns[$i]) ) + $this->_columns[$i] = array("x" => 0, + "min-width" => 0, + "max-width" => 0, + "used-width" => null, + "absolute" => 0, + "percent" => 0, + "auto" => true); + + return $this->_columns[$i]; + } + + function &get_rows() { + return $this->_rows; + } + + function &get_row($j) { + if ( !isset($this->_rows[$j]) ) + $this->_rows[$j] = array("y" => 0, + "first-column" => 0, + "height" => null); + return $this->_rows[$j]; + } + + function get_border($i, $j, $h_v, $prop = null) { + if ( !isset($this->_borders[$i][$j][$h_v]) ) + $this->_borders[$i][$j][$h_v] = array("width" => 0, + "style" => "solid", + "color" => "black"); + if ( isset($prop) ) + return $this->_borders[$i][$j][$h_v][$prop]; + + return $this->_borders[$i][$j][$h_v]; + } + + function get_border_properties($i, $j) { + + $left = $this->get_border($i, $j, "vertical"); + $right = $this->get_border($i, $j+1, "vertical"); + $top = $this->get_border($i, $j, "horizontal"); + $bottom = $this->get_border($i+1, $j, "horizontal"); + + return compact("top", "bottom", "left", "right"); + } + + //........................................................................ + + function get_spanned_cells($frame) { + $key = $frame->get_id(); + + if ( !isset($this->_frames[$key]) ) { + throw new DOMPDF_Internal_Exception("Frame not found in cellmap"); + } + + return $this->_frames[$key]; + + } + + function frame_exists_in_cellmap($frame) { + $key = $frame->get_id(); + return isset($this->_frames[$key]); + } + + function get_frame_position($frame) { + global $_dompdf_warnings; + + $key = $frame->get_id(); + + if ( !isset($this->_frames[$key]) ) { + throw new DOMPDF_Internal_Exception("Frame not found in cellmap"); + } + + $col = $this->_frames[$key]["columns"][0]; + $row = $this->_frames[$key]["rows"][0]; + + if ( !isset($this->_columns[$col])) { + $_dompdf_warnings[] = "Frame not found in columns array. Check your table layout for missing or extra TDs."; + $x = 0; + } else + $x = $this->_columns[$col]["x"]; + + if ( !isset($this->_rows[$row])) { + $_dompdf_warnings[] = "Frame not found in row array. Check your table layout for missing or extra TDs."; + $y = 0; + } else + $y = $this->_rows[$row]["y"]; + + return array($x, $y, "x" => $x, "y" => $y); + } + + function get_frame_width($frame) { + $key = $frame->get_id(); + + if ( !isset($this->_frames[$key]) ) { + throw new DOMPDF_Internal_Exception("Frame not found in cellmap"); + } + + $cols = $this->_frames[$key]["columns"]; + $w = 0; + foreach ($cols as $i) + $w += $this->_columns[$i]["used-width"]; + + return $w; + + } + + function get_frame_height($frame) { + $key = $frame->get_id(); + + if ( !isset($this->_frames[$key]) ) + throw new DOMPDF_Internal_Exception("Frame not found in cellmap"); + + $rows = $this->_frames[$key]["rows"]; + $h = 0; + foreach ($rows as $i) { + if ( !isset($this->_rows[$i]) ) { + throw new Exception("foo"); + } + $h += $this->_rows[$i]["height"]; + } + return $h; + + } + + + //........................................................................ + + function set_column_width($j, $width) { + $col =& $this->get_column($j); + $col["used-width"] = $width; + $next_col =& $this->get_column($j+1); + $next_col["x"] = $next_col["x"] + $width; + } + + function set_row_height($i, $height) { + $row =& $this->get_row($i); + if ( $height <= $row["height"] ) + return; + + $row["height"] = $height; + $next_row =& $this->get_row($i+1); + $next_row["y"] = $row["y"] + $height; + + } + + //........................................................................ + + + protected function _resolve_border($i, $j, $h_v, $border_spec) { + $n_width = $border_spec["width"]; + $n_style = $border_spec["style"]; + $n_color = $border_spec["color"]; + + if ( !isset($this->_borders[$i][$j][$h_v]) ) { + $this->_borders[$i][$j][$h_v] = $border_spec; + return $this->_borders[$i][$j][$h_v]["width"]; + } + + $border = &$this->_borders[$i][$j][$h_v]; + + $o_width = $border["width"]; + $o_style = $border["style"]; + $o_color = $border["color"]; + + if ( ($n_style === "hidden" || + $n_width > $o_width || + $o_style === "none") + + or + + ($o_width == $n_width && + in_array($n_style, self::$_BORDER_STYLE_SCORE) && + self::$_BORDER_STYLE_SCORE[ $n_style ] > self::$_BORDER_STYLE_SCORE[ $o_style ]) ) + $border = $border_spec; + + return $border["width"]; + } + + //........................................................................ + + function add_frame(Frame $frame) { + + $style = $frame->get_style(); + $display = $style->display; + + $collapse = $this->_table->get_style()->border_collapse == "collapse"; + + // Recursively add the frames within tables, table-row-groups and table-rows + if ( $display === "table-row" || + $display === "table" || + $display === "inline-table" || + in_array($display, Table_Frame_Decorator::$ROW_GROUPS) ) { + + $start_row = $this->__row; + foreach ( $frame->get_children() as $child ) + $this->add_frame( $child ); + + if ( $display === "table-row" ) + $this->add_row(); + + $num_rows = $this->__row - $start_row - 1; + $key = $frame->get_id(); + + // Row groups always span across the entire table + $this->_frames[$key]["columns"] = range(0,max(0,$this->_num_cols-1)); + $this->_frames[$key]["rows"] = range($start_row, max(0, $this->__row - 1)); + $this->_frames[$key]["frame"] = $frame; + + if ( $display !== "table-row" && $collapse ) { + + $bp = $style->get_border_properties(); + + // Resolve the borders + for ( $i = 0; $i < $num_rows+1; $i++) { + $this->_resolve_border($start_row + $i, 0, "vertical", $bp["left"]); + $this->_resolve_border($start_row + $i, $this->_num_cols, "vertical", $bp["right"]); + } + + for ( $j = 0; $j < $this->_num_cols; $j++) { + $this->_resolve_border($start_row, $j, "horizontal", $bp["top"]); + $this->_resolve_border($this->__row, $j, "horizontal", $bp["bottom"]); + } + } + + + return; + } + + $node = $frame->get_node(); + + // Determine where this cell is going + $colspan = $node->getAttribute("colspan"); + $rowspan = $node->getAttribute("rowspan"); + + if ( !$colspan ) { + $colspan = 1; + $node->setAttribute("colspan",1); + } + + if ( !$rowspan ) { + $rowspan = 1; + $node->setAttribute("rowspan",1); + } + $key = $frame->get_id(); + + $bp = $style->get_border_properties(); + + + // Add the frame to the cellmap + $max_left = $max_right = 0; + + // Find the next available column (fix by Ciro Mondueri) + $ac = $this->__col; + while ( isset($this->_cells[$this->__row][$ac]) ) + $ac++; + $this->__col = $ac; + + // Rows: + for ( $i = 0; $i < $rowspan; $i++ ) { + $row = $this->__row + $i; + + $this->_frames[$key]["rows"][] = $row; + + for ( $j = 0; $j < $colspan; $j++) + $this->_cells[$row][$this->__col + $j] = $frame; + + if ( $collapse ) { + // Resolve vertical borders + $max_left = max($max_left, $this->_resolve_border($row, $this->__col, "vertical", $bp["left"])); + $max_right = max($max_right, $this->_resolve_border($row, $this->__col + $colspan, "vertical", $bp["right"])); + } + } + + $max_top = $max_bottom = 0; + + // Columns: + for ( $j = 0; $j < $colspan; $j++ ) { + $col = $this->__col + $j; + $this->_frames[$key]["columns"][] = $col; + + if ( $collapse ) { + // Resolve horizontal borders + $max_top = max($max_top, $this->_resolve_border($this->__row, $col, "horizontal", $bp["top"])); + $max_bottom = max($max_bottom, $this->_resolve_border($this->__row + $rowspan, $col, "horizontal", $bp["bottom"])); + } + } + + $this->_frames[$key]["frame"] = $frame; + + // Handle seperated border model + if ( !$collapse ) { + list($h, $v) = $this->_table->get_style()->border_spacing; + + // Border spacing is effectively a margin between cells + $v = $style->length_in_pt($v) / 2; + $h = $style->length_in_pt($h) / 2; + $style->margin = "$v $h"; + + // The additional 1/2 width gets added to the table proper + + } else { + + // Drop the frame's actual border + $style->border_left_width = $max_left / 2; + $style->border_right_width = $max_right / 2; + $style->border_top_width = $max_top / 2; + $style->border_bottom_width = $max_bottom / 2; + $style->margin = "none"; + } + + // Resolve the frame's width + list($frame_min, $frame_max) = $frame->get_min_max_width(); + + $width = $style->width; + + if ( is_percent($width) ) { + $var = "percent"; + $val = (float)rtrim($width, "% ") / $colspan; + + } else if ( $width !== "auto" ) { + $var = "absolute"; + $val = $style->length_in_pt($frame_min) / $colspan; + } + + $min = 0; + $max = 0; + for ( $cs = 0; $cs < $colspan; $cs++ ) { + + // Resolve the frame's width(s) with other cells + $col =& $this->get_column( $this->__col + $cs ); + + // Note: $var is either 'percent' or 'absolute'. We compare the + // requested percentage or absolute values with the existing widths + // and adjust accordingly. + if ( isset($var) && $val > $col[$var] ) { + $col[$var] = $val; + $col["auto"] = false; + } + + $min += $col["min-width"]; + $max += $col["max-width"]; + } + + + if ( $frame_min > $min ) { + // The frame needs more space. Expand each sub-column + $inc = ($frame_min - $min) / $colspan; + for ($c = 0; $c < $colspan; $c++) { + $col =& $this->get_column($this->__col + $c); + $col["min-width"] += $inc; + } + } + + if ( $frame_max > $max ) { + $inc = ($frame_max - $max) / $colspan; + for ($c = 0; $c < $colspan; $c++) { + $col =& $this->get_column($this->__col + $c); + $col["max-width"] += $inc; + } + } + + $this->__col += $colspan; + if ( $this->__col > $this->_num_cols ) + $this->_num_cols = $this->__col; + + } + + //........................................................................ + + function add_row() { + + $this->__row++; + $this->_num_rows++; + + // Find the next available column + $i = 0; + while ( isset($this->_cells[$this->__row][$i]) ) + $i++; + + $this->__col = $i; + + } + + //........................................................................ + + /** + * Remove a row from the cellmap. + * + * @param Frame + */ + function remove_row(Frame $row) { + + $key = $row->get_id(); + if ( !isset($this->_frames[$key]) ) + return; // Presumably this row has alredy been removed + + $this->_row = $this->_num_rows--; + + $rows = $this->_frames[$key]["rows"]; + $columns = $this->_frames[$key]["columns"]; + + // Remove all frames from this row + foreach ( $rows as $r ) { + foreach ( $columns as $c ) { + if ( isset($this->_cells[$r][$c]) ) { + $id = $this->_cells[$r][$c]->get_id(); + + $this->_frames[$id] = null; + unset($this->_frames[$id]); + + $this->_cells[$r][$c] = null; + unset($this->_cells[$r][$c]); + } + } + $this->_rows[$r] = null; + unset($this->_rows[$r]); + } + + $this->_frames[$key] = null; + unset($this->_frames[$key]); + + } + + /** + * Remove a row group from the cellmap. + * + * @param Frame $group The group to remove + */ + function remove_row_group(Frame $group) { + + $key = $group->get_id(); + if ( !isset($this->_frames[$key]) ) + return; // Presumably this row has alredy been removed + + $iter = $group->get_first_child(); + while ($iter) { + $this->remove_row($iter); + $iter = $iter->get_next_sibling(); + } + + $this->_frames[$key] = null; + unset($this->_frames[$key]); + } + + /** + * Update a row group after rows have been removed + * + * @param Frame $group The group to update + * @param Frame $last_row The last row in the row group + */ + function update_row_group(Frame $group, Frame $last_row) { + + $g_key = $group->get_id(); + $r_key = $last_row->get_id(); + + $r_rows = $this->_frames[$r_key]["rows"]; + $this->_frames[$g_key]["rows"] = range( $this->_frames[$g_key]["rows"][0], end($r_rows) ); + + } + + //........................................................................ + + function assign_x_positions() { + // Pre-condition: widths must be resolved and assigned to columns and + // column[0]["x"] must be set. + + $x = $this->_columns[0]["x"]; + foreach ( array_keys($this->_columns) as $j ) { + $this->_columns[$j]["x"] = $x; + $x += $this->_columns[$j]["used-width"]; + + } + + } + + function assign_frame_heights() { + // Pre-condition: widths and heights of each column & row must be + // calcluated + + foreach ( $this->_frames as $arr ) { + $frame = $arr["frame"]; + + $h = 0; + foreach( $arr["rows"] as $row ) { + if ( !isset($this->_rows[$row]) ) + // The row has been removed because of a page split, so skip it. + continue; + $h += $this->_rows[$row]["height"]; + } + + if ( $frame instanceof Table_Cell_Frame_Decorator ) + $frame->set_cell_height($h); + else + $frame->get_style()->height = $h; + } + + } + + //........................................................................ + + /** + * Re-adjust frame height if the table height is larger than its content + */ + function set_frame_heights($table_height, $content_height) { + + + // Distribute the increased height proportionally amongst each row + foreach ( $this->_frames as $arr ) { + $frame = $arr["frame"]; + + $h = 0; + foreach ($arr["rows"] as $row ) { + if ( !isset($this->_rows[$row]) ) + continue; + + $h += $this->_rows[$row]["height"]; + } + + if ( $content_height > 0 ) + $new_height = ($h / $content_height) * $table_height; + else + $new_height = 0; + + if ( $frame instanceof Table_Cell_Frame_Decorator ) + $frame->set_cell_height($new_height); + else + $frame->get_style()->height = $new_height; + } + + } + + //........................................................................ + + // Used for debugging: + function __toString() { + $str = ""; + $str .= "Columns:
"; + $str .= pre_r($this->_columns, true); + $str .= "Rows:
"; + $str .= pre_r($this->_rows, true); + + $str .= "Frames:
"; + $arr = array(); + foreach ( $this->_frames as $key => $val ) + $arr[$key] = array("columns" => $val["columns"], "rows" => $val["rows"]); + + $str .= pre_r($arr, true); + + if ( php_sapi_name() == "cli" ) + $str = strip_tags(str_replace(array("
","",""), + array("\n",chr(27)."[01;33m", chr(27)."[0m"), + $str)); + return $str; + } +} diff --git a/application/third_party/dompdf/include/cpdf_adapter.cls.php b/application/third_party/dompdf/include/cpdf_adapter.cls.php new file mode 100755 index 00000000..8598df52 --- /dev/null +++ b/application/third_party/dompdf/include/cpdf_adapter.cls.php @@ -0,0 +1,919 @@ + + * Portions copyright (c) 2008 - Orion Richardson + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Orion Richardson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - On gif to png conversion tmp file creation, clarify tmp name and add to tmp deletion list only on success + * - On gif to png conversion, when available add direct from gd without tmp file, skip image load if already cached. + * to safe CPU time and memory + * @contributor Helmut Tischer + * @version dompdf_trunk_with_helmut_mods.20090524 + * - Pass temp and fontcache folders to Cpdf, to making Cpdf independent from dompdf + * @version dompdf_trunk_with_helmut_mods.20090528 + * - fix text position according to glyph baseline to match background rectangle + */ + +/* $Id: cpdf_adapter.cls.php 356 2011-01-28 08:56:10Z fabien.menager $ */ + +// FIXME: Need to sanity check inputs to this class +require_once(DOMPDF_LIB_DIR . "/class.pdf.php"); + +/** + * PDF rendering interface + * + * CPDF_Adapter provides a simple stateless interface to the stateful one + * provided by the Cpdf class. + * + * Unless otherwise mentioned, all dimensions are in points (1/72 in). The + * coordinate origin is in the top left corner, and y values increase + * downwards. + * + * See {@link http://www.ros.co.nz/pdf/} for more complete documentation + * on the underlying {@link Cpdf} class. + * + * @package dompdf + */ +class CPDF_Adapter implements Canvas { + + /** + * Dimensions of paper sizes in points + * + * @var array; + */ + static $PAPER_SIZES = array( + "4a0" => array(0,0,4767.87,6740.79), + "2a0" => array(0,0,3370.39,4767.87), + "a0" => array(0,0,2383.94,3370.39), + "a1" => array(0,0,1683.78,2383.94), + "a2" => array(0,0,1190.55,1683.78), + "a3" => array(0,0,841.89,1190.55), + "a4" => array(0,0,595.28,841.89), + "a5" => array(0,0,419.53,595.28), + "a6" => array(0,0,297.64,419.53), + "a7" => array(0,0,209.76,297.64), + "a8" => array(0,0,147.40,209.76), + "a9" => array(0,0,104.88,147.40), + "a10" => array(0,0,73.70,104.88), + "b0" => array(0,0,2834.65,4008.19), + "b1" => array(0,0,2004.09,2834.65), + "b2" => array(0,0,1417.32,2004.09), + "b3" => array(0,0,1000.63,1417.32), + "b4" => array(0,0,708.66,1000.63), + "b5" => array(0,0,498.90,708.66), + "b6" => array(0,0,354.33,498.90), + "b7" => array(0,0,249.45,354.33), + "b8" => array(0,0,175.75,249.45), + "b9" => array(0,0,124.72,175.75), + "b10" => array(0,0,87.87,124.72), + "c0" => array(0,0,2599.37,3676.54), + "c1" => array(0,0,1836.85,2599.37), + "c2" => array(0,0,1298.27,1836.85), + "c3" => array(0,0,918.43,1298.27), + "c4" => array(0,0,649.13,918.43), + "c5" => array(0,0,459.21,649.13), + "c6" => array(0,0,323.15,459.21), + "c7" => array(0,0,229.61,323.15), + "c8" => array(0,0,161.57,229.61), + "c9" => array(0,0,113.39,161.57), + "c10" => array(0,0,79.37,113.39), + "ra0" => array(0,0,2437.80,3458.27), + "ra1" => array(0,0,1729.13,2437.80), + "ra2" => array(0,0,1218.90,1729.13), + "ra3" => array(0,0,864.57,1218.90), + "ra4" => array(0,0,609.45,864.57), + "sra0" => array(0,0,2551.18,3628.35), + "sra1" => array(0,0,1814.17,2551.18), + "sra2" => array(0,0,1275.59,1814.17), + "sra3" => array(0,0,907.09,1275.59), + "sra4" => array(0,0,637.80,907.09), + "letter" => array(0,0,612.00,792.00), + "legal" => array(0,0,612.00,1008.00), + "ledger" => array(0,0,1224.00, 792.00), + "tabloid" => array(0,0,792.00, 1224.00), + "executive" => array(0,0,521.86,756.00), + "folio" => array(0,0,612.00,936.00), + "commercial #10 envelope" => array(0,0,684,297), + "catalog #10 1/2 envelope" => array(0,0,648,864), + "8.5x11" => array(0,0,612.00,792.00), + "8.5x14" => array(0,0,612.00,1008.0), + "11x17" => array(0,0,792.00, 1224.00), + ); + + + /** + * Instance of Cpdf class + * + * @var Cpdf + */ + private $_pdf; + + /** + * PDF width, in points + * + * @var float + */ + private $_width; + + /** + * PDF height, in points + * + * @var float; + */ + private $_height; + + /** + * Current page number + * + * @var int + */ + private $_page_number; + + /** + * Total number of pages + * + * @var int + */ + private $_page_count; + + /** + * Text to display on every page + * + * @var array + */ + private $_page_text; + + /** + * Array of pages for accesing after rendering is initially complete + * + * @var array + */ + private $_pages; + + /** + * Array of temporary cached images to be deleted when processing is complete + * + * @var array + */ + private $_image_cache; + + /** + * Class constructor + * + * @param mixed $paper The size of paper to use in this PDF ({@link CPDF_Adapter::$PAPER_SIZES}) + * @param string $orientation The orienation of the document (either 'landscape' or 'portrait') + */ + function __construct($paper = "letter", $orientation = "portrait") { + + if ( is_array($paper) ) + $size = $paper; + else if ( isset(self::$PAPER_SIZES[mb_strtolower($paper)]) ) + $size = self::$PAPER_SIZES[mb_strtolower($paper)]; + else + $size = self::$PAPER_SIZES["letter"]; + + if ( mb_strtolower($orientation) === "landscape" ) { + list($size[2], $size[3]) = array($size[3], $size[2]); + } + + $this->_pdf = new Cpdf($size, DOMPDF_UNICODE_ENABLED, DOMPDF_FONT_CACHE, DOMPDF_TEMP_DIR); + $this->_pdf->addInfo("Creator", "DOMPDF"); + $time = substr_replace(date('YmdHisO'), '\'', -2, 0).'\''; + $this->_pdf->addInfo("CreationDate", "D:$time"); + $this->_pdf->addInfo("ModDate", "D:$time"); + + $this->_width = $size[2] - $size[0]; + $this->_height= $size[3] - $size[1]; + $this->_pdf->openHere('Fit'); + + $this->_page_number = $this->_page_count = 1; + $this->_page_text = array(); + + $this->_pages = array($this->_pdf->getFirstPageId()); + + $this->_image_cache = array(); + } + + /** + * Class destructor + * + * Deletes all temporary image files + */ + function __destruct() { + foreach ($this->_image_cache as $img) { + //debugpng + if (DEBUGPNG) print '[__destruct unlink '.$img.']'; + if (!DEBUGKEEPTEMP) + unlink($img); + } + clear_object($this); + } + + /** + * Returns the Cpdf instance + * + * @return Cpdf + */ + function get_cpdf() { return $this->_pdf; } + + /** + * Add meta information to the PDF + * + * @param string $label label of the value (Creator, Producer, etc.) + * @param string $value the text to set + */ + function add_info($label, $value) { + $this->_pdf->addInfo($label, $value); + } + + /** + * Opens a new 'object' + * + * While an object is open, all drawing actions are recored in the object, + * as opposed to being drawn on the current page. Objects can be added + * later to a specific page or to several pages. + * + * The return value is an integer ID for the new object. + * + * @see CPDF_Adapter::close_object() + * @see CPDF_Adapter::add_object() + * + * @return int + */ + function open_object() { + $ret = $this->_pdf->openObject(); + $this->_pdf->saveState(); + return $ret; + } + + /** + * Reopens an existing 'object' + * + * @see CPDF_Adapter::open_object() + * @param int $object the ID of a previously opened object + */ + function reopen_object($object) { + $this->_pdf->reopenObject($object); + $this->_pdf->saveState(); + } + + /** + * Closes the current 'object' + * + * @see CPDF_Adapter::open_object() + */ + function close_object() { + $this->_pdf->restoreState(); + $this->_pdf->closeObject(); + } + + /** + * Adds a specified 'object' to the document + * + * $object int specifying an object created with {@link + * CPDF_Adapter::open_object()}. $where can be one of: + * - 'add' add to current page only + * - 'all' add to every page from the current one onwards + * - 'odd' add to all odd numbered pages from now on + * - 'even' add to all even numbered pages from now on + * - 'next' add the object to the next page only + * - 'nextodd' add to all odd numbered pages from the next one + * - 'nexteven' add to all even numbered pages from the next one + * + * @see Cpdf::addObject() + * + * @param int $object + * @param string $where + */ + function add_object($object, $where = 'all') { + $this->_pdf->addObject($object, $where); + } + + /** + * Stops the specified 'object' from appearing in the document. + * + * The object will stop being displayed on the page following the current + * one. + * + * @param int $object + */ + function stop_object($object) { + $this->_pdf->stopObject($object); + } + + /** + * @access private + */ + function serialize_object($id) { + // Serialize the pdf object's current state for retrieval later + return $this->_pdf->serializeObject($id); + } + + /** + * @access private + */ + function reopen_serialized_object($obj) { + return $this->_pdf->restoreSerializedObject($obj); + } + + //........................................................................ + + /** + * Returns the PDF's width in points + * @return float + */ + function get_width() { return $this->_width; } + + /** + * Returns the PDF's height in points + * @return float + */ + function get_height() { return $this->_height; } + + /** + * Returns the current page number + * @return int + */ + function get_page_number() { return $this->_page_number; } + + /** + * Returns the total number of pages in the document + * @return int + */ + function get_page_count() { return $this->_page_count; } + + /** + * Sets the current page number + * + * @param int $num + */ + function set_page_number($num) { $this->_page_number = $num; } + + /** + * Sets the page count + * + * @param int $count + */ + function set_page_count($count) { $this->_page_count = $count; } + + /** + * Sets the stroke colour + * + * See {@link Style::set_colour()} for the format of the color array. + * @param array $color + */ + protected function _set_stroke_color($color) { + $this->_pdf->setStrokeColor($color); + } + + /** + * Sets the fill colour + * + * See {@link Style::set_colour()} for the format of the colour array. + * @param array $color + */ + protected function _set_fill_color($color) { + $this->_pdf->setColor($color); + } + + /** + * Sets line transparency + * @see Cpdf::setLineTransparency() + * + * Valid blend modes are (case-sensitive): + * + * Normal, Multiply, Screen, Overlay, Darken, Lighten, + * ColorDodge, ColorBurn, HardLight, SoftLight, Difference, + * Exclusion + * + * @param string $mode the blending mode to use + * @param float $opacity 0.0 fully transparent, 1.0 fully opaque + */ + protected function _set_line_transparency($mode, $opacity) { + $this->_pdf->setLineTransparency($mode, $opacity); + } + + /** + * Sets fill transparency + * @see Cpdf::setFillTransparency() + * + * Valid blend modes are (case-sensitive): + * + * Normal, Multiply, Screen, Overlay, Darken, Lighten, + * ColorDogde, ColorBurn, HardLight, SoftLight, Difference, + * Exclusion + * + * @param string $mode the blending mode to use + * @param float $opacity 0.0 fully transparent, 1.0 fully opaque + */ + protected function _set_fill_transparency($mode, $opacity) { + $this->_pdf->setFillTransparency($mode, $opacity); + } + + /** + * Sets the line style + * + * @see Cpdf::setLineStyle() + * + * @param float width + * @param string cap + * @param string join + * @param array dash + */ + protected function _set_line_style($width, $cap, $join, $dash) { + $this->_pdf->setLineStyle($width, $cap, $join, $dash); + } + + /** + * Sets the opacity + * + * @param $opacity + * @param $mode + */ + function set_opacity($opacity, $mode = "Normal") { + $this->_set_line_transparency($mode, $opacity); + $this->_set_fill_transparency($mode, $opacity); + } + + //........................................................................ + + + /** + * Remaps y coords from 4th to 1st quadrant + * + * @param float $y + * @return float + */ + protected function y($y) { return $this->_height - $y; } + + // Canvas implementation + + function line($x1, $y1, $x2, $y2, $color, $width, $style = array()) { + //pre_r(compact("x1", "y1", "x2", "y2", "color", "width", "style")); + + $this->_set_stroke_color($color); + $this->_set_line_style($width, "butt", "", $style); + $this->_pdf->line($x1, $this->y($y1), + $x2, $this->y($y2)); + } + + //........................................................................ + + /** + * Convert a GIF or BMP image to a PNG image + * + * @return string The url of the newly converted image + */ + protected function _convert_gif_bmp_to_png($image_url, $image_type) { + $func_name = "imagecreatefrom$image_type"; + + if ( !function_exists($func_name) ) { + throw new DOMPDF_Exception("Function $func_name() not found. Cannot convert $image_type image: $image_url. Please install the image PHP extension."); + } + + set_error_handler("record_warnings"); + $im = $func_name($image_url); + + if ( $im ) { + imageinterlace($im, 0); + + $filename = tempnam(DOMPDF_TEMP_DIR, "{$image_type}dompdf_img_").'.png'; + $this->_image_cache[] = $filename; + + imagepng($im, $filename); + imagedestroy($im); + } else { + $filename = DOMPDF_LIB_DIR . "/res/broken_image.png"; + + } + + restore_error_handler(); + + return $filename; + } + + function rectangle($x1, $y1, $w, $h, $color, $width, $style = array()) { + $this->_set_stroke_color($color); + $this->_set_line_style($width, "butt", "", $style); + $this->_pdf->rectangle($x1, $this->y($y1) - $h, $w, $h); + } + + //........................................................................ + + function filled_rectangle($x1, $y1, $w, $h, $color) { + $this->_set_fill_color($color); + $this->_pdf->filledRectangle($x1, $this->y($y1) - $h, $w, $h); + } + + function clipping_rectangle($x1, $y1, $w, $h) { + $this->_pdf->clippingRectangle($x1, $this->y($y1) - $h, $w, $h); + } + + function clipping_end() { + $this->_pdf->clippingEnd(); + } + + function save() { + $this->_pdf->saveState(); + } + + function restore() { + $this->_pdf->restoreState(); + } + + function rotate($angle, $x, $y) { + $this->_pdf->rotate($angle, $x, $y); + } + + function skew($angle_x, $angle_y, $x, $y) { + $this->_pdf->skew($angle_x, $angle_y, $x, $y); + } + + function scale($s_x, $s_y, $x, $y) { + $this->_pdf->scale($s_x, $s_y, $x, $y); + } + + function translate($t_x, $t_y) { + $this->_pdf->translate($t_x, $t_y); + } + + function transform($a, $b, $c, $d, $e, $f) { + $this->_pdf->transform(array($a, $b, $c, $d, $e, $f)); + } + + //........................................................................ + + function polygon($points, $color, $width = null, $style = array(), $fill = false) { + $this->_set_fill_color($color); + $this->_set_stroke_color($color); + + // Adjust y values + for ( $i = 1; $i < count($points); $i += 2) + $points[$i] = $this->y($points[$i]); + + $this->_pdf->polygon($points, count($points) / 2, $fill); + } + + //........................................................................ + + function circle($x, $y, $r1, $color, $width = null, $style = null, $fill = false) { + $this->_set_fill_color($color); + $this->_set_stroke_color($color); + + if ( !$fill && isset($width) ) + $this->_set_line_style($width, "round", "round", $style); + + $this->_pdf->ellipse($x, $this->y($y), $r1, 0, 0, 8, 0, 360, 1, $fill); + } + + //........................................................................ + + function image($img_url, $img_type, $x, $y, $w, $h) { + //debugpng + if (DEBUGPNG) print '[image:'.$img_url.'|'.$img_type.']'; + + $img_type = mb_strtolower($img_type); + + switch ($img_type) { + case "jpeg": + case "jpg": + //debugpng + if (DEBUGPNG) print '!!!jpg!!!'; + + $this->_pdf->addJpegFromFile($img_url, $x, $this->y($y) - $h, $w, $h); + break; + + case "png": + //debugpng + if (DEBUGPNG) print '!!!png!!!'; + + $this->_pdf->addPngFromFile($img_url, $x, $this->y($y) - $h, $w, $h); + break; + + case "gif": + case "bmp": + // Convert gifs or bmps to pngs + //DEBUG_IMG_TEMP + //if (0) { + if ( method_exists( $this->_pdf, "addImagePng" ) ) { + //debugpng + if (DEBUGPNG) print "!!!$img_type addImagePng!!!"; + + //If optimization to direct png creation from gd object is available, + //don't create temp file, but place gd object directly into the pdf + if ( method_exists( $this->_pdf, "image_iscached" ) && + $this->_pdf->image_iscached($img_url) ) { + //If same image has occured already before, no need to load because + //duplicate will anyway be eliminated. + $img = null; + unset($img); + } + else { + $func_name = "imagecreatefrom$img_type"; + $img = @$func_name($img_url); + if ( !$img ) { + return; + } + imageinterlace($img, false); + } + + $this->_pdf->addImagePng($img_url, $x, $this->y($y) - $h, $w, $h, $img); + + if ( $img ) { + imagedestroy($img); + } + } + else { + //debugpng + if (DEBUGPNG) print "!!!$img_type addPngFromFile!!!"; + $img_url = $this->_convert_gif_bmp_to_png($img_url, $img_type); + $this->_pdf->addPngFromFile($img_url, $x, $this->y($y) - $h, $w, $h); + } + break; + + default: + //debugpng + if (DEBUGPNG) print '!!!unknown!!!'; + break; + } + + return; + } + + //........................................................................ + + function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0, $char_space = 0, $angle = 0) { + $pdf = $this->_pdf; + + $pdf->setColor($color); + + $font .= ".afm"; + $pdf->selectFont($font); + + //Font_Metrics::get_font_height($font, $size) == + //$this->get_font_height($font, $size) == + //$this->_pdf->selectFont($font),$this->_pdf->getFontHeight($size) + //- FontBBoxheight+FontHeightOffset, scaled to $size, in pt + //$this->_pdf->getFontDescender($size) + //- Descender scaled to size + // + //$this->_pdf->fonts[$this->_pdf->currentFont] sizes: + //['FontBBox'][0] left, ['FontBBox'][1] bottom, ['FontBBox'][2] right, ['FontBBox'][3] top + //Maximum extent of all glyphs of the font from the baseline point + //['Ascender'] maximum height above baseline except accents + //['Descender'] maximum depth below baseline, negative number means below baseline + //['FontHeightOffset'] manual enhancement of .afm files to trim windows fonts. currently not used. + //Values are in 1/1000 pt for a font size of 1 pt + // + //['FontBBox'][1] should be close to ['Descender'] + //['FontBBox'][3] should be close to ['Ascender']+Accents + //in practice, FontBBox values are a little bigger + // + //The text position is referenced to the baseline, not to the lower corner of the FontBBox, + //for what the left,top corner is given. + //FontBBox spans also the background box for the text. + //If the lower corner would be used as reference point, the Descents of the glyphs would + //hang over the background box border. + //Therefore compensate only the extent above the Baseline. + // + //print '
['.$font.','.$size.','.$pdf->getFontHeight($size).','.$pdf->getFontDescender($size).','.$pdf->fonts[$pdf->currentFont]['FontBBox'][3].','.$pdf->fonts[$pdf->currentFont]['FontBBox'][1].','.$pdf->fonts[$pdf->currentFont]['FontHeightOffset'].','.$pdf->fonts[$pdf->currentFont]['Ascender'].','.$pdf->fonts[$pdf->currentFont]['Descender'].']
'; + // + //$pdf->addText($x, $this->y($y) - Font_Metrics::get_font_height($font, $size), $size, $text, $angle, $word_space, $char_space); + //$pdf->addText($x, $this->y($y) - $size, $size, $text, $angle, $word_space, $char_space); + //$pdf->addText($x, $this->y($y) - $pdf->getFontHeight($size)-$pdf->getFontDescender($size), $size, $text, $angle, $word_space, $char_space); + $pdf->addText($x, $this->y($y) - ($pdf->fonts[$pdf->currentFont]['FontBBox'][3]*$size)/1000, $size, $text, $angle, $word_space, $char_space); + } + + //........................................................................ + + function javascript($code) { + $this->_pdf->addJavascript($code); + } + + //........................................................................ + + /** + * Add a named destination (similar to ... in html) + * + * @param string $anchorname The name of the named destination + */ + function add_named_dest($anchorname) { + $this->_pdf->addDestination($anchorname, "Fit"); + } + + //........................................................................ + + /** + * Add a link to the pdf + * + * @param string $url The url to link to + * @param float $x The x position of the link + * @param float $y The y position of the link + * @param float $width The width of the link + * @param float $height The height of the link + */ + function add_link($url, $x, $y, $width, $height) { + + $y = $this->y($y) - $height; + + if ( strpos($url, '#') === 0 ) { + // Local link + $name = substr($url,1); + if ( $name ) + $this->_pdf->addInternalLink($name, $x, $y, $x + $width, $y + $height); + + } else { + $this->_pdf->addLink(rawurldecode($url), $x, $y, $x + $width, $y + $height); + } + } + + //........................................................................ + + function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0) { + $this->_pdf->selectFont($font); + if (!DOMPDF_UNICODE_ENABLED) { + $text = mb_convert_encoding($text, 'Windows-1252', 'UTF-8'); + } + return $this->_pdf->getTextWidth($size, $text, $word_spacing, $char_spacing); + } + + //........................................................................ + + function get_font_height($font, $size) { + $this->_pdf->selectFont($font); + return $this->_pdf->getFontHeight($size) * DOMPDF_FONT_HEIGHT_RATIO; + } + + //........................................................................ + + /** + * Writes text at the specified x and y coordinates on every page + * + * The strings '{PAGE_NUM}' and '{PAGE_COUNT}' are automatically replaced + * with their current values. + * + * See {@link Style::munge_colour()} for the format of the colour array. + * + * @param float $x + * @param float $y + * @param string $text the text to write + * @param string $font the font file to use + * @param float $size the font size, in points + * @param array $color + * @param float $adjust word spacing adjustment + * @param float $angle angle to write the text at, measured CW starting from the x-axis + */ + function page_text($x, $y, $text, $font, $size, $color = array(0,0,0), $adjust = 0, $angle = 0) { + $_t = "text"; + $this->_page_text[] = compact("_t", "x", "y", "text", "font", "size", "color", "adjust", "angle"); + } + + //........................................................................ + + /** + * Processes a script on every page + * + * The variables $pdf, $PAGE_NUM, and $PAGE_COUNT are available. + * + * This function can be used to add page numbers to all pages + * after the first one, for example. + * + * @param string $code the script code + * @param string $type the language type for script + */ + function page_script($code, $type = "text/php") { + $_t = "script"; + $this->_page_text[] = compact("_t", "code", "type"); + } + + //........................................................................ + + function new_page() { + $this->_page_number++; + $this->_page_count++; + + $ret = $this->_pdf->newPage(); + $this->_pages[] = $ret; + return $ret; + } + + //........................................................................ + + /** + * Add text to each page after rendering is complete + */ + protected function _add_page_text() { + + if ( !count($this->_page_text) ) + return; + + $page_number = 1; + $eval = null; + + foreach ($this->_pages as $pid) { + $this->reopen_object($pid); + + foreach ($this->_page_text as $pt) { + extract($pt); + + switch ($_t) { + + case "text": + $text = str_replace(array("{PAGE_NUM}","{PAGE_COUNT}"), + array($page_number, $this->_page_count), $text); + $this->text($x, $y, $text, $font, $size, $color, $adjust, $angle); + break; + + case "script": + if (!$eval) { + $eval = new PHP_Evaluator($this); + } + $eval->evaluate($code, array('PAGE_NUM' => $page_number, 'PAGE_COUNT' => $this->_page_count)); + break; + } + } + + $this->close_object(); + $page_number++; + } + } + + /** + * Streams the PDF directly to the browser + * + * @param string $filename the name of the PDF file + * @param array $options associative array, 'Attachment' => 0 or 1, 'compress' => 1 or 0 + */ + function stream($filename, $options = null) { + // Add page text + $this->_add_page_text(); + + $options["Content-Disposition"] = $filename; + $this->_pdf->stream($options); + } + + //........................................................................ + + /** + * Returns the PDF as a string + * + * @param array $options Output options + * @return string + */ + function output($options = null) { + // Add page text + $this->_add_page_text(); + + $debug = isset($options["compress"]) && $options["compress"] != 1; + + return $this->_pdf->output($debug); + } + + //........................................................................ + + /** + * Returns logging messages generated by the Cpdf class + * + * @return string + */ + function get_messages() { return $this->_pdf->messages; } + +} diff --git a/application/third_party/dompdf/include/css_color.cls.php b/application/third_party/dompdf/include/css_color.cls.php new file mode 100755 index 00000000..f6f003a7 --- /dev/null +++ b/application/third_party/dompdf/include/css_color.cls.php @@ -0,0 +1,287 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Fabien M�nager + * @package dompdf + */ + +/* $Id: css_color.cls.php 300 2010-08-11 22:01:09Z fabien.menager $ */ + +class CSS_Color { + static $cssColorNames = array( + "aliceblue" => "F0F8FF", + "antiquewhite" => "FAEBD7", + "aqua" => "00FFFF", + "aquamarine" => "7FFFD4", + "azure" => "F0FFFF", + "beige" => "F5F5DC", + "bisque" => "FFE4C4", + "black" => "000000", + "blanchedalmond" => "FFEBCD", + "blue" => "0000FF", + "blueviolet" => "8A2BE2", + "brown" => "A52A2A", + "burlywood" => "DEB887", + "cadetblue" => "5F9EA0", + "chartreuse" => "7FFF00", + "chocolate" => "D2691E", + "coral" => "FF7F50", + "cornflowerblue" => "6495ED", + "cornsilk" => "FFF8DC", + "crimson" => "DC143C", + "cyan" => "00FFFF", + "darkblue" => "00008B", + "darkcyan" => "008B8B", + "darkgoldenrod" => "B8860B", + "darkgray" => "A9A9A9", + "darkgreen" => "006400", + "darkgrey" => "A9A9A9", + "darkkhaki" => "BDB76B", + "darkmagenta" => "8B008B", + "darkolivegreen" => "556B2F", + "darkorange" => "FF8C00", + "darkorchid" => "9932CC", + "darkred" => "8B0000", + "darksalmon" => "E9967A", + "darkseagreen" => "8FBC8F", + "darkslateblue" => "483D8B", + "darkslategray" => "2F4F4F", + "darkslategrey" => "2F4F4F", + "darkturquoise" => "00CED1", + "darkviolet" => "9400D3", + "deeppink" => "FF1493", + "deepskyblue" => "00BFFF", + "dimgray" => "696969", + "dimgrey" => "696969", + "dodgerblue" => "1E90FF", + "firebrick" => "B22222", + "floralwhite" => "FFFAF0", + "forestgreen" => "228B22", + "fuchsia" => "FF00FF", + "gainsboro" => "DCDCDC", + "ghostwhite" => "F8F8FF", + "gold" => "FFD700", + "goldenrod" => "DAA520", + "gray" => "808080", + "green" => "008000", + "greenyellow" => "ADFF2F", + "grey" => "808080", + "honeydew" => "F0FFF0", + "hotpink" => "FF69B4", + "indianred" => "CD5C5C", + "indigo" => "4B0082", + "ivory" => "FFFFF0", + "khaki" => "F0E68C", + "lavender" => "E6E6FA", + "lavenderblush" => "FFF0F5", + "lawngreen" => "7CFC00", + "lemonchiffon" => "FFFACD", + "lightblue" => "ADD8E6", + "lightcoral" => "F08080", + "lightcyan" => "E0FFFF", + "lightgoldenrodyellow" => "FAFAD2", + "lightgray" => "D3D3D3", + "lightgreen" => "90EE90", + "lightgrey" => "D3D3D3", + "lightpink" => "FFB6C1", + "lightsalmon" => "FFA07A", + "lightseagreen" => "20B2AA", + "lightskyblue" => "87CEFA", + "lightslategray" => "778899", + "lightslategrey" => "778899", + "lightsteelblue" => "B0C4DE", + "lightyellow" => "FFFFE0", + "lime" => "00FF00", + "limegreen" => "32CD32", + "linen" => "FAF0E6", + "magenta" => "FF00FF", + "maroon" => "800000", + "mediumaquamarine" => "66CDAA", + "mediumblue" => "0000CD", + "mediumorchid" => "BA55D3", + "mediumpurple" => "9370DB", + "mediumseagreen" => "3CB371", + "mediumslateblue" => "7B68EE", + "mediumspringgreen" => "00FA9A", + "mediumturquoise" => "48D1CC", + "mediumvioletred" => "C71585", + "midnightblue" => "191970", + "mintcream" => "F5FFFA", + "mistyrose" => "FFE4E1", + "moccasin" => "FFE4B5", + "navajowhite" => "FFDEAD", + "navy" => "000080", + "oldlace" => "FDF5E6", + "olive" => "808000", + "olivedrab" => "6B8E23", + "orange" => "FFA500", + "orangered" => "FF4500", + "orchid" => "DA70D6", + "palegoldenrod" => "EEE8AA", + "palegreen" => "98FB98", + "paleturquoise" => "AFEEEE", + "palevioletred" => "DB7093", + "papayawhip" => "FFEFD5", + "peachpuff" => "FFDAB9", + "peru" => "CD853F", + "pink" => "FFC0CB", + "plum" => "DDA0DD", + "powderblue" => "B0E0E6", + "purple" => "800080", + "red" => "FF0000", + "rosybrown" => "BC8F8F", + "royalblue" => "4169E1", + "saddlebrown" => "8B4513", + "salmon" => "FA8072", + "sandybrown" => "F4A460", + "seagreen" => "2E8B57", + "seashell" => "FFF5EE", + "sienna" => "A0522D", + "silver" => "C0C0C0", + "skyblue" => "87CEEB", + "slateblue" => "6A5ACD", + "slategray" => "708090", + "slategrey" => "708090", + "snow" => "FFFAFA", + "springgreen" => "00FF7F", + "steelblue" => "4682B4", + "tan" => "D2B48C", + "teal" => "008080", + "thistle" => "D8BFD8", + "tomato" => "FF6347", + "turquoise" => "40E0D0", + "violet" => "EE82EE", + "wheat" => "F5DEB3", + "white" => "FFFFFF", + "whitesmoke" => "F5F5F5", + "yellow" => "FFFF00", + "yellowgreen" => "9ACD32", + ); + + static function parse($colour) { + if ( is_array($colour) ) + // Assume the array has the right format... + // FIXME: should/could verify this. + return $colour; + + $colour = strtolower($colour); + + if (isset(self::$cssColorNames[$colour])) + return self::getArray(self::$cssColorNames[$colour]); + + if ($colour === "transparent") + return "transparent"; + + $length = mb_strlen($colour); + + // #rgb format + if ( $length == 4 && $colour[0] === "#" ) { + return self::getArray($colour[1].$colour[1].$colour[2].$colour[2].$colour[3].$colour[3]); + + // #rrggbb format + } else if ( $length == 7 && $colour[0] === "#" ) { + return self::getArray(mb_substr($colour, 1, 6)); + + // rgb( r,g,b ) format + } else if ( mb_strpos($colour, "rgb") !== false ) { + $i = mb_strpos($colour, "("); + $j = mb_strpos($colour, ")"); + + // Bad colour value + if ($i === false || $j === false) + return null; + + $triplet = explode(",", mb_substr($colour, $i+1, $j-$i-1)); + + if (count($triplet) != 3) + return null; + + foreach (array_keys($triplet) as $c) { + $triplet[$c] = trim($triplet[$c]); + + if ( $triplet[$c][mb_strlen($triplet[$c]) - 1] === "%" ) + $triplet[$c] = round($triplet[$c] * 2.55); + } + + return self::getArray(vsprintf("%02X%02X%02X", $triplet)); + + // cmyk( c,m,y,k ) format + // http://www.w3.org/TR/css3-gcpm/#cmyk-colors + } else if ( mb_strpos($colour, "cmyk") !== false ) { + $i = mb_strpos($colour, "("); + $j = mb_strpos($colour, ")"); + + // Bad colour value + if ($i === false || $j === false) + return null; + + $values = explode(",", mb_substr($colour, $i+1, $j-$i-1)); + + if (count($values) != 4) + return null; + + foreach ($values as &$c) { + $c = floatval(trim($c)); + if ($c > 1.0) $c = 1.0; + if ($c < 0.0) $c = 0.0; + } + + return self::getArray($values); + } + } + + static function getArray($colour) { + $c = array(null, null, null, null, "hex" => null); + + if (is_array($colour)) { + $c = $colour; + $c["c"] = $c[0]; + $c["m"] = $c[1]; + $c["y"] = $c[2]; + $c["k"] = $c[3]; + $c["hex"] = "cmyk($c[0],$c[1],$c[2],$c[3])"; + } + else { + $c[0] = hexdec(mb_substr($colour, 0, 2)) / 0xff; + $c[1] = hexdec(mb_substr($colour, 2, 2)) / 0xff; + $c[2] = hexdec(mb_substr($colour, 4, 2)) / 0xff; + $c["r"] = $c[0]; + $c["g"] = $c[1]; + $c["b"] = $c[2]; + $c["hex"] = "#$colour"; + } + + return $c; + } +} diff --git a/application/third_party/dompdf/include/dompdf.cls.php b/application/third_party/dompdf/include/dompdf.cls.php new file mode 100755 index 00000000..7cff2491 --- /dev/null +++ b/application/third_party/dompdf/include/dompdf.cls.php @@ -0,0 +1,792 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: dompdf.cls.php 362 2011-02-16 22:17:28Z fabien.menager $ */ + +/** + * DOMPDF - PHP5 HTML to PDF renderer + * + * DOMPDF loads HTML and does its best to render it as a PDF. It gets its + * name from the new DomDocument PHP5 extension. Source HTML is first + * parsed by a DomDocument object. DOMPDF takes the resulting DOM tree and + * attaches a {@link Frame} object to each node. {@link Frame} objects store + * positioning and layout information and each has a reference to a {@link + * Style} object. + * + * Style information is loaded and parsed (see {@link Stylesheet}) and is + * applied to the frames in the tree by using XPath. CSS selectors are + * converted into XPath queries, and the computed {@link Style} objects are + * applied to the {@link Frame}s. + * + * {@link Frame}s are then decorated (in the design pattern sense of the + * word) based on their CSS display property ({@link + * http://www.w3.org/TR/CSS21/visuren.html#propdef-display}). + * Frame_Decorators augment the basic {@link Frame} class by adding + * additional properties and methods specific to the particular type of + * {@link Frame}. For example, in the CSS layout model, block frames + * (display: block;) contain line boxes that are usually filled with text or + * other inline frames. The Block_Frame_Decorator therefore adds a $lines + * property as well as methods to add {@link Frame}s to lines and to add + * additional lines. {@link Frame}s also are attached to specific + * Positioner and {@link Frame_Reflower} objects that contain the + * positioining and layout algorithm for a specific type of frame, + * respectively. This is an application of the Strategy pattern. + * + * Layout, or reflow, proceeds recursively (post-order) starting at the root + * of the document. Space constraints (containing block width & height) are + * pushed down, and resolved positions and sizes bubble up. Thus, every + * {@link Frame} in the document tree is traversed once (except for tables + * which use a two-pass layout algorithm). If you are interested in the + * details, see the reflow() method of the Reflower classes. + * + * Rendering is relatively straightforward once layout is complete. {@link + * Frame}s are rendered using an adapted {@link Cpdf} class, originally + * written by Wayne Munro, http://www.ros.co.nz/pdf/. (Some performance + * related changes have been made to the original {@link Cpdf} class, and + * the {@link CPDF_Adapter} class provides a simple, stateless interface to + * PDF generation.) PDFLib support has now also been added, via the {@link + * PDFLib_Adapter}. + * + * + * @package dompdf + */ +class DOMPDF { + + /** + * DomDocument representing the HTML document + * + * @var DomDocument + */ + protected $_xml; + + /** + * Frame_Tree derived from the DOM tree + * + * @var Frame_Tree + */ + protected $_tree; + + /** + * Stylesheet for the document + * + * @var Stylesheet + */ + protected $_css; + + /** + * Actual PDF renderer + * + * @var Canvas + */ + protected $_pdf; + + /** + * Desired paper size ('letter', 'legal', 'A4', etc.) + * + * @var string + */ + protected $_paper_size; + + /** + * Paper orientation ('portrait' or 'landscape') + * + * @var string + */ + protected $_paper_orientation; + + /** + * Callbacks on new page and new element + * + * @var array + */ + protected $_callbacks; + + /** + * Experimental caching capability + * + * @var string + */ + private $_cache_id; + + /** + * Base hostname + * + * Used for relative paths/urls + * @var string + */ + protected $_base_host; + + /** + * Absolute base path + * + * Used for relative paths/urls + * @var string + */ + protected $_base_path; + + /** + * Protcol used to request file (file://, http://, etc) + * + * @var string + */ + protected $_protocol; + + /** + * Timestamp of the script start time + * + * @var int + */ + private $_start_time = null; + + /** + * @var string The system's locale + */ + private $_system_locale = null; + + /** + * @var bool Tells if the system's locale is the C standard one + */ + private $_locale_standard = false; + + /** + * Class constructor + */ + function __construct() { + $this->_locale_standard = sprintf('%.1f', 1.0) == '1.0'; + + $this->save_locale(); + + $this->_messages = array(); + $this->_xml = new DOMDocument(); + $this->_xml->preserveWhiteSpace = true; + $this->_tree = new Frame_Tree($this->_xml); + $this->_css = new Stylesheet(); + $this->_pdf = null; + $this->_paper_size = "letter"; + $this->_paper_orientation = "portrait"; + $this->_base_protocol = ""; + $this->_base_host = ""; + $this->_base_path = ""; + $this->_callbacks = array(); + $this->_cache_id = null; + + $this->restore_locale(); + } + + /** + * Class destructor + */ + function __destruct() { + clear_object($this); + } + + /** + * Save the system's locale configuration and + * set the right value for numeric formatting + */ + private function save_locale() { + if ( $this->_locale_standard ) return; + + $this->_system_locale = setlocale(LC_NUMERIC, "C"); + } + + /** + * Restore the system's locale configuration + */ + private function restore_locale() { + if ( $this->_locale_standard ) return; + + setlocale(LC_NUMERIC, $this->_system_locale); + } + + /** + * Returns the underlying {@link Frame_Tree} object + * + * @return Frame_Tree + */ + function get_tree() { return $this->_tree; } + + /** + * Sets the protocol to use + * FIXME validate these + * + * @param string $proto + */ + function set_protocol($proto) { $this->_protocol = $proto; } + + /** + * Sets the base hostname + * + * @param string $host + */ + function set_host($host) { $this->_base_host = $host; } + + /** + * Sets the base path + * + * @param string $path + */ + function set_base_path($path) { $this->_base_path = $path; } + + /** + * Returns the protocol in use + * + * @return string + */ + function get_protocol() { return $this->_protocol; } + + /** + * Returns the base hostname + * + * @return string + */ + function get_host() { return $this->_base_host; } + + /** + * Returns the base path + * + * @return string + */ + function get_base_path() { return $this->_base_path; } + + /** + * Return the underlying Canvas instance (e.g. CPDF_Adapter, GD_Adapter) + * + * @return Canvas + */ + function get_canvas() { return $this->_pdf; } + + /** + * Returns the callbacks array + * + * @return array + */ + function get_callbacks() { return $this->_callbacks; } + + /** + * Loads an HTML file + * + * Parse errors are stored in the global array _dompdf_warnings. + * + * @param string $file a filename or url to load + */ + function load_html_file($file) { + $this->save_locale(); + + // Store parsing warnings as messages (this is to prevent output to the + // browser if the html is ugly and the dom extension complains, + // preventing the pdf from being streamed.) + if ( !$this->_protocol && !$this->_base_host && !$this->_base_path ) + list($this->_protocol, $this->_base_host, $this->_base_path) = explode_url($file); + + if ( !DOMPDF_ENABLE_REMOTE && + ($this->_protocol != "" && $this->_protocol !== "file://" ) ) + throw new DOMPDF_Exception("Remote file requested, but DOMPDF_ENABLE_REMOTE is false."); + + if ($this->_protocol == "" || $this->_protocol === "file://") { + + $realfile = realpath($file); + if ( !$file ) + throw new DOMPDF_Exception("File '$file' not found."); + + if ( strpos($realfile, DOMPDF_CHROOT) !== 0 ) + throw new DOMPDF_Exception("Permission denied on $file."); + + // Exclude dot files (e.g. .htaccess) + if ( substr(basename($realfile),0,1) === "." ) + throw new DOMPDF_Exception("Permission denied on $file."); + + $file = $realfile; + } + + $contents = file_get_contents($file); + $encoding = null; + + // See http://the-stickman.com/web-development/php/getting-http-response-headers-when-using-file_get_contents/ + if ( isset($http_response_header) ) { + foreach($http_response_header as $_header) { + if ( preg_match("@Content-Type:\s*[\w/]+;\s*?charset=([^\s]+)@i", $_header, $matches) ) { + $encoding = strtoupper($matches[1]); + break; + } + } + } + + $this->restore_locale(); + + $this->load_html($contents, $encoding); + } + + /** + * Loads an HTML string + * + * Parse errors are stored in the global array _dompdf_warnings. + * + * @param string $str HTML text to load + */ + function load_html($str, $encoding = null) { + $this->save_locale(); + + // TODO: use the $encoding variable + // FIXME: Determine character encoding, switch to UTF8, update meta tag. Need better http/file stream encoding detection, currently relies on text or meta tag. + mb_detect_order('auto'); + + if (mb_detect_encoding($str) !== 'UTF-8') { + $metatags = array( + '@', '', $str); + } + } + + // Parse embedded php, first-pass + if ( DOMPDF_ENABLE_PHP ) { + ob_start(); + eval("?" . ">$str"); + $str = ob_get_clean(); + } + + // if the document contains non utf-8 with a utf-8 meta tag chars and was + // detected as utf-8 by mbstring, problems could happen. + // http://devzone.zend.com/article/8855 + if ( $encoding === 'UTF-8' ) { + $str = preg_replace("/]+)>/", "", $str); + } + + // Store parsing warnings as messages + set_error_handler("record_warnings"); + $this->_xml->loadHTML($str); + restore_error_handler(); + + /** + @todo Take the quirksmode into account + // http://hsivonen.iki.fi/doctype/ + // https://developer.mozilla.org/en/mozilla's_quirks_mode + $quirksmode = false; + + // HTML5 + if ( !$this->_xml->doctype->publicId && !$this->_xml->doctype->systemId ) { + $quirksmode = false; + } + + // not XHTML + if ( !preg_match("/xhtml/i", $this->_xml->doctype->publicId) ) { + $quirksmode = true; + } + */ + + $this->restore_locale(); + } + + /** + * Builds the {@link Frame_Tree}, loads any CSS and applies the styles to + * the {@link Frame_Tree} + */ + protected function _process_html() { + $this->save_locale(); + + $this->_tree->build_tree(); + + $this->_css->load_css_file(Stylesheet::DEFAULT_STYLESHEET); + + $acceptedmedia = Stylesheet::$ACCEPTED_GENERIC_MEDIA_TYPES; + if ( defined("DOMPDF_DEFAULT_MEDIA_TYPE") ) { + $acceptedmedia[] = DOMPDF_DEFAULT_MEDIA_TYPE; + } else { + $acceptedmedia[] = Stylesheet::$ACCEPTED_DEFAULT_MEDIA_TYPE; + } + + // load tags + $links = $this->_xml->getElementsByTagName("link"); + foreach ($links as $link) { + if ( mb_strtolower($link->getAttribute("rel")) === "stylesheet" || + mb_strtolower($link->getAttribute("type")) === "text/css" ) { + //Check if the css file is for an accepted media type + //media not given then always valid + $formedialist = preg_split("/[\s\n,]/", $link->getAttribute("media"),-1, PREG_SPLIT_NO_EMPTY); + if ( count($formedialist) > 0 ) { + $accept = false; + foreach ( $formedialist as $type ) { + if ( in_array(mb_strtolower(trim($type)), $acceptedmedia) ) { + $accept = true; + break; + } + } + if (!$accept) { + //found at least one mediatype, but none of the accepted ones + //Skip this css file. + continue; + } + } + + $url = $link->getAttribute("href"); + $url = build_url($this->_protocol, $this->_base_host, $this->_base_path, $url); + + $this->_css->load_css_file($url); + } + + } + + // load + $child = $child->nextSibling; + } + + } else + $css = $style->nodeValue; + + // Set the base path of the Stylesheet to that of the file being processed + $this->_css->set_protocol($this->_protocol); + $this->_css->set_host($this->_base_host); + $this->_css->set_base_path($this->_base_path); + + $this->_css->load_css($css); + } + + $this->restore_locale(); + } + + /** + * Sets the paper size & orientation + * + * @param string $size 'letter', 'legal', 'A4', etc. {@link CPDF_Adapter::$PAPER_SIZES} + * @param string $orientation 'portrait' or 'landscape' + */ + function set_paper($size, $orientation = "portrait") { + $this->_paper_size = $size; + $this->_paper_orientation = $orientation; + } + + /** + * Enable experimental caching capability + * @access private + */ + function enable_caching($cache_id) { + $this->_cache_id = $cache_id; + } + + /** + * Sets callbacks for events like rendering of pages and elements. + * The callbacks array contains arrays with 'event' set to 'begin_page', + * 'end_page', 'begin_frame', or 'end_frame' and 'f' set to a function or + * object plus method to be called. + * + * The function 'f' must take an array as argument, which contains info + * about the event. + * + * @param array $callbacks the set of callbacks to set + */ + function set_callbacks($callbacks) { + if (is_array($callbacks)) { + $this->_callbacks = array(); + foreach ($callbacks as $c) { + if (is_array($c) && isset($c['event']) && isset($c['f'])) { + $event = $c['event']; + $f = $c['f']; + if (is_callable($f) && is_string($event)) { + $this->_callbacks[$event][] = $f; + } + } + } + } + } + + /** + * Renders the HTML to PDF + */ + function render() { + $this->save_locale(); + + if ( DOMPDF_LOG_OUTPUT_FILE ) { + if ( !file_exists(DOMPDF_LOG_OUTPUT_FILE) && is_writable(dirname(DOMPDF_LOG_OUTPUT_FILE)) ) { + touch(DOMPDF_LOG_OUTPUT_FILE); + } + + $this->_start_time = microtime(true); + ob_start(); + } + + //enable_mem_profile(); + + $this->_process_html(); + + $this->_css->apply_styles($this->_tree); + + $root = null; + + foreach ($this->_tree->get_frames() as $frame) { + // Set up the root frame + + if ( is_null($root) ) { + $root = Frame_Factory::decorate_root( $this->_tree->get_root(), $this ); + continue; + } + + // Create the appropriate decorators, reflowers & positioners. + $deco = Frame_Factory::decorate_frame($frame, $this); + $deco->set_root($root); + + // FIXME: handle generated content + if ( $frame->get_style()->display === "list-item" ) { + + // Insert a list-bullet frame + $node = $this->_xml->createElement("bullet"); // arbitrary choice + $b_f = new Frame($node); + + $parent_node = $frame->get_parent()->get_node(); + + if ( !$parent_node->hasAttribute("dompdf-children-count") ) { + $count = 0; + foreach ($parent_node->childNodes as $_node) { + if ( $_node instanceof DOMElement ) + $count++; + } + $parent_node->setAttribute("dompdf-children-count", $count); + } + + $index = 0; + if ( !$parent_node->hasAttribute("dompdf-counter") ) { + $index = 1; + $parent_node->setAttribute("dompdf-counter", 1); + } + else { + $index = $parent_node->getAttribute("dompdf-counter"); + $index++; + $parent_node->setAttribute("dompdf-counter", $index); + } + + $node->setAttribute("dompdf-counter", $index); + $style = $this->_css->create_style(); + $style->display = "-dompdf-list-bullet"; + $style->inherit($frame->get_style()); + $b_f->set_style($style); + + $deco->prepend_child( Frame_Factory::decorate_frame($b_f, $this) ); + } + + } + + $page_style = $this->_css->get_page_style(); + + if ( $page_style && is_array($page_style->size) ) { + $this->set_paper(array(0, 0, $page_style->size[0], $page_style->size[1])); + } + + $this->_pdf = Canvas_Factory::get_instance($this->_paper_size, $this->_paper_orientation); + + // Add meta information + $title = $this->_xml->getElementsByTagName("title"); + if ( $title->length ) { + $this->_pdf->add_info("Title", trim($title->item(0)->nodeValue)); + } + + $metas = $this->_xml->getElementsByTagName("meta"); + $labels = array( + "author" => "Author", + "keywords" => "Keywords", + "description" => "Subject", + ); + foreach($metas as $meta) { + $name = mb_strtolower($meta->getAttribute("name")); + if ( isset($labels[$name]) ) { + $this->_pdf->add_info($labels[$name], trim($meta->getAttribute("content"))); + } + } + + $root->set_containing_block(0, 0, $this->_pdf->get_width(), $this->_pdf->get_height()); + $root->set_renderer(new Renderer($this)); + + // This is where the magic happens: + $root->reflow(); + + // Clean up cached images + Image_Cache::clear(); + + global $_dompdf_warnings, $_dompdf_show_warnings; + if ( $_dompdf_show_warnings ) { + echo 'DOMPDF Warnings
';
+      foreach ($_dompdf_warnings as $msg)
+        echo $msg . "\n";
+      echo $this->get_canvas()->get_cpdf()->messages;
+      echo '
'; + flush(); + } + + $this->restore_locale(); + } + + /** + * Add meta information to the PDF after rendering + */ + function add_info($label, $value) { + if (!is_null($this->_pdf)) + $this->_pdf->add_info($label, $value); + } + + /** + * Writes the output buffer in the log file + * @return void + */ + private function write_log() { + if ( !DOMPDF_LOG_OUTPUT_FILE || !is_writable(DOMPDF_LOG_OUTPUT_FILE) ) return; + + $memory = DOMPDF_memory_usage(); + $memory = number_format($memory/1024); + $time = number_format((microtime(true) - $this->_start_time) * 1000, 4); + + $out = "$memory KB ". + "$time ms
"; + + $out .= ob_get_clean(); + file_put_contents(DOMPDF_LOG_OUTPUT_FILE, $out); + } + + /** + * Streams the PDF to the client + * + * The file will open a download dialog by default. The options + * parameter controls the output. Accepted options are: + * + * 'Accept-Ranges' => 1 or 0 - if this is not set to 1, then this + * header is not included, off by default this header seems to + * have caused some problems despite the fact that it is supposed + * to solve them, so I am leaving it off by default. + * + * 'compress' = > 1 or 0 - apply content stream compression, this is + * on (1) by default + * + * 'Attachment' => 1 or 0 - if 1, force the browser to open a + * download dialog, on (1) by default + * + * @param string $filename the name of the streamed file + * @param array $options header options (see above) + */ + function stream($filename, $options = null) { + $this->save_locale(); + + $this->write_log(); + + if (!is_null($this->_pdf)) + $this->_pdf->stream($filename, $options); + + $this->restore_locale(); + } + + /** + * Returns the PDF as a string + * + * The file will open a download dialog by default. The options + * parameter controls the output. Accepted options are: + * + * + * 'compress' = > 1 or 0 - apply content stream compression, this is + * on (1) by default + * + * + * @param array $options options (see above) + * @return string + */ + function output($options = null) { + $this->save_locale(); + + $this->write_log(); + + if ( is_null($this->_pdf) ) + return null; + + $output = $this->_pdf->output( $options ); + + $this->restore_locale(); + + return $output; + } + + /** + * Returns the underlying HTML document as a string + * + * @return string + */ + function output_html() { + return $this->_xml->saveHTML(); + } +} diff --git a/application/third_party/dompdf/include/dompdf_exception.cls.php b/application/third_party/dompdf/include/dompdf_exception.cls.php new file mode 100755 index 00000000..bc61e31a --- /dev/null +++ b/application/third_party/dompdf/include/dompdf_exception.cls.php @@ -0,0 +1,60 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: dompdf_exception.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Standard exception thrown by DOMPDF classes + * + * @link http://www.zend.com/php5/articles/engine2-php5-changes.php#Heading12 + * @package dompdf + */ +class DOMPDF_Exception extends Exception { + + /** + * Class constructor + * + * @param string $message Error message + * @param int $code Error code + */ + function __construct($message = NULL, $code = 0) { + parent::__construct($message, $code); + } + +} diff --git a/application/third_party/dompdf/include/dompdf_internal_exception.cls.php b/application/third_party/dompdf/include/dompdf_internal_exception.cls.php new file mode 100755 index 00000000..1822548e --- /dev/null +++ b/application/third_party/dompdf/include/dompdf_internal_exception.cls.php @@ -0,0 +1,59 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: dompdf_internal_exception.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Exception thrown by DOMPDF classes for internal errors + * + * @package dompdf + */ +class DOMPDF_Internal_Exception extends Exception { + + /** + * Class constructor + * + * @param string $message Error message + * @param int $code Error code + */ + function __construct($message = NULL, $code = 0) { + parent::__construct($message, $code); + } + +} diff --git a/application/third_party/dompdf/include/file.skel b/application/third_party/dompdf/include/file.skel new file mode 100755 index 00000000..f5610438 --- /dev/null +++ b/application/third_party/dompdf/include/file.skel @@ -0,0 +1,40 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + * @version 0.3 + */ + +/* $Id: file.skel 216 2010-03-11 22:49:18Z ryan.masten $ */ diff --git a/application/third_party/dompdf/include/fixed_positioner.cls.php b/application/third_party/dompdf/include/fixed_positioner.cls.php new file mode 100755 index 00000000..8903776b --- /dev/null +++ b/application/third_party/dompdf/include/fixed_positioner.cls.php @@ -0,0 +1,117 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + */ + +/* $Id */ + +/** + * Positions fixely positioned frames + */ +class Fixed_Positioner extends Positioner { + + function __construct(Frame_Decorator $frame) { parent::__construct($frame); } + + function position() { + + $frame = $this->_frame; + $style = $frame->get_original_style(); + $root = $frame->get_root(); + $initialcb = $root->get_containing_block(); + $initialcb_style = $root->get_style(); + + $p = $frame->find_block_parent(); + if ( $p ) { + $p->add_line(); + } + + // Compute the margins of the @page style + $margin_top = $initialcb_style->length_in_pt($initialcb_style->margin_top, $initialcb["h"]); + $margin_right = $initialcb_style->length_in_pt($initialcb_style->margin_right, $initialcb["w"]); + $margin_bottom = $initialcb_style->length_in_pt($initialcb_style->margin_bottom, $initialcb["h"]); + $margin_left = $initialcb_style->length_in_pt($initialcb_style->margin_left, $initialcb["w"]); + + // The needed computed style of the element + $height = $style->length_in_pt($style->height, $initialcb["h"]); + $width = $style->length_in_pt($style->width, $initialcb["w"]); + + $top = $style->length_in_pt($style->top, $initialcb["h"]); + $right = $style->length_in_pt($style->right, $initialcb["w"]); + $bottom = $style->length_in_pt($style->bottom, $initialcb["h"]); + $left = $style->length_in_pt($style->left, $initialcb["w"]); + + $y = $margin_top; + if ( isset($top) ) { + $y = $top + $margin_top; + if ( $top === "auto" ) { + $y = $margin_top; + if ( isset($bottom) && $bottom !== "auto" ) { + $y = $initialcb["h"] - $bottom - $margin_bottom; + $margin_height = $this->_frame->get_margin_height(); + if ( $margin_height !== "auto" ) { + $y -= $margin_height; + } else { + $y -= $height; + } + } + } + } + + $x = $margin_left; + if ( isset($left) ) { + $x = $left + $margin_left; + if ( $left === "auto" ) { + $x = $margin_left; + if ( isset($right) && $right !== "auto" ) { + $x = $initialcb["w"] - $right - $margin_right; + $margin_width = $this->_frame->get_margin_width(); + if ( $margin_width !== "auto" ) { + $x -= $margin_width; + } else { + $x -= $width; + } + } + } + } + + $frame->set_position($x, $y); + + $children = $frame->get_children(); + foreach($children as $child) { + $child->set_position($x, $y); + } + } +} \ No newline at end of file diff --git a/application/third_party/dompdf/include/font_metrics.cls.php b/application/third_party/dompdf/include/font_metrics.cls.php new file mode 100755 index 00000000..ee91ebe5 --- /dev/null +++ b/application/third_party/dompdf/include/font_metrics.cls.php @@ -0,0 +1,299 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - On missing font on explicite font selection don't change subtype and don't return default font. + * - On requesting default font and missing subtype, check similar subtypes, then any subtype, then normal. The last must exist. + * - Add comments + */ + +/* $Id: font_metrics.cls.php 355 2011-01-27 07:44:54Z fabien.menager $ */ + +require_once(DOMPDF_LIB_DIR . "/class.pdf.php"); + +/** + * Name of the font cache file + * + * This file must be writable by the webserver process only to update it + * with save_font_families() after adding the .afm file references of a new font family + * with Font_Metrics::save_font_families(). + * This is typically done only from command line with load_font.php on converting + * ttf fonts to afm with an external tool referenced in the define _TTF2AFM + * + * Declared here because PHP5 prevents constants from being declared with expressions + */ +if (!defined("__DOMPDF_FONT_CACHE_FILE")) { + if (file_exists(DOMPDF_FONT_DIR . "dompdf_font_family_cache")) { + define('__DOMPDF_FONT_CACHE_FILE', DOMPDF_FONT_DIR . "dompdf_font_family_cache"); + } else { + define('__DOMPDF_FONT_CACHE_FILE', DOMPDF_FONT_DIR . "dompdf_font_family_cache.dist.php"); + } +} + +/** + * The font metrics class + * + * This class provides information about fonts and text. It can resolve + * font names into actual installed font files, as well as determine the + * size of text in a particular font and size. + * + * @static + * @package dompdf + */ +class Font_Metrics { + + /** + * @see __DOMPDF_FONT_CACHE_FILE + */ + const CACHE_FILE = __DOMPDF_FONT_CACHE_FILE; + + /** + * Underlying {@link Canvas} object to perform text size calculations + * + * @var Canvas + */ + static protected $_pdf = null; + + /** + * Array of font family names to font files + * + * Usually cached by the {@link load_font.php} script + * + * @var array + */ + static protected $_font_lookup = array(); + + + /** + * Class initialization + * + */ + static function init() { + if (!self::$_pdf) { + self::load_font_families(); + self::$_pdf = Canvas_Factory::get_instance(); + } + } + + /** + * Calculates text size, in points + * + * @param string $text the text to be sized + * @param string $font the desired font + * @param float $size the desired font size + * @param float $spacing word spacing, if any + * @return float + */ + static function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0) { + return self::$_pdf->get_text_width($text, $font, $size, $word_spacing, $char_spacing); + } + + /** + * Calculates font height + * + * @param string $font + * @param float $size + * @return float + */ + static function get_font_height($font, $size) { + return self::$_pdf->get_font_height($font, $size); + } + + /** + * Resolves a font family & subtype into an actual font file + * + * Subtype can be one of 'normal', 'bold', 'italic' or 'bold_italic'. If + * the particular font family has no suitable font file, the default font + * ({@link DOMPDF_DEFAULT_FONT}) is used. The font file returned + * is the absolute pathname to the font file on the system. + * + * @param string $family + * @param string $subtype + * @return string + */ + static function get_font($family, $subtype = "normal") { + + /* Allow calling for various fonts in search path. Therefore not immediately + * return replacement on non match. + * Only when called with NULL try replacement. + * When this is also missing there is really trouble. + * If only the subtype fails, nevertheless return failure. + * Only on checking the fallback font, check various subtypes on same font. + */ + + if ( $family ) { + $family = str_replace( array("'", '"'), "", mb_strtolower($family)); + $subtype = mb_strtolower($subtype); + + if ( isset(self::$_font_lookup[$family][$subtype]) ) { + return self::$_font_lookup[$family][$subtype]; + } + return null; + } + + $family = DOMPDF_DEFAULT_FONT; + + if ( isset(self::$_font_lookup[$family][$subtype]) ) { + return self::$_font_lookup[$family][$subtype]; + } + + foreach ( self::$_font_lookup[$family] as $sub => $font ) { + if (strpos($subtype, $sub) !== false) { + return $font; + } + } + + if ($subtype !== "normal") { + foreach ( self::$_font_lookup[$family] as $sub => $font ) { + if ($sub !== "normal") { + return $font; + } + } + } + + $subtype = "normal"; + + if ( isset(self::$_font_lookup[$family][$subtype]) ) { + return self::$_font_lookup[$family][$subtype]; + } + return null; + } + + /** + * Saves the stored font family cache + * + * The name and location of the cache file are determined by {@link + * Font_Metrics::CACHE_FILE}. This file should be writable by the + * webserver process. + * + * @see Font_Metrics::load_font_families() + */ + static function save_font_families() { + // replace the path to the DOMPDF font directory with "DOMPDF_FONT_DIR" (allows for more portability) + $cache_data = var_export(self::$_font_lookup, true); + $cache_data = str_replace('\''.DOMPDF_FONT_DIR , 'DOMPDF_FONT_DIR . \'' , $cache_data); + $cache_data = "<"."?php return $cache_data ?".">"; + file_put_contents(self::CACHE_FILE, $cache_data); + } + + /** + * Loads the stored font family cache + * + * @see save_font_families() + */ + static function load_font_families() { + if ( !is_readable(self::CACHE_FILE) ) + return; + + self::$_font_lookup = require_once(self::CACHE_FILE); + + // If the font family cache is still in the old format + if ( self::$_font_lookup === 1 ) { + $cache_data = file_get_contents(self::CACHE_FILE); + file_put_contents(self::CACHE_FILE, "<"."?php return $cache_data ?".">"); + self::$_font_lookup = require_once(self::CACHE_FILE); + } + } + + static function get_system_fonts() { + $files = glob("/usr/share/fonts/truetype/*.ttf") + + glob("/usr/share/fonts/truetype/*/*.ttf") + + glob("/usr/share/fonts/truetype/*/*/*.ttf") + + glob("C:\\Windows\\fonts\\*.ttf") + + glob("C:\\WinNT\\fonts\\*.ttf") + + glob("/mnt/c_drive/WINDOWS/Fonts/"); + + new TTF_Info; + + $names = array(); + + foreach($files as $file) { + $info = getFontInfo($file); + $info["path"] = $file; + $type = $info[2]; + + if (preg_match("/regular|normal|medium|book/i", $type)) { + $type = "normal"; + } + elseif (preg_match("/bold/i", $type)) { + if (preg_match("/italic|oblique/i", $type)) { + $type = "bold_italic"; + } + else { + $type = "bold"; + } + } + elseif (preg_match("/italic|oblique/i", $type)) { + $type = "italic"; + } + + $names[mb_strtolower($info[1])][$type] = $file; + } + + $keys = array_keys($names); + + /*$matches = array_intersect(array("times", "times new roman"), $keys); + $names["serif"] = $names[reset($matches)]; + + $matches = array_intersect(array("helvetica", "arial", "verdana"), $keys); + $names["sans-serif"] = $names[reset($matches)]; + + $matches = array_intersect(array("courier", "courier new"), $keys); + $names["monospace"] = $names[reset($matches)]; + $names["fixed"] = $names[reset($matches)];*/ + + return $names; + } + + /** + * Returns the current font lookup table + * + * @return array + */ + static function get_font_families() { + return self::$_font_lookup; + } + + static function set_font_family($fontname, $entry) { + self::$_font_lookup[mb_strtolower($fontname)] = $entry; + } +} + +Font_Metrics::init(); diff --git a/application/third_party/dompdf/include/frame.cls.php b/application/third_party/dompdf/include/frame.cls.php new file mode 100755 index 00000000..3f16ad5a --- /dev/null +++ b/application/third_party/dompdf/include/frame.cls.php @@ -0,0 +1,990 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: frame.cls.php 359 2011-02-05 12:15:06Z fabien.menager $ */ + +/** + * The main Frame class + * + * This class represents a single HTML element. This class stores + * positioning information as well as containing block location and + * dimensions. Style information for the element is stored in a {@link + * Style} object. Tree structure is maintained via the parent & children + * links. + * + * @access protected + * @package dompdf + */ +class Frame { + + /** + * The DOMNode object this frame represents + * + * @var DOMNode + */ + protected $_node; + + /** + * Unique identifier for this frame. Used to reference this frame + * via the node. + * + * @var string + */ + protected $_id; + + /** + * Unique id counter + */ + static protected $ID_COUNTER = 0; + + /** + * This frame's calculated style + * + * @var Style + */ + protected $_style; + + /** + * This frame's original style. Needed for cases where frames are + * split across pages. + * + * @var Style + */ + protected $_original_style; + + /** + * This frame's parent in the document tree. + * + * @var Frame + */ + protected $_parent; + + /** + * This frame's first child. All children are handled as a + * doubly-linked list. + * + * @var Frame + */ + protected $_first_child; + + /** + * This frame's last child. + * + * @var Frame + */ + protected $_last_child; + + /** + * This frame's previous sibling in the document tree. + * + * @var Frame + */ + protected $_prev_sibling; + + /** + * This frame's next sibling in the document tree. + * + * @var Frame + */ + protected $_next_sibling; + + /** + * This frame's containing block (used in layout): array(x, y, w, h) + * + * @var array + */ + protected $_containing_block; + + /** + * Position on the page of the top-left corner of the margin box of + * this frame: array(x,y) + * + * @var array + */ + protected $_position; + + /** + * Absolute opacity of this frame + * + * @var float + */ + protected $_opacity; + + /** + * This frame's decorator + * + * @var Frame_Decorator + */ + protected $_decorator; + + protected $_containing_line; + + /** + * Tells wether the frame was already pushed to the next page + * @var bool + */ + public $_already_pushed = false; + + /** + * Class destructor + */ + function __destruct() { + clear_object($this); + } + + /** + * Class constructor + * + * @param DOMNode $node the DOMNode this frame represents + */ + function __construct(DomNode $node) { + $this->_node = $node; + + $this->_parent = null; + $this->_first_child = null; + $this->_last_child = null; + $this->_prev_sibling = $this->_next_sibling = null; + + $this->_style = null; + $this->_original_style = null; + + $this->_containing_block = array( + "x" => null, + "y" => null, + "w" => null, + "h" => null, + ); + + $this->_containing_block[0] =& $this->_containing_block["x"]; + $this->_containing_block[1] =& $this->_containing_block["y"]; + $this->_containing_block[2] =& $this->_containing_block["w"]; + $this->_containing_block[3] =& $this->_containing_block["h"]; + + $this->_position = array( + "x" => null, + "y" => null, + ); + + $this->_position[0] =& $this->_position["x"]; + $this->_position[1] =& $this->_position["y"]; + + $this->_opacity = 1.0; + $this->_decorator = null; + + $this->set_id( self::$ID_COUNTER++ ); + } + + /** + * "Destructor": forcibly free all references held by this frame + * + * @param bool $recursive if true, call dispose on all children + */ + function dispose($recursive = false) { + + if ( $recursive ) { + while ( $child = $this->_first_child ) + $child->dispose(true); + } + + // Remove this frame from the tree + if ( $this->_prev_sibling ) { + $this->_prev_sibling->_next_sibling = $this->_next_sibling; + } + + if ( $this->_next_sibling ) { + $this->_next_sibling->_prev_sibling = $this->_prev_sibling; + } + + if ( $this->_parent && $this->_parent->_first_child === $this ) { + $this->_parent->_first_child = $this->_next_sibling; + } + + if ( $this->_parent && $this->_parent->_last_child === $this ) { + $this->_parent->_last_child = $this->_prev_sibling; + } + + if ( $this->_parent ) { + $this->_parent->get_node()->removeChild($this->_node); + } + + $this->_style->dispose(); + $this->_style = null; + unset($this->_style); + + $this->_original_style->dispose(); + $this->_original_style = null; + unset($this->_original_style); + + } + + // Re-initialize the frame + function reset() { + $this->_position["x"] = null; + $this->_position["y"] = null; + + $this->_containing_block["x"] = null; + $this->_containing_block["y"] = null; + $this->_containing_block["w"] = null; + $this->_containing_block["h"] = null; + + $this->_style = null; + unset($this->_style); + $this->_style = clone $this->_original_style; + } + + //........................................................................ + + // Accessor methods + /** + * @return DOMNode + */ + function get_node() { return $this->_node; } + + /** + * @return string + */ + function get_id() { return $this->_id; } + + /** + * @return Style + */ + function get_style() { return $this->_style; } + + /** + * @return Style + */ + function get_original_style() { return $this->_original_style; } + + /** + * @return Frame + */ + function get_parent() { return $this->_parent; } + + /** + * @return Frame_Decorator + */ + function get_decorator() { return $this->_decorator; } + + /** + * @return Frame + */ + function get_first_child() { return $this->_first_child; } + + /** + * @return Frame + */ + function get_last_child() { return $this->_last_child; } + + /** + * @return Frame + */ + function get_prev_sibling() { return $this->_prev_sibling; } + + /** + * @return Frame + */ + function get_next_sibling() { return $this->_next_sibling; } + + /** + * @return FrameList + */ + function get_children() { return new FrameList($this); } + + // Layout property accessors + + /** + * Containing block dimensions + * + * @param $i string The key of the wanted containing block's dimension (x, y, x, h) + * @return array|float + */ + function get_containing_block($i = null) { + if ( isset($i) ) + return $this->_containing_block[$i]; + return $this->_containing_block; + } + + /** + * Block position + * + * @param $i string The key of the wanted position value (x, y) + * @return array|float + */ + function get_position($i = null) { + if ( isset($i) ) { + return $this->_position[$i]; + } + return $this->_position; + } + + //........................................................................ + + /** + * Return the height of the margin box of the frame, in pt. Meaningless + * unless the height has been calculated properly. + * + * @return float + */ + function get_margin_height() { + $style = $this->_style; + + return $style->length_in_pt(array( + $style->height, + $style->margin_top, + $style->margin_bottom, + $style->border_top_width, + $style->border_bottom_width, + $style->padding_top, + $style->padding_bottom + ), $this->_containing_block["h"]); + } + + /** + * Return the width of the margin box of the frame, in pt. Meaningless + * unless the width has been calculated properly. + * + * @return float + */ + function get_margin_width() { + $style = $this->_style; + + return $style->length_in_pt(array( + $style->width, + $style->margin_left, + $style->margin_right, + $style->border_left_width, + $style->border_right_width, + $style->padding_left, + $style->padding_right + ), $this->_containing_block["w"]); + } + + function get_break_margins(){ + $style = $this->_style; + + return $style->length_in_pt(array( + //$style->height, + $style->margin_top, + $style->margin_bottom, + $style->border_top_width, + $style->border_bottom_width, + $style->padding_top, + $style->padding_bottom + ), $this->_containing_block["h"]); + } + + /** + * Return the padding box (x,y,w,h) of the frame + * + * @return array + */ + function get_padding_box() { + $style = $this->_style; + $cb = $this->_containing_block; + + $x = $this->_position["x"] + + $style->length_in_pt(array($style->margin_left, + $style->border_left_width), + $cb["w"]); + + $y = $this->_position["y"] + + $style->length_in_pt(array($style->margin_top, + $style->border_top_width), + $cb["h"]); + + $w = $style->length_in_pt(array($style->padding_left, + $style->width, + $style->padding_right), + $cb["w"]); + + $h = $style->length_in_pt(array($style->padding_top, + $style->height, + $style->padding_bottom), + $cb["h"]); + + return array(0 => $x, "x" => $x, + 1 => $y, "y" => $y, + 2 => $w, "w" => $w, + 3 => $h, "h" => $h); + } + + /** + * Return the border box of the frame + * + * @return array + */ + function get_border_box() { + $style = $this->_style; + $cb = $this->_containing_block; + + $x = $this->_position["x"] + $style->length_in_pt($style->margin_left, $cb["w"]); + + $y = $this->_position["y"] + $style->length_in_pt($style->margin_top, $cb["h"]); + + $w = $style->length_in_pt(array($style->border_left_width, + $style->padding_left, + $style->width, + $style->padding_right, + $style->border_right_width), + $cb["w"]); + + $h = $style->length_in_pt(array($style->border_top_width, + $style->padding_top, + $style->height, + $style->padding_bottom, + $style->border_bottom_width), + $cb["h"]); + + return array(0 => $x, "x" => $x, + 1 => $y, "y" => $y, + 2 => $w, "w" => $w, + 3 => $h, "h" => $h); + } + + function get_opacity($opacity = null) { + if ( $opacity !== null ) { + $this->set_opacity($opacity); + } + return $this->_opacity; + } + + function &get_containing_line() { + return $this->_containing_line; + } + + //........................................................................ + + // Set methods + function set_id($id) { + $this->_id = $id; + + // We can only set attributes of DOMElement objects (nodeType == 1). + // Since these are the only objects that we can assign CSS rules to, + // this shortcoming is okay. + if ( $this->_node->nodeType == XML_ELEMENT_NODE ) + $this->_node->setAttribute("frame_id", $id); + } + + function set_style(Style $style) { + if ( is_null($this->_style) ) + $this->_original_style = clone $style; + + //$style->set_frame($this); + $this->_style = $style; + } + + function set_decorator(Frame_Decorator $decorator) { + $this->_decorator = $decorator; + } + + function set_containing_block($x = null, $y = null, $w = null, $h = null) { + if ( is_array($x) ){ + foreach($x as $key => $val){ + $$key = $val; + } + } + + if (is_numeric($x)) { + $this->_containing_block["x"] = $x; + } + + if (is_numeric($y)) { + $this->_containing_block["y"] = $y; + } + + if (is_numeric($w)) { + $this->_containing_block["w"] = $w; + } + + if (is_numeric($h)) { + $this->_containing_block["h"] = $h; + } + } + + function set_position($x = null, $y = null) { + if ( is_array($x) ) + extract($x); + + if ( is_numeric($x) ) { + $this->_position["x"] = $x; + } + + if ( is_numeric($y) ) { + $this->_position["y"] = $y; + } + } + + function set_opacity($opacity) { + $parent = $this->get_parent(); + $base_opacity = (($parent && $parent->_opacity !== null) ? $parent->_opacity : 1.0); + $this->_opacity = $base_opacity * $opacity; + } + + function set_containing_line(&$line) { + $this->_containing_line = &$line; + } + + //........................................................................ + + /** + * Inserts a new child at the beginning of the Frame + * + * @param $child Frame The new Frame to insert + * @param $update_node boolean Whether or not to update the DOM + */ + function prepend_child(Frame $child, $update_node = true) { + if ( $update_node ) + $this->_node->insertBefore($child->_node, $this->_first_child ? $this->_first_child->_node : null); + + // Remove the child from its parent + if ( $child->_parent ) + $child->_parent->remove_child($child, false); + + $child->_parent = $this; + $child->_prev_sibling = null; + + // Handle the first child + if ( !$this->_first_child ) { + $this->_first_child = $child; + $this->_last_child = $child; + $child->_next_sibling = null; + } else { + $this->_first_child->_prev_sibling = $child; + $child->_next_sibling = $this->_first_child; + $this->_first_child = $child; + } + } + + /** + * Inserts a new child at the end of the Frame + * + * @param $child Frame The new Frame to insert + * @param $update_node boolean Whether or not to update the DOM + */ + function append_child(Frame $child, $update_node = true) { + if ( $update_node ) + $this->_node->appendChild($child->_node); + + // Remove the child from its parent + if ( $child->_parent ) + $child->_parent->remove_child($child, false); + + $child->_parent = $this; + $child->_next_sibling = null; + + // Handle the first child + if ( !$this->_last_child ) { + $this->_first_child = $child; + $this->_last_child = $child; + $child->_prev_sibling = null; + } else { + $this->_last_child->_next_sibling = $child; + $child->_prev_sibling = $this->_last_child; + $this->_last_child = $child; + } + } + + /** + * Inserts a new child immediately before the specified frame + * + * @param $new_child Frame The new Frame to insert + * @param $ref Frame The Frame after the new Frame + * @param $update_node boolean Whether or not to update the DOM + */ + function insert_child_before(Frame $new_child, Frame $ref, $update_node = true) { + if ( $ref === $this->_first_child ) { + $this->prepend_child($new_child, $update_node); + return; + } + + if ( is_null($ref) ) { + $this->append_child($new_child, $update_node); + return; + } + + if ( $ref->_parent !== $this ) + throw new DOMPDF_Exception("Reference child is not a child of this node."); + + // Update the node + if ( $update_node ) + $this->_node->insertBefore($new_child->_node, $ref->_node); + + // Remove the child from its parent + if ( $new_child->_parent ) + $new_child->_parent->remove_child($new_child, false); + + $new_child->_parent = $this; + $new_child->_next_sibling = $ref; + $new_child->_prev_sibling = $ref->_prev_sibling; + + if ( $ref->_prev_sibling ) + $ref->_prev_sibling->_next_sibling = $new_child; + + $ref->_prev_sibling = $new_child; + } + + /** + * Inserts a new child immediately after the specified frame + * + * @param $new_child Frame The new Frame to insert + * @param $ref Frame The Frame before the new Frame + * @param $update_node boolean Whether or not to update the DOM + */ + function insert_child_after(Frame $new_child, Frame $ref, $update_node = true) { + if ( $ref === $this->_last_child ) { + $this->append_child($new_child, $update_node); + return; + } + + if ( is_null($ref) ) { + $this->prepend_child($new_child, $update_node); + return; + } + + if ( $ref->_parent !== $this ) + throw new DOMPDF_Exception("Reference child is not a child of this node."); + + // Update the node + if ( $update_node ) { + if ( $ref->_next_sibling ) { + $next_node = $ref->_next_sibling->_node; + $this->_node->insertBefore($new_child->_node, $next_node); + } else { + $new_child->_node = $this->_node->appendChild($new_child); + } + } + + // Remove the child from its parent + if ( $new_child->_parent) + $new_child->_parent->remove_child($new_child, false); + + $new_child->_parent = $this; + $new_child->_prev_sibling = $ref; + $new_child->_next_sibling = $ref->_next_sibling; + + if ( $ref->_next_sibling ) + $ref->_next_sibling->_prev_sibling = $new_child; + + $ref->_next_sibling = $new_child; + } + + + /** + * Remove a child frame + * + * @param $child Frame + * @param $update_node boolean Whether or not to remove the DOM node + * @return Frame The removed child frame + */ + function remove_child(Frame $child, $update_node = true) { + if ( $child->_parent !== $this ) + throw new DOMPDF_Exception("Child not found in this frame"); + + if ( $update_node ) + $this->_node->removeChild($child->_node); + + if ( $child === $this->_first_child ) + $this->_first_child = $child->_next_sibling; + + if ( $child === $this->_last_child ) + $this->_last_child = $child->_prev_sibling; + + if ( $child->_prev_sibling ) + $child->_prev_sibling->_next_sibling = $child->_next_sibling; + + if ( $child->_next_sibling ) + $child->_next_sibling->_prev_sibling = $child->_prev_sibling; + + $child->_next_sibling = null; + $child->_prev_sibling = null; + $child->_parent = null; + return $child; + } + + //........................................................................ + + // Debugging function: + function __toString() { + // Skip empty text frames +// if ( $this->_node->nodeName === "#text" && +// preg_replace("/\s/", "", $this->_node->data) === "" ) +// return ""; + + + $str = "" . $this->_node->nodeName . ":
"; + //$str .= spl_object_hash($this->_node) . "
"; + $str .= "Id: " .$this->get_id() . "
"; + $str .= "Class: " .get_class($this) . "
"; + + if ( $this->_node->nodeName === "#text" ) { + $tmp = htmlspecialchars($this->_node->nodeValue); + $str .= "
'" .  mb_substr($tmp,0,70) .
+        (mb_strlen($tmp) > 70 ? "..." : "") . "'
"; + } elseif ( $css_class = $this->_node->getAttribute("class") ) { + $tmp = htmlspecialchars($css_class); + $str .= "CSS class: '$css_class'
"; + } + + if ( $this->_parent ) + $str .= "\nParent:" . $this->_parent->_node->nodeName . + " (" . spl_object_hash($this->_parent->_node) . ") " . + "
"; + + if ( $this->_prev_sibling ) + $str .= "Prev: " . $this->_prev_sibling->_node->nodeName . + " (" . spl_object_hash($this->_prev_sibling->_node) . ") " . + "
"; + + if ( $this->_next_sibling ) + $str .= "Next: " . $this->_next_sibling->_node->nodeName . + " (" . spl_object_hash($this->_next_sibling->_node) . ") " . + "
"; + + $d = $this->get_decorator(); + while ($d && $d != $d->get_decorator()) { + $str .= "Decorator: " . get_class($d) . "
"; + $d = $d->get_decorator(); + } + + $str .= "Position: " . pre_r($this->_position, true); + $str .= "\nContaining block: " . pre_r($this->_containing_block, true); + $str .= "\nMargin width: " . pre_r($this->get_margin_width(), true); + $str .= "\nMargin height: " . pre_r($this->get_margin_height(), true); + + $str .= "\nStyle:
". $this->_style->__toString() . "
"; + + if ( $this->_decorator instanceof Block_Frame_Decorator ) { + $str .= "Lines:
";
+      foreach ($this->_decorator->get_lines() as $line) {
+        foreach ($line["frames"] as $frame) {
+          if ($frame instanceof Text_Frame_Decorator) {
+            $str .= "\ntext: ";          
+            $str .= "'". htmlspecialchars($frame->get_text()) ."'";
+          } else {
+            $str .= "\nBlock: " . $frame->get_node()->nodeName . " (" . spl_object_hash($frame->get_node()) . ")";
+          }
+        }
+        
+        $str .=
+          //"\ncount => " . $line["count"] . "\n".
+          "\ny => " . $line["y"] . "\n" .
+          "w => " . $line["w"] . "\n" .
+          "h => " . $line["h"] . "\n" .
+          "left => " . $line["left"] . "\n" .
+          "right => " . $line["right"] . "\n";
+      }
+      $str .= "
"; + } + $str .= "\n"; + if ( php_sapi_name() === "cli" ) + $str = strip_tags(str_replace(array("
","",""), + array("\n","",""), + $str)); + + return $str; + } +} + +//------------------------------------------------------------------------ + +/** + * Linked-list IteratorAggregate + * + * @access private + * @package dompdf + */ +class FrameList implements IteratorAggregate { + protected $_frame; + + function __construct($frame) { $this->_frame = $frame; } + function getIterator() { return new FrameListIterator($this->_frame); } +} + +/** + * Linked-list Iterator + * + * Returns children in order and allows for list to change during iteration, + * provided the changes occur to or after the current element + * + * @access private + * @package dompdf + */ +class FrameListIterator implements Iterator { + + /** + * @var Frame + */ + protected $_parent; + + /** + * @var Frame + */ + protected $_cur; + + /** + * @var int + */ + protected $_num; + + function __construct(Frame $frame) { + $this->_parent = $frame; + $this->_cur = $frame->get_first_child(); + $this->_num = 0; + } + + function rewind() { + $this->_cur = $this->_parent->get_first_child(); + $this->_num = 0; + } + + /** + * @return bool + */ + function valid() { + return isset($this->_cur);// && ($this->_cur->get_prev_sibling() === $this->_prev); + } + + function key() { return $this->_num; } + + /** + * @return Frame + */ + function current() { return $this->_cur; } + + /** + * @return Frame + */ + function next() { + + $ret = $this->_cur; + if ( !$ret ) + return null; + + $this->_cur = $this->_cur->get_next_sibling(); + $this->_num++; + return $ret; + } +} + +//------------------------------------------------------------------------ + +/** + * Pre-order IteratorAggregate + * + * @access private + * @package dompdf + */ +class FrameTreeList implements IteratorAggregate { + /** + * @var Frame + */ + protected $_root; + + function __construct(Frame $root) { $this->_root = $root; } + + /** + * @return FrameTreeIterator + */ + function getIterator() { return new FrameTreeIterator($this->_root); } +} + +/** + * Pre-order Iterator + * + * Returns frames in preorder traversal order (parent then children) + * + * @access private + * @package dompdf + */ +class FrameTreeIterator implements Iterator { + /** + * @var Frame + */ + protected $_root; + protected $_stack = array(); + + /** + * @var int + */ + protected $_num; + + function __construct(Frame $root) { + $this->_stack[] = $this->_root = $root; + $this->_num = 0; + } + + function rewind() { + $this->_stack = array($this->_root); + $this->_num = 0; + } + + /** + * @return bool + */ + function valid() { return count($this->_stack) > 0; } + + /** + * @return int + */ + function key() { return $this->_num; } + + /** + * @var Frame + */ + function current() { return end($this->_stack); } + + /** + * @var Frame + */ + function next() { + $b = end($this->_stack); + + // Pop last element + unset($this->_stack[ key($this->_stack) ]); + $this->_num++; + + // Push all children onto the stack in reverse order + if ( $c = $b->get_last_child() ) { + $this->_stack[] = $c; + while ( $c = $c->get_prev_sibling() ) + $this->_stack[] = $c; + } + return $b; + } +} diff --git a/application/third_party/dompdf/include/frame_decorator.cls.php b/application/third_party/dompdf/include/frame_decorator.cls.php new file mode 100755 index 00000000..19478811 --- /dev/null +++ b/application/third_party/dompdf/include/frame_decorator.cls.php @@ -0,0 +1,483 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: frame_decorator.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Base Frame_Decorator class + * + * @access private + * @package dompdf + */ +abstract class Frame_Decorator extends Frame { + + /** + * The root node of the DOM tree + * + * @var Frame + */ + protected $_root; + + /** + * The decorated frame + * + * @var Frame + */ + protected $_frame; + + /** + * Positioner object used to position this frame (Strategy pattern) + * + * @var Positioner + */ + protected $_positioner; + + /** + * Reflower object used to calculate frame dimensions (Strategy pattern) + * + * @var Frame_Reflower + */ + protected $_reflower; + + /** + * Reference to the current dompdf instance + * + * @var DOMPDF + */ + protected $_dompdf; + + /** + * First block parent + * + * @var Frame_Decorator + */ + private $_block_parent; + + /** + * First positionned parent (position: relative | absolute | fixed) + * + * @var Frame_Decorator + */ + private $_positionned_parent; + + /** + * Class constructor + * + * @param Frame $frame the decoration target + */ + function __construct(Frame $frame, DOMPDF $dompdf) { + $this->_frame = $frame; + $this->_root = null; + $this->_dompdf = $dompdf; + $frame->set_decorator($this); + } + + /** + * "Destructor": foribly free all references held by this object + * + * @param bool $recursive if true, call dispose on all children + */ + function dispose($recursive = false) { + + if ( $recursive ) { + while ( $child = $this->get_first_child() ) + $child->dispose(true); + } + + $this->_root = null; + unset($this->_root); + + $this->_frame->dispose(true); + $this->_frame = null; + unset($this->_frame); + + $this->_positioner = null; + unset($this->_positioner); + + $this->_reflower = null; + unset($this->_reflower); + } + + /** + * Return a copy of this frame with $node as its node + * + * @param DomNode $node + * @return Frame + */ + function copy(DomNode $node) { + $frame = new Frame($node); + $frame->set_style(clone $this->_frame->get_original_style()); + $deco = Frame_Factory::decorate_frame($frame, $this->_dompdf); + $deco->set_root($this->_root); + return $deco; + } + + /** + * Create a deep copy: copy this node and all children + * + * @return Frame + */ + function deep_copy() { + $frame = new Frame($this->get_node()->cloneNode()); + $frame->set_style(clone $this->_frame->get_original_style()); + $deco = Frame_Factory::decorate_frame($frame, $this->_dompdf); + $deco->set_root($this->_root); + + foreach ($this->get_children() as $child) + $deco->append_child($child->deep_copy()); + + return $deco; + } + //........................................................................ + + /** + * Delegate calls to decorated frame object + */ + function reset() { + $this->_frame->reset(); + + // Reset all children + foreach ($this->get_children() as $child) + $child->reset(); + } + + // Getters ----------- + function get_id() { return $this->_frame->get_id(); } + + /** + * @return Frame + */ + function get_frame() { return $this->_frame; } + + /** + * @return DomNode + */ + function get_node() { return $this->_frame->get_node(); } + + /** + * @return Style + */ + function get_style() { return $this->_frame->get_style(); } + + /** + * @return Style + */ + function get_original_style() { return $this->_frame->get_original_style(); } + function get_containing_block($i = null) { return $this->_frame->get_containing_block($i); } + function get_position($i = null) { return $this->_frame->get_position($i); } + + /** + * @return DOMPDF + */ + function get_dompdf() { return $this->_dompdf; } + + function get_margin_height() { return $this->_frame->get_margin_height(); } + function get_margin_width() { return $this->_frame->get_margin_width(); } + function get_padding_box() { return $this->_frame->get_padding_box(); } + function get_border_box() { return $this->_frame->get_border_box(); } + + // Setters ----------- + function set_id($id) { $this->_frame->set_id($id); } + function set_style(Style $style) { $this->_frame->set_style($style); } + + function set_containing_block($x = null, $y = null, $w = null, $h = null) { + $this->_frame->set_containing_block($x, $y, $w, $h); + } + + function set_position($x = null, $y = null) { + $this->_frame->set_position($x, $y); + } + function __toString() { return $this->_frame->__toString(); } + + function prepend_child(Frame $child, $update_node = true) { + while ( $child instanceof Frame_Decorator ) + $child = $child->_frame; + + $this->_frame->prepend_child($child, $update_node); + } + + function append_child(Frame $child, $update_node = true) { + while ( $child instanceof Frame_Decorator ) + $child = $child->_frame; + + $this->_frame->append_child($child, $update_node); + } + + function insert_child_before(Frame $new_child, Frame $ref, $update_node = true) { + while ( $new_child instanceof Frame_Decorator ) + $new_child = $new_child->_frame; + + if ( $ref instanceof Frame_Decorator ) + $ref = $ref->_frame; + + $this->_frame->insert_child_before($new_child, $ref, $update_node); + } + + function insert_child_after(Frame $new_child, Frame $ref, $update_node = true) { + while ( $new_child instanceof Frame_Decorator ) + $new_child = $new_child->_frame; + + while ( $ref instanceof Frame_Decorator ) + $ref = $ref->_frame; + + $this->_frame->insert_child_after($new_child, $ref, $update_node); + } + + function remove_child(Frame $child, $update_node = true) { + while ( $child instanceof Frame_Decorator ) + $child = $new_child->_frame; + + $this->_frame->remove_child($child, $update_node); + } + + //........................................................................ + + /** + * @return Frame_Decorator + */ + function get_parent() { + $p = $this->_frame->get_parent(); + if ( $p && $deco = $p->get_decorator() ) { + while ( $tmp = $deco->get_decorator() ) + $deco = $tmp; + return $deco; + } else if ( $p ) + return $p; + else + return null; + } + + /** + * @return Frame_Decorator + */ + function get_first_child() { + $c = $this->_frame->get_first_child(); + if ( $c && $deco = $c->get_decorator() ) { + while ( $tmp = $deco->get_decorator() ) + $deco = $tmp; + return $deco; + } else if ( $c ) + return $c; + else + return null; + } + + /** + * @return Frame_Decorator + */ + function get_last_child() { + $c = $this->_frame->get_last_child(); + if ( $c && $deco = $c->get_decorator() ) { + while ( $tmp = $deco->get_decorator() ) + $deco = $tmp; + return $deco; + } else if ( $c ) + return $c; + else + return null; + } + + /** + * @return Frame_Decorator + */ + function get_prev_sibling() { + $s = $this->_frame->get_prev_sibling(); + if ( $s && $deco = $s->get_decorator() ) { + while ( $tmp = $deco->get_decorator() ) + $deco = $tmp; + return $deco; + } else if ( $s ) + return $s; + else + return null; + } + + /** + * @return Frame_Decorator + */ + function get_next_sibling() { + $s = $this->_frame->get_next_sibling(); + if ( $s && $deco = $s->get_decorator() ) { + while ( $tmp = $deco->get_decorator() ) + $deco = $tmp; + return $deco; + } else if ( $s ) + return $s; + else + return null; + } + + /** + * @return FrameList + */ + function get_children() { + return new FrameList($this); + } + + /** + * @return FrameTreeList + */ + function get_subtree() { + return new FrameTreeList($this); + } + + //........................................................................ + + function set_positioner(Positioner $posn) { + $this->_positioner = $posn; + if ( $this->_frame instanceof Frame_Decorator ) + $this->_frame->set_positioner($posn); + } + + //........................................................................ + + function set_reflower(Frame_Reflower $reflower) { + $this->_reflower = $reflower; + if ( $this->_frame instanceof Frame_Decorator ) + $this->_frame->set_reflower( $reflower ); + } + + function get_reflower() { return $this->_reflower; } + + //........................................................................ + + function set_root(Frame $root) { + $this->_root = $root; + if ( $this->_frame instanceof Frame_Decorator ) + $this->_frame->set_root($root); + } + + function get_root() { return $this->_root; } + + //........................................................................ + + /** + * @return Frame_Decorator + */ + function find_block_parent() { + //if ( $this->_block_parent ) return $this->_block_parent; // FIXME: makes dom_anchor_link example fail + + // Find our nearest block level parent + $p = $this->get_parent(); + + while ( $p ) { + if ( in_array($p->get_style()->display, Style::$BLOCK_TYPES) ) + break; + + $p = $p->get_parent(); + } + + return $this->_block_parent = $p; + } + + /** + * @return Frame_Decorator + */ + function find_positionned_parent() { + //if ( $this->_positionned_parent ) return $this->_positionned_parent; // FIXME: makes dom_anchor_link example fail + + // Find our nearest relative positionned parent + $p = $this->get_parent(); + while ( $p ) { + if ( in_array($p->get_style()->position, Style::$POSITIONNED_TYPES) ) { + break; + } + + $p = $p->get_parent(); + } + + if ( !$p ) { + $p = $this->_root; + } + + return $this->_positionned_parent = $p; + } + + //........................................................................ + + /** + * split this frame at $child. + * + * The current frame is cloned and $child and all children following + * $child are added to the clone. The clone is then passed to the + * current frame's parent->split() method. + * + * @param Frame $child + * @param boolean $force_pagebreak + */ + function split($child = null, $force_pagebreak = false) { + if ( is_null( $child ) ) { + $this->get_parent()->split($this, $force_pagebreak); + return; + } + + if ( $child->get_parent() !== $this ) + throw new DOMPDF_Exception("Unable to split: frame is not a child of this one."); + + $split = $this->copy( $this->_frame->get_node()->cloneNode() ); + $split->reset(); + $this->get_parent()->insert_child_after($split, $this); + + // Add $frame and all following siblings to the new split node + $iter = $child; + while ($iter) { + $frame = $iter; + $iter = $iter->get_next_sibling(); + $frame->reset(); + $split->append_child($frame); + } + + $this->get_parent()->split($split, $force_pagebreak); + } + + //........................................................................ + + final function position() { $this->_positioner->position(); } + + final function reflow(Frame_Decorator $block = null) { + // Uncomment this to see the frames before they're laid out, instead of + // during rendering. + //echo $this->_frame; flush(); + $this->_reflower->reflow($block); + } + + final function get_min_max_width() { return $this->_reflower->get_min_max_width(); } + + //........................................................................ +} diff --git a/application/third_party/dompdf/include/frame_factory.cls.php b/application/third_party/dompdf/include/frame_factory.cls.php new file mode 100755 index 00000000..f4a1a8cb --- /dev/null +++ b/application/third_party/dompdf/include/frame_factory.cls.php @@ -0,0 +1,207 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: frame_factory.cls.php 356 2011-01-28 08:56:10Z fabien.menager $ */ + +/** + * Contains frame decorating logic + * + * This class is responsible for assigning the correct {@link Frame_Decorator}, + * {@link Positioner}, and {@link Frame_Reflower} objects to {@link Frame} + * objects. This is determined primarily by the Frame's display type, but + * also by the Frame's node's type (e.g. DomElement vs. #text) + * + * @access private + * @package dompdf + */ +class Frame_Factory { + + /** + * Decorate the Frame + * + * @param $root Frame The frame to decorate + * @param $dompdf DOMPDF The dompdf instance + */ + static function decorate_root(Frame $root, DOMPDF $dompdf) { + $frame = new Page_Frame_Decorator($root, $dompdf); + $frame->set_reflower( new Page_Frame_Reflower($frame) ); + $root->set_decorator($frame); + return $frame; + } + + /** + * Decorate a Frame + * + * @param $root Frame The frame to decorate + * @param $dompdf DOMPDF The dompdf instance + * @return Frame_Decorator + * FIXME: this is admittedly a little smelly... + */ + static function decorate_frame(Frame $frame, DOMPDF $dompdf) { + if ( is_null($dompdf) ) + throw new Exception("foo"); + + $style = $frame->get_style(); + + switch ($style->display) { + + case "block": + $positioner = "Block"; + $decorator = "Block"; + $reflower = "Block"; + break; + + case "inline-block": + $positioner = "Inline"; + $decorator = "Block"; + $reflower = "Block"; + break; + + case "inline": + $positioner = "Inline"; + if ( $frame->get_node()->nodeName === "#text" ) { + $decorator = "Text"; + $reflower = "Text"; + } + else { + if ( DOMPDF_ENABLE_CSS_FLOAT && $style->float !== "none" ) { + $decorator = "Block"; + $reflower = "Block"; + } + else { + $decorator = "Inline"; + $reflower = "Inline"; + } + } + break; + + case "table": + $positioner = "Block"; + $decorator = "Table"; + $reflower = "Table"; + break; + + case "inline-table": + $positioner = "Inline"; + $decorator = "Table"; + $reflower = "Table"; + break; + + case "table-row-group": + case "table-header-group": + case "table-footer-group": + $positioner = "Null"; + $decorator = "Table_Row_Group"; + $reflower = "Table_Row_Group"; + break; + + case "table-row": + $positioner = "Null"; + $decorator = "Table_Row"; + $reflower = "Table_Row"; + break; + + case "table-cell": + $positioner = "Table_Cell"; + $decorator = "Table_Cell"; + $reflower = "Table_Cell"; + break; + + case "list-item": + $positioner = "Block"; + $decorator = "Block"; + $reflower = "Block"; + break; + + case "-dompdf-list-bullet": + if ( $style->list_style_position === "inside" ) + $positioner = "Inline"; + else + $positioner = "List_Bullet"; + + if ( $style->list_style_image !== "none" ) + $decorator = "List_Bullet_Image"; + else + $decorator = "List_Bullet"; + + $reflower = "List_Bullet"; + break; + + case "-dompdf-image": + $positioner = "Inline"; + $decorator = "Image"; + $reflower = "Image"; + break; + + case "-dompdf-br": + $positioner = "Inline"; + $decorator = "Inline"; + $reflower = "Inline"; + break; + + default: + // FIXME: should throw some sort of warning or something? + case "none": + $positioner = "Null"; + $decorator = "Null"; + $reflower = "Null"; + break; + } + + $position = $style->position; + + if ( $position === "absolute" ) + $positioner = "Absolute"; + + else if ( $position === "fixed" ) + $positioner = "Fixed"; + + $positioner .= "_Positioner"; + $decorator .= "_Frame_Decorator"; + $reflower .= "_Frame_Reflower"; + + $deco = new $decorator($frame, $dompdf); + $deco->set_positioner( new $positioner($deco) ); + $reflow = new $reflower($deco); + + $deco->set_reflower( $reflow ); + + return $deco; + } +} diff --git a/application/third_party/dompdf/include/frame_reflower.cls.php b/application/third_party/dompdf/include/frame_reflower.cls.php new file mode 100755 index 00000000..febe473b --- /dev/null +++ b/application/third_party/dompdf/include/frame_reflower.cls.php @@ -0,0 +1,414 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Base reflower class + * + * Reflower objects are responsible for determining the width and height of + * individual frames. They also create line and page breaks as necessary. + * + * @access private + * @package dompdf + */ +abstract class Frame_Reflower { + + /** + * Frame for this reflower + * + * @var Frame + */ + protected $_frame; + + /** + * Cached min/max size + * + * @var array + */ + protected $_min_max_cache; + + function __construct(Frame $frame) { + $this->_frame = $frame; + $this->_min_max_cache = null; + } + + function dispose() { + clear_object($this); + } + + protected function _collapse_margins() { + $cb = $this->_frame->get_containing_block(); + $style = $this->_frame->get_style(); + + $t = $style->length_in_pt($style->margin_top, $cb["h"]); + $b = $style->length_in_pt($style->margin_bottom, $cb["h"]); + + // Handle 'auto' values + if ( $t === "auto" ) { + $style->margin_top = "0pt"; + $t = 0; + } + + if ( $b === "auto" ) { + $style->margin_bottom = "0pt"; + $b = 0; + } + + // Collapse vertical margins: + $n = $this->_frame->get_next_sibling(); + + // FIXME If there is a non-empty inline frame between the blocks, it is not taken into account + while ( $n && !in_array($n->get_style()->display, Style::$BLOCK_TYPES) ) { + $n = $n->get_next_sibling(); + } + + if ( $n ) { // && !$n instanceof Page_Frame_Decorator ) { + $b = max($b, $style->length_in_pt($n->get_style()->margin_top, $cb["h"])); + $n->get_style()->margin_top = "0pt"; + $style->margin_bottom = $b."pt"; + } + + // Collapse our first child's margin + $f = $this->_frame->get_first_child(); + while ( $f && !in_array($f->get_style()->display, Style::$BLOCK_TYPES) ) + $f = $f->get_next_sibling(); + + // Margin are collapsed only between block elements + if ( $f && in_array($f->get_style()->display, Style::$BLOCK_TYPES)) { + $t = max( $t, $style->length_in_pt($f->get_style()->margin_top, $cb["h"])); + $style->margin_top = $t."pt"; + $f->get_style()->margin_bottom = "0pt"; + } + + } + + //........................................................................ + + abstract function reflow(Frame_Decorator $block = null); + + //........................................................................ + + // Required for table layout: Returns an array(0 => min, 1 => max, "min" + // => min, "max" => max) of the minimum and maximum widths of this frame. + // This provides a basic implementation. Child classes should override + // this if necessary. + function get_min_max_width() { + if ( !is_null($this->_min_max_cache) ) { + return $this->_min_max_cache; + } + + $style = $this->_frame->get_style(); + + // Account for margins & padding + $dims = array($style->padding_left, + $style->padding_right, + $style->border_left_width, + $style->border_right_width, + $style->margin_left, + $style->margin_right); + + $cb_w = $this->_frame->get_containing_block("w"); + $delta = $style->length_in_pt($dims, $cb_w); + + // Handle degenerate case + if ( !$this->_frame->get_first_child() ) + return $this->_min_max_cache = array($delta, $delta,"min" => $delta, "max" => $delta); + + $low = array(); + $high = array(); + + for ( $iter = $this->_frame->get_children()->getIterator(); + $iter->valid(); + $iter->next() ) { + + $inline_min = 0; + $inline_max = 0; + + // Add all adjacent inline widths together to calculate max width + while ( $iter->valid() && in_array( $iter->current()->get_style()->display, Style::$INLINE_TYPES ) ) { + + $child = $iter->current(); + + $minmax = $child->get_min_max_width(); + + if ( in_array( $iter->current()->get_style()->white_space, array("pre", "nowrap") ) ) + $inline_min += $minmax["min"]; + else + $low[] = $minmax["min"]; + + $inline_max += $minmax["max"]; + $iter->next(); + + } + + if ( $inline_max > 0 ) + $high[] = $inline_max; + + if ( $inline_min > 0 ) + $low[] = $inline_min; + + if ( $iter->valid() ) { + list($low[], $high[]) = $iter->current()->get_min_max_width(); + continue; + } + + } + $min = count($low) ? max($low) : 0; + $max = count($high) ? max($high) : 0; + + // Use specified width if it is greater than the minimum defined by the + // content. If the width is a percentage ignore it for now. + $width = $style->width; + if ( $width !== "auto" && !is_percent($width) ) { + $width = $style->length_in_pt($width, $cb_w); + if ( $min < $width ) + $min = $width; + if ( $max < $width ) + $max = $width; + } + + $min += $delta; + $max += $delta; + return $this->_min_max_cache = array($min, $max, "min"=>$min, "max"=>$max); + } + + /** + * Parses a CSS string containing quotes and escaped hex characters + * + * @param $string string The CSS string to parse + * @param $single_trim + * @return string + */ + protected function _parse_string($string, $single_trim = false) { + if ($single_trim) { + $string = preg_replace("/^[\"\']/", "", $string); + $string = preg_replace("/[\"\']$/", "", $string); + } + else { + $string = trim($string, "'\""); + } + + $string = str_replace(array("\\\n",'\\"',"\\'"), + array("",'"',"'"), $string); + + // Convert escaped hex characters into ascii characters (e.g. \A => newline) + $string = preg_replace_callback("/\\\\([0-9a-fA-F]{0,6})(\s)?(?(2)|(?=[^0-9a-fA-F]))/", + create_function('$matches', + 'return chr(hexdec($matches[1]));'), + $string); + return $string; + } + + /** + * Parses a CSS "quotes" property + * + * @return array An array of pairs of quotes + */ + protected function _parse_quotes() { + + // Matches quote types + $re = "/(\'[^\']*\')|(\"[^\"]*\")/"; + + $quotes = $this->_frame->get_style()->quotes; + + // split on spaces, except within quotes + if (!preg_match_all($re, "$quotes", $matches, PREG_SET_ORDER)) + return; + + $quotes_array = array(); + foreach($matches as &$_quote){ + $quotes_array[] = $this->_parse_string($_quote[0], true); + } + + if ( empty($quotes_array) ) { + $quotes_array = array('"', '"'); + } + + return array_chunk($quotes_array, 2); + } + + /** + * Parses the CSS "content" property + * + * @return string The resulting string + */ + protected function _parse_content() { + + // Matches generated content + $re = "/\n". + "\s(counters?\\([^)]*\\))|\n". + "\A(counters?\\([^)]*\\))|\n". + "\s([\"']) ( (?:[^\"']|\\\\[\"'])+ )(?_frame->get_style()->content; + + $quotes = $this->_parse_quotes(); + + // split on spaces, except within quotes + if (!preg_match_all($re, $content, $matches, PREG_SET_ORDER)) + return; + + $text = ""; + + foreach ($matches as $match) { + + if ( isset($match[2]) && $match[2] !== "" ) + $match[1] = $match[2]; + + if ( isset($match[6]) && $match[6] !== "" ) + $match[4] = $match[6]; + + if ( isset($match[8]) && $match[8] !== "" ) + $match[7] = $match[8]; + + if ( isset($match[1]) && $match[1] !== "" ) { + + // counters?(...) + $match[1] = mb_strtolower(trim($match[1])); + + // Handle counter() references: + // http://www.w3.org/TR/CSS21/generate.html#content + + $i = mb_strpos($match[1], ")"); + if ( $i === false ) + continue; + + $args = explode(",", mb_substr($match[1], 8, $i - 8)); + $counter_id = $args[0]; + + if ( $match[1][7] === "(" ) { + // counter(name [,style]) + + if ( isset($args[1]) ) + $type = trim($args[1]); + else + $type = null; + + $p = $this->_frame->find_block_parent(); + + $text .= $p->counter_value($counter_id, $type); + + } else if ( $match[1][7] === "s" ) { + // counters(name, string [,style]) + if ( isset($args[1]) ) + $string = $this->_parse_string(trim($args[1])); + else + $string = ""; + + if ( isset($args[2]) ) + $type = $args[2]; + else + $type = null; + + $p = $this->_frame->find_block_parent(); + $tmp = ""; + while ($p) { + $tmp = $p->counter_value($counter_id, $type) . $string . $tmp; + $p = $p->find_block_parent(); + } + $text .= $tmp; + + } else + // countertops? + continue; + + } else if ( isset($match[4]) && $match[4] !== "" ) { + // String match + $text .= $this->_parse_string($match[4]); + + } else if ( isset($match[7]) && $match[7] !== "" ) { + // Directive match + + if ( $match[7] === "open-quote" ) { + // FIXME: do something here + $text .= $quotes[0][0]; + } else if ( $match[7] === "close-quote" ) { + // FIXME: do something else here + $text .= $quotes[0][1]; + } else if ( $match[7] === "no-open-quote" ) { + // FIXME: + } else if ( $match[7] === "no-close-quote" ) { + // FIXME: + } else if ( mb_strpos($match[7],"attr(") === 0 ) { + + $i = mb_strpos($match[7],")"); + if ( $i === false ) + continue; + + $attr = mb_substr($match[7], 5, $i - 5); + if ( $attr == "" ) + continue; + + $text .= $this->_frame->get_parent()->get_node()->getAttribute($attr); + } else + continue; + } + } + + return $text; + } + + /** + * Sets the generated content of a generated frame + */ + protected function _set_content(){ + $frame = $this->_frame; + $style = $frame->get_style(); + + if ( $style->content && $frame->get_node()->nodeName === "dompdf_generated" ) { + $content = $this->_parse_content(); + $node = $frame->get_node()->ownerDocument->createTextNode($content); + + $new_style = $style->get_stylesheet()->create_style(); + $new_style->inherit($style); + + $new_frame = new Frame($node); + $new_frame->set_style($new_style); + + Frame_Factory::decorate_frame($new_frame, $frame->get_dompdf()); + $new_frame->get_decorator()->set_root($frame->get_root()); + $frame->append_child($new_frame); + } + } +} diff --git a/application/third_party/dompdf/include/frame_tree.cls.php b/application/third_party/dompdf/include/frame_tree.cls.php new file mode 100755 index 00000000..3d5d2148 --- /dev/null +++ b/application/third_party/dompdf/include/frame_tree.cls.php @@ -0,0 +1,230 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: frame_tree.cls.php 332 2010-11-27 14:06:34Z fabien.menager $ */ + +/** + * Represents an entire document as a tree of frames + * + * The Frame_Tree consists of {@link Frame} objects each tied to specific + * DomNode objects in a specific DomDocument. The Frame_Tree has the same + * structure as the DomDocument, but adds additional capabalities for + * styling and layout. + * + * @package dompdf + * @access protected + */ +class Frame_Tree { + + /** + * Tags to ignore while parsing the tree + * + * @var array + */ + static protected $_HIDDEN_TAGS = array("area", "base", "basefont", "head", "style", + "meta", "title", "colgroup", + "noembed", "noscript", "param", "#comment"); + /** + * The main DomDocument + * + * @see http://ca2.php.net/manual/en/ref.dom.php + * @var DomDocument + */ + protected $_dom; + + /** + * The root node of the FrameTree. + * + * @var Frame + */ + protected $_root; + + /** + * Subtrees of absolutely positioned elements + * + * @var array of Frames + */ + protected $_absolute_frames; + + /** + * A mapping of {@link Frame} objects to DomNode objects + * + * @var array + */ + protected $_registry; + + + /** + * Class constructor + * + * @param DomDocument $dom the main DomDocument object representing the current html document + */ + function __construct(DomDocument $dom) { + $this->_dom = $dom; + $this->_root = null; + $this->_registry = array(); + } + + function __destruct() { + clear_object($this); + } + + /** + * Returns the DomDocument object representing the curent html document + * + * @return DomDocument + */ + function get_dom() { return $this->_dom; } + + /** + * Returns the root frame of the tree + * + * @return Frame + */ + function get_root() { return $this->_root; } + + /** + * Returns a specific frame given its id + * + * @param string $id + * @return Frame + */ + function get_frame($id) { return isset($this->_registry[$id]) ? $this->_registry[$id] : null; } + + /** + * Returns a post-order iterator for all frames in the tree + * + * @return FrameTreeList + */ + function get_frames() { return new FrameTreeList($this->_root); } + + /** + * Builds the tree + */ + function build_tree() { + $html = $this->_dom->getElementsByTagName("html")->item(0); + if ( is_null($html) ) + $html = $this->_dom->firstChild; + + if ( is_null($html) ) + throw new DOMPDF_Exception("Requested HTML document contains no data."); + + $this->_root = $this->_build_tree_r($html); + + } + + /** + * Recursively adds {@link Frame} objects to the tree + * + * Recursively build a tree of Frame objects based on a dom tree. + * No layout information is calculated at this time, although the + * tree may be adjusted (i.e. nodes and frames for generated content + * and images may be created). + * + * @param DomNode $node the current DomNode being considered + * @return Frame + */ + protected function _build_tree_r(DomNode $node) { + + $frame = new Frame($node); + $id = $frame->get_id(); + $this->_registry[ $id ] = $frame; + + if ( !$node->hasChildNodes() ) + return $frame; + + // Fixes 'cannot access undefined property for object with + // overloaded access', fix by Stefan radulian + // + //foreach ($node->childNodes as $child) { + + // Store the children in an array so that the tree can be modified + $children = array(); + for ($i = 0; $i < $node->childNodes->length; $i++) + $children[] = $node->childNodes->item($i); + + foreach ($children as $child) { + $node_name = mb_strtolower($child->nodeName); + + // Skip non-displaying nodes + if ( in_array($node_name, self::$_HIDDEN_TAGS) ) { + if ( $node_name !== "head" && + $node_name !== "style" ) + $child->parentNode->removeChild($child); + continue; + } + + // Skip empty text nodes + if ( $node_name === "#text" && $child->nodeValue == "" ) { + $child->parentNode->removeChild($child); + continue; + } + + // Skip empty image nodes + if ( $node_name === "img" && $child->getAttribute("src") == "" ) { + $child->parentNode->removeChild($child); + continue; + } + + $frame->append_child($this->_build_tree_r($child), false); + } + + return $frame; + } + + public function insert_node(DOMNode $node, DOMNode $new_node, $pos) { + if ($pos === "after" || !$node->firstChild) + $node->appendChild($new_node); + else + $node->insertBefore($new_node, $node->firstChild); + + $this->_build_tree_r($new_node); + + $frame_id = $new_node->getAttribute("frame_id"); + $frame = $this->get_frame($frame_id); + + $parent_id = $node->getAttribute("frame_id"); + $parent = $this->get_frame($parent_id); + + if ($pos === "before") + $parent->prepend_child($frame, false); + else + $parent->append_child($frame, false); + } +} diff --git a/application/third_party/dompdf/include/functions.inc.php b/application/third_party/dompdf/include/functions.inc.php new file mode 100755 index 00000000..23c3b1ab --- /dev/null +++ b/application/third_party/dompdf/include/functions.inc.php @@ -0,0 +1,942 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - trailing slash of base_path in build_url is no longer optional when + * required. This allows paths not ending in a slash, e.g. on dynamically + * created sites with page id in the url parameters. + * @version 20090601 + * - fix windows paths + * @version 20090610 + * - relax windows path syntax, use uniform path delimiter. Used for background images. + */ + +/* $Id: functions.inc.php 361 2011-02-16 21:03:05Z fabien.menager $ */ + +function def($name, $value = true) { + if (!defined($name)) { + define($name, $value); + } +} + +if ( !function_exists("pre_r") ) { +/** + * print_r wrapper for html/cli output + * + * Wraps print_r() output in < pre > tags if the current sapi is not + * 'cli'. Returns the output string instead of displaying it if $return is + * true. + * + * @param mixed $mixed variable or expression to display + * @param bool $return + * + */ +function pre_r($mixed, $return = false) { + if ($return) + return "
" . print_r($mixed, true) . "
"; + + if ( php_sapi_name() !== "cli") + echo ("
");
+  print_r($mixed);
+
+  if ( php_sapi_name() !== "cli")
+    echo("
"); + else + echo ("\n"); + flush(); + +} +} + +if ( !function_exists("pre_var_dump") ) { +/** + * var_dump wrapper for html/cli output + * + * Wraps var_dump() output in < pre > tags if the current sapi is not + * 'cli'. + * + * @param mixed $mixed variable or expression to display. + */ +function pre_var_dump($mixed) { + if ( php_sapi_name() !== "cli") + echo("
");
+    
+  var_dump($mixed);
+  
+  if ( php_sapi_name() !== "cli")
+    echo("
"); +} +} + +if ( !function_exists("d") ) { +/** + * generic debug function + * + * Takes everything and does its best to give a good debug output + * + * @param mixed $mixed variable or expression to display. + */ +function d($mixed) { + if ( php_sapi_name() !== "cli") + echo("
");
+    
+  // line
+  if (is_array($mixed) && array_key_exists("tallest_frame", $mixed)) {
+    echo "LINE:\n";
+    foreach($mixed as $key => $value) {
+      if (is_array($value) || is_object($value)) continue;
+      echo "  $key:\t".var_export($value,true)."\n";
+    }
+  }
+  
+  // other
+  else {
+    var_export($mixed);
+  }
+  
+  if ( php_sapi_name() !== "cli")
+    echo("
"); +} +} + +/** + * builds a full url given a protocol, hostname, base path and url + * + * @param string $protocol + * @param string $host + * @param string $base_path + * @param string $url + * @return string + * + * Initially the trailing slash of $base_path was optional, and conditionally appended. + * However on dynamically created sites, where the page is given as url parameter, + * the base path might not end with an url. + * Therefore do not append a slash, and **require** the $base_url to ending in a slash + * when needed. + * Vice versa, on using the local file system path of a file, make sure that the slash + * is appended (o.k. also for Windows) + */ +function build_url($protocol, $host, $base_path, $url) { + if ( mb_strlen($url) == 0 ) { + //return $protocol . $host . rtrim($base_path, "/\\") . "/"; + return $protocol . $host . $base_path; + } + + // Is the url already fully qualified or a Data URI? + if ( mb_strpos($url, "://") !== false || mb_strpos($url, "data:") === 0 ) + return $url; + + $ret = $protocol; + + if (!in_array(mb_strtolower($protocol), array("http://", "https://", "ftp://", "ftps://"))) { + //On Windows local file, an abs path can begin also with a '\' or a drive letter and colon + //drive: followed by a relative path would be a drive specific default folder. + //not known in php app code, treat as abs path + //($url[1] !== ':' || ($url[2]!=='\\' && $url[2]!=='/')) + if ($url[0] !== '/' && (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' || ($url[0] !== '\\' && $url[1] !== ':'))) { + // For rel path and local acess we ignore the host, and run the path through realpath() + $ret .= realpath($base_path).'/'; + } + $ret .= $url; + $ret = preg_replace("/\?(.*)$/", "", $ret); + return $ret; + } + + //remote urls with backslash in html/css are not really correct, but lets be genereous + if ( $url[0] === '/' || $url[0] === '\\' ) { + // Absolute path + $ret .= $host . $url; + } else { + // Relative path + //$base_path = $base_path !== "" ? rtrim($base_path, "/\\") . "/" : ""; + $ret .= $host . $base_path . $url; + } + + return $ret; + +} + +/** + * parse a full url or pathname and return an array(protocol, host, path, + * file + query + fragment) + * + * @param string $url + * @return array + */ +function explode_url($url) { + $protocol = ""; + $host = ""; + $path = ""; + $file = ""; + + $arr = parse_url($url); + + if ( isset($arr["scheme"]) && + $arr["scheme"] !== "file" && + mb_strlen($arr["scheme"]) > 1 ) // Exclude windows drive letters... + { + $protocol = $arr["scheme"] . "://"; + + if ( isset($arr["user"]) ) { + $host .= $arr["user"]; + + if ( isset($arr["pass"]) ) + $host .= "@" . $arr["pass"]; + + $host .= ":"; + } + + if ( isset($arr["host"]) ) + $host .= $arr["host"]; + + if ( isset($arr["port"]) ) + $host .= ":" . $arr["port"]; + + if ( isset($arr["path"]) && $arr["path"] !== "" ) { + // Do we have a trailing slash? + if ( $arr["path"][ mb_strlen($arr["path"]) - 1 ] === "/" ) { + $path = $arr["path"]; + $file = ""; + } else { + $path = dirname($arr["path"]) . "/"; + $file = basename($arr["path"]); + } + } + + if ( isset($arr["query"]) ) + $file .= "?" . $arr["query"]; + + if ( isset($arr["fragment"]) ) + $file .= "#" . $arr["fragment"]; + + } else { + + $i = mb_strpos($url, "file://"); + if ( $i !== false) + $url = mb_substr($url, $i + 7); + + $protocol = ""; // "file://"; ? why doesn't this work... It's because of + // network filenames like //COMPU/SHARENAME + + $host = ""; // localhost, really + $file = basename($url); + + $path = dirname($url); + + // Check that the path exists + if ( $path !== false ) { + $path .= '/'; + + } else { + // generate a url to access the file if no real path found. + $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://'; + + $host = isset($_SERVER["HTTP_HOST"]) ? $_SERVER["HTTP_HOST"] : php_uname("n"); + + if ( substr($arr["path"], 0, 1) === '/' ) { + $path = dirname($arr["path"]); + } else { + $path = '/' . rtrim(dirname($_SERVER["SCRIPT_NAME"]), '/') . '/' . $arr["path"]; + } + } + } + + $ret = array($protocol, $host, $path, $file, + "protocol" => $protocol, + "host" => $host, + "path" => $path, + "file" => $file); + return $ret; +} + +/** + * converts decimal numbers to roman numerals + * + * @param int $num + * @return string + */ +function dec2roman($num) { + + static $ones = array("", "i", "ii", "iii", "iv", "v", + "vi", "vii", "viii", "ix"); + static $tens = array("", "x", "xx", "xxx", "xl", "l", + "lx", "lxx", "lxxx", "xc"); + static $hund = array("", "c", "cc", "ccc", "cd", "d", + "dc", "dcc", "dccc", "cm"); + static $thou = array("", "m", "mm", "mmm"); + + if ( !is_numeric($num) ) + throw new DOMPDF_Exception("dec2roman() requires a numeric argument."); + + if ( $num > 4000 || $num < 0 ) + return "(out of range)"; + + $num = strrev((string)$num); + + $ret = ""; + switch (mb_strlen($num)) { + case 4: $ret .= $thou[$num[3]]; + case 3: $ret .= $hund[$num[2]]; + case 2: $ret .= $tens[$num[1]]; + case 1: $ret .= $ones[$num[0]]; + default: break; + } + return $ret; + +} + +/** + * Determines whether $value is a percentage or not + * + * @param float $value + * @return bool + */ +function is_percent($value) { return false !== mb_strpos($value, "%"); } + +/** + * Parses a data URI scheme + * http://en.wikipedia.org/wiki/Data_URI_scheme + * @param string $data_uri The data URI to parse + * @return array The result with charset, mime type and decoded data + */ +function parse_data_uri($data_uri) { + if (!preg_match('/^data:(?P[a-z0-9\/+-.]+)(;charset=(?P[a-z0-9-])+)?(?P;base64)?\,(?P.*)?/i', $data_uri, $match)) { + return false; + } + + $match['data'] = rawurldecode($match['data']); + $result = array( + 'charset' => $match['charset'] ? $match['charset'] : 'US-ASCII', + 'mime' => $match['mime'] ? $match['mime'] : 'text/plain', + 'data' => $match['base64'] ? base64_decode($match['data']) : $match['data'], + ); + + return $result; +} + +/** + * mb_string compatibility + */ +if ( !function_exists("mb_strlen") ) { + + define('MB_OVERLOAD_MAIL', 1); + define('MB_OVERLOAD_STRING', 2); + define('MB_OVERLOAD_REGEX', 4); + define('MB_CASE_UPPER', 0); + define('MB_CASE_LOWER', 1); + define('MB_CASE_TITLE', 2); + + function mb_convert_encoding($data, $to_encoding, $from_encoding = 'UTF-8') { + if (str_replace('-', '', strtolower($to_encoding)) === 'utf8') { + return utf8_encode($data); + } else { + return utf8_decode($data); + } + } + + function mb_detect_encoding($data, $encoding_list = array('iso-8859-1'), $strict = false) { + return 'iso-8859-1'; + } + + function mb_detect_order($encoding_list = array('iso-8859-1')) { + return 'iso-8859-1'; + } + + function mb_internal_encoding($encoding = null) { + if (isset($encoding)) { + return true; + } else { + return 'iso-8859-1'; + } + } + + function mb_strlen($str, $encoding = 'iso-8859-1') { + switch (str_replace('-', '', strtolower($encoding))) { + case "utf8": return strlen(utf8_encode($str)); + case "8bit": return strlen($str); + default: return strlen(utf8_decode($str)); + } + } + + function mb_strpos($haystack, $needle, $offset = 0) { + return strpos($haystack, $needle, $offset); + } + + function mb_strrpos($haystack, $needle, $offset = 0) { + return strrpos($haystack, $needle, $offset); + } + + function mb_strtolower( $str ) { + return strtolower($str); + } + + function mb_strtoupper( $str ) { + return strtoupper($str); + } + + function mb_substr($string, $start, $length = null, $encoding = 'iso-8859-1') { + if ( is_null($length) ) + return substr($string, $start); + else + return substr($string, $start, $length); + } + + function mb_substr_count($haystack, $needle, $encoding = 'iso-8859-1') { + return substr_count($haystack, $needle); + } + + function mb_encode_numericentity($str, $convmap, $encoding) { + return htmlspecialchars($str); + } + + function mb_convert_case($str, $mode = MB_CASE_UPPER, $encoding = array()) { + switch($mode) { + case MB_CASE_UPPER: return mb_strtoupper($str); + case MB_CASE_LOWER: return mb_strtolower($str); + case MB_CASE_TITLE: return ucwords(mb_strtolower($str)); + default: return $str; + } + } + + function mb_list_encodings() { + return array( + "ISO-8859-1", + "UTF-8", + "8bit", + ); + } +} + +/** + * Decoder for RLE8 compression in windows bitmaps + * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp + */ +function rle8_decode ($str, $width){ + $lineWidth = $width + (3 - ($width-1) % 4); + $out = ''; + $cnt = strlen($str); + + for ($i = 0; $i <$cnt; $i++) { + $o = ord($str[$i]); + switch ($o){ + case 0: # ESCAPE + $i++; + switch (ord($str[$i])){ + case 0: # NEW LINE + $padCnt = $lineWidth - strlen($out)%$lineWidth; + if ($padCnt<$lineWidth) $out .= str_repeat(chr(0), $padCnt); # pad line + break; + case 1: # END OF FILE + $padCnt = $lineWidth - strlen($out)%$lineWidth; + if ($padCnt<$lineWidth) $out .= str_repeat(chr(0), $padCnt); # pad line + break 3; + case 2: # DELTA + $i += 2; + break; + default: # ABSOLUTE MODE + $num = ord($str[$i]); + for ($j = 0; $j < $num; $j++) + $out .= $str[++$i]; + if ($num % 2) $i++; + } + break; + default: + $out .= str_repeat($str[++$i], $o); + } + } + return $out; +} + +/** + * Decoder for RLE4 compression in windows bitmaps + * see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp + */ +function rle4_decode ($str, $width) { + $w = floor($width/2) + ($width % 2); + $lineWidth = $w + (3 - ( ($width-1) / 2) % 4); + $pixels = array(); + $cnt = strlen($str); + + for ($i = 0; $i < $cnt; $i++) { + $o = ord($str[$i]); + switch ($o) { + case 0: # ESCAPE + $i++; + switch (ord($str[$i])){ + case 0: # NEW LINE + while (count($pixels)%$lineWidth!=0) + $pixels[]=0; + break; + case 1: # END OF FILE + while (count($pixels)%$lineWidth!=0) + $pixels[]=0; + break 3; + case 2: # DELTA + $i += 2; + break; + default: # ABSOLUTE MODE + $num = ord($str[$i]); + for ($j = 0; $j < $num; $j++){ + if ($j%2 == 0){ + $c = ord($str[++$i]); + $pixels[] = ($c & 240)>>4; + } else + $pixels[] = $c & 15; + } + if ($num % 2) $i++; + } + break; + default: + $c = ord($str[++$i]); + for ($j = 0; $j < $o; $j++) + $pixels[] = ($j%2==0 ? ($c & 240)>>4 : $c & 15); + } + } + + $out = ''; + if (count($pixels)%2) $pixels[]=0; + $cnt = count($pixels)/2; + + for ($i = 0; $i < $cnt; $i++) + $out .= chr(16*$pixels[2*$i] + $pixels[2*$i+1]); + + return $out; +} + +if ( !function_exists("imagecreatefrombmp") ) { + +/** + * Credit goes to mgutt + * http://www.programmierer-forum.de/function-imagecreatefrombmp-welche-variante-laeuft-t143137.htm + * Modified by Fabien Menager to support RGB555 BMP format + */ +function imagecreatefrombmp($filename) { + try { + // version 1.00 + if (!($fh = fopen($filename, 'rb'))) { + trigger_error('imagecreatefrombmp: Can not open ' . $filename, E_USER_WARNING); + return false; + } + + // read file header + $meta = unpack('vtype/Vfilesize/Vreserved/Voffset', fread($fh, 14)); + + // check for bitmap + if ($meta['type'] != 19778) { + trigger_error('imagecreatefrombmp: ' . $filename . ' is not a bitmap!', E_USER_WARNING); + return false; + } + + // read image header + $meta += unpack('Vheadersize/Vwidth/Vheight/vplanes/vbits/Vcompression/Vimagesize/Vxres/Vyres/Vcolors/Vimportant', fread($fh, 40)); + + // read additional bitfield header + if ($meta['compression'] == 3) { + $meta += unpack('VrMask/VgMask/VbMask', fread($fh, 12)); + } + + //pre_r($filename);pre_r($meta); + + // set bytes and padding + $meta['bytes'] = $meta['bits'] / 8; + $meta['decal'] = 4 - (4 * (($meta['width'] * $meta['bytes'] / 4)- floor($meta['width'] * $meta['bytes'] / 4))); + if ($meta['decal'] == 4) { + $meta['decal'] = 0; + } + + // obtain imagesize + if ($meta['imagesize'] < 1) { + $meta['imagesize'] = $meta['filesize'] - $meta['offset']; + // in rare cases filesize is equal to offset so we need to read physical size + if ($meta['imagesize'] < 1) { + $meta['imagesize'] = @filesize($filename) - $meta['offset']; + if ($meta['imagesize'] < 1) { + trigger_error('imagecreatefrombmp: Can not obtain filesize of ' . $filename . '!', E_USER_WARNING); + return false; + } + } + } + + // calculate colors + $meta['colors'] = !$meta['colors'] ? pow(2, $meta['bits']) : $meta['colors']; + + // read color palette + $palette = array(); + if ($meta['bits'] < 16) { + $palette = unpack('l' . $meta['colors'], fread($fh, $meta['colors'] * 4)); + // in rare cases the color value is signed + if ($palette[1] < 0) { + foreach ($palette as $i => $color) { + $palette[$i] = $color + 16777216; + } + } + } + + // create gd image + $im = imagecreatetruecolor($meta['width'], $meta['height']); + $data = fread($fh, $meta['imagesize']); + + // uncompress data + switch ($meta['compression']) { + case 1: $data = rle8_decode($data, $meta['width']); break; + case 2: $data = rle4_decode($data, $meta['width']); break; + } + + $p = 0; + $vide = chr(0); + $y = $meta['height'] - 1; + $error = 'imagecreatefrombmp: ' . $filename . ' has not enough data!'; + + // loop through the image data beginning with the lower left corner + while ($y >= 0) { + $x = 0; + while ($x < $meta['width']) { + switch ($meta['bits']) { + case 32: + case 24: + if (!($part = substr($data, $p, 3 /*$meta['bytes']*/))) { + trigger_error($error, E_USER_WARNING); + return $im; + } + $color = unpack('V', $part . $vide); + break; + case 16: + if (!($part = substr($data, $p, 2 /*$meta['bytes']*/))) { + trigger_error($error, E_USER_WARNING); + return $im; + } + $color = unpack('v', $part); + + if (empty($meta['rMask']) || $meta['rMask'] != 0xf800) + $color[1] = (($color[1] & 0x7c00) >> 7) * 65536 + (($color[1] & 0x03e0) >> 2) * 256 + (($color[1] & 0x001f) << 3); // 555 + else + $color[1] = (($color[1] & 0xf800) >> 8) * 65536 + (($color[1] & 0x07e0) >> 3) * 256 + (($color[1] & 0x001f) << 3); // 565 + break; + case 8: + $color = unpack('n', $vide . substr($data, $p, 1)); + $color[1] = $palette[ $color[1] + 1 ]; + break; + case 4: + $color = unpack('n', $vide . substr($data, floor($p), 1)); + $color[1] = ($p * 2) % 2 == 0 ? $color[1] >> 4 : $color[1] & 0x0F; + $color[1] = $palette[ $color[1] + 1 ]; + break; + case 1: + $color = unpack('n', $vide . substr($data, floor($p), 1)); + switch (($p * 8) % 8) { + case 0: $color[1] = $color[1] >> 7; break; + case 1: $color[1] = ($color[1] & 0x40) >> 6; break; + case 2: $color[1] = ($color[1] & 0x20) >> 5; break; + case 3: $color[1] = ($color[1] & 0x10) >> 4; break; + case 4: $color[1] = ($color[1] & 0x8 ) >> 3; break; + case 5: $color[1] = ($color[1] & 0x4 ) >> 2; break; + case 6: $color[1] = ($color[1] & 0x2 ) >> 1; break; + case 7: $color[1] = ($color[1] & 0x1 ); break; + } + $color[1] = $palette[ $color[1] + 1 ]; + break; + default: + trigger_error('imagecreatefrombmp: ' . $filename . ' has ' . $meta['bits'] . ' bits and this is not supported!', E_USER_WARNING); + return false; + } + imagesetpixel($im, $x, $y, $color[1]); + $x++; + $p += $meta['bytes']; + } + $y--; + $p += $meta['decal']; + } + fclose($fh); + return $im; + } catch (Exception $e) {var_dump($e);} +} +} + +/** + * getimagesize doesn't give a good size for 32bit BMP image v5 + * + * @param string $filename + * @return array The same format as getimagesize($filename) + */ +function dompdf_getimagesize($filename) { + $size = getimagesize($filename); + + if ( $size[0] == null || $size[1] == null ) { + $data = file_get_contents($filename, null, null, 0, 26); + + if ( substr($data, 0, 2) === "BM" ) { + $meta = unpack('vtype/Vfilesize/Vreserved/Voffset/Vheadersize/Vwidth/Vheight', $data); + $size[0] = (int)$meta['width']; + $size[1] = (int)$meta['height']; + } + } + + return $size; +} + +/** + * Converts a CMYK color to RGB + * + * @param int $c + * @param int $m + * @param int $y + * @param int $k + * @return object + */ +function cmyk_to_rgb($c, $m = null, $y = null, $k = null) { + if (is_array($c)) { + list($c, $m, $y, $k) = $c; + } + + $c *= 255; + $m *= 255; + $y *= 255; + $k *= 255; + + $r = (1 - round(2.55 * ($c+$k))) ; + $g = (1 - round(2.55 * ($m+$k))) ; + $b = (1 - round(2.55 * ($y+$k))) ; + + if($r<0) $r = 0; + if($g<0) $g = 0; + if($b<0) $b = 0; + + return array( + $r, $g, $b, + "r" => $r, "g" => $g, "b" => $b + ); +} + +function unichr($c) { + if ($c <= 0x7F) { + return chr($c); + } else if ($c <= 0x7FF) { + return chr(0xC0 | $c >> 6) . chr(0x80 | $c & 0x3F); + } else if ($c <= 0xFFFF) { + return chr(0xE0 | $c >> 12) . chr(0x80 | $c >> 6 & 0x3F) + . chr(0x80 | $c & 0x3F); + } else if ($c <= 0x10FFFF) { + return chr(0xF0 | $c >> 18) . chr(0x80 | $c >> 12 & 0x3F) + . chr(0x80 | $c >> 6 & 0x3F) + . chr(0x80 | $c & 0x3F); + } + return false; +} + +if ( !function_exists("date_default_timezone_get") ) { + function date_default_timezone_get() { + return ""; + } + + function date_default_timezone_set($timezone_identifier) { + return true; + } +} + +/** + * Stores warnings in an array for display later + * + * This function allows warnings generated by the DomDocument parser + * and CSS loader ({@link Stylesheet}) to be captured and displayed + * later. Without this function, errors are displayed immediately and + * PDF streaming is impossible. + * + * @see http://www.php.net/manual/en/function.set-error_handler.php + * + * @param int $errno + * @param string $errstr + * @param string $errfile + * @param string $errline + */ +function record_warnings($errno, $errstr, $errfile, $errline) { + + if ( !($errno & (E_WARNING | E_NOTICE | E_USER_NOTICE | E_USER_WARNING )) ) // Not a warning or notice + throw new DOMPDF_Exception($errstr . " $errno"); + + global $_dompdf_warnings; + global $_dompdf_show_warnings; + + if ( $_dompdf_show_warnings ) + echo $errstr . "\n"; + + $_dompdf_warnings[] = $errstr; +} + +/** + * Print a useful backtrace + */ +function bt() { + if ( php_sapi_name() !== "cli") + echo("
");
+    
+  $bt = debug_backtrace();
+
+  array_shift($bt); // remove actual bt() call
+  echo "\n";
+
+  $i = 0;
+  foreach ($bt as $call) {
+    $file = basename($call["file"]) . " (" . $call["line"] . ")";
+    if ( isset($call["class"]) ) {
+      $func = $call["class"] . "->" . $call["function"] . "()";
+    } else {
+      $func = $call["function"] . "()";
+    }
+
+    echo "#" . str_pad($i, 2, " ", STR_PAD_RIGHT) . ": " . str_pad($file.":", 42) . " $func\n";
+    $i++;
+  }
+  echo "\n";
+  
+  if ( php_sapi_name() !== "cli")
+    echo("
"); +} + +/** + * Print debug messages + * + * @param string $type The type of debug messages to print + */ +function dompdf_debug($type, $msg) { + global $_DOMPDF_DEBUG_TYPES, $_dompdf_show_warnings, $_dompdf_debug; + if ( isset($_DOMPDF_DEBUG_TYPES[$type]) && ($_dompdf_show_warnings || $_dompdf_debug) ) { + $arr = debug_backtrace(); + + echo basename($arr[0]["file"]) . " (" . $arr[0]["line"] ."): " . $arr[1]["function"] . ": "; + pre_r($msg); + } +} + +if ( !function_exists("print_memusage") ) { +/** + * Dump memory usage + */ +function print_memusage() { + global $memusage; + echo ("Memory Usage\n"); + $prev = 0; + $initial = reset($memusage); + echo (str_pad("Initial:", 40) . $initial . "\n\n"); + + foreach ($memusage as $key=>$mem) { + $mem -= $initial; + echo (str_pad("$key:" , 40)); + echo (str_pad("$mem", 12) . "(diff: " . ($mem - $prev) . ")\n"); + $prev = $mem; + } + + echo ("\n" . str_pad("Total:", 40) . memory_get_usage()) . "\n"; +} +} + +if ( !function_exists("enable_mem_profile") ) { +/** + * Initialize memory profiling code + */ +function enable_mem_profile() { + global $memusage; + $memusage = array("Startup" => memory_get_usage()); + register_shutdown_function("print_memusage"); +} +} + +if ( !function_exists("mark_memusage") ) { +/** + * Record the current memory usage + * + * @param string $location a meaningful location + */ +function mark_memusage($location) { + global $memusage; + if ( isset($memusage) ) + $memusage[$location] = memory_get_usage(); +} +} + +if ( !function_exists('sys_get_temp_dir')) { +/** + * Find the current system temporary directory + * + * @link http://us.php.net/manual/en/function.sys-get-temp-dir.php#85261 + */ +function sys_get_temp_dir() { + if (!empty($_ENV['TMP'])) { return realpath($_ENV['TMP']); } + if (!empty($_ENV['TMPDIR'])) { return realpath( $_ENV['TMPDIR']); } + if (!empty($_ENV['TEMP'])) { return realpath( $_ENV['TEMP']); } + $tempfile=tempnam(uniqid(rand(),TRUE),''); + if (file_exists($tempfile)) { + unlink($tempfile); + return realpath(dirname($tempfile)); + } +} +} + +if ( function_exists("memory_get_peak_usage") ) { + function DOMPDF_memory_usage(){ + return memory_get_peak_usage(true); + } +} +else if ( function_exists("memory_get_peak_usage") ) { + function DOMPDF_memory_usage(){ + return memory_get_usage(true); + } +} +else { + function DOMPDF_memory_usage(){ + return "N/A"; + } +} + +/** + * Affect null to the unused objects + * @param unknown_type $object + */ +function clear_object(&$object) { + if ( is_object($object) ) { + foreach (array_keys((array)$object) as $key) { + clear_object($property); + } + foreach(get_class_vars(get_class($object)) as $property => $value) { + clear_object($property); + } + } + $object = null; + unset($object); +} diff --git a/application/third_party/dompdf/include/gd_adapter.cls.php b/application/third_party/dompdf/include/gd_adapter.cls.php new file mode 100755 index 00000000..58dde2da --- /dev/null +++ b/application/third_party/dompdf/include/gd_adapter.cls.php @@ -0,0 +1,840 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: gd_adapter.cls.php 355 2011-01-27 07:44:54Z fabien.menager $ */ + +/** + * Image rendering interface + * + * Renders to an image format supported by GD (jpeg, gif, png, xpm). + * Not super-useful day-to-day but handy nonetheless + * + * @package dompdf + */ +class GD_Adapter implements Canvas { + + /** + * Resoure handle for the image + * + * @var resource + */ + private $_img; + + /** + * Image width in pixels + * + * @var int + */ + private $_width; + + /** + * Image height in pixels + * + * @var int + */ + private $_height; + + /** + * Current page number + * + * @var int + */ + private $_page_number; + + /** + * Total number of pages + * + * @var int + */ + private $_page_count; + + /** + * Image antialias factor + * + * @var float + */ + private $_aa_factor; + + /** + * Allocated colors + * + * @var array + */ + private $_colors; + + /** + * Background color + * + * @var int + */ + private $_bg_color; + + /** + * Class constructor + * + * @param mixed $size The size of image to create: array(x1,y1,x2,y2) or "letter", "legal", etc. + * @param string $orientation The orientation of the document (either 'landscape' or 'portrait') + * @param float $aa_factor Anti-aliasing factor, 1 for no AA + * @param array $bg_color Image background color: array(r,g,b,a), 0 <= r,g,b,a <= 1 + */ + function __construct($size, $orientation = "portrait", $aa_factor = 1, $bg_color = array(1,1,1,0) ) { + + if ( !is_array($size) ) { + $size = strtolower($size); + + if ( isset(CPDF_Adapter::$PAPER_SIZES[$size]) ) + $size = CPDF_Adapter::$PAPER_SIZES[$size]; + else + $size = CPDF_Adapter::$PAPER_SIZES["letter"]; + } + + if ( strtolower($orientation) === "landscape" ) { + list($size[2],$size[3]) = array($size[3],$size[2]); + } + + if ( $aa_factor < 1 ) + $aa_factor = 1; + + $this->_aa_factor = $aa_factor; + + $size[2] *= $aa_factor; + $size[3] *= $aa_factor; + + $this->_width = $size[2] - $size[0]; + $this->_height = $size[3] - $size[1]; + + $this->_img = imagecreatetruecolor($this->_width, $this->_height); + + if ( is_null($bg_color) || !is_array($bg_color) ) { + // Pure white bg + $bg_color = array(1,1,1,0); + } + + $this->_bg_color = $this->_allocate_color($bg_color); + imagealphablending($this->_img, true); + imagesavealpha($this->_img, true); + imagefill($this->_img, 0, 0, $this->_bg_color); + + } + + /** + * Return the GF image resource + * + * @return resource + */ + function get_image() { return $this->_img; } + + /** + * Return the image's width in pixels + * + * @return float + */ + function get_width() { return $this->_width / $this->_aa_factor; } + + /** + * Return the image's height in pixels + * + * @return float + */ + function get_height() { return $this->_height / $this->_aa_factor; } + + /** + * Returns the current page number + * @return int + */ + function get_page_number() { return $this->_page_number; } + + /** + * Returns the total number of pages in the document + * @return int + */ + function get_page_count() { return $this->_page_count; } + + /** + * Sets the current page number + * + * @param int $num + */ + function set_page_number($num) { $this->_page_number = $num; } + + /** + * Sets the page count + * + * @param int $count + */ + function set_page_count($count) { $this->_page_count = $count; } + + /** + * Sets the opacity + * + * @param $opacity + * @param $mode + */ + function set_opacity($opacity, $mode = "Normal") { + // FIXME + } + + /** + * Allocate a new color. Allocate with GD as needed and store + * previously allocated colors in $this->_colors. + * + * @param array $color The new current color + * @return int The allocated color + */ + private function _allocate_color($color) { + + if ( isset($color["c"]) ) { + $color = cmyk_to_rgb($color); + } + + // Full opacity if no alpha set + if ( !isset($color[3]) ) + $color[3] = 0; + + list($r,$g,$b,$a) = $color; + + $r *= 255; + $g *= 255; + $b *= 255; + $a *= 127; + + // Clip values + $r = $r > 255 ? 255 : $r; + $g = $g > 255 ? 255 : $g; + $b = $b > 255 ? 255 : $b; + $a = $a > 127 ? 127 : $a; + + $r = $r < 0 ? 0 : $r; + $g = $g < 0 ? 0 : $g; + $b = $b < 0 ? 0 : $b; + $a = $a < 0 ? 0 : $a; + + $key = sprintf("#%02X%02X%02X%02X", $r, $g, $b, $a); + + if ( isset($this->_colors[$key]) ) + return $this->_colors[$key]; + + if ( $a != 0 ) + $this->_colors[$key] = imagecolorallocatealpha($this->_img, $r, $g, $b, $a); + else + $this->_colors[$key] = imagecolorallocate($this->_img, $r, $g, $b); + + return $this->_colors[$key]; + + } + + /** + * Draws a line from x1,y1 to x2,y2 + * + * See {@link Style::munge_color()} for the format of the color array. + * See {@link Cpdf::setLineStyle()} for a description of the format of the + * $style parameter (aka dash). + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @param array $color + * @param float $width + * @param array $style + */ + function line($x1, $y1, $x2, $y2, $color, $width, $style = null) { + + // Scale by the AA factor + $x1 *= $this->_aa_factor; + $y1 *= $this->_aa_factor; + $x2 *= $this->_aa_factor; + $y2 *= $this->_aa_factor; + $width *= $this->_aa_factor; + + $c = $this->_allocate_color($color); + + // Convert the style array if required + if ( !is_null($style) ) { + $gd_style = array(); + + if ( count($style) == 1 ) { + for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) { + $gd_style[] = $c; + } + + for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) { + $gd_style[] = $this->_bg_color; + } + + } else { + + $i = 0; + foreach ($style as $length) { + + if ( $i % 2 == 0 ) { + // 'On' pattern + for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) + $gd_style[] = $c; + + } else { + // Off pattern + for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) + $gd_style[] = $this->_bg_color; + + } + $i++; + } + } + + imagesetstyle($this->_img, $gd_style); + $c = IMG_COLOR_STYLED; + } + + imagesetthickness($this->_img, $width); + + imageline($this->_img, $x1, $y1, $x2, $y2, $c); + + } + + /** + * Draws a rectangle at x1,y1 with width w and height h + * + * See {@link Style::munge_color()} for the format of the color array. + * See {@link Cpdf::setLineStyle()} for a description of the $style + * parameter (aka dash) + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + * @param array $color + * @param float $width + * @param array $style + */ + function rectangle($x1, $y1, $w, $h, $color, $width, $style = null) { + + // Scale by the AA factor + $x1 *= $this->_aa_factor; + $y1 *= $this->_aa_factor; + $w *= $this->_aa_factor; + $h *= $this->_aa_factor; + + $c = $this->_allocate_color($color); + + // Convert the style array if required + if ( !is_null($style) ) { + $gd_style = array(); + + foreach ($style as $length) { + for ($i = 0; $i < $length; $i++) { + $gd_style[] = $c; + } + } + + imagesetstyle($this->_img, $gd_style); + $c = IMG_COLOR_STYLED; + } + + imagesetthickness($this->_img, $width); + + imagerectangle($this->_img, $x1, $y1, $x1 + $w, $y1 + $h, $c); + + } + + /** + * Draws a filled rectangle at x1,y1 with width w and height h + * + * See {@link Style::munge_color()} for the format of the color array. + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + * @param array $color + */ + function filled_rectangle($x1, $y1, $w, $h, $color) { + + // Scale by the AA factor + $x1 *= $this->_aa_factor; + $y1 *= $this->_aa_factor; + $w *= $this->_aa_factor; + $h *= $this->_aa_factor; + + $c = $this->_allocate_color($color); + + imagefilledrectangle($this->_img, $x1, $y1, $x1 + $w, $y1 + $h, $c); + + } + + /** + * Starts a clipping rectangle at x1,y1 with width w and height h + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + */ + function clipping_rectangle($x1, $y1, $w, $h) { + // @todo + } + + /** + * Ends the last clipping shape + */ + function clipping_end() { + // @todo + } + + function save() { + // @todo + } + + function restore() { + // @todo + } + + function rotate($angle, $x, $y) { + // @todo + } + + function skew($angle_x, $angle_y, $x, $y) { + // @todo + } + + function scale($s_x, $s_y, $x, $y) { + // @todo + } + + function translate($t_x, $t_y) { + // @todo + } + + function transform($a, $b, $c, $d, $e, $f) { + // @todo + } + + /** + * Draws a polygon + * + * The polygon is formed by joining all the points stored in the $points + * array. $points has the following structure: + * + * array(0 => x1, + * 1 => y1, + * 2 => x2, + * 3 => y2, + * ... + * ); + * + * + * See {@link Style::munge_color()} for the format of the color array. + * See {@link Cpdf::setLineStyle()} for a description of the $style + * parameter (aka dash) + * + * @param array $points + * @param array $color + * @param float $width + * @param array $style + * @param bool $fill Fills the polygon if true + */ + function polygon($points, $color, $width = null, $style = null, $fill = false) { + + // Scale each point by the AA factor + foreach (array_keys($points) as $i) + $points[$i] *= $this->_aa_factor; + + $c = $this->_allocate_color($color); + + // Convert the style array if required + if ( !is_null($style) && !$fill ) { + $gd_style = array(); + + foreach ($style as $length) { + for ($i = 0; $i < $length; $i++) { + $gd_style[] = $c; + } + } + + imagesetstyle($this->_img, $gd_style); + $c = IMG_COLOR_STYLED; + } + + imagesetthickness($this->_img, $width); + + if ( $fill ) + imagefilledpolygon($this->_img, $points, count($points) / 2, $c); + else + imagepolygon($this->_img, $points, count($points) / 2, $c); + + } + + /** + * Draws a circle at $x,$y with radius $r + * + * See {@link Style::munge_color()} for the format of the color array. + * See {@link Cpdf::setLineStyle()} for a description of the $style + * parameter (aka dash) + * + * @param float $x + * @param float $y + * @param float $r + * @param array $color + * @param float $width + * @param array $style + * @param bool $fill Fills the circle if true + */ + function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false) { + + // Scale by the AA factor + $x *= $this->_aa_factor; + $y *= $this->_aa_factor; + $r *= $this->_aa_factor; + + $c = $this->_allocate_color($color); + + // Convert the style array if required + if ( !is_null($style) && !$fill ) { + $gd_style = array(); + + foreach ($style as $length) { + for ($i = 0; $i < $length; $i++) { + $gd_style[] = $c; + } + } + + imagesetstyle($this->_img, $gd_style); + $c = IMG_COLOR_STYLED; + } + + imagesetthickness($this->_img, $width); + + if ( $fill ) + imagefilledellipse($this->_img, $x, $y, $r, $r, $c); + else + imageellipse($this->_img, $x, $y, $r, $r, $c); + + } + + /** + * Add an image to the pdf. + * + * The image is placed at the specified x and y coordinates with the + * given width and height. + * + * @param string $img_url the path to the image + * @param string $img_type the type (e.g. extension) of the image + * @param float $x x position + * @param float $y y position + * @param int $w width (in pixels) + * @param int $h height (in pixels) + */ + function image($img_url, $img_type, $x, $y, $w, $h) { + + switch ($img_type) { + case "png": + $src = @imagecreatefrompng($img_url); + break; + + case "gif": + $src = @imagecreatefromgif($img_url); + break; + + case "bmp": + $src = @imagecreatefrombmp($img_url); + break; + + case "jpg": + case "jpeg": + $src = @imagecreatefromjpeg($img_url); + break; + + default: + break; + + } + + if ( !$src ) + return; // Probably should add to $_dompdf_errors or whatever here + + // Scale by the AA factor + $x *= $this->_aa_factor; + $y *= $this->_aa_factor; + + $w *= $this->_aa_factor; + $h *= $this->_aa_factor; + + $img_w = imagesx($src); + $img_h = imagesy($src); + + + imagecopyresampled($this->_img, $src, $x, $y, 0, 0, $w, $h, $img_w, $img_h); + + } + + /** + * Writes text at the specified x and y coordinates + * + * See {@link Style::munge_color()} for the format of the color array. + * + * @param float $x + * @param float $y + * @param string $text the text to write + * @param string $font the font file to use + * @param float $size the font size, in points + * @param array $color + * @param float $adjust word spacing adjustment + * @param float $angle Text angle + */ + function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_spacing = 0, $char_spacing = 0, $angle = 0) { + + // Scale by the AA factor + $x *= $this->_aa_factor; + $y *= $this->_aa_factor; + $size *= $this->_aa_factor; + + $h = $this->get_font_height($font, $size); + $c = $this->_allocate_color($color); + + $text = mb_encode_numericentity($text, array(0x0080, 0xff, 0, 0xff), 'UTF-8'); + + if ( strpos($font, '.ttf') === false ) + $font .= ".ttf"; + + // FIXME: word spacing + @imagettftext($this->_img, $size, $angle, $x, $y + $h, $c, $font, $text); + + } + + function javascript($code) { + // Not implemented + } + + /** + * Add a named destination (similar to ... in html) + * + * @param string $anchorname The name of the named destination + */ + function add_named_dest($anchorname) { + // Not implemented + } + + /** + * Add a link to the pdf + * + * @param string $url The url to link to + * @param float $x The x position of the link + * @param float $y The y position of the link + * @param float $width The width of the link + * @param float $height The height of the link + */ + function add_link($url, $x, $y, $width, $height) { + // Not implemented + } + + /** + * Add meta information to the PDF + * + * @param string $label label of the value (Creator, Producer, etc.) + * @param string $value the text to set + */ + function add_info($label, $value) { + // N/A + } + + /** + * Calculates text size, in points + * + * @param string $text the text to be sized + * @param string $font the desired font + * @param float $size the desired font size + * @param float $spacing word spacing, if any + * @return float + */ + function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0) { + + if ( strpos($font, '.ttf') === false ) + $font .= ".ttf"; + + $text = mb_encode_numericentity($text, array(0x0080, 0xffff, 0, 0xffff), 'UTF-8'); + + // FIXME: word spacing + list($x1,,$x2) = @imagettfbbox($size, 0, $font, $text); + return $x2 - $x1; + } + + /** + * Calculates font height, in points + * + * @param string $font + * @param float $size + * @return float + */ + function get_font_height($font, $size) { + if ( strpos($font, '.ttf') === false ) + $font .= ".ttf"; + + // FIXME: word spacing + list(,$y2,,,,$y1) = imagettfbbox($size, 0, $font, "MXjpqytfhl"); // Test string with ascenders, descenders and caps + return ($y2 - $y1) * DOMPDF_FONT_HEIGHT_RATIO; + } + + + /** + * Starts a new page + * + * Subsequent drawing operations will appear on the new page. + */ + function new_page() { + $this->_page_number++; + $this->_page_count++; + } + + function open_object(){ + // N/A + } + + function close_object(){ + // N/A + } + + function add_object(){ + // N/A + } + + function page_text(){ + // N/A + } + + /** + * Streams the image directly to the browser + * + * @param string $filename the name of the image file (ignored) + * @param array $options associative array, 'type' => jpeg|jpg|png, 'quality' => 0 - 100 (jpeg only) + */ + function stream($filename, $options = null) { + + // Perform any antialiasing + if ( $this->_aa_factor != 1 ) { + $dst_w = $this->_width / $this->_aa_factor; + $dst_h = $this->_height / $this->_aa_factor; + $dst = imagecreatetruecolor($dst_w, $dst_h); + imagecopyresampled($dst, $this->_img, 0, 0, 0, 0, + $dst_w, $dst_h, + $this->_width, $this->_height); + } else { + $dst = $this->_img; + } + + if ( !isset($options["type"]) ) + $options["type"] = "png"; + + $type = strtolower($options["type"]); + + header("Cache-Control: private"); + + switch ($type) { + + case "jpg": + case "jpeg": + if ( !isset($options["quality"]) ) + $options["quality"] = 75; + + header("Content-type: image/jpeg"); + imagejpeg($dst, '', $options["quality"]); + break; + + case "png": + default: + header("Content-type: image/png"); + imagepng($dst); + break; + } + + if ( $this->_aa_factor != 1 ) + imagedestroy($dst); + } + + /** + * Returns the PNG as a string + * + * @param array $options associative array, 'type' => jpeg|jpg|png, 'quality' => 0 - 100 (jpeg only) + * @return string + */ + function output($options = null) { + + if ( $this->_aa_factor != 1 ) { + $dst_w = $this->_width / $this->_aa_factor; + $dst_h = $this->_height / $this->_aa_factor; + $dst = imagecreatetruecolor($dst_w, $dst_h); + imagecopyresampled($dst, $this->_img, 0, 0, 0, 0, + $dst_w, $dst_h, + $this->_width, $this->_height); + } else { + $dst = $this->_img; + } + + if ( !isset($options["type"]) ) + $options["type"] = "png"; + + $type = $options["type"]; + + ob_start(); + + switch ($type) { + + case "jpg": + case "jpeg": + if ( !isset($options["quality"]) ) + $options["quality"] = 75; + + imagejpeg($dst, '', $options["quality"]); + break; + + case "png": + default: + imagepng($dst); + break; + } + + $image = ob_get_clean(); + + if ( $this->_aa_factor != 1 ) + imagedestroy($dst); + + return $image; + } + + +} diff --git a/application/third_party/dompdf/include/image_cache.cls.php b/application/third_party/dompdf/include/image_cache.cls.php new file mode 100755 index 00000000..46dc0c66 --- /dev/null +++ b/application/third_party/dompdf/include/image_cache.cls.php @@ -0,0 +1,231 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - On getting type of images don't require any file endings + * and don't strip off url parameters, + * to allowing dynamically generated sites with image id + * in url parameters and not at end of url or missing file extension + * @contributor Helmut Tischer + * @version dompdf_trunk_with_helmut_mods.20090524 + * - Made debug messages more individually configurable + * @version 20090622 + * - don't cache broken image, but refer to original broken image replacement + */ + +/* $Id: image_cache.cls.php 354 2011-01-24 21:59:54Z fabien.menager $ */ + +/** + * Static class that resolves image urls and downloads and caches + * remote images if required. + * + * @access private + * @package dompdf + */ +class Image_Cache { + + /** + * Array of downloaded images. Cached so that identical images are + * not needlessly downloaded. + * + * @var array + */ + static protected $_cache = array(); + + + /** + * Resolve and fetch an image for use. + * + * @param string $url The url of the image + * @param string $proto Default protocol if none specified in $url + * @param string $host Default host if none specified in $url + * @param string $base_path Default path if none specified in $url + * @return array An array with two elements: The local path to the image and the image extension + */ + static function resolve_url($url, $proto, $host, $base_path) { + global $_dompdf_warnings; + + $parsed_url = explode_url($url); + + $DEBUGPNG=DEBUGPNG; //=DEBUGPNG; Allow override of global setting for ad hoc debug + $full_url_dbg = ''; + + //debugpng + if ($DEBUGPNG) print 'resolve_url('.$url.','.$proto.','.$host.','.$base_path.')('.$parsed_url['protocol'].')'; + + $remote = ($proto != "" && $proto !== "file://"); + $remote = $remote || ($parsed_url['protocol'] != ""); + + $datauri = strpos($parsed_url['protocol'], "data:") === 0; + + if ( !DOMPDF_ENABLE_REMOTE && $remote && !$datauri ) { + $resolved_url = DOMPDF_LIB_DIR . "/res/broken_image.png"; + $ext = "png"; + + //debugpng + if ($DEBUGPNG) $full_url_dbg = '(blockedremote)'; + + } + else if ( DOMPDF_ENABLE_REMOTE && $remote || $datauri ) { + // Download remote files to a temporary directory + $full_url = build_url($proto, $host, $base_path, $url); + + if ( isset(self::$_cache[$full_url]) ) { + list($resolved_url,$ext) = self::$_cache[$full_url]; + + //debugpng + if ($DEBUGPNG) $full_url_dbg = $full_url.'(cache)'; + + } else { + + $resolved_url = tempnam(DOMPDF_TEMP_DIR, "ca_dompdf_img_"); + //debugpng + if ($DEBUGPNG) echo $resolved_url . "\n"; + + if ($datauri) { + if ($parsed_data_uri = parse_data_uri($url)) { + $image = $parsed_data_uri['data']; + list(, $ext) = explode('/', $parsed_data_uri['mime'], 2); + } + } + else { + $old_err = set_error_handler("record_warnings"); + $image = file_get_contents($full_url); + restore_error_handler(); + } + + if ( strlen($image) == 0 ) { + //target image not found + $resolved_url = DOMPDF_LIB_DIR . "/res/broken_image.png"; + $ext = "png"; + + //debugpng + if ($DEBUGPNG) $full_url_dbg = $full_url.'(missing)'; + + } else { + + file_put_contents($resolved_url, $image); + + //e.g. fetch.php?media=url.jpg&cache=1 + //- Image file name might be one of the dynamic parts of the url, don't strip off! + // if ( preg_match("/.*\.(\w+)/",$url,$match) ) $ext = $match[1]; + //- a remote url does not need to have a file extension at all + //- local cached file does not have a matching file extension + //Therefore get image type from the content + + $imagedim = dompdf_getimagesize($resolved_url); + + if( $imagedim[0] && $imagedim[1] && + in_array($imagedim[2], array(IMAGETYPE_GIF, IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_BMP)) ) { + //target image is valid + + $imagetypes = array('','gif','jpeg','png','swf','psd','bmp'); + $ext = $imagetypes[$imagedim[2]]; + if ( rename($resolved_url,$resolved_url.'.'.$ext) ) { + $resolved_url .= '.'.$ext; + } + + //Don't put replacement image into cache - otherwise it will be deleted on cache cleanup. + //Only execute on successfull caching of remote image. + self::$_cache[$full_url] = array($resolved_url,$ext); + + } else { + //target image is not valid. + unlink($resolved_url); + + $resolved_url = DOMPDF_LIB_DIR . "/res/broken_image.png"; + $ext = "png"; + } + } + + } + + } else { + + $resolved_url = build_url($proto, $host, $base_path, $url); + if ($DEBUGPNG) print 'build_url('.$proto.','.$host.','.$base_path.','.$url.')('.$resolved_url.')'; + + if ( !preg_match("/.*\.(\w+)/",$url,$match) ) { + //debugpng + if ($DEBUGPNG) print '[resolve_url exception '.$url.']'; + throw new DOMPDF_Exception("Unknown image type: $url."); + } + + $ext = $match[1]; + + //debugpng + if ($DEBUGPNG) $full_url_dbg = '(local)'; + + } + + if ( !is_readable($resolved_url) || !filesize($resolved_url) ) { + + //debugpng + if ($DEBUGPNG) $full_url_dbg .= '(nocache'.$resolved_url.')'; + + $_dompdf_warnings[] = "File " .$resolved_url . " is not readable or is an empty file.\n"; + $resolved_url = DOMPDF_LIB_DIR . "/res/broken_image.png"; + $ext = "png"; + } + + //debugpng + if ($DEBUGPNG) print '[resolve_url '.$url.'|'.$full_url_dbg.'|'.$resolved_url.'|'.$ext.']'; + + return array($resolved_url, $ext); + } + + /** + * Unlink all cached images (i.e. temporary images either downloaded + * or converted) + */ + static function clear() { + if ( count(self::$_cache) ) { + while ($entry = array_shift(self::$_cache)) { + list($file, $ext) = $entry; + //debugpng + if (DEBUGPNG) print '[clear unlink '.$file.']'; + if (!DEBUGKEEPTEMP) + //XXX: Should we have some kind of fallback or warning if unlink() fails? + unlink($file); + } + } + } + +} diff --git a/application/third_party/dompdf/include/image_frame_decorator.cls.php b/application/third_party/dompdf/include/image_frame_decorator.cls.php new file mode 100755 index 00000000..e81a4cfd --- /dev/null +++ b/application/third_party/dompdf/include/image_frame_decorator.cls.php @@ -0,0 +1,116 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - add optional debug output + */ + +/* $Id: image_frame_decorator.cls.php 283 2010-07-19 17:57:40Z fabien.menager $ */ + +/** + * Decorates frames for image layout and rendering + * + * @access private + * @package dompdf + */ +class Image_Frame_Decorator extends Frame_Decorator { + + /** + * The path to the image file (note that remote images are + * downloaded locally to DOMPDF_TEMP_DIR). + * + * @var string + */ + protected $_image_url; + + /** + * The image's file extension (i.e. png, jpeg, gif) + * + * @var string + */ + protected $_image_ext; + + /** + * Class constructor + * + * @param Frame $frame the frame to decorate + * @param DOMPDF $dompdf the document's dompdf object (required to resolve relative & remote urls) + */ + function __construct(Frame $frame, DOMPDF $dompdf) { + global $_dompdf_warnings; + + parent::__construct($frame, $dompdf); + $url = $frame->get_node()->getAttribute("src"); + + //debugpng + if (DEBUGPNG) print '[__construct '.$url.']'; + + list($this->_image_url, $this->_image_ext) = Image_Cache::resolve_url($url, + $dompdf->get_protocol(), + $dompdf->get_host(), + $dompdf->get_base_path()); + + if ( strrpos( $this->_image_url, DOMPDF_LIB_DIR . "/res/broken_image.png", 0) !== false && + $alt = $frame->get_node()->getAttribute("alt") ) { + $style = $frame->get_style(); + $style->width = (4/3)*Font_Metrics::get_text_width($alt, $style->font_family, $style->font_size, $style->word_spacing); + $style->height = Font_Metrics::get_font_height($style->font_family, $style->font_size); + } + } + + /** + * Return the image's url + * + * @return string The url of this image + */ + function get_image_url() { + return $this->_image_url; + } + + /** + * Return the image's file extension + * + * @return string The image's file extension + */ + function get_image_ext() { + return $this->_image_ext; + } + +} diff --git a/application/third_party/dompdf/include/image_frame_reflower.cls.php b/application/third_party/dompdf/include/image_frame_reflower.cls.php new file mode 100755 index 00000000..153fa3e5 --- /dev/null +++ b/application/third_party/dompdf/include/image_frame_reflower.cls.php @@ -0,0 +1,162 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - Fix image size as percent of wrapping box + * - Fix arithmetic rounding of image size + * - Time consuming additional image file scan only when really needed + */ + +/* $Id: image_frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Image reflower class + * + * @access private + * @package dompdf + */ +class Image_Frame_Reflower extends Frame_Reflower { + + function __construct(Image_Frame_Decorator $frame) { + parent::__construct($frame); + } + + function reflow(Frame_Decorator $block = null) { + $this->_frame->position(); + + //FLOAT + //$frame = $this->_frame; + //$page = $frame->get_root(); + //if (DOMPDF_ENABLE_CSS_FLOAT && $frame->get_style()->float !== "none" ) { + // $page->add_floating_frame($this); + //} + // Set the frame's width + $this->get_min_max_width(); + + if ( $block ) { + $block->add_frame_to_line($this->_frame); + } + } + + function get_min_max_width() { + if (DEBUGPNG) { + // Determine the image's size. Time consuming. Only when really needed? + list($img_width, $img_height) = dompdf_getimagesize($this->_frame->get_image_url()); + print "get_min_max_width() ". + $this->_frame->get_style()->width.' '. + $this->_frame->get_style()->height.';'. + $this->_frame->get_parent()->get_style()->width." ". + $this->_frame->get_parent()->get_style()->height.";". + $this->_frame->get_parent()->get_parent()->get_style()->width.' '. + $this->_frame->get_parent()->get_parent()->get_style()->height.';'. + $img_width. ' '. + $img_height.'|' ; + } + + $style = $this->_frame->get_style(); + + //own style auto or invalid value: use natural size in px + //own style value: ignore suffix text including unit, use given number as px + //own style %: walk up parent chain until found available space in pt; fill available space + // + //special ignored unit: e.g. 10ex: e treated as exponent; x ignored; 10e completely invalid ->like auto + + $width = ($style->width > 0 ? $style->width : 0); + if ( is_percent($width) ) { + $t = 0.0; + for ($f = $this->_frame->get_parent(); $f; $f = $f->get_parent()) { + $t = (float)($f->get_style()->width); //always in pt + if ((float)$t != 0) { + break; + } + } + $width = ((float)rtrim($width,"%") * $t)/100; //maybe 0 + } elseif ( !mb_strpos($width, 'pt') ) { + // Don't set image original size if "%" branch was 0 or size not given. + // Otherwise aspect changed on %/auto combination for width/height + // Resample according to px per inch + // See also List_Bullet_Image_Frame_Decorator::__construct + $width = (float)($width * 72) / DOMPDF_DPI; + } + + $height = ($style->height > 0 ? $style->height : 0); + if ( is_percent($height) ) { + $t = 0.0; + for ($f = $this->_frame->get_parent(); $f; $f = $f->get_parent()) { + $t = (float)($f->get_style()->height); //always in pt + if ((float)$t != 0) { + break; + } + } + $height = ((float)rtrim($height,"%") * $t)/100; //maybe 0 + } elseif ( !mb_strpos($height, 'pt') ) { + // Don't set image original size if "%" branch was 0 or size not given. + // Otherwise aspect changed on %/auto combination for width/height + // Resample according to px per inch + // See also List_Bullet_Image_Frame_Decorator::__construct + $height = (float)($height * 72) / DOMPDF_DPI; + } + + if ($width == 0 || $height == 0) { + // Determine the image's size. Time consuming. Only when really needed! + list($img_width, $img_height) = dompdf_getimagesize($this->_frame->get_image_url()); + + // don't treat 0 as error. Can be downscaled or can be catched elsewhere if image not readable. + // Resample according to px per inch + // See also List_Bullet_Image_Frame_Decorator::__construct + if ($width == 0 && $height == 0) { + $width = (float)($img_width * 72) / DOMPDF_DPI; + $height = (float)($img_height * 72) / DOMPDF_DPI; + } elseif ($height == 0 && $width != 0) { + $height = ($width / $img_width) * $img_height; //keep aspect ratio + } elseif ($width == 0 && $height != 0) { + $width = ($height / $img_height) * $img_width; //keep aspect ratio + } + } + + if (DEBUGPNG) print $width.' '.$height.';'; + + $style->width = $width . "pt"; + $style->height = $height . "pt"; + + return array( $width, $width, "min" => $width, "max" => $width); + + } +} diff --git a/application/third_party/dompdf/include/image_renderer.cls.php b/application/third_party/dompdf/include/image_renderer.cls.php new file mode 100755 index 00000000..6fef82ab --- /dev/null +++ b/application/third_party/dompdf/include/image_renderer.cls.php @@ -0,0 +1,95 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: image_renderer.cls.php 325 2010-11-07 18:05:59Z fabien.menager $ */ + +/** + * Image renderer + * + * @access private + * @package dompdf + */ +class Image_Renderer extends Block_Renderer { + + function render(Frame $frame) { + // Render background & borders + $style = $frame->get_style(); + $cb = $frame->get_containing_block(); + list($x, $y, $w, $h) = $frame->get_border_box(); + + $this->_set_opacity( $frame->get_opacity( $style->opacity ) ); + + // Handle the last child + if ( ($bg = $style->background_color) !== "transparent" ) + $this->_canvas->filled_rectangle( $x + $widths[3], $y + $widths[0], $w, $h, $bg); + + if ( ($url = $style->background_image) && $url !== "none" ) + $this->_background_image($url, $x + $widths[3], $y + $widths[0], $w, $h, $style); + + $this->_render_border($frame); + $this->_render_outline($frame); + + list($x, $y) = $frame->get_padding_box(); + $x += $style->length_in_pt($style->padding_left, $cb["w"]); + $y += $style->length_in_pt($style->padding_top, $cb["h"]); + + $w = $style->length_in_pt($style->width, $cb["w"]); + $h = $style->length_in_pt($style->height, $cb["h"]); + + if ( strrpos( $frame->get_image_url(), DOMPDF_LIB_DIR . "/res/broken_image.png", 0) !== false && + $alt = $frame->get_node()->getAttribute("alt") ) { + $font = $style->font_family; + $size = $style->font_size; + $spacing = $style->word_spacing; + $this->_canvas->text($x, $y, $alt, + $font, $size, + $style->color, $spacing); + } + else { + $this->_canvas->image( $frame->get_image_url(), $frame->get_image_ext(), $x, $y, $w, $h); + } + + if (DEBUG_LAYOUT && DEBUG_LAYOUT_BLOCKS) { + $this->_debug_layout($frame->get_border_box(), "blue"); + if (DEBUG_LAYOUT_PADDINGBOX) { + $this->_debug_layout($frame->get_padding_box(), "blue", array(0.5, 0.5)); + } + } + } +} diff --git a/application/third_party/dompdf/include/inline_frame_decorator.cls.php b/application/third_party/dompdf/include/inline_frame_decorator.cls.php new file mode 100755 index 00000000..efd66d05 --- /dev/null +++ b/application/third_party/dompdf/include/inline_frame_decorator.cls.php @@ -0,0 +1,112 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + + * + * Changes + * @contributor Helmut Tischer + * @version 20090610 + * - don't repeat non repeatable background images after a line break + */ + +/* $Id: inline_frame_decorator.cls.php 252 2010-04-19 08:10:45Z flaviencrochard $ */ + +/** + * Decorates frames for inline layout + * + * @access private + * @package dompdf + */ +class Inline_Frame_Decorator extends Frame_Decorator { + + function __construct(Frame $frame, DOMPDF $dompdf) { parent::__construct($frame, $dompdf); } + + function split($frame = null, $force_pagebreak = false) { + + if ( is_null($frame) ) { + $this->get_parent()->split($this, $force_pagebreak); + return; + } + + if ( $frame->get_parent() !== $this ) + throw new DOMPDF_Exception("Unable to split: frame is not a child of this one."); + + $split = $this->copy( $this->_frame->get_node()->cloneNode() ); + $this->get_parent()->insert_child_after($split, $this); + + // Unset the current node's right style properties + $style = $this->_frame->get_style(); + $style->margin_right = "0"; + $style->padding_right = "0"; + $style->border_right_width = "0"; + + // Unset the split node's left style properties since we don't want them + // to propagate + $style = $split->get_style(); + $style->margin_left = "0"; + $style->padding_left = "0"; + $style->border_left_width = "0"; + + //On continuation of inline element on next line, + //don't repeat non-vertically repeatble background images + //See e.g. in testcase image_variants, long desriptions + if ( ($url = $style->background_image) && $url !== "none" + && ($repeat = $style->background_repeat) && $repeat !== "repeat" && $repeat !== "repeat-y" + ) { + $style->background_image = "none"; + } + + // Add $frame and all following siblings to the new split node + $iter = $frame; + while ($iter) { + $frame = $iter; + $iter = $iter->get_next_sibling(); + $frame->reset(); + $split->append_child($frame); + } + + $page_breaks = array("always", "left", "right"); + $frame_style = $frame->get_style(); + if( $force_pagebreak || + in_array($frame_style->page_break_before, $page_breaks) || + in_array($frame_style->page_break_after, $page_breaks) ) { + + $this->get_parent()->split($split, true); + } + } + +} diff --git a/application/third_party/dompdf/include/inline_frame_reflower.cls.php b/application/third_party/dompdf/include/inline_frame_reflower.cls.php new file mode 100755 index 00000000..be2e1759 --- /dev/null +++ b/application/third_party/dompdf/include/inline_frame_reflower.cls.php @@ -0,0 +1,99 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: inline_frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Reflows inline frames + * + * @access private + * @package dompdf + */ +class Inline_Frame_Reflower extends Frame_Reflower { + + function __construct(Frame $frame) { parent::__construct($frame); } + + //........................................................................ + + function reflow(Frame_Decorator $block = null) { + $frame = $this->_frame; + + // Check if a page break is forced + $page = $frame->get_root(); + $page->check_forced_page_break($frame); + + if ( $page->is_full() ) + return; + + $style = $frame->get_style(); + + // Generated content + $this->_set_content(); + + $frame->position(); + + $cb = $frame->get_containing_block(); + + // Add our margin, padding & border to the first and last children + if ( ($f = $frame->get_first_child()) && $f instanceof Text_Frame_Decorator ) { + $f_style = $f->get_style(); + $f_style->margin_left = $style->margin_left; + $f_style->padding_left = $style->padding_left; + $f_style->border_left = $style->border_left; + } + + if ( ($l = $frame->get_last_child()) && $l instanceof Text_Frame_Decorator ) { + $l_style = $l->get_style(); + $l_style->margin_right = $style->margin_right; + $l_style->padding_right = $style->padding_right; + $l_style->border_right = $style->border_right; + } + + if ( $block ) { + $block->add_frame_to_line($this->_frame); + } + + // Set the containing blocks and reflow each child. The containing + // block is not changed by line boxes. + foreach ( $frame->get_children() as $child ) { + $child->set_containing_block($cb); + $child->reflow($block); + } + } +} diff --git a/application/third_party/dompdf/include/inline_positioner.cls.php b/application/third_party/dompdf/include/inline_positioner.cls.php new file mode 100755 index 00000000..79bd776c --- /dev/null +++ b/application/third_party/dompdf/include/inline_positioner.cls.php @@ -0,0 +1,102 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: inline_positioner.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ +/** + * Positions inline frames + * + * @access private + * @package dompdf + */ +class Inline_Positioner extends Positioner { + + function __construct(Frame_Decorator $frame) { parent::__construct($frame); } + + //........................................................................ + + function position() { + // Find our nearest block level parent and access its lines property. + $p = $this->_frame->find_block_parent(); + + // Debugging code: + +// pre_r("\nPositioning:"); +// pre_r("Me: " . $this->_frame->get_node()->nodeName . " (" . spl_object_hash($this->_frame->get_node()) . ")"); +// pre_r("Parent: " . $p->get_node()->nodeName . " (" . spl_object_hash($p->get_node()) . ")"); + + // End debugging + + if ( !$p ) + throw new DOMPDF_Exception("No block-level parent found. Not good."); + + $f = $this->_frame; + + $cb = $f->get_containing_block(); + $style = $f->get_style(); + $line = $p->get_current_line(); + + // Skip the page break if in a fixed position element + $is_fixed = false; + while($f = $f->get_parent()) { + if($f->get_style()->position === "fixed") { + $is_fixed = true; + break; + } + } + + $f = $this->_frame; + + if ( !$is_fixed && $f->get_parent() && + $f->get_parent() instanceof Inline_Frame_Decorator && + $f->get_node()->nodeName === "#text" ) { + + $min_max = $f->get_reflower()->get_min_max_width(); + $initialcb = $f->get_root()->get_containing_block(); + $height = $style->length_in_pt($style->height, $initialcb["h"]); + + // If the frame doesn't fit in the current line, a line break occurs + if ( $min_max["min"] > ($cb["w"]-$line["left"]-$line["w"]-$line["right"]) ) { + $p->add_line(); + } + } + + $this->_frame->set_position($cb["x"] + $line["w"], $line["y"]); + + } +} diff --git a/application/third_party/dompdf/include/inline_renderer.cls.php b/application/third_party/dompdf/include/inline_renderer.cls.php new file mode 100755 index 00000000..131e8439 --- /dev/null +++ b/application/third_party/dompdf/include/inline_renderer.cls.php @@ -0,0 +1,207 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: inline_renderer.cls.php 332 2010-11-27 14:06:34Z fabien.menager $ */ + +/** + * Renders inline frames + * + * @access private + * @package dompdf + */ +class Inline_Renderer extends Abstract_Renderer { + + //........................................................................ + + function render(Frame $frame) { + $style = $frame->get_style(); + + if ( !$frame->get_first_child() ) + return; // No children, no service + + // Draw the left border if applicable + $bp = $style->get_border_properties(); + $widths = array($style->length_in_pt($bp["top"]["width"]), + $style->length_in_pt($bp["right"]["width"]), + $style->length_in_pt($bp["bottom"]["width"]), + $style->length_in_pt($bp["left"]["width"])); + + // Draw the background & border behind each child. To do this we need + // to figure out just how much space each child takes: + list($x, $y) = $frame->get_first_child()->get_position(); + $w = null; + $h = 0; +// $x += $widths[3]; +// $y += $widths[0]; + + $this->_set_opacity( $frame->get_opacity( $style->opacity ) ); + + $first_row = true; + + foreach ($frame->get_children() as $child) { + list($child_x, $child_y, $child_w, $child_h) = $child->get_padding_box(); + + if ( !is_null($w) && $child_x < $x + $w ) { + //This branch seems to be supposed to being called on the first part + //of an inline html element, and the part after the if clause for the + //parts after a line break. + //But because $w initially mostly is 0, and gets updated only on the next + //round, this seem to be never executed and the common close always. + + // The next child is on another line. Draw the background & + // borders on this line. + + // Background: + if ( ($bg = $style->background_color) !== "transparent" ) + $this->_canvas->filled_rectangle( $x, $y, $w, $h, $bg); + + if ( ($url = $style->background_image) && $url !== "none" ) { + $this->_background_image($url, $x, $y, $w, $h, $style); + } + + // If this is the first row, draw the left border + if ( $first_row ) { + + if ( $bp["left"]["style"] !== "none" && $bp["left"]["color"] !== "transparent" && $bp["left"]["width"] > 0 ) { + $method = "_border_" . $bp["left"]["style"]; + $this->$method($x, $y, $h + $widths[0] + $widths[2], $bp["left"]["color"], $widths, "left"); + } + $first_row = false; + } + + // Draw the top & bottom borders + if ( $bp["top"]["style"] !== "none" && $bp["top"]["color"] !== "transparent" && $bp["top"]["width"] > 0 ) { + $method = "_border_" . $bp["top"]["style"]; + $this->$method($x, $y, $w + $widths[1] + $widths[3], $bp["top"]["color"], $widths, "top"); + } + + if ( $bp["bottom"]["style"] !== "none" && $bp["bottom"]["color"] !== "transparent" && $bp["bottom"]["width"] > 0 ) { + $method = "_border_" . $bp["bottom"]["style"]; + $this->$method($x, $y + $h + $widths[0] + $widths[2], $w + $widths[1] + $widths[3], $bp["bottom"]["color"], $widths, "bottom"); + } + + // Handle anchors & links + if ( $frame->get_node()->nodeName === "a" ) { + if ( $href = $frame->get_node()->getAttribute("href") ) + $this->_canvas->add_link($href, $x, $y, $w, $h); + } + + $x = $child_x; + $y = $child_y; + $w = $child_w; + $h = $child_h; + continue; + } + + if ( is_null($w) ) + $w = $child_w; + else + $w += $child_w; + + $h = max($h, $child_h); + } + + + // Handle the last child + if ( ($bg = $style->background_color) !== "transparent" ) + $this->_canvas->filled_rectangle( $x + $widths[3], $y + $widths[0], $w, $h, $bg); + + //On continuation lines (after line break) of inline elements, the style got copied. + //But a non repeatable background image should not be repeated on the next line. + //But removing the background image above has never an effect, and removing it below + //removes it always, even on the initial line. + //Need to handle it elsewhere, e.g. on certain ...clone()... usages. + // Repeat not given: default is Style::__construct + // ... && (!($repeat = $style->background_repeat) || $repeat === "repeat" ... + //different position? $this->_background_image($url, $x, $y, $w, $h, $style); + if ( ($url = $style->background_image) && $url !== "none" ) + $this->_background_image($url, $x + $widths[3], $y + $widths[0], $w, $h, $style); + + // Add the border widths + $w += $widths[1] + $widths[3]; + $h += $widths[0] + $widths[2]; + + // make sure the border and background start inside the left margin + $left_margin = $style->length_in_pt($style->margin_left); + $x += $left_margin; + + // If this is the first row, draw the left border too + if ( $first_row && $bp["left"]["style"] !== "none" && $bp["left"]["color"] !== "transparent" && $widths[3] > 0 ) { + $method = "_border_" . $bp["left"]["style"]; + $this->$method($x, $y, $h, $bp["left"]["color"], $widths, "left"); + } + + // Draw the top & bottom borders + if ( $bp["top"]["style"] !== "none" && $bp["top"]["color"] !== "transparent" && $widths[0] > 0 ) { + $method = "_border_" . $bp["top"]["style"]; + $this->$method($x, $y, $w, $bp["top"]["color"], $widths, "top"); + } + + if ( $bp["bottom"]["style"] !== "none" && $bp["bottom"]["color"] !== "transparent" && $widths[2] > 0 ) { + $method = "_border_" . $bp["bottom"]["style"]; + $this->$method($x, $y + $h, $w, $bp["bottom"]["color"], $widths, "bottom"); + } + + // pre_var_dump(get_class($frame->get_next_sibling())); + // $last_row = get_class($frame->get_next_sibling()) !== 'Inline_Frame_Decorator'; + // Draw the right border if this is the last row + if ( $bp["right"]["style"] !== "none" && $bp["right"]["color"] !== "transparent" && $widths[1] > 0 ) { + $method = "_border_" . $bp["right"]["style"]; + $this->$method($x + $w, $y, $h, $bp["right"]["color"], $widths, "right"); + } + + $node = $frame->get_node(); + + // Handle anchors & links + if ( $node->nodeName === "a" ) { + if ( $name = $node->getAttribute("name") ) + $this->_canvas->add_named_dest($name); + + if ( $href = $node->getAttribute("href") ) + $this->_canvas->add_link($href, $x, $y, $w, $h); + } + + if (DEBUG_LAYOUT && DEBUG_LAYOUT_INLINE) { + $this->_debug_layout($child->get_border_box(), "blue"); + if (DEBUG_LAYOUT_PADDINGBOX) { + $this->_debug_layout($child->get_padding_box(), "blue", array(0.5, 0.5)); + } + } + } +} diff --git a/application/third_party/dompdf/include/javascript_embedder.cls.php b/application/third_party/dompdf/include/javascript_embedder.cls.php new file mode 100755 index 00000000..087f0e5c --- /dev/null +++ b/application/third_party/dompdf/include/javascript_embedder.cls.php @@ -0,0 +1,68 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + */ + +/* $Id: javascript_embedder.cls.php 291 2010-08-02 20:55:23Z fabien.menager $ */ + +/** + * Embeds Javascript into the PDF document + * + * @access private + * @package dompdf + */ +class Javascript_Embedder { + + /** + * @var DOMPDF + */ + protected $_dompdf; + + function __construct(DOMPDF $dompdf) { + $this->_dompdf = $dompdf; + } + + function insert($code) { + $this->_dompdf->get_canvas()->javascript($code); + } + + function render($frame) { + if ( !DOMPDF_ENABLE_JAVASCRIPT ) + return; + + $this->insert($frame->get_node()->nodeValue); + } +} diff --git a/application/third_party/dompdf/include/list_bullet_frame_decorator.cls.php b/application/third_party/dompdf/include/list_bullet_frame_decorator.cls.php new file mode 100755 index 00000000..28210198 --- /dev/null +++ b/application/third_party/dompdf/include/list_bullet_frame_decorator.cls.php @@ -0,0 +1,96 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + + * + * Changes + * @contributor Helmut Tischer + * @version 20090622 + * - bullet size proportional to font size, center position + */ + +/* $Id: list_bullet_frame_decorator.cls.php 325 2010-11-07 18:05:59Z fabien.menager $ */ + +/** + * Decorates frames for list bullet rendering + * + * @access private + * @package dompdf + */ +class List_Bullet_Frame_Decorator extends Frame_Decorator { + + const BULLET_PADDING = 1; // Distance from bullet to text in pt + // As fraction of font size (including descent). See also DECO_THICKNESS. + const BULLET_THICKNESS = 0.04; // Thickness of bullet outline. Screen: 0.08, print: better less, e.g. 0.04 + const BULLET_DESCENT = 0.3; //descent of font below baseline. Todo: Guessed for now. + const BULLET_SIZE = 0.35; // bullet diameter. For now 0.5 of font_size without descent. + + static $BULLET_TYPES = array("disc", "circle", "square"); + + //........................................................................ + + function __construct(Frame $frame, DOMPDF $dompdf) { + parent::__construct($frame, $dompdf); + } + + function get_margin_width() { + $style = $this->_frame->get_style(); + // Small hack to prevent extra indenting of list text on list_style_position === "inside" + // and on suppressed bullet + if ( $style->list_style_position === "outside" || + $style->list_style_type === "none" ) + return 0; + return $style->get_font_size()*self::BULLET_SIZE + 2 * self::BULLET_PADDING; + } + + //hits only on "inset" lists items, to increase height of box + function get_margin_height() { + $style = $this->_frame->get_style(); + if ( $style->list_style_type === 'none' ) return 0; + return $style->get_font_size() * self::BULLET_SIZE + 2 * self::BULLET_PADDING; + } + + function get_width() { + return $this->get_margin_height(); + } + + function get_height() { + return $this->get_margin_height(); + } + + //........................................................................ +} diff --git a/application/third_party/dompdf/include/list_bullet_frame_reflower.cls.php b/application/third_party/dompdf/include/list_bullet_frame_reflower.cls.php new file mode 100755 index 00000000..fcc75e44 --- /dev/null +++ b/application/third_party/dompdf/include/list_bullet_frame_reflower.cls.php @@ -0,0 +1,66 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: list_bullet_frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Reflows list bullets + * + * @access private + * @package dompdf + */ +class List_Bullet_Frame_Reflower extends Frame_Reflower { + + function __construct(Frame_Decorator $frame) { parent::__construct($frame); } + + //........................................................................ + + function reflow(Frame_Decorator $block = null) { + $style = $this->_frame->get_style(); + + $style->width = $this->_frame->get_width(); + $this->_frame->position(); + + if ( $style->list_style_position === "inside" ) { + $p = $this->_frame->find_block_parent(); + $p->add_frame_to_line($this->_frame); + } + + } +} diff --git a/application/third_party/dompdf/include/list_bullet_image_frame_decorator.cls.php b/application/third_party/dompdf/include/list_bullet_image_frame_decorator.cls.php new file mode 100755 index 00000000..cfbeb182 --- /dev/null +++ b/application/third_party/dompdf/include/list_bullet_image_frame_decorator.cls.php @@ -0,0 +1,188 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - added comment + */ + +/* $Id: list_bullet_image_frame_decorator.cls.php 354 2011-01-24 21:59:54Z fabien.menager $ */ + +/** + * Decorates frames for list bullets with custom images + * + * @access private + * @package dompdf + */ +class List_Bullet_Image_Frame_Decorator extends Frame_Decorator { + + /** + * The underlying image frame + * + * @var Image_Frame_Decorator + */ + protected $_img; + + /** + * The image's width in pixels + * + * @var int + */ + protected $_width; + + /** + * The image's height in pixels + * + * @var int + */ + protected $_height; + + /** + * Class constructor + * + * @param Frame $frame the bullet frame to decorate + * @param DOMPDF $dompdf the document's dompdf object + */ + function __construct(Frame $frame, DOMPDF $dompdf) { + $style = $frame->get_style(); + $url = $style->list_style_image; + $frame->get_node()->setAttribute("src", $url); + $this->_img = new Image_Frame_Decorator($frame, $dompdf); + parent::__construct($this->_img, $dompdf); + list($width, $height) = dompdf_getimagesize($this->_img->get_image_url()); + + // Resample the bullet image to be consistent with 'auto' sized images + // See also Image_Frame_Reflower::get_min_max_width + // Tested php ver: value measured in px, suffix "px" not in value: rtrim unnecessary. + $this->_width = (((float)rtrim($width, "px")) * 72) / DOMPDF_DPI; + $this->_height = (((float)rtrim($height, "px")) * 72) / DOMPDF_DPI; + + //If an image is taller as the containing block/box, the box should be extended. + //Neighbour elements are overwriting the overlapping image areas. + //Todo: Where can the box size be extended? + //Code below has no effect. + //See block_frame_reflower _calculate_restricted_height + //See generated_frame_reflower, Dompdf:render() "list-item", "-dompdf-list-bullet"S. + //Leave for now + //if ($style->min_height < $this->_height ) { + // $style->min_height = $this->_height; + //} + //$style->height = "auto"; + } + + /** + * Return the bullet's width + * + * @return int + */ + function get_width() { + //ignore image width, use same width as on predefined bullet List_Bullet_Frame_Decorator + //for proper alignment of bullet image and text. Allow image to not fitting on left border. + //This controls the distance between bullet image and text + //return $this->_width; + return $this->_frame->get_style()->get_font_size()*List_Bullet_Frame_Decorator::BULLET_SIZE + + 2 * List_Bullet_Frame_Decorator::BULLET_PADDING; + } + + /** + * Return the bullet's height + * + * @return int + */ + function get_height() { + //based on image height + return $this->_height; + } + + /** + * Override get_margin_width + * + * @return int + */ + function get_margin_width() { + //ignore image width, use same width as on predefined bullet List_Bullet_Frame_Decorator + //for proper alignment of bullet image and text. Allow image to not fitting on left border. + //This controls the extra indentation of text to make room for the bullet image. + //Here use actual image size, not predefined bullet size + //return $this->_frame->get_style()->get_font_size()*List_Bullet_Frame_Decorator::BULLET_SIZE + + // 2 * List_Bullet_Frame_Decorator::BULLET_PADDING; + + // Small hack to prevent indenting of list text + // Image Might not exist, then position like on list_bullet_frame_decorator fallback to none. + if ( $this->_frame->get_style()->list_style_position === "outside" || + $this->_width == 0) + return 0; + //This aligns the "inside" image position with the text. + //The text starts to the right of the image. + //Between the image and the text there is an added margin of image width. + //Where this comes from is unknown. + //The corresponding List_Bullet_Frame_Decorator sets a smaller margin. bullet size? + return $this->_width + 2 * List_Bullet_Frame_Decorator::BULLET_PADDING; + } + + /** + * Override get_margin_height() + * + * @return int + */ + function get_margin_height() { + //Hits only on "inset" lists items, to increase height of box + //based on image height + return $this->_height + 2 * List_Bullet_Frame_Decorator::BULLET_PADDING; + } + + /** + * Return image url + * + * @return string + */ + function get_image_url() { + return $this->_img->get_image_url(); + } + + /** + * Return the image extension + * + * @return string + */ + function get_image_ext() { + return $this->_img->get_image_ext(); + } + +} diff --git a/application/third_party/dompdf/include/list_bullet_positioner.cls.php b/application/third_party/dompdf/include/list_bullet_positioner.cls.php new file mode 100755 index 00000000..66a5c12f --- /dev/null +++ b/application/third_party/dompdf/include/list_bullet_positioner.cls.php @@ -0,0 +1,111 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + + * + * Changes + * @contributor Helmut Tischer + * @version 20090622 + * - try to adjust top position of bullet to top corner of subsequent font + */ + +/* $Id: list_bullet_positioner.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Positions list bullets + * + * @access private + * @package dompdf + */ +class List_Bullet_Positioner extends Positioner { + + function __construct(Frame_Decorator $frame) { parent::__construct($frame); } + + //........................................................................ + + function position() { + + // Bullets & friends are positioned an absolute distance to the left of + // the content edge of their parent element + $cb = $this->_frame->get_containing_block(); + $style = $this->_frame->get_style(); + + // Note: this differs from most frames in that we must position + // ourselves after determining our width + $x = $cb["x"] - $this->_frame->get_width(); + + $p = $this->_frame->find_block_parent(); + + $y = $p->get_current_line("y"); + + // This is a bit of a hack... + $n = $this->_frame->get_next_sibling(); + if ( $n ) { + $style = $n->get_style(); + $y += $style->length_in_pt( array($style->margin_top, $style->padding_top), + $n->get_containing_block("w") ); + } + + // Now the position is the left top of the block which should be marked with the bullet. + // We tried to find out the y of the start of the first text character within the block. + // But the top margin/padding does not fit, neither from this nor from the next sibling + // The "bit of a hack" above does not work also. + + // Instead let's position the bullet vertically centered to the block which should be marked. + // But for get_next_sibling() the get_containing_block is all zero, and for find_block_parent() + // the get_containing_block is paper width and the entire list as height. + + // if ($p) { + // //$cb = $n->get_containing_block(); + // $cb = $p->get_containing_block(); + // $y += $cb["h"]/2; + // print 'cb:'.$cb["x"].':'.$cb["y"].':'.$cb["w"].':'.$cb["h"].':'; + // } + + // Todo: + // For now give up on the above. Use Guesswork with font y-pos in the middle of the line spacing + + $style = $p->get_style(); + $font_size = $style->get_font_size(); + $line_height = $style->length_in_pt($style->line_height, $font_size); + $y += ($line_height - $font_size) / 2; + + //Position is x-end y-top of character position of the bullet. + $this->_frame->set_position($x, $y); + + } +} diff --git a/application/third_party/dompdf/include/list_bullet_renderer.cls.php b/application/third_party/dompdf/include/list_bullet_renderer.cls.php new file mode 100755 index 00000000..8655ffd6 --- /dev/null +++ b/application/third_party/dompdf/include/list_bullet_renderer.cls.php @@ -0,0 +1,200 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + + * + * Changes + * @contributor Helmut Tischer + * @version 20090622 + * - bullet size proportional to font size, center position + */ + +/* $Id: list_bullet_renderer.cls.php 354 2011-01-24 21:59:54Z fabien.menager $ */ + +/** + * Renders list bullets + * + * @access private + * @package dompdf + */ +class List_Bullet_Renderer extends Abstract_Renderer { + + //........................................................................ + private function make_counter($n, $type, $pad = null){ + $n = intval($n); + $text = ""; + $uppercase = false; + + switch ($type) { + case "decimal-leading-zero": + case "decimal": + case "1": + if ($pad) + $text = str_pad($n, $pad, "0", STR_PAD_LEFT); + else + $text = $n; + break; + + case "upper-alpha": + case "upper-latin": + case "A": + $uppercase = true; + case "lower-alpha": + case "lower-latin": + case "a": + $text = chr( ($n % 26) + ord('a') - 1); + break; + + case "upper-roman": + case "I": + $uppercase = true; + case "lower-roman": + case "i": + $text = dec2roman($n); + break; + + case "lower-greek": + $text = unichr($n + 944); + break; + } + + if ($uppercase) + $text = strtoupper($text); + + return $text."."; + } + + function render(Frame $frame) { + + $style = $frame->get_style(); + $font_size = $style->get_font_size(); + $line_height = $style->length_in_pt($style->line_height, $frame->get_containing_block("w")); + + $this->_set_opacity( $frame->get_opacity( $style->opacity ) ); + + // Handle list-style-image + // If list style image is requested but missing, fall back to predefined types + if ( $style->list_style_image !== "none" && + strcmp($img = $frame->get_image_url(), DOMPDF_LIB_DIR . "/res/broken_image.png") != 0) { + + list($x,$y) = $frame->get_position(); + + //For expected size and aspect, instead of box size, use image natural size scaled to DPI. + // Resample the bullet image to be consistent with 'auto' sized images + // See also Image_Frame_Reflower::get_min_max_width + // Tested php ver: value measured in px, suffix "px" not in value: rtrim unnecessary. + //$w = $frame->get_width(); + //$h = $frame->get_height(); + list($width, $height) = dompdf_getimagesize($img); + $w = (((float)rtrim($width, "px")) * 72) / DOMPDF_DPI; + $h = (((float)rtrim($height, "px")) * 72) / DOMPDF_DPI; + + $x -= $w; + $y -= ($line_height - $font_size)/2; //Reverse hinting of list_bullet_positioner + + $this->_canvas->image( $img, $frame->get_image_ext(), $x, $y, $w, $h); + + } else { + + $bullet_style = $style->list_style_type; + + $fill = false; + + switch ($bullet_style) { + + default: + case "disc": + $fill = true; + + case "circle": + list($x,$y) = $frame->get_position(); + $r = ($font_size*(List_Bullet_Frame_Decorator::BULLET_SIZE /*-List_Bullet_Frame_Decorator::BULLET_THICKNESS*/ ))/2; + $x -= $font_size*(List_Bullet_Frame_Decorator::BULLET_SIZE/2); + $y += ($font_size*(1-List_Bullet_Frame_Decorator::BULLET_DESCENT))/2; + $o = $font_size*List_Bullet_Frame_Decorator::BULLET_THICKNESS; + $this->_canvas->circle($x, $y, $r, $style->color, $o, null, $fill); + break; + + case "square": + list($x, $y) = $frame->get_position(); + $w = $font_size*List_Bullet_Frame_Decorator::BULLET_SIZE; + $x -= $w; + $y += ($font_size*(1-List_Bullet_Frame_Decorator::BULLET_DESCENT-List_Bullet_Frame_Decorator::BULLET_SIZE))/2; + $this->_canvas->filled_rectangle($x, $y, $w, $w, $style->color); + break; + + case "decimal-leading-zero": + case "decimal": + case "lower-alpha": + case "lower-latin": + case "lower-roman": + case "lower-greek": + case "upper-alpha": + case "upper-latin": + case "upper-roman": + case "1": // HTML 4.0 compatibility + case "a": + case "i": + case "A": + case "I": + list($x,$y) = $frame->get_position(); + + $pad = null; + if ( $bullet_style === "decimal-leading-zero" ) { + $pad = strlen($frame->get_parent()->get_parent()->get_node()->getAttribute("dompdf-children-count")); + } + + $index = $frame->get_node()->getAttribute("dompdf-counter"); + $text = $this->make_counter($index, $bullet_style, $pad); + $font_family = $style->font_family; + $spacing = 0; //$frame->get_text_spacing() + $style->word_spacing; + + if ( trim($text) == "" ) + return; + + $x -= Font_Metrics::get_text_width($text, $font_family, $font_size, $spacing); + + $this->_canvas->text($x, $y, $text, + $font_family, $font_size, + $style->color, $spacing); + + case "none": + break; + } + } + } +} diff --git a/application/third_party/dompdf/include/null_frame_decorator.cls.php b/application/third_party/dompdf/include/null_frame_decorator.cls.php new file mode 100755 index 00000000..ff3f955a --- /dev/null +++ b/application/third_party/dompdf/include/null_frame_decorator.cls.php @@ -0,0 +1,59 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: null_frame_decorator.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Dummy decorator + * + * @access private + * @package dompdf + */ +class Null_Frame_Decorator extends Frame_Decorator { + + function __construct(Frame $frame, DOMPDF $dompdf) { + parent::__construct($frame, $dompdf); + $style = $this->_frame->get_style(); + $style->width = 0; + $style->height = 0; + $style->margin = 0; + $style->padding = 0; + } + +} diff --git a/application/third_party/dompdf/include/null_frame_reflower.cls.php b/application/third_party/dompdf/include/null_frame_reflower.cls.php new file mode 100755 index 00000000..6af18ace --- /dev/null +++ b/application/third_party/dompdf/include/null_frame_reflower.cls.php @@ -0,0 +1,54 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: null_frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Dummy reflower + * + * @access private + * @package dompdf + */ +class Null_Frame_Reflower extends Frame_Reflower { + + function __construct(Frame $frame) { parent::__construct($frame); } + + function reflow(Frame_Decorator $block = null) { return; } + +} diff --git a/application/third_party/dompdf/include/null_positioner.cls.php b/application/third_party/dompdf/include/null_positioner.cls.php new file mode 100755 index 00000000..0e79f816 --- /dev/null +++ b/application/third_party/dompdf/include/null_positioner.cls.php @@ -0,0 +1,56 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: null_positioner.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Dummy positioner + * + * @access private + * @package dompdf + */ +class Null_Positioner extends Positioner { + + function __construct(Frame_Decorator $frame) { + parent::__construct($frame); + } + + function position() { return; } + +} diff --git a/application/third_party/dompdf/include/page_cache.cls.php b/application/third_party/dompdf/include/page_cache.cls.php new file mode 100755 index 00000000..a7b7dc87 --- /dev/null +++ b/application/third_party/dompdf/include/page_cache.cls.php @@ -0,0 +1,159 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: page_cache.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Caches individual rendered PDF pages + * + * Not totally implmented yet. Use at your own risk ;) + * + * @access private + * @package dompdf + * @static + */ +class Page_Cache { + + const DB_USER = "dompdf_page_cache"; + const DB_PASS = "some meaningful password"; + const DB_NAME = "dompdf_page_cache"; + + static private $__connection = null; + + function init() { + if ( is_null(self::$__connection) ) { + $con_str = "host=" . DB_HOST . + " dbname=" . self::DB_NAME . + " user=" . self::DB_USER . + " password=" . self::DB_PASS; + + if ( !self::$__connection = pg_connect($con_str) ) + throw new Exception("Database connection failed."); + } + } + + function __construct() { throw new Exception("Can not create instance of Page_Class. Class is static."); } + + private static function __query($sql) { + if ( !($res = pg_query(self::$__connection, $sql)) ) + throw new Exception(pg_last_error(self::$__connection)); + return $res; + } + + static function store_page($id, $page_num, $data) { + $where = "WHERE id='" . pg_escape_string($id) . "' AND ". + "page_num=". pg_escape_string($page_num); + + $res = self::__query("SELECT timestamp FROM page_cache ". $where); + + $row = pg_fetch_assoc($res); + + if ( $row ) + self::__query("UPDATE page_cache SET data='" . pg_escape_string($data) . "' " . $where); + else + self::__query("INSERT INTO page_cache (id, page_num, data) VALUES ('" . pg_escape_string($id) . "', ". + pg_escape_string($page_num) . ", ". + "'". pg_escape_string($data) . "')"); + + } + + static function store_fonts($id, $fonts) { + self::__query("BEGIN"); + // Update the font information + self::__query("DELETE FROM page_fonts WHERE id='" . pg_escape_string($id) . "'"); + + foreach (array_keys($fonts) as $font) + self::__query("INSERT INTO page_fonts (id, font_name) VALUES ('" . + pg_escape_string($id) . "', '" . pg_escape_string($font) . "')"); + self::__query("COMMIT"); + } + +// static function retrieve_page($id, $page_num) { + +// $res = self::__query("SELECT data FROM page_cache WHERE id='" . pg_escape_string($id) . "' AND ". +// "page_num=". pg_escape_string($page_num)); + +// $row = pg_fetch_assoc($res); + +// return pg_unescape_bytea($row["data"]); + +// } + + static function get_page_timestamp($id, $page_num) { + $res = self::__query("SELECT timestamp FROM page_cache WHERE id='" . pg_escape_string($id) . "' AND ". + "page_num=". pg_escape_string($page_num)); + + $row = pg_fetch_assoc($res); + + return $row["timestamp"]; + + } + + // Adds the cached document referenced by $id to the provided pdf + static function insert_cached_document(CPDF_Adapter $pdf, $id, $new_page = true) { + $res = self::__query("SELECT font_name FROM page_fonts WHERE id='" . pg_escape_string($id) . "'"); + + // Ensure that the fonts needed by the cached document are loaded into + // the pdf + while ($row = pg_fetch_assoc($res)) + $pdf->get_cpdf()->selectFont($row["font_name"]); + + $res = self::__query("SELECT data FROM page_cache WHERE id='" . pg_escape_string($id) . "'"); + + if ( $new_page ) + $pdf->new_page(); + + $first = true; + while ($row = pg_fetch_assoc($res)) { + + if ( !$first ) + $pdf->new_page(); + else + $first = false; + + $page = $pdf->reopen_serialized_object($row["data"]); + //$pdf->close_object(); + $pdf->add_object($page, "add"); + + } + + } +} + +Page_Cache::init(); diff --git a/application/third_party/dompdf/include/page_frame_decorator.cls.php b/application/third_party/dompdf/include/page_frame_decorator.cls.php new file mode 100755 index 00000000..eaa823b7 --- /dev/null +++ b/application/third_party/dompdf/include/page_frame_decorator.cls.php @@ -0,0 +1,583 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: page_frame_decorator.cls.php 337 2010-12-01 21:30:27Z fabien.menager $ */ + +/** + * Decorates frames for page layout + * + * @access private + * @package dompdf + */ +class Page_Frame_Decorator extends Frame_Decorator { + + /** + * y value of bottom page margin + * + * @var float + */ + protected $_bottom_page_margin; + + /** + * Flag indicating page is full. + * + * @var bool + */ + protected $_page_full; + + /** + * Number of tables currently being reflowed + * + * @var int + */ + protected $_in_table; + + /** + * The pdf renderer + * + * @var Renderer + */ + protected $_renderer; + + //........................................................................ + + /** + * Class constructor + * + * @param Frame $frame the frame to decorate + */ + function __construct(Frame $frame, DOMPDF $dompdf) { + parent::__construct($frame, $dompdf); + $this->_page_full = false; + $this->_in_table = 0; + $this->_bottom_page_margin = null; + } + + + /** + * Set the renderer used for this pdf + * + * @param Renderer $renderer the renderer to use + */ + function set_renderer($renderer) { + $this->_renderer = $renderer; + } + + /** + * Return the renderer used for this pdf + * + * @return Renderer + */ + function get_renderer() { + return $this->_renderer; + } + + /** + * Set the frame's containing block. Overridden to set $this->_bottom_page_margin. + * + * @param float $x + * @param float $y + * @param float $w + * @param float $h + */ + function set_containing_block($x = null, $y = null, $w = null, $h = null) { + parent::set_containing_block($x,$y,$w,$h); + $w = $this->get_containing_block("w"); + if ( isset($h) ) + $this->_bottom_page_margin = $h; // - $this->_frame->get_style()->length_in_pt($this->_frame->get_style()->margin_bottom, $w); + } + + /** + * Returns true if the page is full and is no longer accepting frames. + * + * @return bool + */ + function is_full() { + return $this->_page_full; + } + + /** + * Start a new page by resetting the full flag. + */ + function next_page() { + $this->_renderer->new_page(); + $this->_page_full = false; + } + + /** + * Indicate to the page that a table is currently being reflowed. + */ + function table_reflow_start() { + $this->_in_table++; + } + + /** + * Indicate to the page that table reflow is finished. + */ + function table_reflow_end() { + $this->_in_table--; + } + + /** + * Return whether we are currently in a nested table or not + * + * @return bool + */ + function in_nested_table() { + return $this->_in_table > 1; + } + + /** + * Check if a forced page break is required before $frame. This uses the + * frame's page_break_before property as well as the preceeding frame's + * page_break_after property. + * + * @link http://www.w3.org/TR/CSS21/page.html#forced + * + * @param Frame $frame the frame to check + * @return bool true if a page break occured + */ + function check_forced_page_break(Frame $frame) { + + // Skip check if page is already split + if ( $this->_page_full ) + return; + + $block_types = array("block", "list-item", "table", "inline"); + $page_breaks = array("always", "left", "right"); + + $style = $frame->get_style(); + + if ( !in_array($style->display, $block_types) ) + return false; + + // Find the previous block-level sibling + $prev = $frame->get_prev_sibling(); + + while ( $prev && !in_array($prev->get_style()->display, $block_types) ) + $prev = $prev->get_prev_sibling(); + + + if ( in_array($style->page_break_before, $page_breaks) ) { + + // Prevent cascading splits + $frame->split(null, true); + // We have to grab the style again here because split() resets + // $frame->style to the frame's orignal style. + $frame->get_style()->page_break_before = "auto"; + $this->_page_full = true; + + return true; + } + + if ( $prev && in_array($prev->get_style()->page_break_after, $page_breaks) ) { + // Prevent cascading splits + $frame->split(null, true); + $prev->get_style()->page_break_after = "auto"; + $this->_page_full = true; + return true; + } + + if( $prev && $prev->get_last_child() && $frame->get_node()->nodeName != "body" ) { + $prev_last_child = $prev->get_last_child(); + if ( in_array($prev_last_child->get_style()->page_break_after, $page_breaks) ) { + $frame->split(null, true); + $prev_last_child->get_style()->page_break_after = "auto"; + $this->_page_full = true; + return true; + } + } + + + return false; + } + + /** + * Determine if a page break is allowed before $frame + * http://www.w3.org/TR/CSS21/page.html#allowed-page-breaks + * + * In the normal flow, page breaks can occur at the following places: + * + * 1. In the vertical margin between block boxes. When a page + * break occurs here, the used values of the relevant + * 'margin-top' and 'margin-bottom' properties are set to '0'. + * 2. Between line boxes inside a block box. + * + * These breaks are subject to the following rules: + * + * * Rule A: Breaking at (1) is allowed only if the + * 'page-break-after' and 'page-break-before' properties of + * all the elements generating boxes that meet at this margin + * allow it, which is when at least one of them has the value + * 'always', 'left', or 'right', or when all of them are + * 'auto'. + * + * * Rule B: However, if all of them are 'auto' and the + * nearest common ancestor of all the elements has a + * 'page-break-inside' value of 'avoid', then breaking here is + * not allowed. + * + * * Rule C: Breaking at (2) is allowed only if the number of + * line boxes between the break and the start of the enclosing + * block box is the value of 'orphans' or more, and the number + * of line boxes between the break and the end of the box is + * the value of 'widows' or more. + * + * * Rule D: In addition, breaking at (2) is allowed only if + * the 'page-break-inside' property is 'auto'. + * + * If the above doesn't provide enough break points to keep + * content from overflowing the page boxes, then rules B and D are + * dropped in order to find additional breakpoints. + * + * If that still does not lead to sufficient break points, rules A + * and C are dropped as well, to find still more break points. + * + * We will also allow breaks between table rows. However, when + * splitting a table, the table headers should carry over to the + * next page (but they don't yet). + * + * @param Frame $frame the frame to check + * @return bool true if a break is allowed, false otherwise + */ + protected function _page_break_allowed(Frame $frame) { + + $block_types = array("block", "list-item", "table", "-dompdf-image"); + dompdf_debug("page-break", "_page_break_allowed(" . $frame->get_node()->nodeName. ")"); + $display = $frame->get_style()->display; + + // Block Frames (1): + if ( in_array($display, $block_types) ) { + + // Avoid breaks within table-cells + if ( $this->_in_table ) { + dompdf_debug("page-break", "In table: " . $this->_in_table); + return false; + } + + // Rules A & B + + if ( $frame->get_style()->page_break_before === "avoid" ) { + dompdf_debug("page-break", "before: avoid"); + return false; + } + + // Find the preceeding block-level sibling + $prev = $frame->get_prev_sibling(); + while ( $prev && !in_array($prev->get_style()->display, $block_types) ) + $prev = $prev->get_prev_sibling(); + + // Does the previous element allow a page break after? + if ( $prev && $prev->get_style()->page_break_after === "avoid" ) { + dompdf_debug("page-break", "after: avoid"); + return false; + } + + // If both $prev & $frame have the same parent, check the parent's + // page_break_inside property. + $parent = $frame->get_parent(); + if ( $prev && $parent && $parent->get_style()->page_break_inside === "avoid" ) { + dompdf_debug("page-break", "parent inside: avoid"); + return false; + } + + // To prevent cascading page breaks when a top-level element has + // page-break-inside: avoid, ensure that at least one frame is + // on the page before splitting. + if ( $parent->get_node()->nodeName === "body" && !$prev ) { + // We are the body's first child + dompdf_debug("page-break", "Body's first child."); + return false; + } + + // If the frame is the first block-level frame, use the value from + // $frame's parent instead. + if ( !$prev && $parent ) + return $this->_page_break_allowed( $parent ); + + dompdf_debug("page-break", "block: break allowed"); + return true; + + } + + // Inline frames (2): + else if ( in_array($display, Style::$INLINE_TYPES) ) { + + // Avoid breaks within table-cells + if ( $this->_in_table ) { + dompdf_debug("page-break", "In table: " . $this->_in_table); + return false; + } + + // Rule C + $block_parent = $frame->find_block_parent(); + if ( count($block_parent->get_lines() ) < $frame->get_style()->orphans ) { + dompdf_debug("page-break", "orphans"); + return false; + } + + // FIXME: Checking widows is tricky without having laid out the + // remaining line boxes. Just ignore it for now... + + // Rule D + $p = $block_parent; + while ($p) { + if ( $p->get_style()->page_break_inside === "avoid" ) { + dompdf_debug("page-break", "parent->inside: avoid"); + return false; + } + $p = $p->find_block_parent(); + } + + // To prevent cascading page breaks when a top-level element has + // page-break-inside: avoid, ensure that at least one frame with + // some content is on the page before splitting. + $prev = $frame->get_prev_sibling(); + while ( $prev && ($prev->get_node()->nodeName === "#text" && trim($prev->get_node()->nodeValue) == "") ) + $prev = $prev->get_prev_sibling(); + + if ( $block_parent->get_node()->nodeName === "body" && !$prev ) { + // We are the body's first child + dompdf_debug("page-break", "Body's first child."); + return false; + } + + // Skip breaks on empty text nodes + if ( $frame->get_node()->nodeName === "#text" && + $frame->get_node()->nodeValue == "" ) + return false; + + dompdf_debug("page-break", "inline: break allowed"); + return true; + + // Table-rows + } else if ( $display === "table-row" ) { + + // Simply check if the parent table's page_break_inside property is + // not 'avoid' + $p = Table_Frame_Decorator::find_parent_table($frame); + + while ($p) { + if ( $p->get_style()->page_break_inside === "avoid" ) { + dompdf_debug("page-break", "parent->inside: avoid"); + return false; + } + $p = $p->find_block_parent(); + } + + // Avoid breaking after the first row of a table + if ( $p && $p->get_first_child() === $frame) { + dompdf_debug("page-break", "table: first-row"); + return false; + } + + // If this is a nested table, prevent the page from breaking + if ( $this->_in_table > 1 ) { + dompdf_debug("page-break", "table: nested table"); + return false; + } + + dompdf_debug("page-break","table-row/row-groups: break allowed"); + return true; + + } else if ( in_array($display, Table_Frame_Decorator::$ROW_GROUPS) ) { + + // Disallow breaks at row-groups: only split at row boundaries + return false; + + } else { + + dompdf_debug("page-break", "? " . $frame->get_style()->display . ""); + return false; + } + + } + + /** + * Check if $frame will fit on the page. If the frame does not fit, + * the frame tree is modified so that a page break occurs in the + * correct location. + * + * @param Frame $frame the frame to check + * @return Frame the frame following the page break + */ + function check_page_break(Frame $frame) { + // Do not split if we have already or if the frame was already + // pushed to the next page (prevents infinite loops) + if ( $this->_page_full || $frame->_already_pushed ) { + return false; + } + + // If the frame is absolute of fixed it shouldn't break + $p = $frame; + do { + if ( in_array($p->get_style()->position, array("fixed", "absolute")) ) + return false; + } while ( $p = $p->get_parent() ); + + $margin_height = $frame->get_margin_height(); + + // FIXME If the row is taller than the page and + // if it the first of the page, we don't break + if ( $frame->get_style()->display === "table-row" && + !$frame->get_prev_sibling() && + $margin_height > $this->get_margin_height() ) + return false; + + // Determine the frame's maximum y value + $max_y = $frame->get_position("y") + $margin_height; + + // If a split is to occur here, then the bottom margins & paddings of all + // parents of $frame must fit on the page as well: + $p = $frame->get_parent(); + while ( $p ) { + $style = $p->get_style(); + $max_y += $style->length_in_pt(array($style->margin_bottom, + $style->padding_bottom, + $style->border_bottom_width)); + $p = $p->get_parent(); + } + + + // Check if $frame flows off the page + if ( $max_y <= $this->_bottom_page_margin ) + // no: do nothing + return false; + + dompdf_debug("page-break", "check_page_break"); + dompdf_debug("page-break", "in_table: " . $this->_in_table); + + // yes: determine page break location + $iter = $frame; + $flg = false; + + $in_table = $this->_in_table; + + dompdf_debug("page-break","Starting search"); + while ( $iter ) { +// echo "\nbacktrack: " .$iter->get_node()->nodeName ." ".spl_object_hash($iter->get_node()). ""; + if ( $iter === $this ) { + dompdf_debug("page-break", "reached root."); + // We've reached the root in our search. Just split at $frame. + break; + } + + if ( $this->_page_break_allowed($iter) ) { + dompdf_debug("page-break","break allowed, splitting."); + $iter->split(null, true); + $this->_page_full = true; + $this->_in_table = $in_table; + $frame->_already_pushed = true; + return true; + } + + if ( !$flg && $next = $iter->get_last_child() ) { + dompdf_debug("page-break", "following last child."); + + if ( in_array($next->get_style()->display, Style::$TABLE_TYPES) ) + $this->_in_table++; + + $iter = $next; + continue; + } + + if ( $next = $iter->get_prev_sibling() ) { + dompdf_debug("page-break", "following prev sibling."); + + if ( in_array($next->get_style()->display, Style::$TABLE_TYPES) && + !in_array($iter->get_style()->display, Style::$TABLE_TYPES) ) + $this->_in_table++; + + else if ( !in_array($next->get_style()->display, Style::$TABLE_TYPES) && + in_array($iter->get_style()->display, Style::$TABLE_TYPES) ) + $this->_in_table--; + + $iter = $next; + $flg = false; + continue; + } + + if ( $next = $iter->get_parent() ) { + dompdf_debug("page-break", "following parent."); + + if ( in_array($iter->get_style()->display, Style::$TABLE_TYPES) ) + $this->_in_table--; + + $iter = $next; + $flg = true; + continue; + } + + break; + } + + $this->_in_table = $in_table; + + // No valid page break found. Just break at $frame. + dompdf_debug("page-break", "no valid break found, just splitting."); + + // If we are in a table, backtrack to the nearest top-level table row + if ( $this->_in_table ) { + $num_tables = $this->_in_table - 1; + + $iter = $frame; + while ( $iter && $num_tables && $iter->get_style->display !== "table" ) { + $iter = $iter->get_parent(); + $num_tables--; + } + + $iter = $frame; + while ($iter && $iter->get_style()->display !== "table-row" ) + $iter = $iter->get_parent(); + } + + $frame->split(null, true); + $this->_page_full = true; + $frame->_already_pushed = true; + return true; + + } + + //........................................................................ + + function split($frame = null, $force_pagebreak = false) { + // Do nothing + } + +} diff --git a/application/third_party/dompdf/include/page_frame_reflower.cls.php b/application/third_party/dompdf/include/page_frame_reflower.cls.php new file mode 100755 index 00000000..249b3435 --- /dev/null +++ b/application/third_party/dompdf/include/page_frame_reflower.cls.php @@ -0,0 +1,245 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: page_frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Reflows pages + * + * @access private + * @package dompdf + */ +class Page_Frame_Reflower extends Frame_Reflower { + + /** + * Cache of the callbacks array + * + * @var array + */ + private $_callbacks; + + /** + * Cache of the canvas + * + * @var Canvas + */ + private $_canvas; + + /** + * This page's floating frames + * + * @var array + */ + private $_floating_frames; + + /** + * true if the page has floating frales + * Used to improve performances as it will + * be accesses everytime + * @var bool + */ + private $_has_floating_frames; + + /** + * The stacking context, containing all z-indexed frames + * @var array + */ + private $_stacking_context = array(); + + function __construct(Page_Frame_Decorator $frame) { parent::__construct($frame); } + + /** + * @return array + */ + function get_floating_frames() { return $this->_floating_frames; } + + /** + * @param $frame Frame + * @return void + */ + function add_frame_to_stacking_context(Frame $frame, $z_index) { + $this->_stacking_context[$z_index][] = $frame; + } + + /** + * Add a floating frame + * + * @param $child Frame + */ + function add_floating_frame(Frame $frame) { + $this->_floating_frames[] = $frame; + $this->_has_floating_frames = true; + } + + /** + * Tells if the page has floating frames + * + * @return bool + */ + function has_floating_frames() { + return $this->_has_floating_frames; + } + + //........................................................................ + + function reflow(Frame_Decorator $block = null) { + $style = $this->_frame->get_style(); + + // Paged layout: + // http://www.w3.org/TR/CSS21/page.html + + // Pages are only concerned with margins + $cb = $this->_frame->get_containing_block(); + $left = $style->length_in_pt($style->margin_left, $cb["w"]); + $right = $style->length_in_pt($style->margin_right, $cb["w"]); + $top = $style->length_in_pt($style->margin_top, $cb["h"]); + $bottom = $style->length_in_pt($style->margin_bottom, $cb["h"]); + + $content_x = $cb["x"] + $left; + $content_y = $cb["y"] + $top; + $content_width = $cb["w"] - $left - $right; + $content_height = $cb["h"] - $top - $bottom; + + $fixed_children = array(); + + $prev_child = null; + $child = $this->_frame->get_first_child(); + $current_page = 0; + + while ($child) { + // Only if it's the first page, we save the nodes with a fixed position + if ($current_page == 0) { + $children = $child->get_children(); + foreach ($children as $onechild) { + if ($onechild->get_style()->position === "fixed") { + $fixed_children[] = $onechild->deep_copy(); + } + } + $fixed_children = array_reverse($fixed_children); + } + + $child->set_containing_block($content_x, $content_y, $content_width, $content_height); + + // Check for begin reflow callback + $this->_check_callbacks("begin_page_reflow", $child); + + //Insert a copy of each node which have a fixed position + if ($current_page >= 1) { + foreach ($fixed_children as $fixed_child) { + $child->insert_child_before($fixed_child->deep_copy(), $child->get_first_child()); + } + } + + $child->reflow(); + $next_child = $child->get_next_sibling(); + + // Check for begin render callback + $this->_check_callbacks("begin_page_render", $child); + + $renderer = $this->_frame->get_renderer(); + + // Render the page + $renderer->render($child); + + // http://www.w3.org/TR/CSS21/visuren.html#z-index + ksort($this->_stacking_context); + + foreach( $this->_stacking_context as $_z_index => $_frames ) { + foreach ( $_frames as $_frame ) { + $renderer->render($_frame); + } + } + + $this->_stacking_context = array(); + + // Check for end render callback + $this->_check_callbacks("end_page_render", $child); + + if ( $next_child ) { + $this->_frame->next_page(); + } + + // Wait to dispose of all frames on the previous page + // so callback will have access to them + if ( $prev_child ) { + $prev_child->dispose(true); + } + $prev_child = $child; + $child = $next_child; + $current_page++; + } + + // Dispose of previous page if it still exists + if ( $prev_child ) { + $prev_child->dispose(true); + } + } + + //........................................................................ + + /** + * Check for callbacks that need to be performed when a given event + * gets triggered on a page + * + * @param string $event the type of event + * @param Frame $frame the frame that event is triggered on + */ + protected function _check_callbacks($event, $frame) { + if (!isset($this->_callbacks)) { + $dompdf = $this->_frame->get_dompdf(); + $this->_callbacks = $dompdf->get_callbacks(); + $this->_canvas = $dompdf->get_canvas(); + } + + if (is_array($this->_callbacks) && isset($this->_callbacks[$event])) { + $info = array(0 => $this->_canvas, "canvas" => $this->_canvas, + 1 => $frame, "frame" => $frame); + $fs = $this->_callbacks[$event]; + foreach ($fs as $f) { + if (is_callable($f)) { + if (is_array($f)) { + $f[0]->$f[1]($info); + } else { + $f($info); + } + } + } + } + } +} diff --git a/application/third_party/dompdf/include/pdflib_adapter.cls.php b/application/third_party/dompdf/include/pdflib_adapter.cls.php new file mode 100755 index 00000000..859b6be9 --- /dev/null +++ b/application/third_party/dompdf/include/pdflib_adapter.cls.php @@ -0,0 +1,1053 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - Clarify temp file name, optional debug output for temp file tracking + */ + +/* $Id: pdflib_adapter.cls.php 355 2011-01-27 07:44:54Z fabien.menager $ */ + +/** + * PDF rendering interface + * + * PDFLib_Adapter provides a simple, stateless interface to the one + * provided by PDFLib. + * + * Unless otherwise mentioned, all dimensions are in points (1/72 in). + * The coordinate origin is in the top left corner and y values + * increase downwards. + * + * See {@link http://www.pdflib.com/} for more complete documentation + * on the underlying PDFlib functions. + * + * @package dompdf + */ +class PDFLib_Adapter implements Canvas { + + /** + * Dimensions of paper sizes in points + * + * @var array; + */ + static public $PAPER_SIZES = array(); // Set to + // CPDF_Adapter::$PAPER_SIZES below. + + /** + * Whether to create PDFs in memory or on disk + * + * @var bool + */ + static $IN_MEMORY = true; + + /** + * Instance of PDFLib class + * + * @var PDFlib + */ + private $_pdf; + + /** + * Name of temporary file used for PDFs created on disk + * + * @var string + */ + private $_file; + + /** + * PDF width, in points + * + * @var float + */ + private $_width; + + /** + * PDF height, in points + * + * @var height + */ + private $_height; + + /** + * Last fill colour used + * + * @var array + */ + private $_last_fill_color; + + /** + * Last stroke colour used + * + * @var array + */ + private $_last_stroke_color; + + /** + * Cache of image handles + * + * @var array + */ + private $_imgs; + + /** + * Cache of font handles + * + * @var array + */ + private $_fonts; + + /** + * List of objects (templates) to add to multiple pages + * + * @var array + */ + private $_objs; + + /** + * Current page number + * + * @var int + */ + private $_page_number; + + /** + * Total number of pages + * + * @var int + */ + private $_page_count; + + /** + * Text to display on every page + * + * @var array + */ + private $_page_text; + + /** + * Array of pages for accesing after rendering is initially complete + * + * @var array + */ + private $_pages; + + /** + * Class constructor + * + * @param mixed $paper The size of paper to use either a string (see {@link CPDF_Adapter::$PAPER_SIZES}) or + * an array(xmin,ymin,xmax,ymax) + * @param string $orientation The orientation of the document (either 'landscape' or 'portrait') + */ + function __construct($paper = "letter", $orientation = "portrait") { + if ( is_array($paper) ) + $size = $paper; + else if ( isset(self::$PAPER_SIZES[mb_strtolower($paper)]) ) + $size = self::$PAPER_SIZES[mb_strtolower($paper)]; + else + $size = self::$PAPER_SIZES["letter"]; + + if ( mb_strtolower($orientation) === "landscape" ) { + list($size[2], $size[3]) = array($size[3], $size[2]); + } + + $this->_width = $size[2] - $size[0]; + $this->_height= $size[3] - $size[1]; + + $this->_pdf = new PDFLib(); + + if ( defined("DOMPDF_PDFLIB_LICENSE") ) + $this->_pdf->set_parameter( "license", DOMPDF_PDFLIB_LICENSE); + + $this->_pdf->set_parameter("textformat", "utf8"); + $this->_pdf->set_parameter("fontwarning", "false"); + + $this->_pdf->set_info("Creator", "DOMPDF"); + + // Silence pedantic warnings about missing TZ settings + $tz = @date_default_timezone_get(); + date_default_timezone_set("UTC"); + $this->_pdf->set_info("Date", date("Y-m-d")); + date_default_timezone_set($tz); + + if ( self::$IN_MEMORY ) + $this->_pdf->begin_document("",""); + else { + $this->_file = tempnam(DOMPDF_TEMP_DIR, "libdompdf_pdf_").'.pdf'; + $this->_pdf->begin_document($this->_file,""); + } + + $this->_pdf->begin_page_ext($this->_width, $this->_height, ""); + + $this->_page_number = $this->_page_count = 1; + $this->_page_text = array(); + + $this->_imgs = array(); + $this->_fonts = array(); + $this->_objs = array(); + + // Set up font paths + $families = Font_Metrics::get_font_families(); + foreach ($families as $family => $files) { + foreach ($files as $style => $file) { + $face = basename($file); + + // Prefer ttfs to afms + if ( file_exists("$file.ttf") ) { + $outline = "$file.ttf"; + $afm = null; + + } else if ( file_exists("$file.TTF") ) { + $outline = "$file.TTF"; + $afm = null; + + } else if ( file_exists("$file.pfb") ) { + $outline = "$file.pfb"; + + if ( file_exists("$file.afm") ) + $afm = "$file.afm"; + + } else if ( file_exists("$file.PFB") ) { + $outline = "$file.PFB"; + if ( file_exists("$file.AFM") ) + $afm = "$file.AFM"; + } else + continue; + + $this->_pdf->set_parameter("FontOutline", "\{$face\}=\{$outline\}"); + if ( !is_null($afm) ) + $this->_pdf->set_parameter("FontAFM", "\{$face\}=\{$afm\}"); + } + } + } + + /** + * Close the pdf + */ + protected function _close() { + $this->_place_objects(); + + // Close all pages + $this->_pdf->suspend_page(""); + for ($p = 1; $p <= $this->_page_count; $p++) { + $this->_pdf->resume_page("pagenumber=$p"); + $this->_pdf->end_page_ext(""); + } + + $this->_pdf->end_document(""); + } + + + /** + * Returns the PDFLib instance + * + * @return PDFLib + */ + function get_pdflib() { return $this->_pdf; } + + /** + * Add meta information to the PDF + * + * @param string $label label of the value (Creator, Producter, etc.) + * @param string $value the text to set + */ + function add_info($label, $value) { + $this->_pdf->set_info($label, $value); + } + + /** + * Opens a new 'object' (template in PDFLib-speak) + * + * While an object is open, all drawing actions are recorded to the + * object instead of being drawn on the current page. Objects can + * be added later to a specific page or to several pages. + * + * The return value is an integer ID for the new object. + * + * @see PDFLib_Adapter::close_object() + * @see PDFLib_Adapter::add_object() + * + * @return int + */ + function open_object() { + $this->_pdf->suspend_page(""); + $ret = $this->_pdf->begin_template($this->_width, $this->_height); + $this->_pdf->save(); + $this->_objs[$ret] = array("start_page" => $this->_page_number); + return $ret; + } + + /** + * Reopen an existing object (NOT IMPLEMENTED) + * + * PDFLib does not seem to support reopening templates. + * + * @param int $object the ID of a previously opened object + */ + function reopen_object($object) { + throw new DOMPDF_Exception("PDFLib does not support reopening objects."); + } + + /** + * Close the current template + * + * @see PDFLib_Adapter::open_object() + */ + function close_object() { + $this->_pdf->restore(); + $this->_pdf->end_template(); + $this->_pdf->resume_page("pagenumber=".$this->_page_number); + } + + /** + * Adds the specified object to the document + * + * $where can be one of: + * - 'add' add to current page only + * - 'all' add to every page from the current one onwards + * - 'odd' add to all odd numbered pages from now on + * - 'even' add to all even numbered pages from now on + * - 'next' add the object to the next page only + * - 'nextodd' add to all odd numbered pages from the next one + * - 'nexteven' add to all even numbered pages from the next one + * + * @param int $object the object handle returned by open_object() + * @param string $where + */ + function add_object($object, $where = 'all') { + + if ( mb_strpos($where, "next") !== false ) { + $this->_objs[$object]["start_page"]++; + $where = str_replace("next", "", $where); + if ( $where == "" ) + $where = "add"; + } + + $this->_objs[$object]["where"] = $where; + } + + /** + * Stops the specified template from appearing in the document. + * + * The object will stop being displayed on the page following the + * current one. + * + * @param int $object + */ + function stop_object($object) { + + if ( !isset($this->_objs[$object]) ) + return; + + $start = $this->_objs[$object]["start_page"]; + $where = $this->_objs[$object]["where"]; + + // Place the object on this page if required + if ( $this->_page_number >= $start && + (($this->_page_number % 2 == 0 && $where === "even") || + ($this->_page_number % 2 == 1 && $where === "odd") || + ($where === "all")) ) + $this->_pdf->fit_image($object,0,0,""); + + $this->_objs[$object] = null; + unset($this->_objs[$object]); + } + + /** + * Add all active objects to the current page + */ + protected function _place_objects() { + + foreach ( $this->_objs as $obj => $props ) { + $start = $props["start_page"]; + $where = $props["where"]; + + // Place the object on this page if required + if ( $this->_page_number >= $start && + (($this->_page_number % 2 == 0 && $where === "even") || + ($this->_page_number % 2 == 1 && $where === "odd") || + ($where === "all")) ) { + $this->_pdf->fit_image($obj,0,0,""); + } + } + + } + + function get_width() { return $this->_width; } + + function get_height() { return $this->_height; } + + function get_page_number() { return $this->_page_number; } + + function get_page_count() { return $this->_page_count; } + + function set_page_number($num) { $this->_page_number = (int)$num; } + + function set_page_count($count) { $this->_page_count = (int)$count; } + + + /** + * Sets the line style + * + * @param float width + * @param string corner + * @param string join + * @param array dash + */ + protected function _set_line_style($width, $cap, $join, $dash) { + + if ( count($dash) == 1 ) + $dash[] = $dash[0]; + + if ( count($dash) > 1 ) + $this->_pdf->setdashpattern("dasharray={" . implode(" ", $dash) . "}"); + else + $this->_pdf->setdash(0,0); + + switch ( $join ) { + case "miter": + $this->_pdf->setlinejoin(0); + break; + + case "round": + $this->_pdf->setlinejoin(1); + break; + + case "bevel": + $this->_pdf->setlinejoin(2); + break; + + default: + break; + } + + switch ( $cap ) { + case "butt": + $this->_pdf->setlinecap(0); + break; + + case "round": + $this->_pdf->setlinecap(1); + break; + + case "square": + $this->_pdf->setlinecap(2); + break; + + default: + break; + } + + $this->_pdf->setlinewidth($width); + + } + + /** + * Sets the line color + * + * @param array $color array(r,g,b) + */ + protected function _set_stroke_color($color) { + if($this->_last_stroke_color == $color) + return; + + $this->_last_stroke_color = $color; + + if (isset($color[3])) { + $type = "cmyk"; + list($c1, $c2, $c3, $c4) = array($color[0], $color[1], $color[2], $color[3]); + } + elseif (isset($color[2])) { + $type = "rgb"; + list($c1, $c2, $c3, $c4) = array($color[0], $color[1], $color[2], null); + } + else { + $type = "gray"; + list($c1, $c2, $c3, $c4) = array($color[0], $color[1], null, null); + } + + $this->_pdf->setcolor("stroke", $type, $c1, $c2, $c3, $c4); + } + + /** + * Sets the fill color + * + * @param array $color array(r,g,b) + */ + protected function _set_fill_color($color) { + if($this->_last_fill_color == $color) + return; + + $this->_last_fill_color = $color; + + if (isset($color[3])) { + $type = "cmyk"; + list($c1, $c2, $c3, $c4) = array($color[0], $color[1], $color[2], $color[3]); + } + elseif (isset($color[2])) { + $type = "rgb"; + list($c1, $c2, $c3, $c4) = array($color[0], $color[1], $color[2], null); + } + else { + $type = "gray"; + list($c1, $c2, $c3, $c4) = array($color[0], $color[1], null, null); + } + + $this->_pdf->setcolor("fill", $type, $c1, $c2, $c3, $c4); + } + + /** + * Sets the opacity + * + * @param $opacity + * @param $mode + */ + function set_opacity($opacity, $mode = "Normal") { + if ( $mode === "Normal" ) { + $gstate = $this->_pdf->create_gstate("opacityfill=$opacity opacitystroke=$opacity"); + $this->_pdf->set_gstate($gstate); + } + } + + /** + * Loads a specific font and stores the corresponding descriptor. + * + * @param string $font + * @return int the font descriptor for the font + */ + protected function _load_font($font, $encoding = null, $options = "") { + + // Check if the font is a native PDF font + // Embed non-native fonts + $native_fonts = array("courier", "courier-bold", "courier-oblique", "courier-boldoblique", + "helvetica", "helvetica-bold", "helvetica-oblique", "helvetica-boldoblique", + "times-roman", "times-bold", "times-italic", "times-bolditalic", + "symbol", "zapfdinbats"); + + $test = strtolower(basename($font)); + if ( in_array($test, $native_fonts) ) { + $font = basename($font); + + } else { + // Embed non-native fonts + $options .= " embedding=true"; + } + + if ( is_null($encoding) ) { + + // Unicode encoding is only available for the commerical + // version of PDFlib and not PDFlib-Lite + if ( defined("DOMPDF_PDFLIB_LICENSE") ) + $encoding = "unicode"; + else + $encoding = "auto"; + + } + + $key = "$font:$encoding:$options"; + + if ( isset($this->_fonts[$key]) ) + return $this->_fonts[$key]; + + else { + + $this->_fonts[$key] = $this->_pdf->load_font($font, $encoding, $options); + return $this->_fonts[$key]; + + } + + } + + /** + * Remaps y coords from 4th to 1st quadrant + * + * @param float $y + * @return float + */ + protected function y($y) { return $this->_height - $y; } + + //........................................................................ + + function line($x1, $y1, $x2, $y2, $color, $width, $style = null) { + $this->_set_line_style($width, "butt", "", $style); + $this->_set_stroke_color($color); + + $y1 = $this->y($y1); + $y2 = $this->y($y2); + + $this->_pdf->moveto($x1,$y1); + $this->_pdf->lineto($x2, $y2); + $this->_pdf->stroke(); + } + + //........................................................................ + + function rectangle($x1, $y1, $w, $h, $color, $width, $style = null) { + $this->_set_stroke_color($color); + $this->_set_line_style($width, "butt", "", $style); + + $y1 = $this->y($y1) - $h; + + $this->_pdf->rect($x1, $y1, $w, $h); + $this->_pdf->stroke(); + } + + //........................................................................ + + function filled_rectangle($x1, $y1, $w, $h, $color) { + $this->_set_fill_color($color); + + $y1 = $this->y($y1) - $h; + + $this->_pdf->rect(floatval($x1), floatval($y1), floatval($w), floatval($h)); + $this->_pdf->fill(); + } + + function clipping_rectangle($x1, $y1, $w, $h) { + $this->_pdf->save(); + + $y1 = $this->y($y1) - $h; + + $this->_pdf->rect(floatval($x1), floatval($y1), floatval($w), floatval($h)); + $this->_pdf->clip(); + } + + function clipping_end() { + $this->_pdf->restore(); + } + + function save() { + $this->_pdf->save(); + } + + function restore() { + $this->_pdf->restore(); + } + + function rotate($angle, $x, $y) { + $pdf = $this->_pdf; + $pdf->translate($x, $this->_height-$y); + $pdf->rotate(-$angle); + $pdf->translate(-$x, -$this->_height+$y); + } + + function skew($angle_x, $angle_y, $x, $y) { + $pdf = $this->_pdf; + $pdf->translate($x, $this->_height-$y); + $pdf->skew($angle_y, $angle_x); // Needs to be inverted + $pdf->translate(-$x, -$this->_height+$y); + } + + function scale($s_x, $s_y, $x, $y) { + $pdf = $this->_pdf; + $pdf->translate($x, $this->_height-$y); + $pdf->scale($s_x, $s_y); + $pdf->translate(-$x, -$this->_height+$y); + } + + function translate($t_x, $t_y) { + $this->_pdf->translate($t_x, -$t_y); + } + + function transform($a, $b, $c, $d, $e, $f) { + $this->_pdf->concat($a, $b, $c, $d, $e, $f); + } + + //........................................................................ + + function polygon($points, $color, $width = null, $style = null, $fill = false) { + + $this->_set_fill_color($color); + $this->_set_stroke_color($color); + + if ( !$fill && isset($width) ) + $this->_set_line_style($width, "square", "miter", $style); + + $y = $this->y(array_pop($points)); + $x = array_pop($points); + $this->_pdf->moveto($x,$y); + + while (count($points) > 1) { + $y = $this->y(array_pop($points)); + $x = array_pop($points); + $this->_pdf->lineto($x,$y); + } + + if ( $fill ) + $this->_pdf->fill(); + else + $this->_pdf->closepath_stroke(); + } + + //........................................................................ + + function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false) { + + $this->_set_fill_color($color); + $this->_set_stroke_color($color); + + if ( !$fill && isset($width) ) + $this->_set_line_style($width, "round", "round", $style); + + $y = $this->y($y); + + $this->_pdf->circle($x, $y, $r); + + if ( $fill ) + $this->_pdf->fill(); + else + $this->_pdf->stroke(); + + } + + //........................................................................ + + function image($img_url, $img_type, $x, $y, $w, $h) { + $w = (int)$w; + $h = (int)$h; + + $img_type = strtolower($img_type); + + if ( $img_type === "jpg" ) + $img_type = "jpeg"; + + if ( isset($this->_imgs[$img_url]) ) + $img = $this->_imgs[$img_url]; + + else { + + $img = $this->_imgs[$img_url] = $this->_pdf->load_image($img_type, $img_url, ""); + } + + $y = $this->y($y) - $h; + $this->_pdf->fit_image($img, $x, $y, 'boxsize={'. "$w $h" .'} fitmethod=entire'); + + } + + //........................................................................ + + function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_spacing = 0, $char_spacing = 0, $angle = 0) { + $fh = $this->_load_font($font); + + $this->_pdf->setfont($fh, $size); + $this->_set_fill_color($color); + + $y = $this->y($y) - Font_Metrics::get_font_height($font, $size); + + $word_spacing = (float)$word_spacing; + $char_spacing = (float)$char_spacing; + $angle = -(float)$angle; + + $this->_pdf->fit_textline($text, $x, $y, "rotate=$angle wordspacing=$word_spacing charspacing=$char_spacing "); + + } + + //........................................................................ + + function javascript($code) { + if ( defined("DOMPDF_PDFLIB_LICENSE") ) { + $this->_pdf->create_action("JavaScript", $code); + } + } + + //........................................................................ + + /** + * Add a named destination (similar to ... in html) + * + * @param string $anchorname The name of the named destination + */ + function add_named_dest($anchorname) { + $this->_pdf->add_nameddest($anchorname,""); + } + + //........................................................................ + + /** + * Add a link to the pdf + * + * @param string $url The url to link to + * @param float $x The x position of the link + * @param float $y The y position of the link + * @param float $width The width of the link + * @param float $height The height of the link + */ + function add_link($url, $x, $y, $width, $height) { + + $y = $this->y($y) - $height; + if ( strpos($url, '#') === 0 ) { + // Local link + $name = substr($url,1); + if ( $name ) + $this->_pdf->create_annotation($x, $y, $x + $width, $y + $height, 'Link', "contents={$url} destname=". substr($url,1) . " linewidth=0"); + } else { + + list($proto, $host, $path, $file) = explode_url($url); + + if ( $proto == "" || $proto === "file://" ) + return; // Local links are not allowed + $url = build_url($proto, $host, $path, $file); + $url = '{' . rawurldecode($url) . '}'; + + $action = $this->_pdf->create_action("URI", "url=" . $url); + $this->_pdf->create_annotation($x, $y, $x + $width, $y + $height, 'Link', "contents={$url} action={activate=$action} linewidth=0"); + } + } + + //........................................................................ + + function get_text_width($text, $font, $size, $word_spacing = 0, $letter_spacing = 0) { + $fh = $this->_load_font($font); + + // Determine the additional width due to extra spacing + $num_spaces = mb_substr_count($text," "); + $delta = $word_spacing * $num_spaces; + + if ( $letter_spacing ) { + $num_chars = mb_strlen($text); + $delta += ($num_chars - $num_spaces) * $letter_spacing; + } + + return $this->_pdf->stringwidth($text, $fh, $size) + $delta; + } + + //........................................................................ + + function get_font_height($font, $size) { + + $fh = $this->_load_font($font); + + $this->_pdf->setfont($fh, $size); + + $asc = $this->_pdf->get_value("ascender", $fh); + $desc = $this->_pdf->get_value("descender", $fh); + + // $desc is usually < 0, + return $size * ($asc - $desc) * DOMPDF_FONT_HEIGHT_RATIO; + } + + //........................................................................ + + /** + * Writes text at the specified x and y coordinates on every page + * + * The strings '{PAGE_NUM}' and '{PAGE_COUNT}' are automatically replaced + * with their current values. + * + * See {@link Style::munge_colour()} for the format of the colour array. + * + * @param float $x + * @param float $y + * @param string $text the text to write + * @param string $font the font file to use + * @param float $size the font size, in points + * @param array $color + * @param float $adjust word spacing adjustment + * @param float $angle angle to write the text at, measured CW starting from the x-axis + */ + function page_text($x, $y, $text, $font, $size, $color = array(0,0,0), + $adjust = 0, $angle = 0) { + $_t = "text"; + $this->_page_text[] = compact("_t", "x", "y", "text", "font", "size", "color", "adjust", "angle"); + } + + //........................................................................ + + /** + * Processes a script on every page + * + * The variables $pdf, $PAGE_NUM, and $PAGE_COUNT are available. + * + * This function can be used to add page numbers to all pages + * after the first one, for example. + * + * @param string $code the script code + * @param string $type the language type for script + */ + function page_script($code, $type = "text/php") { + $_t = "script"; + $this->_page_text[] = compact("_t", "code", "type"); + } + + //........................................................................ + + function new_page() { + + // Add objects to the current page + $this->_place_objects(); + + $this->_pdf->suspend_page(""); + $this->_pdf->begin_page_ext($this->_width, $this->_height, ""); + $this->_page_number = ++$this->_page_count; + + } + + //........................................................................ + + /** + * Add text to each page after rendering is complete + */ + protected function _add_page_text() { + + if ( !count($this->_page_text) ) + return; + + $this->_pdf->suspend_page(""); + + for ($p = 1; $p <= $this->_page_count; $p++) { + $this->_pdf->resume_page("pagenumber=$p"); + + foreach ($this->_page_text as $pt) { + extract($pt); + + switch ($_t) { + + case "text": + $text = str_replace(array("{PAGE_NUM}","{PAGE_COUNT}"), + array($p, $this->_page_count), $text); + $this->text($x, $y, $text, $font, $size, $color, $adjust, $angle); + break; + + case "script": + if (!$eval) { + $eval = new PHP_Evaluator($this); + } + $eval->evaluate($code, array('PAGE_NUM' => $p, 'PAGE_COUNT' => $this->_page_count)); + break; + } + } + + $this->_pdf->suspend_page(""); + } + + $this->_pdf->resume_page("pagenumber=".$this->_page_number); + } + + //........................................................................ + + function stream($filename, $options = null) { + + // Add page text + $this->_add_page_text(); + + if ( isset($options["compress"]) && $options["compress"] != 1 ) + $this->_pdf->set_value("compress", 0); + else + $this->_pdf->set_value("compress", 6); + + $this->_close(); + + if ( self::$IN_MEMORY ) { + $data = $this->_pdf->get_buffer(); + $size = strlen($data); + + } else + $size = filesize($this->_file); + + + $filename = str_replace(array("\n","'"),"", $filename); + $attach = (isset($options["Attachment"]) && $options["Attachment"]) ? "attachment" : "inline"; + + header("Cache-Control: private"); + header("Content-type: application/pdf"); + header("Content-Disposition: $attach; filename=\"$filename\""); + + //header("Content-length: " . $size); + + if ( self::$IN_MEMORY ) + echo $data; + + else { + + // Chunked readfile() + $chunk = (1 << 21); // 2 MB + $fh = fopen($this->_file, "rb"); + if ( !$fh ) + throw new DOMPDF_Exception("Unable to load temporary PDF file: " . $this->_file); + + while ( !feof($fh) ) + echo fread($fh,$chunk); + fclose($fh); + + //debugpng + if (DEBUGPNG) print '[pdflib stream unlink '.$this->_file.']'; + if (!DEBUGKEEPTEMP) + + unlink($this->_file); + $this->_file = null; + unset($this->_file); + } + + flush(); + } + + //........................................................................ + + function output($options = null) { + + // Add page text + $this->_add_page_text(); + + if ( isset($options["compress"]) && $options["compress"] != 1 ) + $this->_pdf->set_value("compress", 0); + else + $this->_pdf->set_value("compress", 6); + + $this->_close(); + + if ( self::$IN_MEMORY ) + $data = $this->_pdf->get_buffer(); + + else { + $data = file_get_contents($this->_file); + + //debugpng + if (DEBUGPNG) print '[pdflib output unlink '.$this->_file.']'; + if (!DEBUGKEEPTEMP) + + unlink($this->_file); + $this->_file = null; + unset($this->_file); + } + + return $data; + } +} + +// Workaround for idiotic limitation on statics... +PDFLib_Adapter::$PAPER_SIZES = CPDF_Adapter::$PAPER_SIZES; diff --git a/application/third_party/dompdf/include/php_evaluator.cls.php b/application/third_party/dompdf/include/php_evaluator.cls.php new file mode 100755 index 00000000..fe45864a --- /dev/null +++ b/application/third_party/dompdf/include/php_evaluator.cls.php @@ -0,0 +1,76 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: php_evaluator.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Executes inline PHP code during the rendering process + * + * @access private + * @package dompdf + */ +class PHP_Evaluator { + + protected $_canvas; + + function __construct(Canvas $canvas) { + $this->_canvas = $canvas; + } + + function evaluate($code, $vars = array()) { + if ( !DOMPDF_ENABLE_PHP ) + return; + + // Set up some variables for the inline code + $pdf = $this->_canvas; + $PAGE_NUM = $pdf->get_page_number(); + $PAGE_COUNT = $pdf->get_page_count(); + + // Override those variables if passed in + foreach ($vars as $k => $v) { + $$k = $v; + } + + eval(utf8_decode($code)); + } + + function render($frame) { + $this->evaluate($frame->get_node()->nodeValue); + } +} diff --git a/application/third_party/dompdf/include/positioner.cls.php b/application/third_party/dompdf/include/positioner.cls.php new file mode 100755 index 00000000..f2e27af2 --- /dev/null +++ b/application/third_party/dompdf/include/positioner.cls.php @@ -0,0 +1,71 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: positioner.cls.php 283 2010-07-19 17:57:40Z fabien.menager $ */ + +/** + * Base Positioner class + * + * Defines postioner interface + * + * @access private + * @package dompdf + */ +abstract class Positioner { + + // protected members + protected $_frame; + + //........................................................................ + + function __construct(Frame_Decorator $frame) { + $this->_frame = $frame; + } + + /** + * Class destructor + */ + function __destruct() { + clear_object($this); + } + //........................................................................ + + abstract function position(); + +} diff --git a/application/third_party/dompdf/include/renderer.cls.php b/application/third_party/dompdf/include/renderer.cls.php new file mode 100755 index 00000000..d3d2162d --- /dev/null +++ b/application/third_party/dompdf/include/renderer.cls.php @@ -0,0 +1,293 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: renderer.cls.php 351 2011-01-19 20:27:02Z fabien.menager $ */ + +/** + * Concrete renderer + * + * Instantiates several specific renderers in order to render any given + * frame. + * + * @access private + * @package dompdf + */ +class Renderer extends Abstract_Renderer { + + /** + * Array of renderers for specific frame types + * + * @var array + */ + protected $_renderers; + + /** + * Cache of the callbacks array + * + * @var array + */ + private $_callbacks; + + /** + * Class destructor + */ + function __destruct() { + clear_object($this); + } + + /** + * Advance the canvas to the next page + */ + function new_page() { + $this->_canvas->new_page(); + } + + /** + * Render frames recursively + * + * @param Frame $frame the frame to render + */ + function render(Frame $frame) { + global $_dompdf_debug; + + if ( $_dompdf_debug ) { + echo $frame; + flush(); + } + + $style = $frame->get_style(); + $display = $style->display; + + // Starts the CSS transformation + if ( $style->transform && is_array($style->transform) ) { + $this->_canvas->save(); + list($x, $y, $w, $h) = $frame->get_padding_box(); + $origin = $style->transform_origin; + + foreach($style->transform as $transform) { + list($function, $values) = $transform; + if ( $function === "matrix" ) { + $function = "transform"; + } + + $values = array_map("floatval", $values); + $values[] = $x + $style->length_in_pt($origin[0], $style->width); + $values[] = $y + $style->length_in_pt($origin[1], $style->height); + + call_user_func_array(array($this->_canvas, $function), $values); + } + } + + switch ($display) { + + case "block": + case "list-item": + case "inline-block": + case "table": + case "table-row-group": + case "table-header-group": + case "table-footer-group": + case "inline-table": + $this->_render_frame("block", $frame); + break; + + case "inline": + if ( $frame->get_node()->nodeName === "#text" ) + $this->_render_frame("text", $frame); + else + $this->_render_frame("inline", $frame); + break; + + case "table-cell": + $this->_render_frame("table-cell", $frame); + break; + + case "-dompdf-list-bullet": + $this->_render_frame("list-bullet", $frame); + break; + + case "-dompdf-image": + $this->_render_frame("image", $frame); + break; + + case "none": + $node = $frame->get_node(); + + if ( $node->nodeName === "script" ) { + if ( $node->getAttribute("type") === "text/php" || + $node->getAttribute("language") === "php" ) { + // Evaluate embedded php scripts + $this->_render_frame("php", $frame); + } + + elseif ( $node->getAttribute("type") === "text/javascript" || + $node->getAttribute("language") === "javascript" ) { + // Insert JavaScript + $this->_render_frame("javascript", $frame); + } + } + + // Don't render children, so skip to next iter + return; + + default: + break; + + } + + // Check for begin frame callback + $this->_check_callbacks("begin_frame", $frame); + + // Starts the overflow: hidden box + if ( $style->overflow === "hidden" ) { + list($x, $y, $w, $h) = $frame->get_padding_box(); + $this->_canvas->clipping_rectangle($x, $y, $w, $h); + } + + $page = $frame->get_root()->get_reflower(); + + foreach ($frame->get_children() as $child) { + $child_style = $child->get_style(); + + // Stacking context + if ( $child_style->z_index !== false && ($child_style->z_index !== "auto" || in_array($child_style->position, Style::$POSITIONNED_TYPES)) ) { + $z_index = ($child_style->z_index === "auto") ? 0 : intval($child_style->z_index); + $page->add_frame_to_stacking_context($child, $z_index); + $child_style->z_index = false; + } + + else { + $this->render($child); + } + } + + // Ends the overflow: hidden box + if ( $style->overflow === "hidden" ) { + $this->_canvas->clipping_end(); + } + + if ( $style->transform && is_array($style->transform) ) { + $this->_canvas->restore(); + } + + // Check for end frame callback + $this->_check_callbacks("end_frame", $frame); + + } + + /** + * Check for callbacks that need to be performed when a given event + * gets triggered on a frame + * + * @param string $event the type of event + * @param Frame $frame the frame that event is triggered on + */ + protected function _check_callbacks($event, $frame) { + if (!isset($this->_callbacks)) { + $this->_callbacks = $this->_dompdf->get_callbacks(); + } + + if (is_array($this->_callbacks) && isset($this->_callbacks[$event])) { + $info = array(0 => $this->_canvas, "canvas" => $this->_canvas, + 1 => $frame, "frame" => $frame); + $fs = $this->_callbacks[$event]; + foreach ($fs as $f) { + if (is_callable($f)) { + if (is_array($f)) { + $f[0]->$f[1]($info); + } else { + $f($info); + } + } + } + } + } + + /** + * Render a single frame + * + * Creates Renderer objects on demand + * + * @param string $type type of renderer to use + * @param Frame $frame the frame to render + */ + protected function _render_frame($type, $frame) { + + if ( !isset($this->_renderers[$type]) ) { + + switch ($type) { + case "block": + $this->_renderers[$type] = new Block_Renderer($this->_dompdf); + break; + + case "inline": + $this->_renderers[$type] = new Inline_Renderer($this->_dompdf); + break; + + case "text": + $this->_renderers[$type] = new Text_Renderer($this->_dompdf); + break; + + case "image": + $this->_renderers[$type] = new Image_Renderer($this->_dompdf); + break; + + case "table-cell": + $this->_renderers[$type] = new Table_Cell_Renderer($this->_dompdf); + break; + + case "list-bullet": + $this->_renderers[$type] = new List_Bullet_Renderer($this->_dompdf); + break; + + case "php": + $this->_renderers[$type] = new PHP_Evaluator($this->_canvas); + break; + + case "javascript": + $this->_renderers[$type] = new Javascript_Embedder($this->_dompdf); + break; + + } + } + + $this->_renderers[$type]->render($frame); + + } +} diff --git a/application/third_party/dompdf/include/style.cls.php b/application/third_party/dompdf/include/style.cls.php new file mode 100755 index 00000000..594134b9 --- /dev/null +++ b/application/third_party/dompdf/include/style.cls.php @@ -0,0 +1,2149 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - Fix px to pt conversion according to DOMPDF_DPI + * - Recognize css styles with !important attribute, and store !important attribute within style + * - Propagate !important by inherit and sequences of styles with merge. + * - Add missing style property cache flushes for consistent rendering, e.g. on explicte assignments + * - Add important set/get for access from outside of class + * - Fix font_family search path with multiple fonts list in css attribute: + * On missing font, do not immediately fall back to default font, + * but try subsequent fonts in search chain. Only when none found, explicitely + * refer to default font. + * - Allow read of background individual properties + * - Add support for individual styles background-position, background-attachment, background-repeat + * - Complete style components of list-style + * - Add support for combined styles in addition to individual styles + * like {border: red 1px solid;}, { border-width: 1px;}, { border-right-color: red; } ... + * for font, background + * - Propagate attributes including !important from combined style to individual component + * for border, background, padding, margin, font, list_style + * - Refactor common code of border, background, padding, margin, font, list_style + * - Refactor common code of list-style-image and background-image + * - special treatment of css images "none" instead of url(...), otherwise would prepend string "none" with path name + * - Added comments + * - Added debug output + * @contributor Helmut Tischer + * @version dompdf_trunk_with_helmut_mods.20090524 + * - Allow superflous white space and string delimiter in font search path. + * - Restore lost change of default font of above + * @version 20090610 + * - Allow absolute path from web server root as html image reference + * - More accurate handling of css property cache consistency + */ + +/* $Id: style.cls.php 355 2011-01-27 07:44:54Z fabien.menager $ */ + +/** + * Represents CSS properties. + * + * The Style class is responsible for handling and storing CSS properties. + * It includes methods to resolve colours and lengths, as well as getters & + * setters for many CSS properites. + * + * Actual CSS parsing is performed in the {@link Stylesheet} class. + * + * @package dompdf + */ +class Style { + + /** + * Default font size, in points. + * + * @var float + */ + static $default_font_size = 12; + + /** + * Default line height, as a fraction of the font size. + * + * @var float + */ + static $default_line_height = 1.2; + + /** + * Default "absolute" font sizes relative to the default font-size + * http://www.w3.org/TR/css3-fonts/#font-size-the-font-size-property + * @var array + */ + static $font_size_keywords = array( + "xx-small" => 0.6, // 3/5 + "x-small" => 0.75, // 3/4 + "small" => 0.889, // 8/9 + "medium" => 1, // 1 + "large" => 1.2, // 6/5 + "x-large" => 1.5, // 3/2 + "xx-large" => 2.0, // 2/1 + ); + + /** + * List of all inline types. Should really be a constant. + * + * @var array + */ + static $INLINE_TYPES = array("inline"); + + /** + * List of all block types. Should really be a constant. + * + * @var array + */ + static $BLOCK_TYPES = array("block", "inline-block", "table-cell", "list-item"); + + /** + * List of all positionned types. Should really be a constant. + * + * @var array + */ + static $POSITIONNED_TYPES = array("relative", "absolute", "fixed"); + + /** + * List of all table types. Should really be a constant. + * + * @var array; + */ + static $TABLE_TYPES = array("table", "inline-table"); + + /** + * List of valid border styles. Should also really be a constant. + * + * @var array + */ + static $BORDER_STYLES = array("none", "hidden", "dotted", "dashed", "solid", + "double", "groove", "ridge", "inset", "outset"); + + /** + * Default style values. + * + * @link http://www.w3.org/TR/CSS21/propidx.html + * + * @var array + */ + static protected $_defaults = null; + + /** + * List of inherited properties + * + * @link http://www.w3.org/TR/CSS21/propidx.html + * + * @var array + */ + static protected $_inherited = null; + + /** + * The stylesheet this style belongs to + * + * @see Stylesheet + * @var Stylesheet + */ + protected $_stylesheet; // stylesheet this style is attached to + + /** + * Main array of all CSS properties & values + * + * @var array + */ + protected $_props; + + /* var instead of protected would allow access outside of class */ + protected $_important_props; + + /** + * Cached property values + * + * @var array + */ + protected $_prop_cache; + + /** + * Font size of parent element in document tree. Used for relative font + * size resolution. + * + * @var float + */ + protected $_parent_font_size; // Font size of parent element + + /** + * @var Frame + */ + protected $_frame; + + // private members + /** + * True once the font size is resolved absolutely + * + * @var bool + */ + private $__font_size_calculated; // Cache flag + + /** + * Class constructor + * + * @param Stylesheet $stylesheet the stylesheet this Style is associated with. + */ + function __construct(Stylesheet $stylesheet) { + $this->_props = array(); + $this->_important_props = array(); + $this->_stylesheet = $stylesheet; + $this->_parent_font_size = null; + $this->__font_size_calculated = false; + + if ( !isset(self::$_defaults) ) { + + // Shorthand + $d =& self::$_defaults; + + // All CSS 2.1 properties, and their default values + $d["azimuth"] = "center"; + $d["background_attachment"] = "scroll"; + $d["background_color"] = "transparent"; + $d["background_image"] = "none"; + $d["background_position"] = "0% 0%"; + $d["background_repeat"] = "repeat"; + $d["background"] = ""; + $d["border_collapse"] = "separate"; + $d["border_color"] = ""; + $d["border_spacing"] = "0"; + $d["border_style"] = ""; + $d["border_top"] = ""; + $d["border_right"] = ""; + $d["border_bottom"] = ""; + $d["border_left"] = ""; + $d["border_top_color"] = ""; + $d["border_right_color"] = ""; + $d["border_bottom_color"] = ""; + $d["border_left_color"] = ""; + $d["border_top_style"] = "none"; + $d["border_right_style"] = "none"; + $d["border_bottom_style"] = "none"; + $d["border_left_style"] = "none"; + $d["border_top_width"] = "medium"; + $d["border_right_width"] = "medium"; + $d["border_bottom_width"] = "medium"; + $d["border_left_width"] = "medium"; + $d["border_width"] = "medium"; + $d["border"] = ""; + $d["bottom"] = "auto"; + $d["caption_side"] = "top"; + $d["clear"] = "none"; + $d["clip"] = "auto"; + $d["color"] = "#000000"; + $d["content"] = "normal"; + $d["counter_increment"] = "none"; + $d["counter_reset"] = "none"; + $d["cue_after"] = "none"; + $d["cue_before"] = "none"; + $d["cue"] = ""; + $d["cursor"] = "auto"; + $d["direction"] = "ltr"; + $d["display"] = "inline"; + $d["elevation"] = "level"; + $d["empty_cells"] = "show"; + $d["float"] = "none"; + $d["font_family"] = "serif"; + $d["font_size"] = "medium"; + $d["font_style"] = "normal"; + $d["font_variant"] = "normal"; + $d["font_weight"] = "normal"; + $d["font"] = ""; + $d["height"] = "auto"; + $d["left"] = "auto"; + $d["letter_spacing"] = "normal"; + $d["line_height"] = "normal"; + $d["list_style_image"] = "none"; + $d["list_style_position"] = "outside"; + $d["list_style_type"] = "disc"; + $d["list_style"] = ""; + $d["margin_right"] = "0"; + $d["margin_left"] = "0"; + $d["margin_top"] = "0"; + $d["margin_bottom"] = "0"; + $d["margin"] = ""; + $d["max_height"] = "none"; + $d["max_width"] = "none"; + $d["min_height"] = "0"; + $d["min_width"] = "0"; + $d["opacity"] = "1.0"; // CSS3 + $d["orphans"] = "2"; + $d["outline_color"] = ""; // "invert" special color is not supported + $d["outline_style"] = "none"; + $d["outline_width"] = "medium"; + $d["outline"] = ""; + $d["overflow"] = "visible"; + $d["padding_top"] = "0"; + $d["padding_right"] = "0"; + $d["padding_bottom"] = "0"; + $d["padding_left"] = "0"; + $d["padding"] = ""; + $d["page_break_after"] = "auto"; + $d["page_break_before"] = "auto"; + $d["page_break_inside"] = "auto"; + $d["pause_after"] = "0"; + $d["pause_before"] = "0"; + $d["pause"] = ""; + $d["pitch_range"] = "50"; + $d["pitch"] = "medium"; + $d["play_during"] = "auto"; + $d["position"] = "static"; + $d["quotes"] = ""; + $d["richness"] = "50"; + $d["right"] = "auto"; + $d["size"] = "auto"; // @page + $d["speak_header"] = "once"; + $d["speak_numeral"] = "continuous"; + $d["speak_punctuation"] = "none"; + $d["speak"] = "normal"; + $d["speech_rate"] = "medium"; + $d["stress"] = "50"; + $d["table_layout"] = "auto"; + $d["text_align"] = "left"; + $d["text_decoration"] = "none"; + $d["text_indent"] = "0"; + $d["text_transform"] = "none"; + $d["top"] = "auto"; + $d["transform"] = "none"; // CSS3 + $d["transform_origin"] = "50% 50%"; // CSS3 + $d["_webkit_transform"] = $d["transform"]; // CSS3 + $d["_webkit_transform_origin"] = $d["transform_origin"]; // CSS3 + $d["unicode_bidi"] = "normal"; + $d["vertical_align"] = "baseline"; + $d["visibility"] = "visible"; + $d["voice_family"] = ""; + $d["volume"] = "medium"; + $d["white_space"] = "normal"; + $d["widows"] = "2"; + $d["width"] = "auto"; + $d["word_spacing"] = "normal"; + $d["z_index"] = "auto"; + + // for @font-face + $d["src"] = ""; + $d["unicode_range"] = ""; + + // Properties that inherit by default + self::$_inherited = array("azimuth", + "border_collapse", + "border_spacing", + "caption_side", + "color", + "cursor", + "direction", + "elevation", + "empty_cells", + "font_family", + "font_size", + "font_style", + "font_variant", + "font_weight", + "font", + "letter_spacing", + "line_height", + "list_style_image", + "list_style_position", + "list_style_type", + "list_style", + "orphans", + "page_break_inside", + "pitch_range", + "pitch", + "quotes", + "richness", + "speak_header", + "speak_numeral", + "speak_punctuation", + "speak", + "speech_rate", + "stress", + "text_align", + "text_indent", + "text_transform", + "visibility", + "voice_family", + "volume", + "white_space", + "widows", + "word_spacing"); + } + + } + + /** + * "Destructor": forcibly free all references held by this object + */ + function dispose() { + clear_object($this); + } + + function set_frame(Frame $frame) { + $this->_frame = $frame; + } + + function get_frame() { + return $this->_frame; + } + + /** + * returns the {@link Stylesheet} this Style is associated with. + * + * @return Stylesheet + */ + function get_stylesheet() { return $this->_stylesheet; } + + /** + * Converts any CSS length value into an absolute length in points. + * + * length_in_pt() takes a single length (e.g. '1em') or an array of + * lengths and returns an absolute length. If an array is passed, then + * the return value is the sum of all elements. + * + * If a reference size is not provided, the default font size is used + * ({@link Style::$default_font_size}). + * + * @param float|array $length the length or array of lengths to resolve + * @param float $ref_size an absolute reference size to resolve percentage lengths + * @return float + */ + function length_in_pt($length, $ref_size = null) { + + if ( !is_array($length) ) + $length = array($length); + + if ( !isset($ref_size) ) + $ref_size = self::$default_font_size; + + $ret = 0; + foreach ($length as $l) { + + if ( $l === "auto" ) + return "auto"; + + if ( $l === "none" ) + return "none"; + + // Assume numeric values are already in points + if ( is_numeric($l) ) { + $ret += $l; + continue; + } + + if ( $l === "normal" ) { + $ret += $ref_size; + continue; + } + + // Border lengths + if ( $l === "thin" ) { + $ret += 0.5; + continue; + } + + if ( $l === "medium" ) { + $ret += 1.5; + continue; + } + + if ( $l === "thick" ) { + $ret += 2.5; + continue; + } + + if ( ($i = mb_strpos($l, "px")) !== false ) { + $ret += ( mb_substr($l, 0, $i) * 72 ) / DOMPDF_DPI; + continue; + } + + if ( ($i = mb_strpos($l, "pt")) !== false ) { + $ret += mb_substr($l, 0, $i); + continue; + } + + if ( ($i = mb_strpos($l, "em")) !== false ) { + $ret += mb_substr($l, 0, $i) * $this->__get("font_size"); + continue; + } + + if ( ($i = mb_strpos($l, "%")) !== false ) { + $ret += mb_substr($l, 0, $i)/100 * $ref_size; + continue; + } + + if ( ($i = mb_strpos($l, "cm")) !== false ) { + $ret += mb_substr($l, 0, $i) * 72 / 2.54; + continue; + } + + if ( ($i = mb_strpos($l, "mm")) !== false ) { + $ret += mb_substr($l, 0, $i) * 72 / 25.4; + continue; + } + + // FIXME: em:ex ratio? + if ( ($i = mb_strpos($l, "ex")) !== false ) { + $ret += mb_substr($l, 0, $i) * $this->__get("font_size"); + continue; + } + + if ( ($i = mb_strpos($l, "in")) !== false ) { + $ret += mb_substr($l, 0, $i) * 72; + continue; + } + + if ( ($i = mb_strpos($l, "pc")) !== false ) { + $ret += mb_substr($l, 0, $i) / 12; + continue; + } + + // Bogus value + $ret += $ref_size; + } + + return $ret; + } + + + /** + * Set inherited properties in this style using values in $parent + * + * @param Style $parent + */ + function inherit(Style $parent) { + + // Set parent font size + $this->_parent_font_size = $parent->get_font_size(); + + foreach (self::$_inherited as $prop) { + //inherit the !important property also. + //if local property is also !important, don't inherit. + if ( isset($parent->_props[$prop]) && + ( !isset($this->_props[$prop]) || + ( isset($parent->_important_props[$prop]) && !isset($this->_important_props[$prop]) ) + ) + ) { + if ( isset($parent->_important_props[$prop]) ) { + $this->_important_props[$prop] = true; + } + //see __set and __get, on all assignments clear cache! + $this->_prop_cache[$prop] = null; + $this->_props[$prop] = $parent->_props[$prop]; + } + } + + foreach (array_keys($this->_props) as $prop) { + if ( $this->_props[$prop] === "inherit" ) { + if ( isset($parent->_important_props[$prop]) ) { + $this->_important_props[$prop] = true; + } + //do not assign direct, but + //implicite assignment through __set, redirect to specialized, get value with __get + //This is for computing defaults if the parent setting is also missing. + //Therefore do not directly assign the value without __set + //set _important_props before that to be able to propagate. + //see __set and __get, on all assignments clear cache! + //$this->_prop_cache[$prop] = null; + //$this->_props[$prop] = $parent->_props[$prop]; + //props_set for more obvious explicite assignment not implemented, because + //too many implicite uses. + // $this->props_set($prop, $parent->$prop); + $this->$prop = $parent->$prop; + } + } + + return $this; + } + + /** + * Override properties in this style with those in $style + * + * @param Style $style + */ + function merge(Style $style) { + //treat the !important attribute + //if old rule has !important attribute, override with new rule only if + //the new rule is also !important + foreach($style->_props as $prop => $val ) { + if (isset($style->_important_props[$prop])) { + $this->_important_props[$prop] = true; + //see __set and __get, on all assignments clear cache! + $this->_prop_cache[$prop] = null; + $this->_props[$prop] = $val; + } else if ( !isset($this->_important_props[$prop]) ) { + //see __set and __get, on all assignments clear cache! + $this->_prop_cache[$prop] = null; + $this->_props[$prop] = $val; + } + } + + if ( isset($style->_props["font_size"]) ) + $this->__font_size_calculated = false; + } + + /** + * Returns an array(r, g, b, "r"=> r, "g"=>g, "b"=>b, "hex"=>"#rrggbb") + * based on the provided CSS colour value. + * + * @param string $colour + * @return array + */ + function munge_colour($colour) { return CSS_Color::parse($colour); } + + /** + * Alias for {@link Style::munge_colour()} + * + * @param string $color + * @return array + */ + function munge_color($color) { return CSS_Color::parse($color); } + + /* direct access to _important_props array from outside would work only when declared as + * 'var $_important_props;' instead of 'protected $_important_props;' + * Don't call _set/__get on missing attribute. Therefore need a special access. + * Assume that __set will be also called when this is called, so do not check validity again. + * Only created, if !important exists -> always set true. + */ + function important_set($prop) { + $prop = str_replace("-", "_", $prop); + $this->_important_props[$prop] = true; + } + + function important_get($prop) { + isset($this->_important_props[$prop]); + } + + /** + * PHP5 overloaded setter + * + * This function along with {@link Style::__get()} permit a user of the + * Style class to access any (CSS) property using the following syntax: + * + * Style->margin_top = "1em"; + * echo (Style->margin_top); + * + * + * __set() automatically calls the provided set function, if one exists, + * otherwise it sets the property directly. Typically, __set() is not + * called directly from outside of this class. + * + * On each modification clear cache to return accurate setting. + * Also affects direct settings not using __set + * For easier finding all assignments, attempted to allowing only explicite assignment: + * Very many uses, e.g. frame_reflower.cls.php -> for now leave as it is + * function __set($prop, $val) { + * throw new DOMPDF_Exception("Implicite replacement of assignment by __set. Not good."); + * } + * function props_set($prop, $val) { ... } + * + * @param string $prop the property to set + * @param mixed $val the value of the property + * + */ + function __set($prop, $val) { + $prop = str_replace("-", "_", $prop); + $this->_prop_cache[$prop] = null; + + if ( !isset(self::$_defaults[$prop]) ) { + global $_dompdf_warnings; + $_dompdf_warnings[] = "'$prop' is not a valid CSS2 property."; + return; + } + + if ( $prop !== "content" && is_string($val) && strlen($val) > 5 && mb_strpos($val, "url") === false ) { + $val = mb_strtolower(trim(str_replace(array("\n", "\t"), array(" "), $val))); + $val = preg_replace("/([0-9]+) (pt|px|pc|em|ex|in|cm|mm|%)/S", "\\1\\2", $val); + } + + $method = "set_$prop"; + + if ( method_exists($this, $method) ) + $this->$method($val); + else + $this->_props[$prop] = $val; + } + + /** + * PHP5 overloaded getter + * + * Along with {@link Style::__set()} __get() provides access to all CSS + * properties directly. Typically __get() is not called directly outside + * of this class. + * + * On each modification clear cache to return accurate setting. + * Also affects direct settings not using __set + * + * @param string $prop + * @return mixed + */ + function __get($prop) { + if ( !isset(self::$_defaults[$prop]) ) + throw new DOMPDF_Exception("'$prop' is not a valid CSS2 property."); + + if ( isset($this->_prop_cache[$prop]) && $this->_prop_cache[$prop] != null ) + return $this->_prop_cache[$prop]; + + $method = "get_$prop"; + + // Fall back on defaults if property is not set + if ( !isset($this->_props[$prop]) ) + $this->_props[$prop] = self::$_defaults[$prop]; + + if ( method_exists($this, $method) ) + return $this->_prop_cache[$prop] = $this->$method(); + + return $this->_prop_cache[$prop] = $this->_props[$prop]; + } + + + /** + * Getter for the 'font-family' CSS property. + * + * Uses the {@link Font_Metrics} class to resolve the font family into an + * actual font file. + * + * @link http://www.w3.org/TR/CSS21/fonts.html#propdef-font-family + * @return string + */ + function get_font_family() { + + $DEBUGCSS=DEBUGCSS; //=DEBUGCSS; Allow override of global setting for ad hoc debug + + // Select the appropriate font. First determine the subtype, then check + // the specified font-families for a candidate. + + // Resolve font-weight + $weight = $this->__get("font_weight"); + + if ( is_numeric($weight) ) { + + if ( $weight < 600 ) + $weight = "normal"; + else + $weight = "bold"; + + } else if ( $weight === "bold" || $weight === "bolder" ) { + $weight = "bold"; + + } else { + $weight = "normal"; + + } + + // Resolve font-style + $font_style = $this->__get("font_style"); + + if ( $weight === "bold" && ($font_style === "italic" || $font_style === "oblique") ) + $subtype = "bold_italic"; + else if ( $weight === "bold" && $font_style !== "italic" && $font_style !== "oblique" ) + $subtype = "bold"; + else if ( $weight !== "bold" && ($font_style === "italic" || $font_style === "oblique") ) + $subtype = "italic"; + else + $subtype = "normal"; + + // Resolve the font family + if ($DEBUGCSS) { + print "
[get_font_family:";
+      print '('.$this->_props["font_family"].'.'.$font_style.'.'.$this->__get("font_weight").'.'.$weight.'.'.$subtype.')';
+    }
+    $families = explode(",", $this->_props["font_family"]);
+    $families = array_map('trim',$families);
+    reset($families);
+
+    $font = null;
+    while ( current($families) ) {
+      list(,$family) = each($families);
+      //remove leading and trailing string delimiters, e.g. on font names with spaces;
+      //remove leading and trailing whitespace
+      $family=trim($family," \t\n\r\x0B\"'");
+      if ($DEBUGCSS) print '('.$family.')';
+      $font = Font_Metrics::get_font($family, $subtype);
+
+      if ( $font ) {
+        if ($DEBUGCSS)  print '('.$font.")get_font_family]\n
"; + return $font; + } + } + + $family = null; + if ($DEBUGCSS) print '(default)'; + $font = Font_Metrics::get_font($family, $subtype); + + if ( $font ) { + if ($DEBUGCSS) print '('.$font.")get_font_family]\n"; + return $font; + } + throw new DOMPDF_Exception("Unable to find a suitable font replacement for: '" . $this->_props["font_family"] ."'"); + + } + + /** + * Returns the resolved font size, in points + * + * @link http://www.w3.org/TR/CSS21/fonts.html#propdef-font-size + * @return float + */ + function get_font_size() { + + if ( $this->__font_size_calculated ) + return $this->_props["font_size"]; + + if ( !isset($this->_props["font_size"]) ) + $fs = self::$_defaults["font_size"]; + else + $fs = $this->_props["font_size"]; + + if ( !isset($this->_parent_font_size) ) + $this->_parent_font_size = self::$default_font_size; + + switch ($fs) { + case "xx-small": + case "x-small": + case "small": + case "medium": + case "large": + case "x-large": + case "xx-large": + $fs = self::$default_font_size * self::$font_size_keywords[$fs]; + break; + + case "smaller": + $fs = 8/9 * $this->_parent_font_size; + break; + + case "larger": + $fs = 6/5 * $this->_parent_font_size; + break; + + default: + break; + } + + // Ensure relative sizes resolve to something + if ( ($i = mb_strpos($fs, "em")) !== false ) + $fs = mb_substr($fs, 0, $i) * $this->_parent_font_size; + + else if ( ($i = mb_strpos($fs, "ex")) !== false ) + $fs = mb_substr($fs, 0, $i) * $this->_parent_font_size; + + else + $fs = $this->length_in_pt($fs); + + //see __set and __get, on all assignments clear cache! + $this->_prop_cache["font_size"] = null; + $this->_props["font_size"] = $fs; + $this->__font_size_calculated = true; + return $this->_props["font_size"]; + + } + + /** + * @link http://www.w3.org/TR/CSS21/text.html#propdef-word-spacing + * @return float + */ + function get_word_spacing() { + if ( $this->_props["word_spacing"] === "normal" ) + return 0; + + return $this->_props["word_spacing"]; + } + + /** + * @link http://www.w3.org/TR/CSS21/text.html#propdef-letter-spacing + * @return float + */ + function get_letter_spacing() { + if ( $this->_props["letter_spacing"] === "normal" ) + return 0; + + return $this->_props["letter_spacing"]; + } + + /** + * @link http://www.w3.org/TR/CSS21/visudet.html#propdef-line-height + * @return float + */ + function get_line_height() { + $line_height = $this->_props["line_height"]; + + if ( $line_height === "normal" ) + return self::$default_line_height * $this->get_font_size(); + + if ( is_numeric($line_height) ) + return $this->length_in_pt( $line_height . "em", $this->get_font_size()); + + return $this->length_in_pt( $line_height, $this->get_font_size() ); + } + + /** + * Returns the colour as an array + * + * The array has the following format: + * array(r,g,b, "r" => r, "g" => g, "b" => b, "hex" => "#rrggbb") + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-color + * @return array + */ + function get_color() { + return $this->munge_color( $this->_props["color"] ); + } + + /** + * Returns the background colour as an array + * + * The returned array has the same format as {@link Style::get_color()} + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-color + * @return array + */ + function get_background_color() { + return $this->munge_color( $this->_props["background_color"] ); + } + + /** + * Returns the background position as an array + * + * The returned array has the following format: + * array(x,y, "x" => x, "y" => y) + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-position + * @return array + */ + function get_background_position() { + $tmp = explode(" ", $this->_props["background_position"]); + + switch ($tmp[0]) { + + case "left": + $x = "0%"; + break; + + case "right": + $x = "100%"; + break; + + case "top": + $y = "0%"; + break; + + case "bottom": + $y = "100%"; + break; + + case "center": + $x = "50%"; + $y = "50%"; + break; + + default: + $x = $tmp[0]; + break; + } + + if ( isset($tmp[1]) ) { + + switch ($tmp[1]) { + case "left": + $x = "0%"; + break; + + case "right": + $x = "100%"; + break; + + case "top": + $y = "0%"; + break; + + case "bottom": + $y = "100%"; + break; + + case "center": + if ( $tmp[0] === "left" || $tmp[0] === "right" || $tmp[0] === "center" ) + $y = "50%"; + else + $x = "50%"; + break; + + default: + $y = $tmp[1]; + break; + } + + } else { + $y = "50%"; + } + + if ( !isset($x) ) + $x = "0%"; + + if ( !isset($y) ) + $y = "0%"; + + return array( 0 => $x, "x" => $x, + 1 => $y, "y" => $y ); + } + + + /** + * Returns the background as it is currently stored + * + * (currently anyway only for completeness. + * not used for further processing) + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-attachment + * @return string + */ + function get_background_attachment() { + return $this->_props["background_attachment"]; + } + + + /** + * Returns the background_repeat as it is currently stored + * + * (currently anyway only for completeness. + * not used for further processing) + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-repeat + * @return string + */ + function get_background_repeat() { + return $this->_props["background_repeat"]; + } + + + /** + * Returns the background as it is currently stored + * + * (currently anyway only for completeness. + * not used for further processing, but the individual get_background_xxx) + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background + * @return string + */ + function get_background() { + return $this->_props["background"]; + } + + + /**#@+ + * Returns the border colour as an array + * + * See {@link Style::get_color()} + * + * @link http://www.w3.org/TR/CSS21/box.html#border-color-properties + * @return array + */ + function get_border_top_color() { + if ( $this->_props["border_top_color"] === "" ) { + //see __set and __get, on all assignments clear cache! + $this->_prop_cache["border_top_color"] = null; + $this->_props["border_top_color"] = $this->__get("color"); + } + return $this->munge_color($this->_props["border_top_color"]); + } + + function get_border_right_color() { + if ( $this->_props["border_right_color"] === "" ) { + //see __set and __get, on all assignments clear cache! + $this->_prop_cache["border_right_color"] = null; + $this->_props["border_right_color"] = $this->__get("color"); + } + return $this->munge_color($this->_props["border_right_color"]); + } + + function get_border_bottom_color() { + if ( $this->_props["border_bottom_color"] === "" ) { + //see __set and __get, on all assignments clear cache! + $this->_prop_cache["border_bottom_color"] = null; + $this->_props["border_bottom_color"] = $this->__get("color"); + } + return $this->munge_color($this->_props["border_bottom_color"]); + } + + function get_border_left_color() { + if ( $this->_props["border_left_color"] === "" ) { + //see __set and __get, on all assignments clear cache! + $this->_prop_cache["border_left_color"] = null; + $this->_props["border_left_color"] = $this->__get("color"); + } + return $this->munge_color($this->_props["border_left_color"]); + } + + /**#@-*/ + + /**#@+ + * Returns the border width, as it is currently stored + * + * @link http://www.w3.org/TR/CSS21/box.html#border-width-properties + * @return float|string + */ + function get_border_top_width() { + $style = $this->__get("border_top_style"); + return $style !== "none" && $style !== "hidden" ? $this->length_in_pt($this->_props["border_top_width"]) : 0; + } + + function get_border_right_width() { + $style = $this->__get("border_right_style"); + return $style !== "none" && $style !== "hidden" ? $this->length_in_pt($this->_props["border_right_width"]) : 0; + } + + function get_border_bottom_width() { + $style = $this->__get("border_bottom_style"); + return $style !== "none" && $style !== "hidden" ? $this->length_in_pt($this->_props["border_bottom_width"]) : 0; + } + + function get_border_left_width() { + $style = $this->__get("border_left_style"); + return $style !== "none" && $style !== "hidden" ? $this->length_in_pt($this->_props["border_left_width"]) : 0; + } + /**#@-*/ + + /** + * Return an array of all border properties. + * + * The returned array has the following structure: + * + * array("top" => array("width" => [border-width], + * "style" => [border-style], + * "color" => [border-color (array)]), + * "bottom" ... ) + * + * + * @return array + */ + function get_border_properties() { + return array("top" => array("width" => $this->__get("border_top_width"), + "style" => $this->__get("border_top_style"), + "color" => $this->__get("border_top_color")), + "bottom" => array("width" => $this->__get("border_bottom_width"), + "style" => $this->__get("border_bottom_style"), + "color" => $this->__get("border_bottom_color")), + "right" => array("width" => $this->__get("border_right_width"), + "style" => $this->__get("border_right_style"), + "color" => $this->__get("border_right_color")), + "left" => array("width" => $this->__get("border_left_width"), + "style" => $this->__get("border_left_style"), + "color" => $this->__get("border_left_color"))); + } + + /** + * Return a single border property + * + * @return mixed + */ + protected function _get_border($side) { + $color = $this->__get("border_" . $side . "_color"); + + return $this->__get("border_" . $side . "_width") . " " . + $this->__get("border_" . $side . "_style") . " " . $color["hex"]; + } + + /**#@+ + * Return full border properties as a string + * + * Border properties are returned just as specified in CSS: + *
[width] [style] [color]
+ * e.g. "1px solid blue" + * + * @link http://www.w3.org/TR/CSS21/box.html#border-shorthand-properties + * @return string + */ + function get_border_top() { return $this->_get_border("top"); } + function get_border_right() { return $this->_get_border("right"); } + function get_border_bottom() { return $this->_get_border("bottom"); } + function get_border_left() { return $this->_get_border("left"); } + /**#@-*/ + + /** + * Returns the outline colour as an array + * + * See {@link Style::get_color()} + * + * @link http://www.w3.org/TR/CSS21/box.html#border-color-properties + * @return array + */ + function get_outline_color() { + if ( $this->_props["outline_color"] === "" ) { + //see __set and __get, on all assignments clear cache! + $this->_prop_cache["outline_color"] = null; + $this->_props["outline_color"] = $this->__get("color"); + } + return $this->munge_color($this->_props["outline_color"]); + } + + /**#@+ + * Returns the outline width, as it is currently stored + * @return float|string + */ + function get_outline_width() { + $style = $this->__get("outline_style"); + return $style !== "none" && $style !== "hidden" ? $this->length_in_pt($this->_props["outline_width"]) : 0; + } + + /**#@+ + * Return full outline properties as a string + * + * Outline properties are returned just as specified in CSS: + *
[width] [style] [color]
+ * e.g. "1px solid blue" + * + * @link http://www.w3.org/TR/CSS21/box.html#border-shorthand-properties + * @return string + */ + function get_outline() { + $color = $this->__get("outline_color"); + return + $this->__get("outline_width") . " " . + $this->__get("outline_style") . " " . + $color["hex"]; + } + /**#@-*/ + + /** + * Returns border spacing as an array + * + * The array has the format (h_space,v_space) + * + * @link http://www.w3.org/TR/CSS21/tables.html#propdef-border-spacing + * @return array + */ + function get_border_spacing() { + return explode(" ", $this->_props["border_spacing"]); + } + +/*==============================*/ + + /* + !important attribute + For basic functionality of the !important attribute with overloading + of several styles of an element, changes in inherit(), merge() and _parse_properties() + are sufficient [helpers var $_important_props, __construct(), important_set(), important_get()] + + Only for combined attributes extra treatment needed. See below. + + div { border: 1px red; } + div { border: solid; } // Not combined! Only one occurence of same style per context + // + div { border: 1px red; } + div a { border: solid; } // Adding to border style ok by inheritance + // + div { border-style: solid; } // Adding to border style ok because of different styles + div { border: 1px red; } + // + div { border-style: solid; !important} // border: overrides, even though not !important + div { border: 1px dashed red; } + // + div { border: 1px red; !important } + div a { border-style: solid; } // Need to override because not set + + Special treatment: + At individual property like border-top-width need to check whether overriding value is also !important. + Also store the !important condition for later overrides. + Since not known who is initiating the override, need to get passed !importan as parameter. + !important Paramter taken as in the original style in the css file. + When poperty border !important given, do not mark subsets like border_style as important. Only + individual properties. + + Note: + Setting individual property directly from css with e.g. set_border_top_style() is not needed, because + missing set funcions handled by a generic handler __set(), including the !important. + Setting individual property of as sub-property is handled below. + + Implementation see at _set_style_side_type() + Callers _set_style_sides_type(), _set_style_type, _set_style_type_important() + + Related functionality for background, padding, margin, font, list_style + */ + + /* Generalized set function for individual attribute of combined style. + * With check for !important + * Applicable for background, border, padding, margin, font, list_style + * Note: $type has a leading underscore (or is empty), the others not. + */ + protected function _set_style_side_type($style,$side,$type,$val,$important) { + $prop = $style.'_'.$side.$type; + + if ( !isset($this->_important_props[$prop]) || $important) { + //see __set and __get, on all assignments clear cache! + $this->_prop_cache[$prop] = null; + if ($important) { + $this->_important_props[$prop] = true; + } + $this->_props[$prop] = $val; + } + } + + protected function _set_style_sides_type($style,$top,$right,$bottom,$left,$type,$important) { + $this->_set_style_side_type($style,'top',$type,$top,$important); + $this->_set_style_side_type($style,'right',$type,$right,$important); + $this->_set_style_side_type($style,'bottom',$type,$bottom,$important); + $this->_set_style_side_type($style,'left',$type,$left,$important); + } + + protected function _set_style_type($style,$type,$val,$important) { + $arr = explode(" ", $val); + switch (count($arr)) { + case 1: + $this->_set_style_sides_type($style,$arr[0],$arr[0],$arr[0],$arr[0],$type,$important); + break; + case 2: + $this->_set_style_sides_type($style,$arr[0],$arr[1],$arr[0],$arr[1],$type,$important); + break; + case 3: + $this->_set_style_sides_type($style,$arr[0],$arr[1],$arr[2],$arr[1],$type,$important); + break; + case 4: + $this->_set_style_sides_type($style,$arr[0],$arr[1],$arr[2],$arr[3],$type,$important); + break; + default: + break; + } + //see __set and __get, on all assignments clear cache! + $this->_prop_cache[$style.$type] = null; + $this->_props[$style.$type] = $val; + } + + protected function _set_style_type_important($style,$type,$val) { + $this->_set_style_type($style,$type,$val,isset($this->_important_props[$style.$type])); + } + + /* Anyway only called if _important matches and is assigned + * E.g. _set_style_side_type($style,$side,'',str_replace("none", "0px", $val),isset($this->_important_props[$style.'_'.$side])); + */ + protected function _set_style_side_width_important($style,$side,$val) { + //see __set and __get, on all assignments clear cache! + $this->_prop_cache[$style.'_'.$side] = null; + $this->_props[$style.'_'.$side] = str_replace("none", "0px", $val); + } + + protected function _set_style($style,$val,$important) { + if ( !isset($this->_important_props[$style]) || $important) { + if ($important) { + $this->_important_props[$style] = true; + } + //see __set and __get, on all assignments clear cache! + $this->_prop_cache[$style] = null; + $this->_props[$style] = $val; + } + } + + protected function _image($val) { + $DEBUGCSS=DEBUGCSS; + + if ( mb_strpos($val, "url") === false ) { + $path = "none"; //Don't resolve no image -> otherwise would prefix path and no longer recognize as none + } else { + $val = preg_replace("/url\(['\"]?([^'\")]+)['\"]?\)/","\\1", trim($val)); + + // Resolve the url now in the context of the current stylesheet + $parsed_url = explode_url($val); + if ( $parsed_url["protocol"] == "" && $this->_stylesheet->get_protocol() == "" ) { + if ($parsed_url["path"][0] === '/' || $parsed_url["path"][0] === '\\' ) { + $path = $_SERVER["DOCUMENT_ROOT"].'/'; + } else { + $path = $this->_stylesheet->get_base_path(); + } + $path .= $parsed_url["path"] . $parsed_url["file"]; + $path = realpath($path); + // If realpath returns FALSE then specifically state that there is no background image + if (!$path) { $path = 'none'; } + } else { + $path = build_url($this->_stylesheet->get_protocol(), + $this->_stylesheet->get_host(), + $this->_stylesheet->get_base_path(), + $val); + } + } + if ($DEBUGCSS) { + print "
[_image\n";
+      print_r($parsed_url);
+      print $this->_stylesheet->get_protocol()."\n".$this->_stylesheet->get_base_path()."\n".$path."\n";
+      print "_image]
";; + } + return $path; + } + +/*======================*/ + + /** + * Sets colour + * + * The colour parameter can be any valid CSS colour value + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-color + * @param string $colour + */ + function set_color($colour) { + $col = $this->munge_colour($colour); + + if ( is_null($col) ) + $col = self::$_defaults["color"]; + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["color"] = null; + $this->_props["color"] = $col["hex"]; + } + + /** + * Sets the background colour + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-color + * @param string $colour + */ + function set_background_color($colour) { + $col = $this->munge_colour($colour); + if ( is_null($col) ) + $col = self::$_defaults["background_color"]; + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["background_color"] = null; + $this->_props["background_color"] = is_array($col) ? $col["hex"] : $col; + } + + /** + * Set the background image url + * + * @link http://www.w3.org/TR/CSS21/colors.html#background-properties + * @param string $url + */ + function set_background_image($val) { + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["background_image"] = null; + $this->_props["background_image"] = $this->_image($val); + } + + /** + * Sets the background repeat + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-repeat + * @param string $val + */ + function set_background_repeat($val) { + if ( is_null($val) ) + $val = self::$_defaults["background_repeat"]; + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["background_repeat"] = null; + $this->_props["background_repeat"] = $val; + } + + /** + * Sets the background attachment + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-attachment + * @param string $val + */ + function set_background_attachment($val) { + if ( is_null($val) ) + $val = self::$_defaults["background_attachment"]; + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["background_attachment"] = null; + $this->_props["background_attachment"] = $val; + } + + /** + * Sets the background position + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-position + * @param string $val + */ + function set_background_position($val) { + if ( is_null($val) ) + $val = self::$_defaults["background_position"]; + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["background_position"] = null; + $this->_props["background_position"] = $val; + } + + /** + * Sets the background - combined options + * + * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background + * @param string $val + */ + function set_background($val) { + $col = null; + $pos = array(); + $tmp = preg_replace("/\s*\,\s*/", ",", $val); // when rgb() has spaces + $tmp = explode(" ", $tmp); + $important = isset($this->_important_props["background"]); + + foreach($tmp as $attr) { + if (mb_substr($attr, 0, 3) === "url" || $attr === "none") { + $this->_set_style("background_image", $this->_image($attr), $important); + } else if ($attr === "fixed" || $attr === "scroll") { + $this->_set_style("background_attachment", $attr, $important); + } else if ($attr === "repeat" || $attr === "repeat-x" || $attr === "repeat-y" || $attr === "no-repeat") { + $this->_set_style("background_repeat", $attr, $important); + } else if (($col = $this->munge_color($attr)) != null ) { + $this->_set_style("background_color", is_array($col) ? $col["hex"] : $col, $important); + } else { + $pos[] = $attr; + } + } + + if (count($pos)) { + $this->_set_style("background_position",implode(' ',$pos), $important); + } + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["background"] = null; + $this->_props["background"] = $val; + } + + /** + * Sets the font size + * + * $size can be any acceptable CSS size + * + * @link http://www.w3.org/TR/CSS21/fonts.html#propdef-font-size + * @param string|float $size + */ + function set_font_size($size) { + $this->__font_size_calculated = false; + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["font_size"] = null; + $this->_props["font_size"] = $size; + } + + /** + * Sets the font style + * + * combined attributes + * set individual attributes also, respecting !important mark + * exactly this order, separate by space. Multiple fonts separated by comma: + * font-style, font-variant, font-weight, font-size, line-height, font-family + * + * Other than with border and list, existing partial attributes should + * reset when starting here, even when not mentioned. + * If individual attribute is !important and explicite or implicite replacement is not, + * keep individual attribute + * + * require whitespace as delimiters for single value attributes + * On delimiter "/" treat first as font height, second as line height + * treat all remaining at the end of line as font + * font-style, font-variant, font-weight, font-size, line-height, font-family + * + * missing font-size and font-family might be not allowed, but accept it here and + * use default (medium size, enpty font name) + * + * @link http://www.w3.org/TR/CSS21/generate.html#propdef-list-style + * @param $val + */ + function set_font($val) { + $this->__font_size_calculated = false; + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["font"] = null; + $this->_props["font"] = $val; + + $important = isset($this->_important_props["font"]); + + if ( preg_match("/^(italic|oblique|normal)\s*(.*)$/i",$val,$match) ) { + $this->_set_style("font_style", $match[1], $important); + $val = $match[2]; + } else { + $this->_set_style("font_style", self::$_defaults["font_style"], $important); + } + + if ( preg_match("/^(small-caps|normal)\s*(.*)$/i",$val,$match) ) { + $this->_set_style("font_variant", $match[1], $important); + $val = $match[2]; + } else { + $this->_set_style("font_variant", self::$_defaults["font_variant"], $important); + } + + //matching numeric value followed by unit -> this is indeed a subsequent font size. Skip! + if ( preg_match("/^(bold|bolder|lighter|100|200|300|400|500|600|700|800|900|normal)\s*(.*)$/i",$val,$match) && + !preg_match("/^(?:pt|px|pc|em|ex|in|cm|mm|%)/",$match[2]) + ) { + $this->_set_style("font_weight", $match[1], $important); + $val = $match[2]; + } else { + $this->_set_style("font_weight", self::$_defaults["font_weight"], $important); + } + + if ( preg_match("/^(xx-small|x-small|small|medium|large|x-large|xx-large|smaller|larger|\d+\s*(?:pt|px|pc|em|ex|in|cm|mm|%))\s*(.*)$/i",$val,$match) ) { + $this->_set_style("font_size", $match[1], $important); + $val = $match[2]; + if (preg_match("/^\/\s*(\d+\s*(?:pt|px|pc|em|ex|in|cm|mm|%))\s*(.*)$/i",$val,$match) ) { + $this->_set_style("line_height", $match[1], $important); + $val = $match[2]; + } else { + $this->_set_style("line_height", self::$_defaults["line_height"], $important); + } + } else { + $this->_set_style("font_size", self::$_defaults["font_size"], $important); + $this->_set_style("line_height", self::$_defaults["line_height"], $important); + } + + if(strlen($val) != 0) { + $this->_set_style("font_family", $val, $important); + } else { + $this->_set_style("font_family", self::$_defaults["font_family"], $important); + } + } + + /**#@+ + * Sets page break properties + * + * @link http://www.w3.org/TR/CSS21/page.html#page-breaks + * @param string $break + */ + function set_page_break_before($break) { + if ($break === "left" || $break === "right") + $break = "always"; + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["page_break_before"] = null; + $this->_props["page_break_before"] = $break; + } + + function set_page_break_after($break) { + if ($break === "left" || $break === "right") + $break = "always"; + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["page_break_after"] = null; + $this->_props["page_break_after"] = $break; + } + /**#@-*/ + + //........................................................................ + + /**#@+ + * Sets the margin size + * + * @link http://www.w3.org/TR/CSS21/box.html#margin-properties + * @param $val + */ + function set_margin_top($val) { + $this->_set_style_side_width_important('margin','top',$val); + } + + function set_margin_right($val) { + $this->_set_style_side_width_important('margin','right',$val); + } + + function set_margin_bottom($val) { + $this->_set_style_side_width_important('margin','bottom',$val); + } + + function set_margin_left($val) { + $this->_set_style_side_width_important('margin','left',$val); + } + + function set_margin($val) { + $val = str_replace("none", "0px", $val); + $this->_set_style_type_important('margin','',$val); + } + /**#@-*/ + + /**#@+ + * Sets the padding size + * + * @link http://www.w3.org/TR/CSS21/box.html#padding-properties + * @param $val + */ + function set_padding_top($val) { + $this->_set_style_side_width_important('padding','top',$val); + } + + function set_padding_right($val) { + $this->_set_style_side_width_important('padding','right',$val); + } + + function set_padding_bottom($val) { + $this->_set_style_side_width_important('padding','bottom',$val); + } + + function set_padding_left($val) { + $this->_set_style_side_width_important('padding','left',$val); + } + + function set_padding($val) { + $val = str_replace("none", "0px", $val); + $this->_set_style_type_important('padding','',$val); + } + /**#@-*/ + + /** + * Sets a single border + * + * @param string $side + * @param string $border_spec ([width] [style] [color]) + */ + protected function _set_border($side, $border_spec, $important) { + $border_spec = preg_replace("/\s*\,\s*/", ",", $border_spec); + //$border_spec = str_replace(",", " ", $border_spec); // Why did we have this ?? rbg(10, 102, 10) > rgb(10 102 10) + $arr = explode(" ", $border_spec); + + // FIXME: handle partial values + + //For consistency of individal and combined properties, and with ie8 and firefox3 + //reset all attributes, even if only partially given + $this->_set_style_side_type('border',$side,'_style',self::$_defaults['border_'.$side.'_style'],$important); + $this->_set_style_side_type('border',$side,'_width',self::$_defaults['border_'.$side.'_width'],$important); + $this->_set_style_side_type('border',$side,'_color',self::$_defaults['border_'.$side.'_color'],$important); + + foreach ($arr as $value) { + $value = trim($value); + if ( in_array($value, self::$BORDER_STYLES) ) { + $this->_set_style_side_type('border',$side,'_style',$value,$important); + + } else if ( preg_match("/[.0-9]+(?:px|pt|pc|em|ex|%|in|mm|cm)|(?:thin|medium|thick)/", $value ) ) { + $this->_set_style_side_type('border',$side,'_width',$value,$important); + + } else { + // must be colour + $this->_set_style_side_type('border',$side,'_color',$value,$important); + } + } + + //see __set and __get, on all assignments clear cache! + $this->_prop_cache['border_'.$side] = null; + $this->_props['border_'.$side] = $border_spec; + } + + /**#@+ + * Sets the border styles + * + * @link http://www.w3.org/TR/CSS21/box.html#border-properties + * @param string $val + */ + function set_border_top($val) { $this->_set_border("top", $val, isset($this->_important_props['border_top'])); } + function set_border_right($val) { $this->_set_border("right", $val, isset($this->_important_props['border_right'])); } + function set_border_bottom($val) { $this->_set_border("bottom", $val, isset($this->_important_props['border_bottom'])); } + function set_border_left($val) { $this->_set_border("left", $val, isset($this->_important_props['border_left'])); } + + function set_border($val) { + $important = isset($this->_important_props["border"]); + $this->_set_border("top", $val, $important); + $this->_set_border("right", $val, $important); + $this->_set_border("bottom", $val, $important); + $this->_set_border("left", $val, $important); + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["border"] = null; + $this->_props["border"] = $val; + } + + function set_border_width($val) { + $this->_set_style_type_important('border','_width',$val); + } + + function set_border_color($val) { + $this->_set_style_type_important('border','_color',$val); + } + + function set_border_style($val) { + $this->_set_style_type_important('border','_style',$val); + } + + /**#@+ + * Sets the outline styles + * + * @link http://www.w3.org/TR/CSS21/ui.html#dynamic-outlines + * @param string $val + */ + function set_outline($val) { + $important = isset($this->_important_props["outline"]); + + $props = array( + "outline_style", + "outline_width", + "outline_color", + ); + + foreach($props as $prop) { + $_val = self::$_defaults[$prop]; + + if ( !isset($this->_important_props[$prop]) || $important) { + //see __set and __get, on all assignments clear cache! + $this->_prop_cache[$prop] = null; + if ($important) { + $this->_important_props[$prop] = true; + } + $this->_props[$prop] = $_val; + } + } + + $val = preg_replace("/\s*\,\s*/", ",", $val); // when rgb() has spaces + $arr = explode(" ", $val); + foreach ($arr as $value) { + $value = trim($value); + if ( in_array($value, self::$BORDER_STYLES) ) { + $this->set_outline_style($value); + } else if ( preg_match("/[.0-9]+(?:px|pt|pc|em|ex|%|in|mm|cm)|(?:thin|medium|thick)/", $value ) ) { + $this->set_outline_width($value); + } else { + // must be colour + $this->set_outline_color($value); + } + } + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["outline"] = null; + $this->_props["outline"] = $val; + } + + function set_outline_width($val) { + $this->_set_style_type_important('outline','_width',$val); + } + + function set_outline_color($val) { + $this->_set_style_type_important('outline','_color',$val); + } + + function set_outline_style($val) { + $this->_set_style_type_important('outline','_style',$val); + } + /**#@-*/ + + + /** + * Sets the border spacing + * + * @link http://www.w3.org/TR/CSS21/box.html#border-properties + * @param float $val + */ + function set_border_spacing($val) { + $arr = explode(" ", $val); + + if ( count($arr) == 1 ) + $arr[1] = $arr[0]; + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["border_spacing"] = null; + $this->_props["border_spacing"] = "$arr[0] $arr[1]"; + } + + /** + * Sets the list style image + * + * @link http://www.w3.org/TR/CSS21/generate.html#propdef-list-style-image + * @param $val + */ + function set_list_style_image($val) { + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["list_style_image"] = null; + $this->_props["list_style_image"] = $this->_image($val); + } + + /** + * Sets the list style + * + * @link http://www.w3.org/TR/CSS21/generate.html#propdef-list-style + * @param $val + */ + function set_list_style($val) { + $important = isset($this->_important_props["list_style"]); + $arr = explode(" ", str_replace(",", " ", $val)); + + static $types = array( + "disc", "circle", "square", + "decimal-leading-zero", "decimal", "1", + "lower-roman", "upper-roman", "a", "A", + "lower-greek", + "lower-latin", "upper-latin", + "lower-alpha", "upper-alpha", + "armenian", "georgian", "hebrew", + "cjk-ideographic", "hiragana", "katakana", + "hiragana-iroha", "katakana-iroha", "none" + ); + + static $positions = array("inside", "outside"); + + foreach ($arr as $value) { + /* http://www.w3.org/TR/CSS21/generate.html#list-style + * A value of 'none' for the 'list-style' property sets both 'list-style-type' and 'list-style-image' to 'none' + */ + if ($value === "none") { + $this->_set_style("list_style_type", $value, $important); + $this->_set_style("list_style_image", $value, $important); + continue; + } + + //On setting or merging or inheriting list_style_image as well as list_style_type, + //and url exists, then url has precedence, otherwise fall back to list_style_type + //Firefox is wrong here (list_style_image gets overwritten on explicite list_style_type) + //Internet Explorer 7/8 and dompdf is right. + + if (mb_substr($value, 0, 3) === "url") { + $this->_set_style("list_style_image", $this->_image($value), $important); + continue; + } + + if ( in_array($value, $types) ) { + $this->_set_style("list_style_type", $value, $important); + } else if ( in_array($value, $positions) ) { + $this->_set_style("list_style_position", $value, $important); + } + } + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["list_style"] = null; + $this->_props["list_style"] = $val; + } + + function set_size($val) { + $length_re = "/(\d+\s*(?:pt|px|pc|em|ex|in|cm|mm|%))/"; + + $val = mb_strtolower($val); + + if ( $val === "auto" ) { + return; + } + + $parts = preg_split("/\s+/", $val); + + $computed = array(); + if ( preg_match($length_re, $parts[0]) ) { + $computed[] = $this->length_in_pt($parts[0]); + + if ( isset($parts[1]) && preg_match($length_re, $parts[1]) ) { + $computed[] = $this->length_in_pt($parts[1]); + } + else { + $computed[] = $computed[0]; + } + } + elseif ( isset(CPDF_Adapter::$PAPER_SIZES[$parts[0]]) ) { + $computed = array_slice(CPDF_Adapter::$PAPER_SIZES[$parts[0]], 2, 2); + + if ( isset($parts[1]) && $parts[1] === "landscape" ) { + $computed = array_reverse($computed); + } + } + else { + return; + } + + $this->_props["size"] = $computed; + } + + /** + * Sets the CSS3 transform property + * + * @link http://www.w3.org/TR/css3-2d-transforms/#transform-property + * @param string $val + */ + function set_transform($val) { + $number = "\s*([^,\s]+)\s*"; + $tr_value = "\s*([^,\s]+)\s*"; + $angle = "\s*([^,\s]+(?:deg|rad)?)\s*"; + + if( !preg_match_all("/[a-z]+\([^\)]+\)/i", $val, $parts, PREG_SET_ORDER) ) { + return; + } + + $functions = array( + //"matrix" => "\($number,$number,$number,$number,$number,$number\)", + + "translate" => "\($tr_value(?:,$tr_value)?\)", + "translateX" => "\($tr_value\)", + "translateY" => "\($tr_value\)", + + "scale" => "\($number(?:,$number)?\)", + "scaleX" => "\($number\)", + "scaleY" => "\($number\)", + + "rotate" => "\($angle\)", + + "skew" => "\($angle(?:,$angle)?\)", + "skewX" => "\($angle\)", + "skewY" => "\($angle\)", + ); + + $transforms = array(); + + foreach($parts as $part) { + $t = $part[0]; + + foreach($functions as $name => $pattern) { + if (preg_match("/$name\s*$pattern/i", $t, $matches)) { + $values = array_slice($matches, 1); + + switch($name) { + // units + case "rotate": + case "skew": + case "skewX": + case "skewY": + + foreach($values as $i => $value) { + if ( strpos($value, "rad") ) + $values[$i] = rad2deg(floatval($value)); + else + $values[$i] = floatval($value); + } + + switch($name) { + case "skew": + if ( !isset($values[1]) ) + $values[1] = 0; + break; + case "skewX": + $name = "skew"; + $values = array($values[0], 0); + break; + case "skewY": + $name = "skew"; + $values = array(0, $values[0]); + break; + } + break; + + // units + case "translate": + $values[0] = $this->length_in_pt($values[0], $this->width); + + if ( isset($values[1]) ) + $values[1] = $this->length_in_pt($values[1], $this->height); + else + $values[1] = 0; + break; + + case "translateX": + $name = "translate"; + $values = array($this->length_in_pt($values[0], $this->width), 0); + break; + + case "translateY": + $name = "translate"; + $values = array(0, $this->length_in_pt($values[0], $this->height)); + break; + + // units + case "scale": + if ( !isset($values[1]) ) + $values[1] = $values[0]; + break; + + case "scaleX": + $name = "scale"; + $values = array($values[0], 1.0); + break; + + case "scaleY": + $name = "scale"; + $values = array(1.0, $values[0]); + break; + } + + $transforms[] = array( + $name, + $values, + ); + } + } + } + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["transform"] = null; + $this->_props["transform"] = $transforms; + } + + function set__webkit_transform($val) { + return $this->set_transform($val); + } + + function set__webkit_transform_origin($val) { + return $this->set_transform_origin($val); + } + + /** + * Sets the CSS3 transform-origin property + * + * @link http://www.w3.org/TR/css3-2d-transforms/#transform-origin + * @param string $val + */ + function set_transform_origin($val) { + $values = preg_split("/\s+/", $val); + + if ( count($values) === 0) { + return; + } + + foreach($values as &$value) { + if ( in_array($value, array("top", "left")) ) { + $value = 0; + } + + if ( in_array($value, array("bottom", "right")) ) { + $value = "100%"; + } + } + + if ( !isset($values[1]) ) { + $values[1] = $values[0]; + } + + //see __set and __get, on all assignments clear cache, not needed on direct set through __set + $this->_prop_cache["transform_origin"] = null; + $this->_props["transform_origin"] = $values; + } + + /** + * Generate a string representation of the Style + * + * This dumps the entire property array into a string via print_r. Useful + * for debugging. + * + * @return string + */ + /*DEBUGCSS print: see below additional debugging util*/ + function __toString() { + return print_r(array_merge(array("parent_font_size" => $this->_parent_font_size), + $this->_props), true); + } + +/*DEBUGCSS*/ function debug_print() +/*DEBUGCSS*/ { +/*DEBUGCSS*/ print "parent_font_size:".$this->_parent_font_size . ";\n"; +/*DEBUGCSS*/ foreach($this->_props as $prop => $val ) { +/*DEBUGCSS*/ print $prop.':'.$val; +/*DEBUGCSS*/ if (isset($this->_important_props[$prop])) { +/*DEBUGCSS*/ print '!important'; +/*DEBUGCSS*/ } +/*DEBUGCSS*/ print ";\n"; +/*DEBUGCSS*/ } +/*DEBUGCSS*/ } +} diff --git a/application/third_party/dompdf/include/stylesheet.cls.php b/application/third_party/dompdf/include/stylesheet.cls.php new file mode 100755 index 00000000..3107d087 --- /dev/null +++ b/application/third_party/dompdf/include/stylesheet.cls.php @@ -0,0 +1,1202 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - Specifity of css selector chain was too small because leading whitespace + * to be counted as number of elements was removed + * - On parsing css properties accept and register !important attribute + * - Add optional debug output + * @version 20090610 + * - _parse_properties on style property name and value remove augmenting superflous + * space for consistent parsing, in particular combined values like background + */ + +/* $Id: stylesheet.cls.php 360 2011-02-15 19:33:52Z fabien.menager $ */ + +/** + * The location of the default built-in CSS file. + * {@link Stylesheet::DEFAULT_STYLESHEET} + */ +define('__DEFAULT_STYLESHEET', DOMPDF_LIB_DIR . DIRECTORY_SEPARATOR . "res" . DIRECTORY_SEPARATOR . "html.css"); + +/** + * The master stylesheet class + * + * The Stylesheet class is responsible for parsing stylesheets and style + * tags/attributes. It also acts as a registry of the individual Style + * objects generated by the current set of loaded CSS files and style + * elements. + * + * @see Style + * @package dompdf + */ +class Stylesheet { + + /** + * The location of the default built-in CSS file. + */ + const DEFAULT_STYLESHEET = __DEFAULT_STYLESHEET; + + /** + * Array of currently defined styles + * @var array + */ + private $_styles; + + /** + * Base protocol of the document being parsed + * Used to handle relative urls. + * @var string + */ + private $_protocol; + + /** + * Base hostname of the document being parsed + * Used to handle relative urls. + * @var string + */ + private $_base_host; + + /** + * Base path of the document being parsed + * Used to handle relative urls. + * @var string + */ + private $_base_path; + + /** + * The style defined by @page rules + * @var Style + */ + private $_page_style; + + /** + * List of loaded files, used to prevent recursion + * @var array + */ + private $_loaded_files; + + /** + * Accepted CSS media types + * List of types and parsing rules for future extensions: + * http://www.w3.org/TR/REC-html40/types.html + * screen, tty, tv, projection, handheld, print, braille, aural, all + * The following are non standard extensions for undocumented specific environments. + * static, visual, bitmap, paged, dompdf + * Note, even though the generated pdf file is intended for print output, + * the desired content might be different (e.g. screen or projection view of html file). + * Therefore allow specification of content by dompdf setting DOMPDF_DEFAULT_MEDIA_TYPE. + * If given, replace media "print" by DOMPDF_DEFAULT_MEDIA_TYPE. + * (Previous version $ACCEPTED_MEDIA_TYPES = $ACCEPTED_GENERIC_MEDIA_TYPES + $ACCEPTED_DEFAULT_MEDIA_TYPE) + */ + static $ACCEPTED_DEFAULT_MEDIA_TYPE = "print"; + static $ACCEPTED_GENERIC_MEDIA_TYPES = array("all", "static", "visual", "bitmap", "paged", "dompdf"); + + /** + * The class constructor. + * + * The base protocol, host & path are initialized to those of + * the current script. + */ + function __construct() { + $this->_styles = array(); + $this->_loaded_files = array(); + list($this->_protocol, $this->_base_host, $this->_base_path) = explode_url($_SERVER["SCRIPT_FILENAME"]); + $this->_page_style = null; + } + + /** + * Class destructor + */ + function __destruct() { + clear_object($this); + } + + /** + * Set the base protocol + * + * @param string $proto + */ + function set_protocol($proto) { $this->_protocol = $proto; } + + /** + * Set the base host + * + * @param string $host + */ + function set_host($host) { $this->_base_host = $host; } + + /** + * Set the base path + * + * @param string $path + */ + function set_base_path($path) { $this->_base_path = $path; } + + /** + * Return the base protocol for this stylesheet + * + * @return string + */ + function get_protocol() { return $this->_protocol; } + + /** + * Return the base host for this stylesheet + * + * @return string + */ + function get_host() { return $this->_base_host; } + + /** + * Return the base path for this stylesheet + * + * @return string + */ + function get_base_path() { return $this->_base_path; } + + /** + * Return the page style + * + * @return Style + */ + function get_page_style() { return $this->_page_style; } + + /** + * Add a new Style object to the stylesheet + * + * add_style() adds a new Style object to the current stylesheet, or + * merges a new Style with an existing one. + * + * @param string $key the Style's selector + * @param Style $style the Style to be added + */ + function add_style($key, Style $style) { + if (!is_string($key)) + throw new DOMPDF_Exception("CSS rule must be keyed by a string."); + + if ( isset($this->_styles[$key]) ) + $this->_styles[$key]->merge($style); + else + $this->_styles[$key] = clone $style; + } + + /** + * lookup a specifc Style object + * + * lookup() returns the Style specified by $key, or null if the Style is + * not found. + * + * @param string $key the selector of the requested Style + * @return Style + */ + function lookup($key) { + if ( !isset($this->_styles[$key]) ) + return null; + + return $this->_styles[$key]; + } + + /** + * create a new Style object associated with this stylesheet + * + * @param Style $parent The style of this style's parent in the DOM tree + * @return Style + */ + function create_style(Style $parent = null) { + return new Style($this, $parent); + } + + /** + * load and parse a CSS string + * + * @param string $css + */ + function load_css(&$css) { $this->_parse_css($css); } + + + /** + * load and parse a CSS file + * + * @param string $file + */ + function load_css_file($file) { + global $_dompdf_warnings; + + // Prevent circular references + if ( isset($this->_loaded_files[$file]) ) + return; + + $this->_loaded_files[$file] = true; + $parsed_url = explode_url($file); + + list($this->_protocol, $this->_base_host, $this->_base_path, $filename) = $parsed_url; + + if ( !DOMPDF_ENABLE_REMOTE && + ($this->_protocol != "" && $this->_protocol !== "file://") ) { + record_warnings(E_USER_WARNING, "Remote CSS file '$file' requested, but DOMPDF_ENABLE_REMOTE is false.", __FILE__, __LINE__); + return; + } + + // Fix submitted by Nick Oostveen for aliased directory support: + if ( $this->_protocol == "" ) + $file = $this->_base_path . $filename; + else + $file = build_url($this->_protocol, $this->_base_host, $this->_base_path, $filename); + + set_error_handler("record_warnings"); + $css = file_get_contents($file); + restore_error_handler(); + + if ( $css == "" ) { + record_warnings(E_USER_WARNING, "Unable to load css file $file", __FILE__, __LINE__);; + return; + } + + $this->_parse_css($css); + } + + /** + * @link http://www.w3.org/TR/CSS21/cascade.html#specificity} + * + * @param string $selector + * @return int + */ + private function _specificity($selector) { + // http://www.w3.org/TR/CSS21/cascade.html#specificity + // ignoring the ":" pseudoclass modifyers + // also ignored in _css_selector_to_xpath + + $a = ($selector === "!style attribute") ? 1 : 0; + + $b = min(mb_substr_count($selector, "#"), 255); + + $c = min(mb_substr_count($selector, ".") + + mb_substr_count($selector, "["), 255); + + $d = min(mb_substr_count($selector, " ") + + mb_substr_count($selector, ">") + + mb_substr_count($selector, "+"), 255); + + //If a normal element name is at the begining of the string, + //a leading whitespace might have been removed on whitespace collapsing and removal + //therefore there might be one whitespace less as selected element names + //this can lead to a too small specificity + //see _css_selector_to_xpath + + if ( !in_array($selector[0], array(" ", ">", ".", "#", "+", ":", "[")) ) { + $d++; + } + + if (DEBUGCSS) { + /*DEBUGCSS*/ print "
\n";
+      /*DEBUGCSS*/	printf("_specificity(): 0x%08x \"%s\"\n", ($a << 24) | ($b << 16) | ($c << 8) | ($d), $selector);
+      /*DEBUGCSS*/	print "
"; + } + + return ($a << 24) | ($b << 16) | ($c << 8) | ($d); + } + + /** + * converts a CSS selector to an XPath query. + * + * @param string $selector + * @return string + */ + private function _css_selector_to_xpath($selector, $first_pass = false) { + + // Collapse white space and strip whitespace around delimiters +// $search = array("/\\s+/", "/\\s+([.>#+:])\\s+/"); +// $replace = array(" ", "\\1"); +// $selector = preg_replace($search, $replace, trim($selector)); + + // Initial query (non-absolute) + $query = "//"; + + // Will contain :before and :after if they must be created + $pseudo_elements = array(); + + // Parse the selector + //$s = preg_split("/([ :>.#+])/", $selector, -1, PREG_SPLIT_DELIM_CAPTURE); + + $delimiters = array(" ", ">", ".", "#", "+", ":", "["); + + // Add an implicit * at the beginning of the selector + // if it begins with an attribute selector + if ( $selector[0] === "[" ) + $selector = "*$selector"; + + // Add an implicit space at the beginning of the selector if there is no + // delimiter there already. + if ( !in_array($selector[0], $delimiters) ) + $selector = " $selector"; + + $tok = ""; + $len = mb_strlen($selector); + $i = 0; + + while ( $i < $len ) { + + $s = $selector[$i]; + $i++; + + // Eat characters up to the next delimiter + $tok = ""; + $in_attr = false; + + while ($i < $len) { + $c = $selector[$i]; + $c_prev = $selector[$i-1]; + + if ( !$in_attr && in_array($c, $delimiters) ) + break; + + if ( $c_prev === "[" ) { + $in_attr = true; + } + + $tok .= $selector[$i++]; + } + + switch ($s) { + + case " ": + case ">": + // All elements matching the next token that are direct children of + // the current token + $expr = $s === " " ? "descendant" : "child"; + + if ( mb_substr($query, -1, 1) !== "/" ) + $query .= "/"; + + if ( !$tok ) + $tok = "*"; + + $query .= "$expr::$tok"; + $tok = ""; + break; + + case ".": + case "#": + // All elements matching the current token with a class/id equal to + // the _next_ token. + + $attr = $s === "." ? "class" : "id"; + + // empty class/id == * + if ( mb_substr($query, -1, 1) === "/" ) + $query .= "*"; + + // Match multiple classes: $tok contains the current selected + // class. Search for class attributes with class="$tok", + // class=".* $tok .*" and class=".* $tok" + + // This doesn't work because libxml only supports XPath 1.0... + //$query .= "[matches(@$attr,\"^${tok}\$|^${tok}[ ]+|[ ]+${tok}\$|[ ]+${tok}[ ]+\")]"; + + // Query improvement by Michael Sheakoski : + $query .= "[contains(concat(' ', @$attr, ' '), concat(' ', '$tok', ' '))]"; + $tok = ""; + break; + + case "+": + // All sibling elements that folow the current token + if ( mb_substr($query, -1, 1) !== "/" ) + $query .= "/"; + + $query .= "following-sibling::$tok"; + $tok = ""; + break; + + case ":": + // Pseudo-classes + switch ($tok) { + + case "first-child": + $query .= "[1]"; + $tok = ""; + break; + + case "last-child": + $query .= "[not(following-sibling::*)]"; + $tok = ""; + break; + + case "link": + $query .= "[@href]"; + $tok = ""; + break; + + case "first-line": // TODO + case "first-letter": // TODO + + // N/A + case "active": + case "visited": + $query .= "[@dummy]"; + $tok = ""; + break; + + /* Pseudo-elements */ + case "before": + case "after": + if ( $first_pass ) + $pseudo_elements[$tok] = $tok; + else + $query .= "/*[@$tok]"; + + $tok = ""; + break; + + case "empty": + $query .= "[not(*) and not(normalize-space())]"; + $tok = ""; + break; + + case "disabled": + case "checked": + $query .= "[@$tok]"; + $tok = ""; + break; + + case "enabled": + $query .= "[not(@disabled)]"; + $tok = ""; + break; + } + + break; + + case "[": + // Attribute selectors. All with an attribute matching the following token(s) + $attr_delimiters = array("=", "]", "~", "|", "$", "^", "*"); + $tok_len = mb_strlen($tok); + $j = 0; + + $attr = ""; + $op = ""; + $value = ""; + + while ( $j < $tok_len ) { + if ( in_array($tok[$j], $attr_delimiters) ) + break; + $attr .= $tok[$j++]; + } + + switch ( $tok[$j] ) { + + case "~": + case "|": + case "$": + case "^": + case "*": + $op .= $tok[$j++]; + + if ( $tok[$j] !== "=" ) + throw new DOMPDF_Exception("Invalid CSS selector syntax: invalid attribute selector: $selector"); + + $op .= $tok[$j]; + break; + + case "=": + $op = "="; + break; + + } + + // Read the attribute value, if required + if ( $op != "" ) { + $j++; + while ( $j < $tok_len ) { + if ( $tok[$j] === "]" ) + break; + $value .= $tok[$j++]; + } + } + + if ( $attr == "" ) + throw new DOMPDF_Exception("Invalid CSS selector syntax: missing attribute name"); + + $value = trim($value, "\"'"); + + switch ( $op ) { + + case "": + $query .= "[@$attr]"; + break; + + case "=": + $query .= "[@$attr=\"$value\"]"; + break; + + case "~=": + // FIXME: this will break if $value contains quoted strings + // (e.g. [type~="a b c" "d e f"]) + $values = explode(" ", $value); + $query .= "["; + + foreach ( $values as $val ) + $query .= "@$attr=\"$val\" or "; + + $query = rtrim($query, " or ") . "]"; + break; + + case "|=": + $values = explode("-", $value); + $query .= "["; + + foreach ( $values as $val ) + $query .= "starts-with(@$attr, \"$val\") or "; + + $query = rtrim($query, " or ") . "]"; + break; + + case "$=": + $query .= "[substring(@$attr, string-length(@$attr)-".(strlen($value) - 1).")=\"$value\"]"; + break; + + case "^=": + $query .= "[starts-with(@$attr,\"$value\")]"; + break; + + case "*=": + $query .= "[contains(@$attr,\"$value\")]"; + break; + } + + break; + } + } + $i++; + +// case ":": +// // Pseudo selectors: ignore for now. Partially handled directly +// // below. + +// // Skip until the next special character, leaving the token as-is +// while ( $i < $len ) { +// if ( in_array($selector[$i], $delimiters) ) +// break; +// $i++; +// } +// break; + +// default: +// // Add the character to the token +// $tok .= $selector[$i++]; +// break; +// } + +// } + + + // Trim the trailing '/' from the query + if ( mb_strlen($query) > 2 ) + $query = rtrim($query, "/"); + + return array("query" => $query, "pseudo_elements" => $pseudo_elements); + } + + /** + * applies all current styles to a particular document tree + * + * apply_styles() applies all currently loaded styles to the provided + * {@link Frame_Tree}. Aside from parsing CSS, this is the main purpose + * of this class. + * + * @param Frame_Tree $tree + */ + function apply_styles(Frame_Tree $tree) { + + // Use XPath to select nodes. This would be easier if we could attach + // Frame objects directly to DOMNodes using the setUserData() method, but + // we can't do that just yet. Instead, we set a _node attribute_ in + // Frame->set_id() and use that as a handle on the Frame object via + // Frame_Tree::$_registry. + + // We create a scratch array of styles indexed by frame id. Once all + // styles have been assigned, we order the cached styles by specificity + // and create a final style object to assign to the frame. + + // FIXME: this is not particularly robust... + + $styles = array(); + $xp = new DOMXPath($tree->get_dom()); + + // Add generated content + foreach ($this->_styles as $selector => $style) { + if (strpos($selector, ":before") === false && + strpos($selector, ":after") === false) continue; + + $query = $this->_css_selector_to_xpath($selector, true); + + // Retrieve the nodes + $nodes = @$xp->query($query["query"]); + if ($nodes == null) { + record_warnings(E_USER_WARNING, "The CSS selector '$selector' is not valid", __FILE__, __LINE__); + continue; + } + + foreach ($nodes as $i => $node) { + foreach ($query["pseudo_elements"] as $pos) { + if (($src = $this->_image($style->content)) !== "none") { + $new_node = $node->ownerDocument->createElement("img_generated"); + $new_node->setAttribute("src", $src); + } + else { + $new_node = $node->ownerDocument->createElement("dompdf_generated"); + } + $new_node->setAttribute($pos, $pos); + + $tree->insert_node($node, $new_node, $pos); + } + } + } + + // Apply all styles in stylesheet + foreach ($this->_styles as $selector => $style) { + $query = $this->_css_selector_to_xpath($selector); + + // Retrieve the nodes + $nodes = @$xp->query($query["query"]); + if ($nodes == null) { + record_warnings(E_USER_WARNING, "The CSS selector '$selector' is not valid", __FILE__, __LINE__); + continue; + } + + foreach ($nodes as $node) { + // Retrieve the node id + if ( $node->nodeType != XML_ELEMENT_NODE ) // Only DOMElements get styles + continue; + + $id = $node->getAttribute("frame_id"); + + // Assign the current style to the scratch array + $spec = $this->_specificity($selector); + $styles[$id][$spec][] = $style; + } + } + + // Now create the styles and assign them to the appropriate frames. (We + // iterate over the tree using an implicit Frame_Tree iterator.) + $root_flg = false; + foreach ($tree->get_frames() as $frame) { + // pre_r($frame->get_node()->nodeName . ":"); + if ( !$root_flg && $this->_page_style ) { + $style = $this->_page_style; + $root_flg = true; + } else + $style = $this->create_style(); + + // Find nearest DOMElement parent + $p = $frame; + while ( $p = $p->get_parent() ) + if ($p->get_node()->nodeType == XML_ELEMENT_NODE ) + break; + + // Styles can only be applied directly to DOMElements; anonymous + // frames inherit from their parent + if ( $frame->get_node()->nodeType != XML_ELEMENT_NODE ) { + if ( $p ) + $style->inherit($p->get_style()); + $frame->set_style($style); + continue; + } + + $id = $frame->get_id(); + + // Handle HTML 4.0 attributes + Attribute_Translator::translate_attributes($frame); + + // Locate any additional style attributes + if ( ($str = $frame->get_node()->getAttribute("style")) !== "" ) { + // Destroy CSS comments + $str = preg_replace("'/\*.*?\*/'si", "", $str); + + $spec = $this->_specificity("!style attribute"); + $styles[$id][$spec][] = $this->_parse_properties($str); + } + + // Grab the applicable styles + if ( isset($styles[$id]) ) { + + $applied_styles = $styles[ $frame->get_id() ]; + + // Sort by specificity + ksort($applied_styles); + + if (DEBUGCSS) { + $debug_nodename = $frame->get_node()->nodeName; + print "
\n[$debug_nodename\n";
+          foreach ($applied_styles as $spec => $arr) {
+            printf("specificity: 0x%08x\n",$spec);
+            foreach ($arr as $s) {
+              print "[\n";
+              $s->debug_print();
+              print "]\n";
+            }
+          }
+        }
+        
+        // Merge the new styles with the inherited styles
+        foreach ($applied_styles as $arr) {
+          foreach ($arr as $s)
+            $style->merge($s);
+        }
+      }
+
+      // Inherit parent's styles if required
+      if ( $p ) {
+
+        if (DEBUGCSS) {
+          print "inherit:\n";
+          print "[\n";
+          $p->get_style()->debug_print();
+          print "]\n";
+        }
+
+        $style->inherit( $p->get_style() );
+      }
+
+      if (DEBUGCSS) {
+        print "DomElementStyle:\n";
+        print "[\n";
+        $style->debug_print();
+        print "]\n";
+        print "/$debug_nodename]\n
"; + } + + /*DEBUGCSS print: see below different print debugging method + pre_r($frame->get_node()->nodeName . ":"); + echo "
";
+      echo $style;
+      echo "
";*/ + $frame->set_style($style); + + } + + // We're done! Clean out the registry of all styles since we + // won't be needing this later. + foreach ( array_keys($this->_styles) as $key ) { + $this->_styles[$key] = null; + unset($this->_styles[$key]); + } + + } + + + /** + * parse a CSS string using a regex parser + * + * Called by {@link Stylesheet::parse_css()} + * + * @param string $str + */ + private function _parse_css($str) { + + $str = trim($str); + + // Destroy comments and remove HTML comments + $css = preg_replace(array( + "'/\*.*?\*/'si", + "/^$/" + ), "", $str); + + // FIXME: handle '{' within strings, e.g. [attr="string {}"] + + // Something more legible: + $re = + "/\s* # Skip leading whitespace \n". + "( @([^\s]+)\s+([^{;]*) (?:;|({)) )? # Match @rules followed by ';' or '{' \n". + "(?(1) # Only parse sub-sections if we're in an @rule... \n". + " (?(4) # ...and if there was a leading '{' \n". + " \s*( (?:(?>[^{}]+) ({)? # Parse rulesets and individual @page rules \n". + " (?(6) (?>[^}]*) }) \s*)+? \n". + " ) \n". + " }) # Balancing '}' \n". + "| # Branch to match regular rules (not preceeded by '@')\n". + "([^{]*{[^}]*})) # Parse normal rulesets\n". + "/xs"; + + if ( preg_match_all($re, $css, $matches, PREG_SET_ORDER) === false ) + // An error occured + throw new DOMPDF_Exception("Error parsing css file: preg_match_all() failed."); + + // After matching, the array indicies are set as follows: + // + // [0] => complete text of match + // [1] => contains '@import ...;' or '@media {' if applicable + // [2] => text following @ for cases where [1] is set + // [3] => media types or full text following '@import ...;' + // [4] => '{', if present + // [5] => rulesets within media rules + // [6] => '{', within media rules + // [7] => individual rules, outside of media rules + // + //pre_r($matches); + foreach ( $matches as $match ) { + $match[2] = trim($match[2]); + + if ( $match[2] !== "" ) { + // Handle @rules + switch ($match[2]) { + + case "import": + $this->_parse_import($match[3]); + break; + + case "media": + $acceptedmedia = self::$ACCEPTED_GENERIC_MEDIA_TYPES; + if ( defined("DOMPDF_DEFAULT_MEDIA_TYPE") ) { + $acceptedmedia[] = DOMPDF_DEFAULT_MEDIA_TYPE; + } else { + $acceptedmedia[] = self::$ACCEPTED_DEFAULT_MEDIA_TYPE; + } + if ( in_array(mb_strtolower(trim($match[3])), $acceptedmedia ) ) { + $this->_parse_sections($match[5]); + } + break; + + case "page": + //This handles @page to be applied to page oriented media + //Note: This has a reduced syntax: + //@page { margin:1cm; color:blue; } + //Not a sequence of styles like a full.css, but only the properties + //of a single style, which is applied to the very first "root" frame before + //processing other styles of the frame. + //Working properties: + // margin (for margin around edge of paper) + // font-family (default font of pages) + // color (default text color of pages) + //Non working properties: + // border + // padding + // background-color + //Todo:Reason is unknown + //Other properties (like further font or border attributes) not tested. + //If a border or background color around each paper sheet is desired, + //assign it to the tag, possibly only for the css of the correct media type. + + // If the page has a name, skip the style. + if ($match[3] !== "") + return; + + // Store the style for later... + if ( is_null($this->_page_style) ) + $this->_page_style = $this->_parse_properties($match[5]); + else + $this->_page_style->merge($this->_parse_properties($match[5])); + break; + + case "font-face": + $this->_parse_font_face($match[5]); + break; + + default: + // ignore everything else + break; + } + + continue; + } + + if ( $match[7] !== "" ) + $this->_parse_sections($match[7]); + + } + } + + /* See also style.cls Style::_image(), refactoring?, works also for imported css files */ + protected function _image($val) { + $DEBUGCSS=DEBUGCSS; + + if ( mb_strpos($val, "url") === false ) { + $path = "none"; //Don't resolve no image -> otherwise would prefix path and no longer recognize as none + } + else { + $val = preg_replace("/url\(['\"]?([^'\")]+)['\"]?\)/","\\1", trim($val)); + + // Resolve the url now in the context of the current stylesheet + $parsed_url = explode_url($val); + if ( $parsed_url["protocol"] == "" && $this->get_protocol() == "" ) { + if ($parsed_url["path"][0] === '/' || $parsed_url["path"][0] === '\\' ) { + $path = $_SERVER["DOCUMENT_ROOT"].'/'; + } else { + $path = $this->get_base_path(); + } + $path .= $parsed_url["path"] . $parsed_url["file"]; + $path = realpath($path); + // If realpath returns FALSE then specifically state that there is no background image + // FIXME: Is this causing problems for imported CSS files? There are some './none' references when running the test cases. + if (!$path) { $path = 'none'; } + } else { + $path = build_url($this->get_protocol(), + $this->get_host(), + $this->get_base_path(), + $val); + } + } + if ($DEBUGCSS) { + print "
[_image\n";
+      print_r($parsed_url);
+      print $this->get_protocol()."\n".$this->get_base_path()."\n".$path."\n";
+      print "_image]
";; + } + return $path; + } + + /** + * parse @import{} sections + * + * @param string $url the url of the imported CSS file + */ + private function _parse_import($url) { + $arr = preg_split("/[\s\n,]/", $url,-1, PREG_SPLIT_NO_EMPTY); + $url = array_shift($arr); + $accept = false; + + if ( count($arr) > 0 ) { + + $acceptedmedia = self::$ACCEPTED_GENERIC_MEDIA_TYPES; + if ( defined("DOMPDF_DEFAULT_MEDIA_TYPE") ) { + $acceptedmedia[] = DOMPDF_DEFAULT_MEDIA_TYPE; + } else { + $acceptedmedia[] = self::$ACCEPTED_DEFAULT_MEDIA_TYPE; + } + + // @import url media_type [media_type...] + foreach ( $arr as $type ) { + if ( in_array(mb_strtolower(trim($type)), $acceptedmedia) ) { + $accept = true; + break; + } + } + + } else { + // unconditional import + $accept = true; + } + + if ( $accept ) { + // Store our current base url properties in case the new url is elsewhere + $protocol = $this->_protocol; + $host = $this->_base_host; + $path = $this->_base_path; + + // $url = str_replace(array('"',"url", "(", ")"), "", $url); + // If the protocol is php, assume that we will import using file:// + // $url = build_url($protocol == "php://" ? "file://" : $protocol, $host, $path, $url); + // Above does not work for subfolders and absolute urls. + // Todo: As above, do we need to replace php or file to an empty protocol for local files? + + $url = $this->_image($url); + + $this->load_css_file($url); + + // Restore the current base url + $this->_protocol = $protocol; + $this->_base_host = $host; + $this->_base_path = $path; + } + + } + + /** + * parse @font-face{} sections + * http://www.w3.org/TR/css3-fonts/#the-font-face-rule + * + * @param string $str CSS @font-face rules + * @return Style + */ + private function _parse_font_face($str) { + $descriptors = $this->_parse_properties($str); + + preg_match_all("/(url|local)\s*\([\"\']?([^\"\'\)]+)[\"\']?\)\s*(format\s*\([\"\']?([^\"\'\)]+)[\"\']?\))?/i", $descriptors->src, $src); + + $sources = array(); + foreach($src[0] as $i => $value) { + $sources[] = array( + "local" => strtolower($src[1][$i]) === "local", + "uri" => $src[2][$i], + "format" => $src[4][$i], + ); + } + + //@todo download font file, ttf2afm, etc + } + + /** + * parse regular CSS blocks + * + * _parse_properties() creates a new Style object based on the provided + * CSS rules. + * + * @param string $str CSS rules + * @return Style + */ + private function _parse_properties($str) { + $properties = preg_split("/;(?=(?:[^\(]*\([^\)]*\))*(?![^\)]*\)))/", $str); + + if (DEBUGCSS) print '[_parse_properties'; + + // Create the style + $style = new Style($this); + foreach ($properties as $prop) { + // If the $prop contains an url, the regex may be wrong + // @todo: fix the regex so that it works everytime + /*if (strpos($prop, "url(") === false) { + if (preg_match("/([a-z-]+)\s*:\s*[^:]+$/i", $prop, $m)) + $prop = $m[0]; + }*/ + //A css property can have " ! important" appended (whitespace optional) + //strip this off to decode core of the property correctly. + //Pass on in the style to allow proper handling: + //!important properties can only be overridden by other !important ones. + //$style->$prop_name = is a shortcut of $style->__set($prop_name,$value);. + //If no specific set function available, set _props["prop_name"] + //style is always copied completely, or $_props handled separately + //Therefore set a _important_props["prop_name"]=true to indicate the modifier + + /* Instead of short code, prefer the typical case with fast code + $important = preg_match("/(.*?)!\s*important/",$prop,$match); + if ( $important ) { + $prop = $match[1]; + } + $prop = trim($prop); + */ + if (DEBUGCSS) print '('; + $important = false; + $prop = trim($prop); + if (substr($prop,-9) === 'important') { + $prop_tmp = rtrim(substr($prop,0,-9)); + if (substr($prop_tmp,-1) === '!') { + $prop = rtrim(substr($prop_tmp,0,-1)); + $important = true; + } + } + + if ($prop == "") { + if (DEBUGCSS) print 'empty)'; + continue; + } + + $i = mb_strpos($prop, ":"); + if ( $i === false ) { + if (DEBUGCSS) print 'novalue'.$prop.')'; + continue; + } + + $prop_name = rtrim(mb_strtolower(mb_substr($prop, 0, $i))); + $value = ltrim(mb_substr($prop, $i+1)); + if (DEBUGCSS) print $prop_name.':='.$value.($important?'!IMPORTANT':'').')'; + //New style, anyway empty + //if ($important || !$style->important_get($prop_name) ) { + //$style->$prop_name = array($value,$important); + //assignment might be replaced by overloading through __set, + //and overloaded functions might check _important_props, + //therefore set _important_props first. + if ($important) { + $style->important_set($prop_name); + } + //For easier debugging, don't use overloading of assignments with __set + $style->$prop_name = $value; + //$style->props_set($prop_name, $value); + } + if (DEBUGCSS) print '_parse_properties]'; + + return $style; + } + + /** + * parse selector + rulesets + * + * @param string $str CSS selectors and rulesets + */ + private function _parse_sections($str) { + // Pre-process: collapse all whitespace and strip whitespace around '>', + // '.', ':', '+', '#' + + $patterns = array("/[\\s\n]+/", "/\\s+([>.:+#])\\s+/"); + $replacements = array(" ", "\\1"); + $str = preg_replace($patterns, $replacements, $str); + + $sections = explode("}", $str); + if (DEBUGCSS) print '[_parse_sections'; + foreach ($sections as $sect) { + $i = mb_strpos($sect, "{"); + + $selectors = explode(",", mb_substr($sect, 0, $i)); + if (DEBUGCSS) print '[section'; + $style = $this->_parse_properties(trim(mb_substr($sect, $i+1))); + + // Assign it to the selected elements + foreach ($selectors as $selector) { + $selector = trim($selector); + + if ($selector == "") { + if (DEBUGCSS) print '#empty#'; + continue; + } + if (DEBUGCSS) print '#'.$selector.'#'; + //if (DEBUGCSS) { if (strpos($selector,'p') !== false) print '!!!p!!!#'; } + + $this->add_style($selector, $style); + } + if (DEBUGCSS) print 'section]'; + } + if (DEBUGCSS) print '_parse_sections]'; + } + + /** + * dumps the entire stylesheet as a string + * + * Generates a string of each selector and associated style in the + * Stylesheet. Useful for debugging. + * + * @return string + */ + function __toString() { + $str = ""; + foreach ($this->_styles as $selector => $style) + $str .= "$selector => " . $style->__toString() . "\n"; + + return $str; + } +} diff --git a/application/third_party/dompdf/include/table_cell_frame_decorator.cls.php b/application/third_party/dompdf/include/table_cell_frame_decorator.cls.php new file mode 100755 index 00000000..d23eaa44 --- /dev/null +++ b/application/third_party/dompdf/include/table_cell_frame_decorator.cls.php @@ -0,0 +1,135 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_cell_frame_decorator.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Decorates table cells for layout + * + * @access private + * @package dompdf + */ +class Table_Cell_Frame_Decorator extends Block_Frame_Decorator { + + protected $_resolved_borders; + protected $_content_height; + + //........................................................................ + + function __construct(Frame $frame, DOMPDF $dompdf) { + parent::__construct($frame, $dompdf); + $this->_resolved_borders = array(); + $this->_content_height = 0; + } + + //........................................................................ + + function reset() { + parent::reset(); + $this->_resolved_borders = array(); + $this->_content_height = 0; + $this->_frame->reset(); + } + + function get_content_height() { + return $this->_content_height; + } + + function set_content_height($height) { + $this->_content_height = $height; + } + + function set_cell_height($height) { + $style = $this->get_style(); + $v_space = $style->length_in_pt(array($style->margin_top, + $style->padding_top, + $style->border_top_width, + $style->border_bottom_width, + $style->padding_bottom, + $style->margin_bottom), + $style->width); + + $new_height = $height - $v_space; + $style->height = $new_height; + + if ( $new_height > $this->_content_height ) { + // Adjust our vertical alignment + $valign = $style->vertical_align; + + switch ($valign) { + + default: + case "baseline": + // FIXME: this isn't right + + case "top": + // Don't need to do anything + return; + + case "middle": + $delta = ($new_height - $this->_content_height) / 2; + break; + + case "bottom": + $delta = $new_height - $this->_content_height; + break; + + } + + // Move our children + foreach ( $this->get_lines() as $i => $line ) { + foreach ( $line["frames"] as $frame ) + $frame->set_position( null, $frame->get_position("y") + $delta ); + } + } + + } + + function set_resolved_border($side, $border_spec) { + $this->_resolved_borders[$side] = $border_spec; + } + + //........................................................................ + + function get_resolved_border($side) { + return $this->_resolved_borders[$side]; + } + + function get_resolved_borders() { return $this->_resolved_borders; } +} diff --git a/application/third_party/dompdf/include/table_cell_frame_reflower.cls.php b/application/third_party/dompdf/include/table_cell_frame_reflower.cls.php new file mode 100755 index 00000000..0393c85b --- /dev/null +++ b/application/third_party/dompdf/include/table_cell_frame_reflower.cls.php @@ -0,0 +1,147 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_cell_frame_reflower.cls.php 358 2011-01-30 22:22:47Z fabien.menager $ */ + + +/** + * Reflows table cells + * + * @access private + * @package dompdf + */ +class Table_Cell_Frame_Reflower extends Block_Frame_Reflower { + + //........................................................................ + + function __construct(Frame $frame) { + parent::__construct($frame); + } + + //........................................................................ + + function reflow(Frame_Decorator $block = null) { + + $style = $this->_frame->get_style(); + + $table = Table_Frame_Decorator::find_parent_table($this->_frame); + $cellmap = $table->get_cellmap(); + + list($x, $y) = $cellmap->get_frame_position($this->_frame); + $this->_frame->set_position($x, $y); + + $cells = $cellmap->get_spanned_cells($this->_frame); + + $w = 0; + foreach ( $cells["columns"] as $i ) { + $col = $cellmap->get_column( $i ); + $w += $col["used-width"]; + } + + //FIXME? + $h = $this->_frame->get_containing_block("h"); + + $left_space = $style->length_in_pt(array($style->margin_left, + $style->padding_left, + $style->border_left_width), + $w); + + $right_space = $style->length_in_pt(array($style->padding_right, + $style->margin_right, + $style->border_right_width), + $w); + + $top_space = $style->length_in_pt(array($style->margin_top, + $style->padding_top, + $style->border_top_width), + $h); + $bottom_space = $style->length_in_pt(array($style->margin_bottom, + $style->padding_bottom, + $style->border_bottom_width), + $h); + + $style->width = $cb_w = $w - $left_space - $right_space; + + $content_x = $x + $left_space; + $content_y = $line_y = $y + $top_space; + + // Adjust the first line based on the text-indent property + $indent = $style->length_in_pt($style->text_indent, $w); + $this->_frame->increase_line_width($indent); + + // Set the y position of the first line in the cell + $page = $this->_frame->get_root(); + $this->_frame->set_current_line($line_y); + + // Set the containing blocks and reflow each child + foreach ( $this->_frame->get_children() as $child ) { + + if ( $page->is_full() ) + break; + + $child->set_containing_block($content_x, $content_y, $cb_w, $h); + $child->reflow($this->_frame); + + } + + // Determine our height + $style_height = $style->length_in_pt($style->height, $h); + + $this->_frame->set_content_height($this->_calculate_content_height()); + + $height = max($style_height, $this->_frame->get_content_height()); + + // Let the cellmap know our height + $cell_height = $height / count($cells["rows"]); + + if ($style_height <= $height) + $cell_height += $top_space + $bottom_space; + + foreach ($cells["rows"] as $i) + $cellmap->set_row_height($i, $cell_height); + + $style->height = $height; + + $this->_text_align(); + + $this->vertical_align(); + + } + +} diff --git a/application/third_party/dompdf/include/table_cell_positioner.cls.php b/application/third_party/dompdf/include/table_cell_positioner.cls.php new file mode 100755 index 00000000..29842ace --- /dev/null +++ b/application/third_party/dompdf/include/table_cell_positioner.cls.php @@ -0,0 +1,61 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_cell_positioner.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Positions table cells + * + * @access private + * @package dompdf + */ +class Table_Cell_Positioner extends Positioner { + + function __construct(Frame_Decorator $frame) { parent::__construct($frame); } + + //........................................................................ + + function position() { + + $table = Table_Frame_Decorator::find_parent_table($this->_frame); + $cellmap = $table->get_cellmap(); + $this->_frame->set_position($cellmap->get_frame_position($this->_frame)); + + } +} diff --git a/application/third_party/dompdf/include/table_cell_renderer.cls.php b/application/third_party/dompdf/include/table_cell_renderer.cls.php new file mode 100755 index 00000000..5417032b --- /dev/null +++ b/application/third_party/dompdf/include/table_cell_renderer.cls.php @@ -0,0 +1,185 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_cell_renderer.cls.php 311 2010-09-05 20:02:01Z fabien.menager $ */ + +/** + * Renders table cells + * + * @access private + * @package dompdf + */ +class Table_Cell_Renderer extends Block_Renderer { + + //........................................................................ + + function render(Frame $frame) { + $style = $frame->get_style(); + + $this->_set_opacity( $frame->get_opacity( $style->opacity ) ); + + // Draw our background, border and content + if ( ($bg = $style->background_color) !== "transparent" ) { + list($x, $y, $w, $h) = $frame->get_padding_box(); + $this->_canvas->filled_rectangle( $x, $y, $w, $h, $bg ); + } + else { + list($x, $y, $w, $h) = $frame->get_padding_box(); + } + + if ( ($url = $style->background_image) && $url !== "none" ) { + $this->_background_image($url, $x, $y, $w, $h, $style); + } + + if ( $style->border_collapse !== "collapse" ) { + $this->_render_border($frame, "bevel"); + $this->_render_outline($frame, "bevel"); + return; + } + + // The collapsed case is slightly complicated... + // @todo Add support for outlines here + + $cellmap = Table_Frame_Decorator::find_parent_table($frame)->get_cellmap(); + $cells = $cellmap->get_spanned_cells($frame); + $num_rows = $cellmap->get_num_rows(); + $num_cols = $cellmap->get_num_cols(); + + // Determine the top row spanned by this cell + $i = $cells["rows"][0]; + $top_row = $cellmap->get_row($i); + + // Determine if this cell borders on the bottom of the table. If so, + // then we draw its bottom border. Otherwise the next row down will + // draw its top border instead. + if (in_array( $num_rows - 1, $cells["rows"])) { + $draw_bottom = true; + $bottom_row = $cellmap->get_row($num_rows - 1); + } else + $draw_bottom = false; + + + // Draw the horizontal borders + foreach ( $cells["columns"] as $j ) { + $bp = $cellmap->get_border_properties($i, $j); + + $y = $top_row["y"] - $bp["top"]["width"] / 2; + + $col = $cellmap->get_column($j); + $x = $col["x"] - $bp["left"]["width"] / 2; + $w = $col["used-width"] + ($bp["left"]["width"] + $bp["right"]["width"] ) / 2; + + if ( $bp["top"]["style"] !== "none" && $bp["top"]["width"] > 0 ) { + $widths = array($bp["top"]["width"], + $bp["right"]["width"], + $bp["bottom"]["width"], + $bp["left"]["width"]); + $method = "_border_". $bp["top"]["style"]; + $this->$method($x, $y, $w, $bp["top"]["color"], $widths, "top", "square"); + } + + if ( $draw_bottom ) { + $bp = $cellmap->get_border_properties($num_rows - 1, $j); + if ( $bp["bottom"]["style"] === "none" || $bp["bottom"]["width"] <= 0 ) + continue; + + $y = $bottom_row["y"] + $bottom_row["height"] + $bp["bottom"]["width"] / 2; + + $widths = array($bp["top"]["width"], + $bp["right"]["width"], + $bp["bottom"]["width"], + $bp["left"]["width"]); + $method = "_border_". $bp["bottom"]["style"]; + $this->$method($x, $y, $w, $bp["bottom"]["color"], $widths, "bottom", "square"); + + } + } + + $j = $cells["columns"][0]; + + $left_col = $cellmap->get_column($j); + + if (in_array($num_cols - 1, $cells["columns"])) { + $draw_right = true; + $right_col = $cellmap->get_column($num_cols - 1); + } else + $draw_right = false; + + // Draw the vertical borders + foreach ( $cells["rows"] as $i ) { + $bp = $cellmap->get_border_properties($i, $j); + + $x = $left_col["x"] - $bp["left"]["width"] / 2; + + $row = $cellmap->get_row($i); + + $y = $row["y"] - $bp["top"]["width"] / 2; + $h = $row["height"] + ($bp["top"]["width"] + $bp["bottom"]["width"])/ 2; + + if ( $bp["left"]["style"] !== "none" && $bp["left"]["width"] > 0 ) { + + $widths = array($bp["top"]["width"], + $bp["right"]["width"], + $bp["bottom"]["width"], + $bp["left"]["width"]); + + $method = "_border_" . $bp["left"]["style"]; + $this->$method($x, $y, $h, $bp["left"]["color"], $widths, "left", "square"); + } + + if ( $draw_right ) { + $bp = $cellmap->get_border_properties($i, $num_cols - 1); + if ( $bp["right"]["style"] === "none" || $bp["right"]["width"] <= 0 ) + continue; + + $x = $right_col["x"] + $right_col["used-width"] + $bp["right"]["width"] / 2; + + $widths = array($bp["top"]["width"], + $bp["right"]["width"], + $bp["bottom"]["width"], + $bp["left"]["width"]); + + $method = "_border_" . $bp["right"]["style"]; + $this->$method($x, $y, $h, $bp["right"]["color"], $widths, "right", "square"); + + } + } + + } +} diff --git a/application/third_party/dompdf/include/table_frame_decorator.cls.php b/application/third_party/dompdf/include/table_frame_decorator.cls.php new file mode 100755 index 00000000..713cce4d --- /dev/null +++ b/application/third_party/dompdf/include/table_frame_decorator.cls.php @@ -0,0 +1,342 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_frame_decorator.cls.php 317 2010-10-06 13:06:57Z fabien.menager $ */ + +/** + * Decorates Frames for table layout + * + * @access private + * @package dompdf + */ +class Table_Frame_Decorator extends Frame_Decorator { + static $VALID_CHILDREN = array("table-row-group", + "table-row", + "table-header-group", + "table-footer-group", + "table-column", + "table-column-group", + "table-caption", + "table-cell"); + + static $ROW_GROUPS = array('table-row-group', + 'table-header-group', + 'table-footer-group'); + + /** + * The Cellmap object for this table. The cellmap maps table cells + * to rows and columns, and aids in calculating column widths. + * + * @var Cellmap + */ + protected $_cellmap; + + /** + * The minimum width of the table, in pt + * + * @var float + */ + protected $_min_width; + + /** + * The maximum width of the table, in pt + * + * @var float + */ + protected $_max_width; + + /** + * Table header rows. Each table header is duplicated when a table + * spans pages. + * + * @var array + */ + protected $_headers; + + /** + * Table footer rows. Each table footer is duplicated when a table + * spans pages. + * + * @var array + */ + protected $_footers; + + /** + * Class constructor + * + * @param Frame $frame the frame to decorate + */ + function __construct(Frame $frame, DOMPDF $dompdf) { + parent::__construct($frame, $dompdf); + $this->_cellmap = new Cellmap($this); + $this->_min_width = null; + $this->_max_width = null; + $this->_headers = array(); + $this->_footers = array(); + } + + + function reset() { + parent::reset(); + $this->_cellmap->reset(); + $this->_min_width = null; + $this->_max_width = null; + $this->_headers = array(); + $this->_footers = array(); + $this->_reflower->reset(); + } + + //........................................................................ + + /** + * split the table at $row. $row and all subsequent rows will be + * added to the clone. This method is overidden in order to remove + * frames from the cellmap properly. + * + * @param Frame $row + */ + function split($child = null, $force_pagebreak = false) { + + if ( is_null($child) ) { + parent::split(); + return; + } + + // If $child is a header or if it is the first non-header row, do + // not duplicate headers, simply move the table to the next page. + if ( count($this->_headers) && !in_array($child, $this->_headers, true) && + !in_array($child->get_prev_sibling(), $this->_headers, true) ) { + + $first_header = null; + + // Insert copies of the table headers before $child + foreach ($this->_headers as $header) { + + $new_header = $header->deep_copy(); + + if ( is_null($first_header) ) + $first_header = $new_header; + + $this->insert_child_before($new_header, $child); + } + + parent::split($first_header); + + } else if ( in_array($child->get_style()->display, self::$ROW_GROUPS) ) { + + // Individual rows should have already been handled + parent::split($child); + + } else { + + $iter = $child; + + while ($iter) { + $this->_cellmap->remove_row($iter); + $iter = $iter->get_next_sibling(); + } + + parent::split($child); + } + } + + /** + * Static function to locate the parent table of a frame + * + * @param Frame $frame + * @return Table_Frame_Decorator the table that is an ancestor of $frame + */ + static function find_parent_table(Frame $frame) { + + while ( $frame = $frame->get_parent() ) + if ( in_array($frame->get_style()->display, Style::$TABLE_TYPES) ) + break; + + return $frame; + } + + /** + * Return this table's Cellmap + * + * @return Cellmap + */ + function get_cellmap() { return $this->_cellmap; } + + /** + * Return the minimum width of this table + * + * @return float + */ + function get_min_width() { return $this->_min_width; } + + /** + * Return the maximum width of this table + * + * @return float + */ + function get_max_width() { return $this->_max_width; } + + /** + * Set the minimum width of the table + * + * @param float $width the new minimum width + */ + function set_min_width($width) { $this->_min_width = $width; } + + /** + * Set the maximum width of the table + * + * @param float $width the new maximum width + */ + function set_max_width($width) { $this->_max_width = $width; } + + /** + * Restructure tree so that the table has the correct structure. + * Invalid children (i.e. all non-table-rows) are moved below the + * table. + */ + function normalise() { + + // Store frames generated by invalid tags and move them outside the table + $erroneous_frames = array(); + $anon_row = false; + $iter = $this->get_first_child(); + while ( $iter ) { + $child = $iter; + $iter = $iter->get_next_sibling(); + + $display = $child->get_style()->display; + + if ( $anon_row ) { + + if ( $display === "table-row" ) { + // Add the previous anonymous row + $this->insert_child_before($table_row, $child); + + $table_row->normalise(); + $child->normalise(); + $anon_row = false; + continue; + } + + // add the child to the anonymous row + $table_row->append_child($child); + continue; + + } else { + + if ( $display === "table-row" ) { + $child->normalise(); + continue; + } + + if ( $display === "table-cell") { + // Create an anonymous table row + $tr = $this->get_node()->ownerDocument->createElement("tr"); + + $frame = new Frame($tr); + + $css = $this->get_style()->get_stylesheet(); + $style = $css->create_style(); + $style->inherit($this->get_style()); + + // Lookup styles for tr tags. If the user wants styles to work + // better, they should make the tr explicit... I'm not going to + // try to guess what they intended. + if ( $tr_style = $css->lookup("tr") ) + $style->merge($tr_style); + + // Okay, I have absolutely no idea why I need this clone here, but + // if it's omitted, php (as of 2004-07-28) segfaults. + $frame->set_style(clone $style); + $table_row = Frame_Factory::decorate_frame($frame, $this->_dompdf); + $table_row->set_root($this->_root); + + // Add the cell to the row + $table_row->append_child($child); + + $anon_row = true; + continue; + } + + if ( !in_array($display, self::$VALID_CHILDREN) ) { + $erroneous_frames[] = $child; + continue; + } + + // Normalise other table parts (i.e. row groups) + foreach ($child->get_children() as $grandchild) { + if ( $grandchild->get_style()->display === "table-row" ) + $grandchild->normalise(); + } + + // Add headers and footers + if ( $display === "table-header-group" ) + $this->_headers[] = $child; + + else if ( $display === "table-footer-group" ) + $this->_footers[] = $child; + } + } + + if ( $anon_row ) { + // Add the row to the table + $this->_frame->append_child($table_row); + $table_row->normalise(); + $this->_cellmap->add_row(); + } + + foreach ($erroneous_frames as $frame) + $this->move_after($frame); + + } + + //........................................................................ + + /** + * Moves the specified frame and it's corresponding node outside of + * the table. + * + * @param Frame $frame the frame to move + */ + function move_after(Frame $frame) { + $this->get_parent()->insert_child_after($frame, $this); + } + +} diff --git a/application/third_party/dompdf/include/table_frame_reflower.cls.php b/application/third_party/dompdf/include/table_frame_reflower.cls.php new file mode 100755 index 00000000..5e4a9a1f --- /dev/null +++ b/application/third_party/dompdf/include/table_frame_reflower.cls.php @@ -0,0 +1,574 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_frame_reflower.cls.php 359 2011-02-05 12:15:06Z fabien.menager $ */ + +/** + * Reflows tables + * + * @access private + * @package dompdf + */ +class Table_Frame_Reflower extends Frame_Reflower { + + /** + * Cache of results between call to get_min_max_width and assign_widths + * + * @var array + */ + protected $_state; + + function __construct(Table_Frame_Decorator $frame) { + $this->_state = null; + parent::__construct($frame); + } + + /** + * State is held here so it needs to be reset along with the decorator + */ + function reset() { + $this->_state = null; + $this->_min_max_cache = null; + } + + //........................................................................ + + protected function _assign_widths() { + $style = $this->_frame->get_style(); + + // Find the min/max width of the table and sort the columns into + // absolute/percent/auto arrays + $min_width = $this->_state["min_width"]; + $max_width = $this->_state["max_width"]; + $percent_used = $this->_state["percent_used"]; + $absolute_used = $this->_state["absolute_used"]; + $auto_min = $this->_state["auto_min"]; + + $absolute =& $this->_state["absolute"]; + $percent =& $this->_state["percent"]; + $auto =& $this->_state["auto"]; + + // Determine the actual width of the table + $cb = $this->_frame->get_containing_block(); + $columns =& $this->_frame->get_cellmap()->get_columns(); + + $width = $style->width; + + // Calculate padding & border fudge factor + $left = $style->margin_left; + $right = $style->margin_right; + + $left = $left === "auto" ? 0 : $style->length_in_pt($left, $cb["w"]); + $right = $right === "auto" ? 0 : $style->length_in_pt($right, $cb["w"]); + + $delta = $left + $right + $style->length_in_pt(array($style->padding_left, + $style->border_left_width, + $style->border_right_width, + $style->padding_right), $cb["w"]); + + $min_table_width = $style->length_in_pt( $style->min_width, $cb["w"] - $delta ); + + // min & max widths already include borders & padding + $min_width -= $delta; + $max_width -= $delta; + + if ( $width !== "auto" ) { + + $preferred_width = $style->length_in_pt($width, $cb["w"]) - $delta; + + if ( $preferred_width < $min_table_width ) + $preferred_width = $min_table_width; + + if ( $preferred_width > $min_width ) + $width = $preferred_width; + else + $width = $min_width; + + } else { + + if ( $max_width + $delta < $cb["w"] ) + $width = $max_width; + else if ( $cb["w"] - $delta > $min_width ) + $width = $cb["w"] - $delta; + else + $width = $min_width; + + if ( $width < $min_table_width ) + $width = $min_table_width; + + } + + // Store our resolved width + $style->width = $width; + + $cellmap = $this->_frame->get_cellmap(); + + // If the whole table fits on the page, then assign each column it's max width + if ( $width == $max_width ) { + + foreach (array_keys($columns) as $i) + $cellmap->set_column_width($i, $columns[$i]["max-width"]); + + return; + } + + // Determine leftover and assign it evenly to all columns + if ( $width > $min_width ) { + + // We have four cases to deal with: + // + // 1. All columns are auto--no widths have been specified. In this + // case we distribute extra space across all columns weighted by max-width. + // + // 2. Only absolute widths have been specified. In this case we + // distribute any extra space equally among 'width: auto' columns, or all + // columns if no auto columns have been specified. + // + // 3. Only percentage widths have been specified. In this case we + // normalize the percentage values and distribute any remaining % to + // width: auto columns. We then proceed to assign widths as fractions + // of the table width. + // + // 4. Both absolute and percentage widths have been specified. + + // Case 1: + if ( $absolute_used == 0 && $percent_used == 0 ) { + $increment = $width - $min_width; + + foreach (array_keys($columns) as $i) + $cellmap->set_column_width($i, $columns[$i]["min-width"] + $increment * ($columns[$i]["max-width"] / $max_width)); + return; + } + + + // Case 2 + if ( $absolute_used > 0 && $percent_used == 0 ) { + + if ( count($auto) > 0 ) + $increment = ($width - $auto_min - $absolute_used) / count($auto); + + // Use the absolutely specified width or the increment + foreach (array_keys($columns) as $i) { + + if ( $columns[$i]["absolute"] > 0 && count($auto) ) + $cellmap->set_column_width($i, $columns[$i]["min-width"]); + else if ( count($auto) ) + $cellmap->set_column_width($i, $columns[$i]["min-width"] + $increment); + else { + // All absolute columns + $increment = ($width - $absolute_used) * $columns[$i]["absolute"] / $absolute_used; + + $cellmap->set_column_width($i, $columns[$i]["min-width"] + $increment); + } + + } + return; + } + + + // Case 3: + if ( $absolute_used == 0 && $percent_used > 0 ) { + + $scale = null; + $remaining = null; + + // Scale percent values if the total percentage is > 100, or if all + // values are specified as percentages. + if ( $percent_used > 100 || count($auto) == 0) + $scale = 100 / $percent_used; + else + $scale = 1; + + // Account for the minimum space used by the unassigned auto columns + $used_width = $auto_min; + + foreach ($percent as $i) { + $columns[$i]["percent"] *= $scale; + + $slack = $width - $used_width; + + $w = min($columns[$i]["percent"] * $width/100, $slack); + + if ( $w < $columns[$i]["min-width"] ) + $w = $columns[$i]["min-width"]; + + $cellmap->set_column_width($i, $w); + $used_width += $w; + + } + + // This works because $used_width includes the min-width of each + // unassigned column + if ( count($auto) > 0 ) { + $increment = ($width - $used_width) / count($auto); + + foreach ($auto as $i) + $cellmap->set_column_width($i, $columns[$i]["min-width"] + $increment); + + } + return; + } + + // Case 4: + + // First-come, first served + if ( $absolute_used > 0 && $percent_used > 0 ) { + + $used_width = $auto_min; + + foreach ($absolute as $i) { + $cellmap->set_column_width($i, $columns[$i]["min-width"]); + $used_width += $columns[$i]["min-width"]; + } + + // Scale percent values if the total percentage is > 100 or there + // are no auto values to take up slack + if ( $percent_used > 100 || count($auto) == 0 ) + $scale = 100 / $percent_used; + else + $scale = 1; + + $remaining_width = $width - $used_width; + + foreach ($percent as $i) { + $slack = $remaining_width - $used_width; + + $columns[$i]["percent"] *= $scale; + $w = min($columns[$i]["percent"] * $remaining_width / 100, $slack); + + if ( $w < $columns[$i]["min-width"] ) + $w = $columns[$i]["min-width"]; + + $columns[$i]["used-width"] = $w; + $used_width += $w; + } + + if ( count($auto) > 0 ) { + $increment = ($width - $used_width) / count($auto); + + foreach ($auto as $i) + $cellmap->set_column_width($i, $columns[$i]["min-width"] + $increment); + + } + + return; + } + + + } else { // we are over constrained + + // Each column gets its minimum width + foreach (array_keys($columns) as $i) + $cellmap->set_column_width($i, $columns[$i]["min-width"]); + + } + } + + //........................................................................ + + // Determine the frame's height based on min/max height + protected function _calculate_height() { + + $style = $this->_frame->get_style(); + $height = $style->height; + + $cellmap = $this->_frame->get_cellmap(); + $cellmap->assign_frame_heights(); + $rows = $cellmap->get_rows(); + + // Determine our content height + $content_height = 0; + foreach ( $rows as $r ) + $content_height += $r["height"]; + + $cb = $this->_frame->get_containing_block(); + + if ( !($style->overflow === "visible" || + ($style->overflow === "hidden" && $height === "auto")) ) { + + // Only handle min/max height if the height is independent of the frame's content + + $min_height = $style->min_height; + $max_height = $style->max_height; + + if ( isset($cb["h"]) ) { + $min_height = $style->length_in_pt($min_height, $cb["h"]); + $max_height = $style->length_in_pt($max_height, $cb["h"]); + + } else if ( isset($cb["w"]) ) { + + if ( mb_strpos($min_height, "%") !== false ) + $min_height = 0; + else + $min_height = $style->length_in_pt($min_height, $cb["w"]); + + if ( mb_strpos($max_height, "%") !== false ) + $max_height = "none"; + else + $max_height = $style->length_in_pt($max_height, $cb["w"]); + } + + if ( $max_height !== "none" && $min_height > $max_height ) + // Swap 'em + list($max_height, $min_height) = array($min_height, $max_height); + + if ( $max_height !== "none" && $height > $max_height ) + $height = $max_height; + + if ( $height < $min_height ) + $height = $min_height; + + } else { + + // Use the content height or the height value, whichever is greater + if ( $height !== "auto" ) { + $height = $style->length_in_pt($height, $cb["h"]); + + if ( $height <= $content_height ) + $height = $content_height; + else + $cellmap->set_frame_heights($height,$content_height); + + } else + $height = $content_height; + + } + + return $height; + + } + //........................................................................ + + function reflow(Frame_Decorator $block = null) { + $frame = $this->_frame; + + // Check if a page break is forced + $page = $frame->get_root(); + $page->check_forced_page_break($frame); + + // Bail if the page is full + if ( $page->is_full() ) + return; + + // Let the page know that we're reflowing a table so that splits + // are suppressed (simply setting page-break-inside: avoid won't + // work because we may have an arbitrary number of block elements + // inside tds.) + $page->table_reflow_start(); + + // Collapse vertical margins, if required + $this->_collapse_margins(); + + $frame->position(); + + // Table layout algorithm: + // http://www.w3.org/TR/CSS21/tables.html#auto-table-layout + + if ( is_null($this->_state) ) + $this->get_min_max_width(); + + $cb = $frame->get_containing_block(); + $style = $frame->get_style(); + + // This is slightly inexact, but should be okay. Add half the + // border-spacing to the table as padding. The other half is added to + // the cells themselves. + if ( $style->border_collapse === "separate" ) { + list($h, $v) = $style->border_spacing; + + $v = $style->length_in_pt($v) / 2; + $h = $style->length_in_pt($h) / 2; + + $style->padding_left = $style->length_in_pt($style->padding_left, $cb["w"]) + $h; + $style->padding_right = $style->length_in_pt($style->padding_right, $cb["w"]) + $h; + $style->padding_top = $style->length_in_pt($style->padding_top, $cb["h"]) + $v; + $style->padding_bottom = $style->length_in_pt($style->padding_bottom, $cb["h"]) + $v; + + } + + $this->_assign_widths(); + + // Adjust left & right margins, if they are auto + $width = $style->width; + $left = $style->margin_left; + $right = $style->margin_right; + + $diff = $cb["w"] - $width; + + if ( $left === "auto" && $right === "auto" && $diff > 0 ) { + $left = $right = $diff / 2; + $style->margin_left = "$left pt"; + $style->margin_right = "$right pt"; + + } else { + if($left === "auto") { + $left = $style->length_in_pt($cb["w"] - $right - $width, $cb["w"]); + } + if($right === "auto") { + $left = $style->length_in_pt($left, $cb["w"]); + } + } + + + list($x, $y) = $frame->get_position(); + + // Determine the content edge + $content_x = $x + $left + $style->length_in_pt(array($style->padding_left, + $style->border_left_width), $cb["w"]); + $content_y = $y + $style->length_in_pt(array($style->margin_top, + $style->border_top_width, + $style->padding_top), $cb["h"]); + + if ( isset($cb["h"]) ) + $h = $cb["h"]; + else + $h = null; + + + $cellmap = $frame->get_cellmap(); + $col =& $cellmap->get_column(0); + $col["x"] = $content_x; + + $row =& $cellmap->get_row(0); + $row["y"] = $content_y; + + $cellmap->assign_x_positions(); + + // Set the containing block of each child & reflow + foreach ( $frame->get_children() as $child ) { + + // Bail if the page is full + if ( !$page->in_nested_table() && $page->is_full() ) + break; + + $child->set_containing_block($content_x, $content_y, $width, $h); + $child->reflow(); + + if ( !$page->in_nested_table() ) + // Check if a split has occured + $page->check_page_break($child); + + } + + // Assign heights to our cells: + $style->height = $this->_calculate_height(); + + if ( $style->border_collapse === "collapse" ) { + // Unset our borders because our cells are now using them + $style->border_style = "none"; + } + + $page->table_reflow_end(); + + // Debugging: + //echo ($this->_frame->get_cellmap()); + + if ( $block ) { + $block->add_frame_to_line($this->_frame); + } + } + + //........................................................................ + + function get_min_max_width() { + + if ( !is_null($this->_min_max_cache) ) + return $this->_min_max_cache; + + $style = $this->_frame->get_style(); + + $this->_frame->normalise(); + + // Add the cells to the cellmap (this will calcluate column widths as + // frames are added) + $this->_frame->get_cellmap()->add_frame($this->_frame); + + // Find the min/max width of the table and sort the columns into + // absolute/percent/auto arrays + $this->_state = array(); + $this->_state["min_width"] = 0; + $this->_state["max_width"] = 0; + + $this->_state["percent_used"] = 0; + $this->_state["absolute_used"] = 0; + $this->_state["auto_min"] = 0; + + $this->_state["absolute"] = array(); + $this->_state["percent"] = array(); + $this->_state["auto"] = array(); + + $columns =& $this->_frame->get_cellmap()->get_columns(); + foreach (array_keys($columns) as $i) { + $this->_state["min_width"] += $columns[$i]["min-width"]; + $this->_state["max_width"] += $columns[$i]["max-width"]; + + if ( $columns[$i]["absolute"] > 0 ) { + $this->_state["absolute"][] = $i; + $this->_state["absolute_used"] += $columns[$i]["absolute"]; + + } else if ( $columns[$i]["percent"] > 0 ) { + $this->_state["percent"][] = $i; + $this->_state["percent_used"] += $columns[$i]["percent"]; + + } else { + $this->_state["auto"][] = $i; + $this->_state["auto_min"] += $columns[$i]["min-width"]; + } + } + + // Account for margins & padding + $dims = array($style->border_left_width, + $style->border_right_width, + $style->padding_left, + $style->padding_right, + $style->margin_left, + $style->margin_right); + + if ( $style->border_collapse !== "collapse" ) + list($dims[]) = $style->border_spacing; + + $delta = $style->length_in_pt($dims, $this->_frame->get_containing_block("w")); + + $this->_state["min_width"] += $delta; + $this->_state["max_width"] += $delta; + + return $this->_min_max_cache = array($this->_state["min_width"], $this->_state["max_width"], + "min" => $this->_state["min_width"], "max" => $this->_state["max_width"]); + } +} diff --git a/application/third_party/dompdf/include/table_row_frame_decorator.cls.php b/application/third_party/dompdf/include/table_row_frame_decorator.cls.php new file mode 100755 index 00000000..1bf7911b --- /dev/null +++ b/application/third_party/dompdf/include/table_row_frame_decorator.cls.php @@ -0,0 +1,81 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_row_frame_decorator.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Decorates Frames for table row layout + * + * @access private + * @package dompdf + */ +class Table_Row_Frame_Decorator extends Frame_Decorator { + + // protected members + + function __construct(Frame $frame, DOMPDF $dompdf) { + parent::__construct($frame, $dompdf); + } + + //........................................................................ + + /** + * Remove all non table-cell frames from this row and move them after + * the table. + */ + function normalise() { + + // Find our table parent + $p = Table_Frame_Decorator::find_parent_table($this); + + $erroneous_frames = array(); + foreach ($this->get_children() as $child) { + $display = $child->get_style()->display; + + if ( $display !== "table-cell" ) + $erroneous_frames[] = $child; + } + + // dump the extra nodes after the table. + foreach ($erroneous_frames as $frame) + $p->move_after($frame); + } + + +} diff --git a/application/third_party/dompdf/include/table_row_frame_reflower.cls.php b/application/third_party/dompdf/include/table_row_frame_reflower.cls.php new file mode 100755 index 00000000..d44d3169 --- /dev/null +++ b/application/third_party/dompdf/include/table_row_frame_reflower.cls.php @@ -0,0 +1,94 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_row_frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Reflows table rows + * + * @access private + * @package dompdf + */ +class Table_Row_Frame_Reflower extends Frame_Reflower { + + + function __construct(Table_Row_Frame_Decorator $frame) { + parent::__construct($frame); + } + + //........................................................................ + + function reflow(Frame_Decorator $block = null) { + $page = $this->_frame->get_root(); + + if ( $page->is_full() ) + return; + + $this->_frame->position(); + $style = $this->_frame->get_style(); + $cb = $this->_frame->get_containing_block(); + + foreach ($this->_frame->get_children() as $child) { + + if ( $page->is_full() ) + return; + + $child->set_containing_block($cb); + $child->reflow(); + + } + + if ( $page->is_full() ) + return; + + $table = Table_Frame_Decorator::find_parent_table($this->_frame); + $cellmap = $table->get_cellmap(); + $style->width = $cellmap->get_frame_width($this->_frame); + $style->height = $cellmap->get_frame_height($this->_frame); + + $this->_frame->set_position($cellmap->get_frame_position($this->_frame)); + + } + + //........................................................................ + + function get_min_max_width() { + throw new DOMPDF_Exception("Min/max width is undefined for table rows"); + } +} diff --git a/application/third_party/dompdf/include/table_row_group_frame_decorator.cls.php b/application/third_party/dompdf/include/table_row_group_frame_decorator.cls.php new file mode 100755 index 00000000..10c64baa --- /dev/null +++ b/application/third_party/dompdf/include/table_row_group_frame_decorator.cls.php @@ -0,0 +1,96 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004-6 Benj Carson + * @author Benj Carson + * @package dompdf + */ + +/* $Id: table_row_group_frame_decorator.cls.php 317 2010-10-06 13:06:57Z fabien.menager $ */ + +/** + * Table row group decorator + * + * Overrides split() method for tbody, thead & tfoot elements + * + * @access private + * @package dompdf + */ +class Table_Row_Group_Frame_Decorator extends Frame_Decorator { + + /** + * Class constructor + * + * @param Frame $frame Frame to decorate + * @param DOMPDF $dompdf Current dompdf instance + */ + function __construct(Frame $frame, DOMPDF $dompdf) { + parent::__construct($frame, $dompdf); + } + + /** + * Override split() to remove all child rows and this element from the cellmap + * + * @param Frame $child + */ + function split($child = null, $force_pagebreak = false) { + + if ( is_null($child) ) { + parent::split(); + return; + } + + + // Remove child & all subsequent rows from the cellmap + $cellmap = $this->get_parent()->get_cellmap(); + $iter = $child; + + while ( $iter ) { + $cellmap->remove_row($iter); + $iter = $iter->get_next_sibling(); + } + + // If we are splitting at the first child remove the + // table-row-group from the cellmap as well + if ( $child === $this->get_first_child() ) { + $cellmap->remove_row_group($this); + parent::split(); + return; + } + + $cellmap->update_row_group($this, $child->get_prev_sibling()); + parent::split($child); + + } +} + diff --git a/application/third_party/dompdf/include/table_row_group_frame_reflower.cls.php b/application/third_party/dompdf/include/table_row_group_frame_reflower.cls.php new file mode 100755 index 00000000..5298876d --- /dev/null +++ b/application/third_party/dompdf/include/table_row_group_frame_reflower.cls.php @@ -0,0 +1,92 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_row_group_frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ + +/** + * Reflows table row groups (e.g. tbody tags) + * + * @access private + * @package dompdf + */ +class Table_Row_Group_Frame_Reflower extends Frame_Reflower { + + function __construct($frame) { + parent::__construct($frame); + } + + function reflow(Frame_Decorator $block = null) { + $page = $this->_frame->get_root(); + + $style = $this->_frame->get_style(); + + // Our width is equal to the width of our parent table + $table = Table_Frame_Decorator::find_parent_table($this->_frame); + + $cb = $this->_frame->get_containing_block(); + + foreach ( $this->_frame->get_children() as $child) { + // Bail if the page is full + if ( $page->is_full() ) + return; + + $child->set_containing_block($cb["x"], $cb["y"], $cb["w"], $cb["h"]); + $child->reflow(); + + // Check if a split has occured + $page->check_page_break($child); + + } + + if ( $page->is_full() ) + return; + + $cellmap = $table->get_cellmap(); + $style->width = $cellmap->get_frame_width($this->_frame); + $style->height = $cellmap->get_frame_height($this->_frame); + + $this->_frame->set_position($cellmap->get_frame_position($this->_frame)); + + if ( $table->get_style()->border_collapse === "collapse" ) + // Unset our borders because our cells are now using them + $style->border_style = "none"; + + } + +} diff --git a/application/third_party/dompdf/include/table_row_positioner.cls.php b/application/third_party/dompdf/include/table_row_positioner.cls.php new file mode 100755 index 00000000..7a15929f --- /dev/null +++ b/application/third_party/dompdf/include/table_row_positioner.cls.php @@ -0,0 +1,68 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: table_row_positioner.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */ + +/** + * Positions table rows + * + * @access private + * @package dompdf + */ +class Table_Row_Positioner extends Positioner { + + function __construct(Frame_Decorator $frame) { parent::__construct($frame); } + + //........................................................................ + + function position() { + + $cb = $this->_frame->get_containing_block(); + $p = $this->_frame->get_prev_sibling(); + + if ( $p ) + $y = $p->get_position("y") + $p->get_margin_height(); + + else + $y = $cb["y"]; + + $this->_frame->set_position($cb["x"], $y); + + } +} diff --git a/application/third_party/dompdf/include/tcpdf_adapter.cls.php b/application/third_party/dompdf/include/tcpdf_adapter.cls.php new file mode 100755 index 00000000..47ed71ae --- /dev/null +++ b/application/third_party/dompdf/include/tcpdf_adapter.cls.php @@ -0,0 +1,498 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: tcpdf_adapter.cls.php 311 2010-09-05 20:02:01Z fabien.menager $ */ + +require_once(DOMPDF_LIB_DIR . '/tcpdf/tcpdf.php'); + +/** + * TCPDF PDF Rendering interface + * + * TCPDF_Adapter provides a simple, stateless interface to TCPDF. + * + * Unless otherwise mentioned, all dimensions are in points (1/72 in). + * The coordinate origin is in the top left corner and y values + * increase downwards. + * + * See {@link http://tcpdf.sourceforge.net} for more information on + * the underlying TCPDF class. + * + * @package dompdf + */ +class TCPDF_Adapter implements Canvas { + + /** + * Dimensions of paper sizes in points + * + * @var array; + */ + static public $PAPER_SIZES = array(); // Set to + // CPDF_Adapter::$PAPER_SIZES below. + + + /** + * Instance of the TCPDF class + * + * @var TCPDF + */ + private $_pdf; + + /** + * PDF width in points + * + * @var float + */ + private $_width; + + /** + * PDF height in points + * + * @var float + */ + private $_height; + + /** + * Last fill colour used + * + * @var array + */ + private $_last_fill_color; + + /** + * Last stroke colour used + * + * @var array + */ + private $_last_stroke_color; + + /** + * Last line width used + * + * @var float + */ + private $_last_line_width; + + /** + * Total number of pages + * + * @var int + */ + private $_page_count; + + /** + * Text to display on every page + * + * @var array + */ + private $_page_text; + + /** + * Array of pages for accessing after initial rendering is complete + * + * @var array + */ + private $_pages; + + /** + * Class constructor + * + * @param mixed $paper The size of paper to use either a string (see {@link CPDF_Adapter::$PAPER_SIZES}) or + * an array(xmin,ymin,xmax,ymax) + * @param string $orientation The orientation of the document (either 'landscape' or 'portrait') + */ + function __construct($paper = "letter", $orientation = "portrait") { + + if ( is_array($paper) ) + $size = $paper; + else if ( isset(self::$PAPER_SIZES[mb_strtolower($paper)]) ) + $size = self::$PAPER_SIZE[$paper]; + else + $size = self::$PAPER_SIZE["letter"]; + + if ( mb_strtolower($orientation) === "landscape" ) { + list($size[2], $size[3]) = array($size[3], $size[2]); + } + + $this->_width = $size[2] - $size[0]; + $this->_height = $size[3] - $size[1]; + + $this->_pdf = new TCPDF("P", "pt", array($this->_width, $this->_height)); + $this->_pdf->Setcreator("DOMPDF Converter"); + + $this->_pdf->AddPage(); + + $this->_page_number = $this->_page_count = 1; + $this->_page_text = array(); + + $this->_last_fill_color = + $this->_last_stroke_color = + $this->_last_line_width = null; + + } + + /** + * Remaps y coords from 4th to 1st quadrant + * + * @param float $y + * @return float + */ + protected function y($y) { return $this->_height - $y; } + + /** + * Sets the stroke colour + * + * @param array $color + */ + protected function _set_stroke_colour($colour) { + $colour[0] = round(255 * $colour[0]); + $colour[1] = round(255 * $colour[1]); + $colour[2] = round(255 * $colour[2]); + + if ( is_null($this->_last_stroke_color) || $color != $this->_last_stroke_color ) { + $this->_pdf->SetDrawColor($color[0],$color[1],$color[2]); + $this->_last_stroke_color = $color; + } + + } + + /** + * Sets the fill colour + * + * @param array $color + */ + protected function _set_fill_colour($colour) { + $colour[0] = round(255 * $colour[0]); + $colour[1] = round(255 * $colour[1]); + $colour[2] = round(255 * $colour[2]); + + if ( is_null($this->_last_fill_color) || $color != $this->_last_fill_color ) { + $this->_pdf->SetDrawColor($color[0],$color[1],$color[2]); + $this->_last_fill_color = $color; + } + + } + + /** + * Return the TCPDF instance + * + * @return TCPDF + */ + function get_tcpdf() { return $this->_pdf; } + + /** + * Returns the current page number + * + * @return int + */ + function get_page_number() { + return $this->_page_number; + } + + /** + * Returns the total number of pages + * + * @return int + */ + function get_page_count() { + return $this->_page_count; + } + + /** + * Sets the total number of pages + * + * @param int $count + */ + function set_page_count($count) { + $this->_page_count = (int)$count; + } + + /** + * Draws a line from x1,y1 to x2,y2 + * + * See {@link Style::munge_colour()} for the format of the colour array. + * See {@link Cpdf::setLineStyle()} for a description of the format of the + * $style parameter (aka dash). + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @param array $color + * @param float $width + * @param array $style + */ + function line($x1, $y1, $x2, $y2, $color, $width, $style = null) { + + if ( is_null($this->_last_line_width) || $width != $this->_last_line_width ) { + $this->_pdf->SetLineWidth($width); + $this->_last_line_width = $width; + } + + $this->_set_stroke_colour($color); + + // FIXME: ugh, need to handle different styles here + $this->_pdf->line($x1, $y1, $x2, $y2); + } + + /** + * Draws a rectangle at x1,y1 with width w and height h + * + * See {@link Style::munge_colour()} for the format of the colour array. + * See {@link Cpdf::setLineStyle()} for a description of the $style + * parameter (aka dash) + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + * @param array $color + * @param float $width + * @param array $style + */ + function rectangle($x1, $y1, $w, $h, $color, $width, $style = null) { + + if ( is_null($this->_last_line_width) || $width != $this->_last_line_width ) { + $this->_pdf->SetLineWidth($width); + $this->_last_line_width = $width; + } + + $this->_set_stroke_colour($color); + + // FIXME: ugh, need to handle styles here + $this->_pdf->rect($x1, $y1, $w, $h); + + } + + /** + * Draws a filled rectangle at x1,y1 with width w and height h + * + * See {@link Style::munge_colour()} for the format of the colour array. + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + * @param array $color + */ + function filled_rectangle($x1, $y1, $w, $h, $color) { + + $this->_set_fill_colour($color); + + // FIXME: ugh, need to handle styles here + $this->_pdf->rect($x1, $y1, $w, $h, "F"); + } + + /** + * Draws a polygon + * + * The polygon is formed by joining all the points stored in the $points + * array. $points has the following structure: + * + * array(0 => x1, + * 1 => y1, + * 2 => x2, + * 3 => y2, + * ... + * ); + * + * + * See {@link Style::munge_colour()} for the format of the colour array. + * See {@link Cpdf::setLineStyle()} for a description of the $style + * parameter (aka dash) + * + * @param array $points + * @param array $color + * @param float $width + * @param array $style + * @param bool $fill Fills the polygon if true + */ + function polygon($points, $color, $width = null, $style = null, $fill = false) { + // FIXME + } + + /** + * Draws a circle at $x,$y with radius $r + * + * See {@link Style::munge_colour()} for the format of the colour array. + * See {@link Cpdf::setLineStyle()} for a description of the $style + * parameter (aka dash) + * + * @param float $x + * @param float $y + * @param float $r + * @param array $color + * @param float $width + * @param array $style + * @param bool $fill Fills the circle if true + */ + function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false) { + // FIXME + } + + /** + * Add an image to the pdf. + * + * The image is placed at the specified x and y coordinates with the + * given width and height. + * + * @param string $img_url the path to the image + * @param string $img_type the type (e.g. extension) of the image + * @param float $x x position + * @param float $y y position + * @param int $w width (in pixels) + * @param int $h height (in pixels) + */ + function image($img_url, $img_type, $x, $y, $w, $h) { + // FIXME + } + + /** + * Writes text at the specified x and y coordinates + * + * See {@link Style::munge_colour()} for the format of the colour array. + * + * @param float $x + * @param float $y + * @param string $text the text to write + * @param string $font the font file to use + * @param float $size the font size, in points + * @param array $color + * @param float $adjust word spacing adjustment + */ + function text($x, $y, $text, $font, $size, $color = array(0,0,0), $adjust = 0) { + // FIXME + } + + function javascript($code) { + // FIXME + } + + /** + * Add a named destination (similar to ... in html) + * + * @param string $anchorname The name of the named destination + */ + function add_named_dest($anchorname) { + // FIXME + } + + /** + * Add a link to the pdf + * + * @param string $url The url to link to + * @param float $x The x position of the link + * @param float $y The y position of the link + * @param float $width The width of the link + * @param float $height The height of the link + */ + function add_link($url, $x, $y, $width, $height) { + // FIXME + } + + /** + * Add meta information to the PDF + * + * @param string $label label of the value (Creator, Producer, etc.) + * @param string $value the text to set + */ + function add_info($label, $value) { + $method = "Set$label"; + if ( in_array("Title", "Author", "Keywords", "Subject") && method_exists($this->_pdf, $method) ) { + $this->_pdf->$method($value); + } + } + + /** + * Calculates text size, in points + * + * @param string $text the text to be sized + * @param string $font the desired font + * @param float $size the desired font size + * @param float $spacing word spacing, if any + * @return float + */ + function get_text_width($text, $font, $size, $spacing = 0) { + // FIXME + } + + /** + * Calculates font height, in points + * + * @param string $font + * @param float $size + * @return float + */ + function get_font_height($font, $size) { + // FIXME + } + + + /** + * Starts a new page + * + * Subsequent drawing operations will appear on the new page. + */ + function new_page() { + // FIXME + } + + /** + * Streams the PDF directly to the browser + * + * @param string $filename the name of the PDF file + * @param array $options associative array, 'Attachment' => 0 or 1, 'compress' => 1 or 0 + */ + function stream($filename, $options = null) { + // FIXME + } + + /** + * Returns the PDF as a string + * + * @param array $options associative array: 'compress' => 1 or 0 + * @return string + */ + function output($options = null) { + // FIXME + } + +} + +// Workaround for idiotic limitation on statics... +PDFLib_Adapter::$PAPER_SIZES = CPDF_Adapter::$PAPER_SIZES; diff --git a/application/third_party/dompdf/include/text_frame_decorator.cls.php b/application/third_party/dompdf/include/text_frame_decorator.cls.php new file mode 100755 index 00000000..0bcb77f2 --- /dev/null +++ b/application/third_party/dompdf/include/text_frame_decorator.cls.php @@ -0,0 +1,204 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: text_frame_decorator.cls.php 356 2011-01-28 08:56:10Z fabien.menager $ */ + +/** + * Decorates Frame objects for text layout + * + * @access private + * @package dompdf + */ +class Text_Frame_Decorator extends Frame_Decorator { + + // protected members + protected $_text_spacing; + + // buggy DOMText::splitText (PHP < 5.2.7) + public static $_buggy_splittext; + + function __construct(Frame $frame, DOMPDF $dompdf) { + if ( $frame->get_node()->nodeName !== "#text" ) + throw new DOMPDF_Exception("Text_Decorator can only be applied to #text nodes."); + + parent::__construct($frame, $dompdf); + $this->_text_spacing = null; + } + + //........................................................................ + + function reset() { + parent::reset(); + $this->_text_spacing = null; + } + + //........................................................................ + + // Accessor methods + function get_text_spacing() { return $this->_text_spacing; } + + function get_text() { + // FIXME: this should be in a child class (and is incorrect) +// if ( $this->_frame->get_style()->content !== "normal" ) { +// $this->_frame->get_node()->data = $this->_frame->get_style()->content; +// $this->_frame->get_style()->content = "normal"; +// } + +// pre_r("---"); +// $style = $this->_frame->get_style(); +// var_dump($text = $this->_frame->get_node()->data); +// var_dump($asc = utf8_decode($text)); +// for ($i = 0; $i < strlen($asc); $i++) +// pre_r("$i: " . $asc[$i] . " - " . ord($asc[$i])); +// pre_r("width: " . Font_Metrics::get_text_width($text, $style->font_family, $style->font_size)); + + return $this->_frame->get_node()->data; + } + + //........................................................................ + + // Vertical margins & padding do not apply to text frames + + // http://www.w3.org/TR/CSS21/visudet.html#inline-non-replaced: + // + // The vertical padding, border and margin of an inline, non-replaced box + // start at the top and bottom of the content area, not the + // 'line-height'. But only the 'line-height' is used to calculate the + // height of the line box. + function get_margin_height() { + // This function is called in add_frame_to_line() and is used to + // determine the line height, so we actually want to return the + // 'line-height' property, not the actual margin box + $style = $this->get_style(); + $font = $style->font_family; + $size = $style->font_size; + + /* + pre_r('-----'); + pre_r($style->line_height); + pre_r($style->font_size); + pre_r(Font_Metrics::get_font_height($font, $size)); + pre_r(($style->line_height / $size) * Font_Metrics::get_font_height($font, $size)); + */ + + return ($style->line_height / $size) * Font_Metrics::get_font_height($font, $size); + + } + + function get_padding_box() { + $pb = $this->_frame->get_padding_box(); + $pb[3] = $pb["h"] = $this->_frame->get_style()->height; + return $pb; + } + //........................................................................ + + // Set method + function set_text_spacing($spacing) { + $style = $this->_frame->get_style(); + + $this->_text_spacing = $spacing; + $char_spacing = $style->length_in_pt($style->letter_spacing); + + // Re-adjust our width to account for the change in spacing + $style->width = Font_Metrics::get_text_width($this->get_text(), $style->font_family, $style->font_size, $spacing, $char_spacing); + } + + //........................................................................ + + // Recalculate the text width + function recalculate_width() { + $style = $this->get_style(); + $text = $this->get_text(); + $size = $style->font_size; + $font = $style->font_family; + $word_spacing = $style->length_in_pt($style->word_spacing); + $char_spacing = $style->length_in_pt($style->letter_spacing); + + return $style->width = Font_Metrics::get_text_width($text, $font, $size, $word_spacing, $char_spacing); + } + + //........................................................................ + + // Text manipulation methods + + // split the text in this frame at the offset specified. The remaining + // text is added a sibling frame following this one and is returned. + function split_text($offset) { + if ( $offset == 0 ) + return; + + if ( self::$_buggy_splittext ) { + // workaround to solve DOMText::spliText() bug parsing multibyte strings + $node = $this->_frame->get_node(); + $txt0 = $node->substringData(0, $offset); + $txt1 = $node->substringData($offset, mb_strlen($node->textContent)-1); + + $node->replaceData(0, mb_strlen($node->textContent), $txt0); + $split = $node->parentNode->appendChild(new DOMText($txt1)); + } + else { + $split = $this->_frame->get_node()->splitText($offset); + } + + $deco = $this->copy($split); + + $p = $this->get_parent(); + $p->insert_child_after($deco, $this, false); + + if ( $p instanceof Inline_Frame_Decorator ) + $p->split($deco); + + return $deco; + } + + //........................................................................ + + function delete_text($offset, $count) { + $this->_frame->get_node()->deleteData($offset, $count); + } + + //........................................................................ + + function set_text($text) { + $this->_frame->get_node()->data = $text; + } + +} + +Text_Frame_Decorator::$_buggy_splittext = version_compare(PHP_VERSION, '5.2.6', '<='); diff --git a/application/third_party/dompdf/include/text_frame_reflower.cls.php b/application/third_party/dompdf/include/text_frame_reflower.cls.php new file mode 100755 index 00000000..622fb86b --- /dev/null +++ b/application/third_party/dompdf/include/text_frame_reflower.cls.php @@ -0,0 +1,440 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +/* $Id: text_frame_reflower.cls.php 360 2011-02-15 19:33:52Z fabien.menager $ */ + +/** + * Reflows text frames. + * + * @access private + * @package dompdf + */ +class Text_Frame_Reflower extends Frame_Reflower { + + /** + * @var Block_Frame_Decorator + */ + protected $_block_parent; // Nearest block-level ancestor + + /** + * @var Text_Frame_Decorator + */ + protected $_frame; + + public static $_whitespace_pattern = "/[ \t\r\n\f]+/u"; + + function __construct(Text_Frame_Decorator $frame) { parent::__construct($frame); } + + //........................................................................ + + protected function _collapse_white_space($text) { + //$text = $this->_frame->get_text(); +// if ( $this->_block_parent->get_current_line("w") == 0 ) +// $text = ltrim($text, " \n\r\t"); + return preg_replace(self::$_whitespace_pattern, " ", $text); + } + + //........................................................................ + + protected function _line_break($text) { + $style = $this->_frame->get_style(); + $size = $style->font_size; + $font = $style->font_family; + $current_line = $this->_block_parent->get_current_line(); + + // Determine the available width + $line_width = $this->_frame->get_containing_block("w"); + $current_line_width = $current_line["left"] + $current_line["w"] + $current_line["right"]; + + $available_width = $line_width - $current_line_width; + + // split the text into words + $words = preg_split('/([\s-]+)/u', $text, -1, PREG_SPLIT_DELIM_CAPTURE); + $wc = count($words); + + // Account for word-spacing + $word_spacing = $style->length_in_pt($style->word_spacing); + $char_spacing = $style->length_in_pt($style->letter_spacing); + + // Determine the frame width including margin, padding & border + $text_width = Font_Metrics::get_text_width($text, $font, $size, $word_spacing, $char_spacing); + $mbp_width = + $style->length_in_pt( array( $style->margin_left, + $style->border_left_width, + $style->padding_left, + $style->padding_right, + $style->border_right_width, + $style->margin_right), $line_width ); + + $frame_width = $text_width + $mbp_width; + +// Debugging: +// pre_r("Text: '" . htmlspecialchars($text). "'"); +// pre_r("width: " .$frame_width); +// pre_r("textwidth + delta: $text_width + $mbp_width"); +// pre_r("font-size: $size"); +// pre_r("cb[w]: " .$line_width); +// pre_r("available width: " . $available_width); +// pre_r("current line width: " . $current_line_width); + +// pre_r($words); + + if ( $frame_width <= $available_width ) + return false; + + // Determine the split point + $width = 0; + $str = ""; + reset($words); + + // @todo support , + for ($i = 0; $i < $wc; $i += 2) { + $word = $words[$i] . (isset($words[$i+1]) ? $words[$i+1] : ""); + $word_width = Font_Metrics::get_text_width($word, $font, $size, $word_spacing, $char_spacing); + if ( $width + $word_width + $mbp_width > $available_width ) + break; + + $width += $word_width; + $str .= $word; + + } + + // The first word has overflowed. Force it onto the line + if ( $current_line_width == 0 && $width == 0 ) { + $width += $word_width; + $str .= $word; + } + + $offset = mb_strlen($str); + +// More debugging: +// pre_var_dump($str); +// pre_r("Width: ". $width); +// pre_r("Offset: " . $offset); + + return $offset; + + } + + //........................................................................ + + protected function _newline_break($text) { + + if ( ($i = mb_strpos($text, "\n")) === false) + return false; + + return $i+1; + + } + + //........................................................................ + + protected function _layout_line() { + $style = $this->_frame->get_style(); + $text = $this->_frame->get_text(); + $size = $style->font_size; + $font = $style->font_family; + $word_spacing = $style->length_in_pt($style->word_spacing); + $char_spacing = $style->length_in_pt($style->letter_spacing); + + // Determine the text height + $style->height = Font_Metrics::get_font_height( $font, $size ); + + $split = false; + $add_line = false; + + // Handle text transform: + // http://www.w3.org/TR/CSS21/text.html#propdef-text-transform + switch (strtolower($style->text_transform)) { + default: break; + case "capitalize": $text = mb_convert_case($text, MB_CASE_TITLE); break; + case "uppercase": $text = mb_convert_case($text, MB_CASE_UPPER); break; + case "lowercase": $text = mb_convert_case($text, MB_CASE_LOWER); break; + } + + // Handle white-space property: + // http://www.w3.org/TR/CSS21/text.html#propdef-white-space + switch ($style->white_space) { + + default: + case "normal": + $this->_frame->set_text( $text = $this->_collapse_white_space($text) ); + if ( $text == "" ) + break; + + $split = $this->_line_break($text); + break; + + case "pre": + $split = $this->_newline_break($text); + $add_line = $split !== false; + break; + + case "nowrap": + $this->_frame->set_text( $text = $this->_collapse_white_space($text) ); + break; + + case "pre-wrap": + $split = $this->_newline_break($text); + + if ( ($tmp = $this->_line_break($text)) !== false ) { + $add_line = $split < $tmp; + $split = min($tmp, $split); + } else + $add_line = true; + + break; + + case "pre-line": + // Collapse white-space except for \n + $this->_frame->set_text( $text = preg_replace( "/[ \t]+/u", " ", $text ) ); + + if ( $text == "" ) + break; + + $split = $this->_newline_break($text); + + if ( ($tmp = $this->_line_break($text)) !== false ) { + $add_line = $split < $tmp; + $split = min($tmp, $split); + } else + $add_line = true; + + break; + + } + + // Handle degenerate case + if ( $text === "" ) + return; + + if ( $split !== false) { + + // Handle edge cases + if ( $split == 0 && $text === " " ) { + $this->_frame->set_text(""); + return; + } + + if ( $split == 0 ) { + + // Trim newlines from the beginning of the line + //$this->_frame->set_text(ltrim($text, "\n\r")); + + $this->_block_parent->add_line(); + $this->_frame->position(); + + // Layout the new line + $this->_layout_line(); + + } + + else if ( $split < mb_strlen($this->_frame->get_text()) ) { + // split the line if required + $this->_frame->split_text($split); + + $t = $this->_frame->get_text(); + + // Remove any trailing newlines + if ( $split > 1 && $t[$split-1] === "\n" ) + $this->_frame->set_text( mb_substr($t, 0, -1) ); + + // Do we need to trim spaces on wrapped lines? This might be desired, however, we + // can't trim the lines here or the layout will be affected if trimming the line + // leaves enough space to fit the next word in the text stream (because pdf layout + // is performed elsewhere). + /*if (!$this->_frame->get_prev_sibling() && !$this->_frame->get_next_sibling()) { + $t = $this->_frame->get_text(); + $this->_frame->set_text( trim($t) ); + }*/ + } + + if ( $add_line ) { + $this->_block_parent->add_line(); + $this->_frame->position(); + } + + } else { + + // Remove empty space from start and end of line, but only where there isn't an inline sibling + // and the parent node isn't an inline element with siblings + // FIXME: Include non-breaking spaces? + $t = $this->_frame->get_text(); + $parent = $this->_frame->get_parent(); + $is_inline_frame = get_class($parent) === 'Inline_Frame_Decorator'; + + if ((!$is_inline_frame && !$this->_frame->get_next_sibling()) || + ( $is_inline_frame && !$parent->get_next_sibling())) { + $t = rtrim($t); + } + + if ((!$is_inline_frame && !$this->_frame->get_prev_sibling()) || + ( $is_inline_frame && !$parent->get_prev_sibling())) { + $t = ltrim($t); + } + + $this->_frame->set_text( $t ); + + } + + // Set our new width + $width = $this->_frame->recalculate_width(); + } + + //........................................................................ + + function reflow(Frame_Decorator $block = null) { + + $page = $this->_frame->get_root(); + $page->check_forced_page_break($this->_frame); + + if ( $page->is_full() ) + return; + + $this->_block_parent = $this->_frame->find_block_parent(); + + // Left trim the text if this is the first text on the line and we're + // collapsing white space +// if ( $this->_block_parent->get_current_line("w") == 0 && +// ($this->_frame->get_style()->white_space !== "pre" || +// $this->_frame->get_style()->white_space !== "pre-wrap") ) { +// $this->_frame->set_text( ltrim( $this->_frame->get_text() ) ); +// } + + $this->_frame->position(); + + $this->_layout_line(); + + if ( $block ) { + $block->add_frame_to_line($this->_frame); + } + } + + //........................................................................ + + // Returns an array(0 => min, 1 => max, "min" => min, "max" => max) of the + // minimum and maximum widths of this frame + function get_min_max_width() { + + $style = $this->_frame->get_style(); + $this->_block_parent = $this->_frame->find_block_parent(); + $line_width = $this->_frame->get_containing_block("w"); + + $str = $text = $this->_frame->get_text(); + $size = $style->font_size; + $font = $style->font_family; + + $word_spacing = $style->length_in_pt($style->word_spacing); + $char_spacing = $style->length_in_pt($style->letter_spacing); + + switch($style->white_space) { + + default: + case "normal": + $str = preg_replace(self::$_whitespace_pattern," ", $str); + case "pre-wrap": + case "pre-line": + + // Find the longest word (i.e. minimum length) + + // This technique (using arrays & an anonymous function) is actually + // faster than doing a single-pass character by character scan. Heh, + // yes I took the time to bench it ;) + $words = array_flip(preg_split("/[\s-]+/u",$str, -1, PREG_SPLIT_DELIM_CAPTURE)); + array_walk($words, create_function('&$val,$str', + '$val = Font_Metrics::get_text_width($str, "'.addslashes($font).'", '.$size.', '.$word_spacing.', '.$char_spacing.');')); + arsort($words); + $min = reset($words); + break; + + case "pre": + $lines = array_flip(preg_split("/\n/u", $str)); + array_walk($lines, create_function('&$val,$str', + '$val = Font_Metrics::get_text_width($str, "'.addslashes($font).'", '.$size.', '.$word_spacing.', '.$char_spacing.');')); + + arsort($lines); + $min = reset($lines); + break; + + case "nowrap": + $min = Font_Metrics::get_text_width($this->_collapse_white_space($str), $font, $size, $word_spacing, $char_spacing); + break; + + } + + switch ($style->white_space) { + + default: + case "normal": + case "nowrap": + $str = preg_replace(self::$_whitespace_pattern," ", $text); + break; + + case "pre-line": + //XXX: Is this correct? + $str = preg_replace( "/[ \t]+/u", " ", $text); + + case "pre-wrap": + // Find the longest word (i.e. minimum length) + $lines = array_flip(preg_split("/\n/", $text)); + array_walk($lines, create_function('&$val,$str', + '$val = Font_Metrics::get_text_width($str, "'.$font.'", '.$size.', '.$word_spacing.', '.$char_spacing.');')); + arsort($lines); + reset($lines); + $str = key($lines); + break; + + } + + $max = Font_Metrics::get_text_width($str, $font, $size, $word_spacing, $char_spacing); + + $delta = $style->length_in_pt(array($style->margin_left, + $style->border_left_width, + $style->padding_left, + $style->padding_right, + $style->border_right_width, + $style->margin_right), $line_width); + $min += $delta; + $max += $delta; + + return array($min, $max, "min" => $min, "max" => $max); + + } + +} diff --git a/application/third_party/dompdf/include/text_renderer.cls.php b/application/third_party/dompdf/include/text_renderer.cls.php new file mode 100755 index 00000000..56ba38f1 --- /dev/null +++ b/application/third_party/dompdf/include/text_renderer.cls.php @@ -0,0 +1,182 @@ + + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @contributor Helmut Tischer + * @package dompdf + + * + * Changes + * @contributor Helmut Tischer + * @version dompdf_trunk_with_helmut_mods.20090528 + * - fix text decoration positions according to font metrics + * @version 20090610 + * - better accuracy on using different renderer as cpdf, added comments + */ + +/* $Id: text_renderer.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */ +/** + * Renders text frames + * + * @access private + * @package dompdf + */ +class Text_Renderer extends Abstract_Renderer { + + const DECO_THICKNESS = 0.02; // Thickness of underline. Screen: 0.08, print: better less, e.g. 0.04 + + //Tweaking if $base and $descent are not accurate. + //Check method_exists( $this->_canvas, "get_cpdf" ) + //- For cpdf these can and must stay 0, because font metrics are used directly. + //- For other renderers, if different values are wanted, separate the parameter sets. + // But $size and $size-$height seem to be accurate enough + const UNDERLINE_OFFSET = 0.0; // Relative to bottom of text, as fraction of height. + const OVERLINE_OFFSET = 0.0; // Relative to top of text + const LINETHROUGH_OFFSET = 0.0; // Relative to centre of text. + const DECO_EXTENSION = 0.0; // How far to extend lines past either end, in pt + + //........................................................................ + + function render(Frame $frame) { + $text = $frame->get_text(); + if ( trim($text) === "" ) + return; + + $style = $frame->get_style(); + list($x, $y) = $frame->get_position(); + $cb = $frame->get_containing_block(); + + if ( ($ml = $style->margin_left) === "auto" || $ml === "none" ) + $ml = 0; + + if ( ($pl = $style->padding_left) === "auto" || $pl === "none" ) + $pl = 0; + + if ( ($bl = $style->border_left_width) === "auto" || $bl === "none" ) + $bl = 0; + + $x += $style->length_in_pt( array($ml, $pl, $bl), $cb["w"] ); + + $font = $style->font_family; + $size = $frame_font_size = $style->font_size; + $height = $style->height; + $word_spacing = $frame->get_text_spacing() + $style->length_in_pt($style->word_spacing); + $char_spacing = $style->length_in_pt($style->letter_spacing); + $width = $style->width; + + /*$text = str_replace( + array("{PAGE_NUM}"), + array($this->_canvas->get_page_number()), + $text + );*/ + + $this->_canvas->text($x, $y, $text, + $font, $size, + $style->color, $word_spacing, $char_spacing); + + $line = $frame->get_containing_line(); + + // FIXME Instead of using the tallest frame to position, + // the decoration, the text should be well placed + if ( false && $line["tallest_frame"] ) { + $base_frame = $line["tallest_frame"]; + $style = $base_frame->get_style(); + $size = $style->font_size; + $height = $line["h"] * ($size / $style->line_height); + } + + if ( method_exists( $this->_canvas, "get_cpdf" ) ) { + $cpdf = $this->_canvas->get_cpdf(); + $fontBBox = $cpdf->fonts[$style->font_family]['FontBBox']; + $base = (($fontBBox[3]*$size)/1000) * 0.90; + $descent = ($fontBBox[1]*$size)/1000; + //print '
Text_Renderer cpdf:'.$base.' '.$descent.' '.$size.'
'; + } else { + //Descent is font part below baseline, typically negative. $height is about full height of font box. + //$descent = -$size/6; is less accurate, depends on font family. + // @todo Could we get font info for PDFlib adapter and others ? + $base = $size*1.08; + $descent = $size-$height; + //print '
Text_Renderer other than cpdf:'.$base.' '.$descent.' '.$size.'
'; + } + + // Handle text decoration: + // http://www.w3.org/TR/CSS21/text.html#propdef-text-decoration + + // Draw all applicable text-decorations. Start with the root and work our way down. + $p = $frame; + $stack = array(); + while ( $p = $p->get_parent() ) + $stack[] = $p; + + while ( count($stack) > 0 ) { + $f = array_pop($stack); + + if ( ($text_deco = $f->get_style()->text_decoration) === "none" ) + continue; + + $deco_y = $y; //$line["y"]; + $color = $f->get_style()->color; + + switch ($text_deco) { + + default: + continue; + + case "underline": + $deco_y += $base - $descent + $size * (self::UNDERLINE_OFFSET - self::DECO_THICKNESS/2); + break; + + case "overline": + $deco_y += $size * (self::OVERLINE_OFFSET + self::DECO_THICKNESS/2); + break; + + case "line-through": + $deco_y += $base * 0.7 + $size * self::LINETHROUGH_OFFSET; + break; + } + + $dx = 0; + $x1 = $x - self::DECO_EXTENSION; + $x2 = $x + $width + $dx + self::DECO_EXTENSION; + $this->_canvas->line($x1, $deco_y, $x2, $deco_y, $color, $size * self::DECO_THICKNESS); + + } + + if (DEBUG_LAYOUT && DEBUG_LAYOUT_LINES) { + $text_width = Font_Metrics::get_text_width($text, $font, $frame_font_size); + $this->_debug_layout(array($x, $y, $text_width+($line["wc"]-1)*$word_spacing, $frame_font_size), "orange", array(0.5, 0.5)); + } + } +} diff --git a/application/third_party/dompdf/include/ttf_info.cls.php b/application/third_party/dompdf/include/ttf_info.cls.php new file mode 100755 index 00000000..8fdeb3bc --- /dev/null +++ b/application/third_party/dompdf/include/ttf_info.cls.php @@ -0,0 +1,306 @@ +_dirRestriction && preg_match('[\.\/|\.\.\/]', $data)) + { + $this->exitClass('Error: Directory restriction is enforced!'); + } + + $this->filename = $data; + return $this; + } // public function setFontFile + + /** + * function setFontsDir() + * set the Font Directory + * @public + * @param string $data the new value + * @return object referrence to this + */ + public function setFontsDir($data) + { + if ($this->_dirRestriction && preg_match('[\.\/|\.\.\/]', $data)) + { + $this->exitClass('Error: Directory restriction is enforced!'); + } + + $this->fontsdir = $data; + return $this; + } // public function setFontsDir + + /** + * function readFontsDir() + * @public + * @return information contained in the TTF 'name' table of all fonts in a directory. + */ + public function readFontsDir() + { + if (empty($this->fontsdir)) { $this->exitClass('Error: Fonts Directory has not been set with setFontsDir().'); } + if (empty($this->backupDir)){ $this->backupDir = $this->fontsdir; } + + //$this->array = array(); + $d = dir($this->fontsdir); + + while (false !== ($e = $d->read())) + { + if($e != '.' && $e != '..') + { + $e = $this->fontsdir . $e; + if($this->_recursive && is_dir($e)) + { + $this->setFontsDir($e); + $this->readFontsDir(); + } + else if ($this->is_ttf($e) === true) + { + $this->setFontFile($e); + $this->array[] = $this->getFontInfo(); + } + } + } + + if (!empty($this->backupDir)){ $this->fontsdir = $this->backupDir; } + + $d->close(); + return $this; + } // public function readFontsDir + + /** + * function setProtectedVar() + * @public + * @param string $var the new variable + * @param string $data the new value + * @return object reference to this + + * DISABLED, NO REAL USE YET + + public function setProtectedVar($var, $data) + { + if ($var == 'filename') + { + $this->setFontFile($data); + } else { + //if (isset($var) && !empty($data)) + $this->$var = $data; + } + return $this; + } + */ + /** + * function getFontInfo() + * @public + * @return information contained in the TTF 'name' table. + */ + public function getFontInfo() + { + $fd = fopen ($this->filename, "r"); + $this->text = fread ($fd, filesize($this->filename)); + fclose ($fd); + + $number_of_tables = hexdec($this->dec2ord($this->text[4]).$this->dec2ord($this->text[5])); + + for ($i=0;$i<$number_of_tables;$i++) + { + $tag = $this->text[12+$i*16].$this->text[12+$i*16+1].$this->text[12+$i*16+2].$this->text[12+$i*16+3]; + + if ($tag == 'name') + { + $this->ntOffset = hexdec( + $this->dec2ord($this->text[12+$i*16+8]).$this->dec2ord($this->text[12+$i*16+8+1]). + $this->dec2ord($this->text[12+$i*16+8+2]).$this->dec2ord($this->text[12+$i*16+8+3])); + + $offset_storage_dec = hexdec($this->dec2ord($this->text[$this->ntOffset+4]).$this->dec2ord($this->text[$this->ntOffset+5])); + $number_name_records_dec = hexdec($this->dec2ord($this->text[$this->ntOffset+2]).$this->dec2ord($this->text[$this->ntOffset+3])); + } + } + + $storage_dec = $offset_storage_dec + $this->ntOffset; + $storage_hex = strtoupper(dechex($storage_dec)); + + for ($j=0;$j<$number_name_records_dec;$j++) + { + $platform_id_dec = hexdec($this->dec2ord($this->text[$this->ntOffset+6+$j*12+0]).$this->dec2ord($this->text[$this->ntOffset+6+$j*12+1])); + $name_id_dec = hexdec($this->dec2ord($this->text[$this->ntOffset+6+$j*12+6]).$this->dec2ord($this->text[$this->ntOffset+6+$j*12+7])); + $string_length_dec = hexdec($this->dec2ord($this->text[$this->ntOffset+6+$j*12+8]).$this->dec2ord($this->text[$this->ntOffset+6+$j*12+9])); + $string_offset_dec = hexdec($this->dec2ord($this->text[$this->ntOffset+6+$j*12+10]).$this->dec2ord($this->text[$this->ntOffset+6+$j*12+11])); + + if (!empty($name_id_dec) and empty($font_tags[$name_id_dec])) + { + for($l=0;$l<$string_length_dec;$l++) + { + if (ord($this->text[$storage_dec+$string_offset_dec+$l]) == '0') { continue; } + else { $font_tags[$name_id_dec] .= ($this->text[$storage_dec+$string_offset_dec+$l]); } + } + } + } + return $font_tags; + } // public function getFontInfo + + /** + * function getCopyright() + * @public + * @return 'Copyright notice' contained in the TTF 'name' table at index 0 + */ + public function getCopyright() + { + $this->info = $this->getFontInfo(); + return $this->info[0]; + } // public function getCopyright + + /** + * function getFontFamily() + * @public + * @return 'Font Family name' contained in the TTF 'name' table at index 1 + */ + public function getFontFamily() + { + $this->info = $this->getFontInfo(); + return $this->info[1]; + } // public function getFontFamily + + /** + * function getFontSubFamily() + * @public + * @return 'Font Subfamily name' contained in the TTF 'name' table at index 2 + */ + public function getFontSubFamily() + { + $this->info = $this->getFontInfo(); + return $this->info[2]; + } // public function getFontSubFamily + + /** + * function getFontId() + * @public + * @return 'Unique font identifier' contained in the TTF 'name' table at index 3 + */ + public function getFontId() + { + $this->info = $this->getFontInfo(); + return $this->info[3]; + } // public function getFontId + + /** + * function getFullFontName() + * @public + * @return 'Full font name' contained in the TTF 'name' table at index 4 + */ + public function getFullFontName() + { + $this->info = $this->getFontInfo(); + return $this->info[4]; + } // public function getFullFontName + + /** + * function dec2ord() + * Used to lessen redundant calls to multiple functions. + * @protected + * @return object + */ + protected function dec2ord($dec) + { + return $this->dec2hex(ord($dec)); + } // protected function dec2ord + + /** + * function dec2hex() + * private function to perform Hexadecimal to decimal with proper padding. + * @protected + * @return object + */ + protected function dec2hex($dec) + { + return str_repeat('0', 2-strlen(($hex=strtoupper(dechex($dec))))) . $hex; + } // protected function dec2hex + + /** + * function dec2hex() + * private function to perform Hexadecimal to decimal with proper padding. + * @protected + * @return object + */ + protected function exitClass($message) + { + echo $message; + exit; + } // protected function dec2hex + + /** + * function dec2hex() + * private helper function to test in the file in question is a ttf. + * @protected + * @return object + */ + protected function is_ttf($file) + { + $ext = explode('.', $file); + $ext = $ext[count($ext)-1]; + return preg_match("/ttf$/i",$ext) ? true : false; + } // protected function is_ttf +} // class ttfInfo + +function getFontInfo($resource) +{ + $ttfInfo = new TTF_Info; + $ttfInfo->setFontFile($resource); + return $ttfInfo->getFontInfo(); +} +?> \ No newline at end of file diff --git a/application/third_party/dompdf/index.php b/application/third_party/dompdf/index.php new file mode 100755 index 00000000..7ed173a8 --- /dev/null +++ b/application/third_party/dompdf/index.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/application/third_party/dompdf/lib/class.pdf.php b/application/third_party/dompdf/lib/class.pdf.php new file mode 100755 index 00000000..3478e05d --- /dev/null +++ b/application/third_party/dompdf/lib/class.pdf.php @@ -0,0 +1,4897 @@ + + * @contributor Orion Richardson + * @contributor Helmut Tischer + * @contributor Ryan H. Masten + * @version 009 + * @package Cpdf + * + * Changes + * @contributor Helmut Tischer + * @version 0.5.1.htischer.20090507 + * - On multiple identical png and jpg images, put only one copy into the pdf file and refer to it. + * This reduces file size and rendering time. + * - Allow font metrics cache to be a different folder as the font metrics. This allows a read only installation. + * - Allow adding images directly from a gd object. This increases performance by avoiding temporary files. + * - On png image files remove alpa channel to allow display of typical png files in pdf. + * - On addImage avoid temporary file. Todo: Duplicate Image (currently not used) + * - Add a check function, whether image is already cached, This avoids double creation by caller which saves + * CPU time and memory. + * @contributor Helmut Tischer + * @version dompdf_trunk_with_helmut_mods.20090524 + * - Allow temp and fontcache folders to be passed in by class creator + * @version dompdf_trunk_with_helmut_mods.20090528 + * - typo 'decent' instead of 'descent' at various locations made getFontDescender worthless + */ + +/* $Id: class.pdf.php 360 2011-02-15 19:33:52Z fabien.menager $ */ + +class Cpdf { + + + /** + * the current number of pdf objects in the document + */ + public $numObj = 0; + + /** + * this array contains all of the pdf objects, ready for final assembly + */ + public $objects = array(); + + /** + * the objectId (number within the objects array) of the document catalog + */ + public $catalogId; + + /** + * array carrying information about the fonts that the system currently knows about + * used to ensure that a font is not loaded twice, among other things + */ + public $fonts = array(); + + /** + * the default font metrics file to use if no other font has been loaded + * the path to the directory containing the font metrics should be included + */ + public $defaultFont = './fonts/Helvetica.afm'; + + /** + * a record of the current font + */ + public $currentFont = ''; + + /** + * the current base font + */ + public $currentBaseFont = ''; + + /** + * the number of the current font within the font array + */ + public $currentFontNum = 0; + + /** + * + */ + public $currentNode; + + /** + * object number of the current page + */ + public $currentPage; + + /** + * object number of the currently active contents block + */ + public $currentContents; + + /** + * number of fonts within the system + */ + public $numFonts = 0; + + /** + * Number of graphic state resources used + */ + private $numStates = 0; + + /** + * current colour for fill operations, defaults to inactive value, all three components should be between 0 and 1 inclusive when active + */ + public $currentColour = null; + + /** + * current colour for stroke operations (lines etc.) + */ + public $currentStrokeColour = null; + + /** + * current style that lines are drawn in + */ + public $currentLineStyle = ''; + + /** + * current line transparency (partial graphics state) + */ + public $currentLineTransparency = array("mode" => "Normal", "opacity" => 1.0); + + /** + * current fill transparency (partial graphics state) + */ + public $currentFillTransparency = array("mode" => "Normal", "opacity" => 1.0); + + /** + * an array which is used to save the state of the document, mainly the colours and styles + * it is used to temporarily change to another state, the change back to what it was before + */ + public $stateStack = array(); + + /** + * number of elements within the state stack + */ + public $nStateStack = 0; + + /** + * number of page objects within the document + */ + public $numPages = 0; + + /** + * object Id storage stack + */ + public $stack = array(); + + /** + * number of elements within the object Id storage stack + */ + public $nStack = 0; + + /** + * an array which contains information about the objects which are not firmly attached to pages + * these have been added with the addObject function + */ + public $looseObjects = array(); + + /** + * array contains infomation about how the loose objects are to be added to the document + */ + public $addLooseObjects = array(); + + /** + * the objectId of the information object for the document + * this contains authorship, title etc. + */ + public $infoObject = 0; + + /** + * number of images being tracked within the document + */ + public $numImages = 0; + + /** + * an array containing options about the document + * it defaults to turning on the compression of the objects + */ + public $options = array('compression'=>true); + + /** + * the objectId of the first page of the document + */ + public $firstPageId; + + /** + * used to track the last used value of the inter-word spacing, this is so that it is known + * when the spacing is changed. + */ + public $wordSpaceAdjust = 0; + + /** + * used to track the last used value of the inter-letter spacing, this is so that it is known + * when the spacing is changed. + */ + public $charSpaceAdjust = 0; + + /** + * the object Id of the procset object + */ + public $procsetObjectId; + + /** + * store the information about the relationship between font families + * this used so that the code knows which font is the bold version of another font, etc. + * the value of this array is initialised in the constuctor function. + */ + public $fontFamilies = array(); + + /** + * folder for php serialized formats of font metrics files. + * If empty string, use same folder as original metrics files. + * This can be passed in from class creator. + * If this folder does not exist or is not writable, Cpdf will be **much** slower. + * Because of potential trouble with php safe mode, folder cannot be created at runtime. + */ + public $fontcache = ''; + + /** + * The version of the font metrics cache file. + * This value must be manually incremented whenever the internal font data structure is modified. + */ + public $fontcacheVersion = 4; + + /** + * temporary folder. + * If empty string, will attempty system tmp folder. + * This can be passed in from class creator. + * Only used for conversion of gd images to jpeg images. + */ + public $tmp = ''; + + /** + * track if the current font is bolded or italicised + */ + public $currentTextState = ''; + + /** + * messages are stored here during processing, these can be selected afterwards to give some useful debug information + */ + public $messages = ''; + + /** + * the ancryption array for the document encryption is stored here + */ + public $arc4 = ''; + + /** + * the object Id of the encryption information + */ + public $arc4_objnum = 0; + + /** + * the file identifier, used to uniquely identify a pdf document + */ + public $fileIdentifier = ''; + + /** + * a flag to say if a document is to be encrypted or not + */ + public $encrypted = 0; + + /** + * the ancryption key for the encryption of all the document content (structure is not encrypted) + */ + public $encryptionKey = ''; + + /** + * array which forms a stack to keep track of nested callback functions + */ + public $callback = array(); + + /** + * the number of callback functions in the callback array + */ + public $nCallback = 0; + + /** + * store label->id pairs for named destinations, these will be used to replace internal links + * done this way so that destinations can be defined after the location that links to them + */ + public $destinations = array(); + + /** + * store the stack for the transaction commands, each item in here is a record of the values of all the + * publiciables within the class, so that the user can rollback at will (from each 'start' command) + * note that this includes the objects array, so these can be large. + */ + public $checkpoint = ''; + + /* Table of Image origin filenames and image labels which were already added with o_image(). + * Allows to merge identical images + */ + public $imagelist = array(); + + /** + * whether the text passed in should be treated as Unicode or just local character set. + */ + public $isUnicode = false; + + /** + * @var string the JavaScript code of the document + */ + public $javascript = ''; + + /** + * @var boolean whether the compression is possible + */ + protected $compressionReady = false; + + /** + * @var array current page size + */ + protected $currentPageSize = array("width" => 0, "height" => 0); + + /** + * @var string the target internal encoding + */ + static protected $targetEncoding = 'iso-8859-1'; + + /** + * class constructor + * this will start a new document + * @var array array of 4 numbers, defining the bottom left and upper right corner of the page. first two are normally zero. + * @var boolean whether text will be treated as Unicode or not. + */ + function __construct ($pageSize = array(0, 0, 612, 792), $isUnicode = false, $fontcache = '', $tmp = '') { + $this->isUnicode = $isUnicode; + $this->fontcache = $fontcache; + $this->tmp = $tmp; + $this->newDocument($pageSize); + + $this->compressionReady = function_exists('gzcompress'); + + if ( in_array('Windows-1252', mb_list_encodings()) ) { + self::$targetEncoding = 'Windows-1252'; + } + + // also initialize the font families that are known about already + $this->setFontFamily('init'); + // $this->fileIdentifier = md5('xxxxxxxx'.time()); + } + + + /** + * Class destructor + */ + function __destruct() { + clear_object($this); + } + + /** + * Document object methods (internal use only) + * + * There is about one object method for each type of object in the pdf document + * Each function has the same call list ($id,$action,$options). + * $id = the object ID of the object, or what it is to be if it is being created + * $action = a string specifying the action to be performed, though ALL must support: + * 'new' - create the object with the id $id + * 'out' - produce the output for the pdf object + * $options = optional, a string or array containing the various parameters for the object + * + * These, in conjunction with the output function are the ONLY way for output to be produced + * within the pdf 'file'. + */ + + /** + *destination object, used to specify the location for the user to jump to, presently on opening + */ + protected function o_destination($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'destination', 'info'=>array()); + $tmp = ''; + switch ($options['type']) { + case 'XYZ': + case 'FitR': + $tmp = ' '.$options['p3'].$tmp; + case 'FitH': + case 'FitV': + case 'FitBH': + case 'FitBV': + $tmp = ' '.$options['p1'].' '.$options['p2'].$tmp; + case 'Fit': + case 'FitB': + $tmp = $options['type'].$tmp; + $this->objects[$id]['info']['string'] = $tmp; + $this->objects[$id]['info']['page'] = $options['page']; + } + break; + + case 'out': + $tmp = $o['info']; + $res = "\n$id 0 obj\n".'['.$tmp['page'].' 0 R /'.$tmp['string']."]\nendobj"; + return $res; + } + } + + + /** + * set the viewer preferences + */ + protected function o_viewerPreferences($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'viewerPreferences', 'info'=>array()); + break; + + case 'add': + foreach($options as $k=>$v) { + switch ($k) { + case 'HideToolbar': + case 'HideMenubar': + case 'HideWindowUI': + case 'FitWindow': + case 'CenterWindow': + case 'NonFullScreenPageMode': + case 'Direction': + $o['info'][$k] = $v; + break; + } + } + break; + + case 'out': + $res = "\n$id 0 obj\n<< "; + foreach($o['info'] as $k=>$v) { + $res.= "\n/$k $v"; + } + $res.= "\n>>\n"; + return $res; + } + } + + + /** + * define the document catalog, the overall controller for the document + */ + protected function o_catalog($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'catalog', 'info'=>array()); + $this->catalogId = $id; + break; + + case 'outlines': + case 'pages': + case 'openHere': + case 'javascript': + $o['info'][$action] = $options; + break; + + case 'viewerPreferences': + if (!isset($o['info']['viewerPreferences'])) { + $this->numObj++; + $this->o_viewerPreferences($this->numObj, 'new'); + $o['info']['viewerPreferences'] = $this->numObj; + } + + $vp = $o['info']['viewerPreferences']; + $this->o_viewerPreferences($vp, 'add', $options); + + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /Catalog"; + + foreach($o['info'] as $k=>$v) { + switch ($k) { + case 'outlines': + $res.= "\n/Outlines $v 0 R"; + break; + + case 'pages': + $res.= "\n/Pages $v 0 R"; + break; + + case 'viewerPreferences': + $res.= "\n/ViewerPreferences $v 0 R"; + break; + + case 'openHere': + $res.= "\n/OpenAction $v 0 R"; + break; + + case 'javascript': + $res.= "\n/Names <>"; + break; + } + } + + $res.= " >>\nendobj"; + return $res; + } + } + + + /** + * object which is a parent to the pages in the document + */ + protected function o_pages($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'pages', 'info'=>array()); + $this->o_catalog($this->catalogId, 'pages', $id); + break; + + case 'page': + if (!is_array($options)) { + // then it will just be the id of the new page + $o['info']['pages'][] = $options; + } else { + // then it should be an array having 'id','rid','pos', where rid=the page to which this one will be placed relative + // and pos is either 'before' or 'after', saying where this page will fit. + if (isset($options['id']) && isset($options['rid']) && isset($options['pos'])) { + $i = array_search($options['rid'], $o['info']['pages']); + if (isset($o['info']['pages'][$i]) && $o['info']['pages'][$i] == $options['rid']) { + + // then there is a match + // make a space + switch ($options['pos']) { + case 'before': + $k = $i; + break; + + case 'after': + $k = $i+1; + break; + + default: + $k = -1; + break; + } + + if ($k >= 0) { + for ($j = count($o['info']['pages']) -1;$j >= $k;$j--) { + $o['info']['pages'][$j+1] = $o['info']['pages'][$j]; + } + + $o['info']['pages'][$k] = $options['id']; + } + } + } + } + break; + + case 'procset': + $o['info']['procset'] = $options; + break; + + case 'mediaBox': + $o['info']['mediaBox'] = $options; + // which should be an array of 4 numbers + $this->currentPageSize = array('width' => $options[2], 'height' => $options[3]); + break; + + case 'font': + $o['info']['fonts'][] = array('objNum'=>$options['objNum'], 'fontNum'=>$options['fontNum']); + break; + + case 'extGState': + $o['info']['extGStates'][] = array('objNum' => $options['objNum'], 'stateNum' => $options['stateNum']); + break; + + case 'xObject': + $o['info']['xObjects'][] = array('objNum'=>$options['objNum'], 'label'=>$options['label']); + break; + + case 'out': + if (count($o['info']['pages'])) { + $res = "\n$id 0 obj\n<< /Type /Pages\n/Kids ["; + foreach($o['info']['pages'] as $v) { + $res.= "$v 0 R\n"; + } + + $res.= "]\n/Count ".count($this->objects[$id]['info']['pages']); + + if ( (isset($o['info']['fonts']) && count($o['info']['fonts'])) || + isset($o['info']['procset']) || + (isset($o['info']['extGStates']) && count($o['info']['extGStates']))) { + $res.= "\n/Resources <<"; + + if (isset($o['info']['procset'])) { + $res.= "\n/ProcSet ".$o['info']['procset']." 0 R"; + } + + if (isset($o['info']['fonts']) && count($o['info']['fonts'])) { + $res.= "\n/Font << "; + foreach($o['info']['fonts'] as $finfo) { + $res.= "\n/F".$finfo['fontNum']." ".$finfo['objNum']." 0 R"; + } + $res.= "\n>>"; + } + + if (isset($o['info']['xObjects']) && count($o['info']['xObjects'])) { + $res.= "\n/XObject << "; + foreach($o['info']['xObjects'] as $finfo) { + $res.= "\n/".$finfo['label']." ".$finfo['objNum']." 0 R"; + } + $res.= "\n>>"; + } + + if ( isset($o['info']['extGStates']) && count($o['info']['extGStates'])) { + $res.= "\n/ExtGState << "; + foreach ($o['info']['extGStates'] as $gstate) { + $res.= "\n/GS" . $gstate['stateNum'] . " " . $gstate['objNum'] . " 0 R"; + } + $res.= "\n>>"; + } + + $res.= "\n>>"; + if (isset($o['info']['mediaBox'])) { + $tmp = $o['info']['mediaBox']; + $res.= "\n/MediaBox [".sprintf('%.3F %.3F %.3F %.3F', $tmp[0], $tmp[1], $tmp[2], $tmp[3]) .']'; + } + } + + $res.= "\n >>\nendobj"; + } else { + $res = "\n$id 0 obj\n<< /Type /Pages\n/Count 0\n>>\nendobj"; + } + + return $res; + } + } + + + /** + * define the outlines in the doc, empty for now + */ + protected function o_outlines($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'outlines', 'info'=>array('outlines'=>array())); + $this->o_catalog($this->catalogId, 'outlines', $id); + break; + + case 'outline': + $o['info']['outlines'][] = $options; + break; + + case 'out': + if (count($o['info']['outlines'])) { + $res = "\n$id 0 obj\n<< /Type /Outlines /Kids ["; + foreach($o['info']['outlines'] as $v) { + $res.= "$v 0 R "; + } + + $res.= "] /Count ".count($o['info']['outlines']) ." >>\nendobj"; + } else { + $res = "\n$id 0 obj\n<< /Type /Outlines /Count 0 >>\nendobj"; + } + + return $res; + } + } + + + /** + * an object to hold the font description + */ + protected function o_font($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t' => 'font', 'info' => array('name' => $options['name'], 'fontFileName' => $options['fontFileName'], 'SubType' => 'Type1')); + $fontNum = $this->numFonts; + $this->objects[$id]['info']['fontNum'] = $fontNum; + + // deal with the encoding and the differences + if (isset($options['differences'])) { + // then we'll need an encoding dictionary + $this->numObj++; + $this->o_fontEncoding($this->numObj, 'new', $options); + $this->objects[$id]['info']['encodingDictionary'] = $this->numObj; + } else if (isset($options['encoding'])) { + // we can specify encoding here + switch ($options['encoding']) { + case 'WinAnsiEncoding': + case 'MacRomanEncoding': + case 'MacExpertEncoding': + $this->objects[$id]['info']['encoding'] = $options['encoding']; + break; + + case 'none': + break; + + default: + $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding'; + break; + } + } else { + $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding'; + } + + if ($this->fonts[$options['fontFileName']]['isUnicode']) { + // For Unicode fonts, we need to incorporate font data into + // sub-sections that are linked from the primary font section. + // Look at o_fontGIDtoCID and o_fontDescendentCID functions + // for more informaiton. + // + // All of this code is adapted from the excellent changes made to + // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/) + + $toUnicodeId = ++$this->numObj; + $this->o_contents($toUnicodeId, 'new', 'raw'); + $this->objects[$id]['info']['toUnicode'] = $toUnicodeId; + + $stream = <<> def +/CMapName /Adobe-Identity-UCS def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +1 beginbfrange +<0000> <0000> +endbfrange +endcmap +CMapName currentdict /CMap defineresource pop +end +end +EOT; + + $res = "<>\n"; + $res .= "stream\n" . $stream . "endstream"; + + $this->objects[$toUnicodeId]['c'] = $res; + + $cidFontId = ++$this->numObj; + $this->o_fontDescendentCID($cidFontId, 'new', $options); + $this->objects[$id]['info']['cidFont'] = $cidFontId; + } + + // also tell the pages node about the new font + $this->o_pages($this->currentNode, 'font', array('fontNum' => $fontNum, 'objNum' => $id)); + break; + + case 'add': + foreach ($options as $k => $v) { + switch ($k) { + case 'BaseFont': + $o['info']['name'] = $v; + break; + case 'FirstChar': + case 'LastChar': + case 'Widths': + case 'FontDescriptor': + case 'SubType': + $this->addMessage('o_font '.$k." : ".$v); + $o['info'][$k] = $v; + break; + } + } + + // pass values down to descendent font + if (isset($o['info']['cidFont'])) { + $this->o_fontDescendentCID($o['info']['cidFont'], 'add', $options); + } + break; + + case 'out': + if ($this->fonts[$this->objects[$id]['info']['fontFileName']]['isUnicode']) { + // For Unicode fonts, we need to incorporate font data into + // sub-sections that are linked from the primary font section. + // Look at o_fontGIDtoCID and o_fontDescendentCID functions + // for more informaiton. + // + // All of this code is adapted from the excellent changes made to + // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/) + + $res = "\n$id 0 obj\n<objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'fontDescriptor', 'info'=>$options); + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /FontDescriptor\n"; + foreach ($o['info'] as $label => $value) { + switch ($label) { + case 'Ascent': + case 'CapHeight': + case 'Descent': + case 'Flags': + case 'ItalicAngle': + case 'StemV': + case 'AvgWidth': + case 'Leading': + case 'MaxWidth': + case 'MissingWidth': + case 'StemH': + case 'XHeight': + case 'CharSet': + if (mb_strlen($value, '8bit')) { + $res.= "/$label $value\n"; + } + + break; + case 'FontFile': + case 'FontFile2': + case 'FontFile3': + $res.= "/$label $value 0 R\n"; + break; + + case 'FontBBox': + $res.= "/$label [$value[0] $value[1] $value[2] $value[3]]\n"; + break; + + case 'FontName': + $res.= "/$label /$value\n"; + break; + } + } + + $res.= ">>\nendobj"; + + return $res; + } + } + + + /** + * the font encoding + */ + protected function o_fontEncoding($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + // the options array should contain 'differences' and maybe 'encoding' + $this->objects[$id] = array('t'=>'fontEncoding', 'info'=>$options); + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /Encoding\n"; + if (!isset($o['info']['encoding'])) { + $o['info']['encoding'] = 'WinAnsiEncoding'; + } + + if ($o['info']['encoding'] !== 'none') { + $res.= "/BaseEncoding /".$o['info']['encoding']."\n"; + } + + $res.= "/Differences \n["; + + $onum = -100; + + foreach($o['info']['differences'] as $num=>$label) { + if ($num != $onum+1) { + // we cannot make use of consecutive numbering + $res.= "\n$num /$label"; + } else { + $res.= " /$label"; + } + + $onum = $num; + } + + $res.= "\n]\n>>\nendobj"; + return $res; + } + } + + + /** + * a descendent cid font, needed for unicode fonts + */ + protected function o_fontDescendentCID($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'fontDescendentCID', 'info'=>$options); + + // we need a CID system info section + $cidSystemInfoId = ++$this->numObj; + $this->o_contents($cidSystemInfoId, 'new', 'raw'); + $this->objects[$id]['info']['cidSystemInfo'] = $cidSystemInfoId; + $res= "<objects[$cidSystemInfoId]['c'] = $res; + + // and a CID to GID map + $cidToGidMapId = ++$this->numObj; + $this->o_fontGIDtoCIDMap($cidToGidMapId, 'new', $options); + $this->objects[$id]['info']['cidToGidMap'] = $cidToGidMapId; + break; + + case 'add': + foreach ($options as $k => $v) { + switch ($k) { + case 'BaseFont': + $o['info']['name'] = $v; + break; + + case 'FirstChar': + case 'LastChar': + case 'MissingWidth': + case 'FontDescriptor': + case 'SubType': + $this->addMessage("o_fontDescendentCID $k : $v"); + $o['info'][$k] = $v; + break; + } + } + + // pass values down to cid to gid map + $this->o_fontGIDtoCIDMap($o['info']['cidToGidMap'], 'add', $options); + break; + + case 'out': + $res = "\n$id 0 obj\n"; + $res.= "<fonts[$o['info']['fontFileName']]['CIDWidths'])) { + $cid_widths = &$this->fonts[$o['info']['fontFileName']]['CIDWidths']; + $w = ''; + foreach ($cid_widths as $cid => $width) { + $w .= "$cid [$width] "; + } + $res.= "/W [$w]\n"; + } + + $res.= "/CIDToGIDMap ".$o['info']['cidToGidMap']." 0 R\n"; + $res.= ">>\n"; + $res.= "endobj"; + + return $res; + } + } + + + /** + * a font glyph to character map, needed for unicode fonts + */ + protected function o_fontGIDtoCIDMap($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'fontGIDtoCIDMap', 'info'=>$options); + break; + + case 'out': + $res = "\n$id 0 obj\n"; + $fontFileName = $o['info']['fontFileName']; + $tmp = $this->fonts[$fontFileName]['CIDtoGID'] = base64_decode($this->fonts[$fontFileName]['CIDtoGID']); + + $compressed = isset($this->fonts[$fontFileName]['CIDtoGID_Compressed']) && + $this->fonts[$fontFileName]['CIDtoGID_Compressed']; + + if (!$compressed && isset($o['raw'])) { + $res.= $tmp; + } else { + $res.= "<<"; + + if (!$compressed && $this->compressionReady && $this->options['compression']) { + // then implement ZLIB based compression on this content stream + $compressed = true; + $tmp = gzcompress($tmp, 6); + } + if ($compressed) { + $res.= "\n/Filter /FlateDecode"; + } + + $res.= "\n/Length ".mb_strlen($tmp, '8bit') .">>\nstream\n$tmp\nendstream"; + } + + $res.= "\nendobj"; + return $res; + } + } + + + /** + * the document procset, solves some problems with printing to old PS printers + */ + protected function o_procset($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'procset', 'info'=>array('PDF'=>1, 'Text'=>1)); + $this->o_pages($this->currentNode, 'procset', $id); + $this->procsetObjectId = $id; + break; + + case 'add': + // this is to add new items to the procset list, despite the fact that this is considered + // obselete, the items are required for printing to some postscript printers + switch ($options) { + case 'ImageB': + case 'ImageC': + case 'ImageI': + $o['info'][$options] = 1; + break; + } + break; + + case 'out': + $res = "\n$id 0 obj\n["; + foreach ($o['info'] as $label=>$val) { + $res.= "/$label "; + } + $res.= "]\nendobj"; + return $res; + } + } + + + /** + * define the document information + */ + protected function o_info($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->infoObject = $id; + $date = 'D:'.@date('Ymd'); + $this->objects[$id] = array('t'=>'info', 'info'=>array('Creator'=>'R and OS php pdf writer, http://www.ros.co.nz', 'CreationDate'=>$date)); + break; + case 'Title': + case 'Author': + case 'Subject': + case 'Keywords': + case 'Creator': + case 'Producer': + case 'CreationDate': + case 'ModDate': + case 'Trapped': + $o['info'][$action] = $options; + break; + + case 'out': + if ($this->encrypted) { + $this->encryptInit($id); + } + + $res = "\n$id 0 obj\n<<\n"; + foreach ($o['info'] as $k=>$v) { + $res.= "/$k ("; + // dates must be outputted as-is, without Unicode transformations + $raw = ($k === 'CreationDate' || $k === 'ModDate'); + $c = $v; + + if ($this->encrypted) { + $c = $this->ARC4($c); + } + + $res.= ($raw) ? $c : $this->filterText($c); + $res.= ")\n"; + } + + $res.= ">>\nendobj"; + return $res; + } + } + + + /** + * an action object, used to link to URLS initially + */ + protected function o_action($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + if (is_array($options)) { + $this->objects[$id] = array('t'=>'action', 'info'=>$options, 'type'=>$options['type']); + } else { + // then assume a URI action + $this->objects[$id] = array('t'=>'action', 'info'=>$options, 'type'=>'URI'); + } + break; + + case 'out': + if ($this->encrypted) { + $this->encryptInit($id); + } + + $res = "\n$id 0 obj\n<< /Type /Action"; + switch ($o['type']) { + case 'ilink': + // there will be an 'label' setting, this is the name of the destination + $res.= "\n/S /GoTo\n/D ".$this->destinations[(string)$o['info']['label']]." 0 R"; + break; + + case 'URI': + $res.= "\n/S /URI\n/URI ("; + if ($this->encrypted) { + $res.= $this->filterText($this->ARC4($o['info'])); + } else { + $res.= $this->filterText($o['info']); + } + + $res.= ")"; + break; + } + + $res.= "\n>>\nendobj"; + return $res; + } + } + + + /** + * an annotation object, this will add an annotation to the current page. + * initially will support just link annotations + */ + protected function o_annotation($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + // add the annotation to the current page + $pageId = $this->currentPage; + $this->o_page($pageId, 'annot', $id); + + // and add the action object which is going to be required + switch ($options['type']) { + case 'link': + $this->objects[$id] = array('t'=>'annotation', 'info'=>$options); + $this->numObj++; + $this->o_action($this->numObj, 'new', $options['url']); + $this->objects[$id]['info']['actionId'] = $this->numObj; + break; + + case 'ilink': + // this is to a named internal link + $label = $options['label']; + $this->objects[$id] = array('t'=>'annotation', 'info'=>$options); + $this->numObj++; + $this->o_action($this->numObj, 'new', array('type'=>'ilink', 'label'=>$label)); + $this->objects[$id]['info']['actionId'] = $this->numObj; + break; + } + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /Annot"; + switch ($o['info']['type']) { + case 'link': + case 'ilink': + $res.= "\n/Subtype /Link"; + break; + } + $res.= "\n/A ".$o['info']['actionId']." 0 R"; + $res.= "\n/Border [0 0 0]"; + $res.= "\n/H /I"; + $res.= "\n/Rect [ "; + + foreach($o['info']['rect'] as $v) { + $res.= sprintf("%.4F ", $v); + } + + $res.= "]"; + $res.= "\n>>\nendobj"; + return $res; + } + } + + + /** + * a page object, it also creates a contents object to hold its contents + */ + protected function o_page($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->numPages++; + $this->objects[$id] = array('t'=>'page', 'info'=>array('parent'=>$this->currentNode, 'pageNum'=>$this->numPages)); + + if (is_array($options)) { + // then this must be a page insertion, array should contain 'rid','pos'=[before|after] + $options['id'] = $id; + $this->o_pages($this->currentNode, 'page', $options); + } else { + $this->o_pages($this->currentNode, 'page', $id); + } + + $this->currentPage = $id; + //make a contents object to go with this page + $this->numObj++; + $this->o_contents($this->numObj, 'new', $id); + $this->currentContents = $this->numObj; + $this->objects[$id]['info']['contents'] = array(); + $this->objects[$id]['info']['contents'][] = $this->numObj; + + $match = ($this->numPages%2 ? 'odd' : 'even'); + foreach($this->addLooseObjects as $oId=>$target) { + if ($target === 'all' || $match === $target) { + $this->objects[$id]['info']['contents'][] = $oId; + } + } + break; + + case 'content': + $o['info']['contents'][] = $options; + break; + + case 'annot': + // add an annotation to this page + if (!isset($o['info']['annot'])) { + $o['info']['annot'] = array(); + } + + // $options should contain the id of the annotation dictionary + $o['info']['annot'][] = $options; + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /Page"; + $res.= "\n/Parent ".$o['info']['parent']." 0 R"; + + if (isset($o['info']['annot'])) { + $res.= "\n/Annots ["; + foreach($o['info']['annot'] as $aId) { + $res.= " $aId 0 R"; + } + $res.= " ]"; + } + + $count = count($o['info']['contents']); + if ($count == 1) { + $res.= "\n/Contents ".$o['info']['contents'][0]." 0 R"; + } else if ($count>1) { + $res.= "\n/Contents [\n"; + + // reverse the page contents so added objects are below normal content + //foreach (array_reverse($o['info']['contents']) as $cId) { + // Back to normal now that I've got transparency working --Benj + foreach ($o['info']['contents'] as $cId) { + $res.= "$cId 0 R\n"; + } + $res.= "]"; + } + + $res.= "\n>>\nendobj"; + return $res; + } + } + + + /** + * the contents objects hold all of the content which appears on pages + */ + protected function o_contents($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'contents', 'c'=>'', 'info'=>array()); + if (mb_strlen($options, '8bit') && intval($options)) { + // then this contents is the primary for a page + $this->objects[$id]['onPage'] = $options; + } else if ($options === 'raw') { + // then this page contains some other type of system object + $this->objects[$id]['raw'] = 1; + } + break; + + case 'add': + // add more options to the decleration + foreach ($options as $k=>$v) { + $o['info'][$k] = $v; + } + + case 'out': + $tmp = $o['c']; + $res = "\n$id 0 obj\n"; + + if (isset($this->objects[$id]['raw'])) { + $res.= $tmp; + } else { + $res.= "<<"; + if ($this->compressionReady && $this->options['compression']) { + // then implement ZLIB based compression on this content stream + $res.= " /Filter /FlateDecode"; + $tmp = gzcompress($tmp, 6); + } + + if ($this->encrypted) { + $this->encryptInit($id); + $tmp = $this->ARC4($tmp); + } + + foreach($o['info'] as $k=>$v) { + $res.= "\n/$k $v"; + } + + $res.= "\n/Length ".mb_strlen($tmp, '8bit') ." >>\nstream\n$tmp\nendstream"; + } + + $res.= "\nendobj"; + return $res; + } + } + + protected function o_embedjs($id, $action, $code = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'embedjs', 'info'=>array( + 'Names' => '[(EmbeddedJS) '.($id+1).' 0 R]' + )); + break; + + case 'out': + $res = "\n$id 0 obj\n<< "; + foreach($o['info'] as $k=>$v) { + $res.= "\n/$k $v"; + } + $res.= "\n>>\nendobj"; + return $res; + } + } + + protected function o_javascript($id, $action, $code = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = array('t'=>'javascript', 'info'=>array( + 'S' => '/JavaScript', + 'JS' => '('.$this->filterText($code).')', + )); + break; + + case 'out': + $res = "\n$id 0 obj\n<< "; + foreach($o['info'] as $k=>$v) { + $res.= "\n/$k $v"; + } + $res.= "\n>>\nendobj"; + return $res; + } + } + + /** + * an image object, will be an XObject in the document, includes description and data + */ + protected function o_image($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + // make the new object + $this->objects[$id] = array('t'=>'image', 'data'=>&$options['data'], 'info'=>array()); + + $info =& $this->objects[$id]['info']; + + $info['Type'] = '/XObject'; + $info['Subtype'] = '/Image'; + $info['Width'] = $options['iw']; + $info['Height'] = $options['ih']; + + if (isset($options['masked']) && $options['masked']) { + $info['SMask'] = ($this->numObj-1).' 0 R'; + } + + if (!isset($options['type']) || $options['type'] === 'jpg') { + if (!isset($options['channels'])) { + $options['channels'] = 3; + } + + switch ($options['channels']) { + case 1: $info['ColorSpace'] = '/DeviceGray'; break; + case 4: $info['ColorSpace'] = '/DeviceCMYK'; break; + default: $info['ColorSpace'] = '/DeviceRGB'; break; + } + + if ($info['ColorSpace'] === '/DeviceCMYK') { + $info['Decode'] = '[1 0 1 0 1 0 1 0]'; + } + + $info['Filter'] = '/DCTDecode'; + $info['BitsPerComponent'] = 8; + } + + else if ($options['type'] === 'png') { + $info['Filter'] = '/FlateDecode'; + $info['DecodeParms'] = '<< /Predictor 15 /Colors '.$options['ncolor'].' /Columns '.$options['iw'].' /BitsPerComponent '.$options['bitsPerComponent'].'>>'; + + if ($options['isMask']) { + $info['ColorSpace'] = '/DeviceGray'; + } + else { + if (mb_strlen($options['pdata'], '8bit')) { + $tmp = ' [ /Indexed /DeviceRGB '.(mb_strlen($options['pdata'], '8bit') /3-1) .' '; + $this->numObj++; + $this->o_contents($this->numObj, 'new'); + $this->objects[$this->numObj]['c'] = $options['pdata']; + $tmp.= $this->numObj.' 0 R'; + $tmp.= ' ]'; + $info['ColorSpace'] = $tmp; + + if (isset($options['transparency'])) { + $transparency = $options['transparency']; + switch ($transparency['type']) { + case 'indexed': + $tmp = ' [ '.$transparency['data'].' '.$transparency['data'].'] '; + $info['Mask'] = $tmp; + break; + + case 'color-key': + $tmp = ' [ '. + $transparency['r'] . ' ' . $transparency['r'] . + $transparency['g'] . ' ' . $transparency['g'] . + $transparency['b'] . ' ' . $transparency['b'] . + ' ] '; + $info['Mask'] = $tmp; + break; + } + } + } else { + if (isset($options['transparency'])) { + $transparency = $options['transparency']; + + switch ($transparency['type']) { + case 'indexed': + $tmp = ' [ '.$transparency['data'].' '.$transparency['data'].'] '; + $info['Mask'] = $tmp; + break; + + case 'color-key': + $tmp = ' [ '. + $transparency['r'] . ' ' . $transparency['r'] . ' ' . + $transparency['g'] . ' ' . $transparency['g'] . ' ' . + $transparency['b'] . ' ' . $transparency['b'] . + ' ] '; + $info['Mask'] = $tmp; + break; + } + } + $info['ColorSpace'] = '/'.$options['color']; + } + } + + $info['BitsPerComponent'] = $options['bitsPerComponent']; + } + + // assign it a place in the named resource dictionary as an external object, according to + // the label passed in with it. + $this->o_pages($this->currentNode, 'xObject', array('label'=>$options['label'], 'objNum'=>$id)); + + // also make sure that we have the right procset object for it. + $this->o_procset($this->procsetObjectId, 'add', 'ImageC'); + break; + + case 'out': + $tmp = &$o['data']; + $res = "\n$id 0 obj\n<<"; + + foreach($o['info'] as $k=>$v) { + $res.= "\n/$k $v"; + } + + if ($this->encrypted) { + $this->encryptInit($id); + $tmp = $this->ARC4($tmp); + } + + $res.= "\n/Length ".mb_strlen($tmp, '8bit') .">>\nstream\n$tmp\nendstream\nendobj"; + + return $res; + } + } + + + /** + * graphics state object + */ + protected function o_extGState($id, $action, $options = "") { + static $valid_params = array("LW", "LC", "LC", "LJ", "ML", + "D", "RI", "OP", "op", "OPM", + "Font", "BG", "BG2", "UCR", + "TR", "TR2", "HT", "FL", + "SM", "SA", "BM", "SMask", + "CA", "ca", "AIS", "TK"); + + if ($action !== "new") { + $o = & $this->objects[$id]; + } + + switch ($action) { + case "new": + $this->objects[$id] = array('t' => 'extGState', 'info' => $options); + + // Tell the pages about the new resource + $this->numStates++; + $this->o_pages($this->currentNode, 'extGState', array("objNum" => $id, "stateNum" => $this->numStates)); + break; + + case "out": + $res = "\n$id 0 obj\n<< /Type /ExtGState\n"; + + foreach ($o["info"] as $k => $v) { + if ( !in_array($k, $valid_params)) + continue; + $res.= "/$k $v\n"; + } + + $res.= ">>\nendobj"; + return $res; + } + } + + + /** + * encryption object. + */ + protected function o_encryption($id, $action, $options = '') { + if ($action !== 'new') { + $o = & $this->objects[$id]; + } + + switch ($action) { + case 'new': + // make the new object + $this->objects[$id] = array('t'=>'encryption', 'info'=>$options); + $this->arc4_objnum = $id; + + // figure out the additional paramaters required + $pad = chr(0x28) .chr(0xBF) .chr(0x4E) .chr(0x5E) .chr(0x4E) .chr(0x75) .chr(0x8A) .chr(0x41) + .chr(0x64) .chr(0x00) .chr(0x4E) .chr(0x56) .chr(0xFF) .chr(0xFA) .chr(0x01) .chr(0x08) + .chr(0x2E) .chr(0x2E) .chr(0x00) .chr(0xB6) .chr(0xD0) .chr(0x68) .chr(0x3E) .chr(0x80) + .chr(0x2F) .chr(0x0C) .chr(0xA9) .chr(0xFE) .chr(0x64) .chr(0x53) .chr(0x69) .chr(0x7A); + + $len = mb_strlen($options['owner'], '8bit'); + + if ($len>32) { + $owner = substr($options['owner'], 0, 32); + } else if ($len<32) { + $owner = $options['owner'].substr($pad, 0, 32-$len); + } else { + $owner = $options['owner']; + } + + $len = mb_strlen($options['user'], '8bit'); + if ($len>32) { + $user = substr($options['user'], 0, 32); + } else if ($len<32) { + $user = $options['user'].substr($pad, 0, 32-$len); + } else { + $user = $options['user']; + } + + $tmp = $this->md5_16($owner); + $okey = substr($tmp, 0, 5); + $this->ARC4_init($okey); + $ovalue = $this->ARC4($user); + $this->objects[$id]['info']['O'] = $ovalue; + + // now make the u value, phew. + $tmp = $this->md5_16($user.$ovalue.chr($options['p']) .chr(255) .chr(255) .chr(255) .$this->fileIdentifier); + + $ukey = substr($tmp, 0, 5); + $this->ARC4_init($ukey); + $this->encryptionKey = $ukey; + $this->encrypted = 1; + $uvalue = $this->ARC4($pad); + $this->objects[$id]['info']['U'] = $uvalue; + $this->encryptionKey = $ukey; + // initialize the arc4 array + break; + + case 'out': + $res = "\n$id 0 obj\n<<"; + $res.= "\n/Filter /Standard"; + $res.= "\n/V 1"; + $res.= "\n/R 2"; + $res.= "\n/O (".$this->filterText($o['info']['O'], true, false) .')'; + $res.= "\n/U (".$this->filterText($o['info']['U'], true, false) .')'; + // and the p-value needs to be converted to account for the twos-complement approach + $o['info']['p'] = (($o['info']['p']^255) +1) *-1; + $res.= "\n/P ".($o['info']['p']); + $res.= "\n>>\nendobj"; + return $res; + } + } + + + /** + * ARC4 functions + * A series of function to implement ARC4 encoding in PHP + */ + + /** + * calculate the 16 byte version of the 128 bit md5 digest of the string + */ + function md5_16($string) { + $tmp = md5($string); + $out = ''; + for ($i = 0;$i <= 30;$i = $i+2) { + $out.= chr(hexdec(substr($tmp, $i, 2))); + } + return $out; + } + + + /** + * initialize the encryption for processing a particular object + */ + function encryptInit($id) { + $tmp = $this->encryptionKey; + $hex = dechex($id); + if (mb_strlen($hex, '8bit') <6) { + $hex = substr('000000', 0, 6-mb_strlen($hex, '8bit')) .$hex; + } + $tmp.= chr(hexdec(substr($hex, 4, 2))) .chr(hexdec(substr($hex, 2, 2))) .chr(hexdec(substr($hex, 0, 2))) .chr(0) .chr(0); + $key = $this->md5_16($tmp); + $this->ARC4_init(substr($key, 0, 10)); + } + + + /** + * initialize the ARC4 encryption + */ + function ARC4_init($key = '') { + $this->arc4 = ''; + + // setup the control array + if (mb_strlen($key, '8bit') == 0) { + return; + } + + $k = ''; + while (mb_strlen($k, '8bit') <256) { + $k.= $key; + } + + $k = substr($k, 0, 256); + for ($i = 0;$i<256;$i++) { + $this->arc4.= chr($i); + } + + $j = 0; + + for ($i = 0;$i<256;$i++) { + $t = $this->arc4[$i]; + $j = ($j + ord($t) + ord($k[$i])) %256; + $this->arc4[$i] = $this->arc4[$j]; + $this->arc4[$j] = $t; + } + } + + + /** + * ARC4 encrypt a text string + */ + function ARC4($text) { + $len = mb_strlen($text, '8bit'); + $a = 0; + $b = 0; + $c = $this->arc4; + $out = ''; + for ($i = 0;$i<$len;$i++) { + $a = ($a+1) %256; + $t = $c[$a]; + $b = ($b+ord($t)) %256; + $c[$a] = $c[$b]; + $c[$b] = $t; + $k = ord($c[(ord($c[$a]) +ord($c[$b])) %256]); + $out.= chr(ord($text[$i]) ^ $k); + } + return $out; + } + + + /** + * functions which can be called to adjust or add to the document + */ + + /** + * add a link in the document to an external URL + */ + function addLink($url, $x0, $y0, $x1, $y1) { + $this->numObj++; + $info = array('type'=>'link', 'url'=>$url, 'rect'=>array($x0, $y0, $x1, $y1)); + $this->o_annotation($this->numObj, 'new', $info); + } + + + /** + * add a link in the document to an internal destination (ie. within the document) + */ + function addInternalLink($label, $x0, $y0, $x1, $y1) { + $this->numObj++; + $info = array('type'=>'ilink', 'label'=>$label, 'rect'=>array($x0, $y0, $x1, $y1)); + $this->o_annotation($this->numObj, 'new', $info); + } + + + /** + * set the encryption of the document + * can be used to turn it on and/or set the passwords which it will have. + * also the functions that the user will have are set here, such as print, modify, add + */ + function setEncryption($userPass = '', $ownerPass = '', $pc = array()) { + $p = bindec("11000000"); + + $options = array('print'=>4, 'modify'=>8, 'copy'=>16, 'add'=>32); + + foreach($pc as $k=>$v) { + if ($v && isset($options[$k])) { + $p+= $options[$k]; + } else if (isset($options[$v])) { + $p+= $options[$v]; + } + } + + // implement encryption on the document + if ($this->arc4_objnum == 0) { + // then the block does not exist already, add it. + $this->numObj++; + if (mb_strlen($ownerPass) == 0) { + $ownerPass = $userPass; + } + + $this->o_encryption($this->numObj, 'new', array('user'=>$userPass, 'owner'=>$ownerPass, 'p'=>$p)); + } + } + + + /** + * should be used for internal checks, not implemented as yet + */ + function checkAllHere() { + } + + + /** + * return the pdf stream as a string returned from the function + */ + function output($debug = false) { + if ($debug) { + // turn compression off + $this->options['compression'] = false; + } + + if ($this->javascript) { + $this->numObj++; + + $js_id = $this->numObj; + $this->o_embedjs($js_id, 'new'); + $this->o_javascript(++$this->numObj, 'new', $this->javascript); + + $id = $this->catalogId; + + $this->o_catalog($id, 'javascript', $js_id); + } + + if ($this->arc4_objnum) { + $this->ARC4_init($this->encryptionKey); + } + + $this->checkAllHere(); + + + $xref = array(); + $content = '%PDF-1.3'; + $pos = mb_strlen($content, '8bit'); + + foreach($this->objects as $k=>$v) { + $tmp = 'o_'.$v['t']; + $cont = $this->$tmp($k, 'out'); + $content.= $cont; + $xref[] = $pos; + $pos+= mb_strlen($cont, '8bit'); + } + + $content.= "\nxref\n0 ".(count($xref) +1) ."\n0000000000 65535 f \n"; + + foreach($xref as $p) { + $content.= str_pad($p, 10, "0", STR_PAD_LEFT) . " 00000 n \n"; + } + + $content.= "trailer\n<<\n/Size ".(count($xref) +1) ."\n/Root 1 0 R\n/Info $this->infoObject 0 R\n"; + + // if encryption has been applied to this document then add the marker for this dictionary + if ($this->arc4_objnum > 0) { + $content.= "/Encrypt $this->arc4_objnum 0 R\n"; + } + + if (mb_strlen($this->fileIdentifier, '8bit')) { + $content.= "/ID[<$this->fileIdentifier><$this->fileIdentifier>]\n"; + } + + $content.= ">>\nstartxref\n$pos\n%%EOF\n"; + + return $content; + } + + /** + * intialize a new document + * if this is called on an existing document results may be unpredictable, but the existing document would be lost at minimum + * this function is called automatically by the constructor function + * + * @access private + */ + function newDocument($pageSize = array(0, 0, 612, 792)) { + $this->numObj = 0; + $this->objects = array(); + + $this->numObj++; + $this->o_catalog($this->numObj, 'new'); + + $this->numObj++; + $this->o_outlines($this->numObj, 'new'); + + $this->numObj++; + $this->o_pages($this->numObj, 'new'); + + $this->o_pages($this->numObj, 'mediaBox', $pageSize); + $this->currentNode = 3; + + $this->numObj++; + $this->o_procset($this->numObj, 'new'); + + $this->numObj++; + $this->o_info($this->numObj, 'new'); + + $this->numObj++; + $this->o_page($this->numObj, 'new'); + + // need to store the first page id as there is no way to get it to the user during + // startup + $this->firstPageId = $this->currentContents; + } + + /** + * open the font file and return a php structure containing it. + * first check if this one has been done before and saved in a form more suited to php + * note that if a php serialized version does not exist it will try and make one, but will + * require write access to the directory to do it... it is MUCH faster to have these serialized + * files. + * + * @access private + */ + function openFont($font) { + // assume that $font contains the path and file but not the extension + $pos = strrpos($font, '/'); + + if ($pos === false) { + $dir = './'; + $name = $font; + } else { + $dir = substr($font, 0, $pos+1); + $name = substr($font, $pos+1); + } + + $fontcache = $this->fontcache; + if ($fontcache == '') { + $fontcache = $dir; + } + + //$name filename without folder and extension of font metrics + //$dir folder of font metrics + //$fontcache folder of runtime created php serialized version of font metrics. + // If this is not given, the same folder as the font metrics will be used. + // Storing and reusing serialized versions improves speed much + + $this->addMessage("openFont: $font - $name"); + + $metrics_name = $name . ($this->isUnicode ? '.ufm' : '.afm'); + + // Core fonts don't currently work with composite fonts (for Unicode support). + // The .ufm files have been removed so we need to check whether or not to use the + // .ufm or .afm. + if ($this->isUnicode && !file_exists("$dir/$metrics_name")) { $metrics_name = $name . '.afm'; } + + $cache_name = "$metrics_name.php"; + $this->addMessage("metrics: $metrics_name, cache: $cache_name"); + if (file_exists($fontcache . $cache_name)) { + $this->addMessage("openFont: php file exists $fontcache$cache_name"); + $this->fonts[$font] = require($fontcache . $cache_name); + + if (!isset($this->fonts[$font]['_version_']) || $this->fonts[$font]['_version_'] != $this->fontcacheVersion) { + // if the font file is old, then clear it out and prepare for re-creation + $this->addMessage('openFont: clear out, make way for new version.'); + $this->fonts[$font] = null; + unset($this->fonts[$font]); + } + } + else { + $old_cache_name = "php_$metrics_name"; + if (file_exists($fontcache . $old_cache_name)) { + $this->addMessage("openFont: php file doesn't exist $fontcache$cache_name, creating it from the old format"); + $old_cache = file_get_contents($fontcache . $old_cache_name); + file_put_contents($fontcache . $cache_name, 'openFont($font); + } + } + + if (!isset($this->fonts[$font]) && file_exists($dir . $metrics_name)) { + // then rebuild the php_.afm file from the .afm file + $this->addMessage("openFont: build php file from $dir$metrics_name"); + $data = array(); + + // 20 => 'space' + $data['codeToName'] = array(); + + // Since we're not going to enable Unicode for the core fonts we need to use a font-based + // setting for Unicode support rather than a global setting. + $data['isUnicode'] = (strtolower(substr($metrics_name, -3)) !== 'afm'); + + $cidtogid = ''; + if ($data['isUnicode']) { + $cidtogid = str_pad('', 256*256*2, "\x00"); + } + + $file = file($dir . $metrics_name); + + foreach ($file as $rowA) { + $row = trim($rowA); + $pos = strpos($row, ' '); + + if ($pos) { + // then there must be some keyword + $key = substr($row, 0, $pos); + switch ($key) { + case 'FontName': + case 'FullName': + case 'FamilyName': + case 'Weight': + case 'ItalicAngle': + case 'IsFixedPitch': + case 'CharacterSet': + case 'UnderlinePosition': + case 'UnderlineThickness': + case 'Version': + case 'EncodingScheme': + case 'CapHeight': + case 'XHeight': + case 'Ascender': + case 'Descender': + case 'StdHW': + case 'StdVW': + case 'StartCharMetrics': + case 'FontHeightOffset': // OAR - Added so we can offset the height calculation of a Windows font. Otherwise it's too big. + $data[$key] = trim(substr($row, $pos)); + break; + + case 'FontBBox': + $data[$key] = explode(' ', trim(substr($row, $pos))); + break; + + //C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ; + case 'C': // Found in AFM files + $bits = explode(';', trim($row)); + $dtmp = array(); + + foreach($bits as $bit) { + $bits2 = explode(' ', trim($bit)); + if (mb_strlen($bits2[0], '8bit') == 0) continue; + + if (count($bits2) >2) { + $dtmp[$bits2[0]] = array(); + for ($i = 1;$i= 0) { + if ($c != hexdec($n)) { + $data['codeToName'][$c] = $n; + } + $data['C'][$c] = $width; + } else { + $data['C'][$n] = $width; + } + + if (!isset($data['MissingWidth']) && $c == -1 && $n === '.notdef') { + $data['MissingWidth'] = $width; + } + + break; + + // U 827 ; WX 0 ; N squaresubnosp ; G 675 ; + case 'U': // Found in UFM files + if (!$data['isUnicode']) break; + + $bits = explode(';', trim($row)); + $dtmp = array(); + + foreach($bits as $bit) { + $bits2 = explode(' ', trim($bit)); + if (mb_strlen($bits2[0], '8bit') === 0) continue; + + if (count($bits2) >2) { + $dtmp[$bits2[0]] = array(); + for ($i = 1;$i= 0) { + // Set values in CID to GID map + if ($c >= 0 && $c < 0xFFFF && $glyph) { + $cidtogid[$c*2] = chr($glyph >> 8); + $cidtogid[$c*2 + 1] = chr($glyph & 0xFF); + } + + if ($c != hexdec($n)) { + $data['codeToName'][$c] = $n; + } + $data['C'][$c] = $width; + } else { + $data['C'][$n] = $width; + } + + if (!isset($data['MissingWidth']) && $c == -1 && $n === '.notdef') { + $data['MissingWidth'] = $width; + } + + break; + + case 'KPX': + break; // don't include them as they are not used yet + //KPX Adieresis yacute -40 + $bits = explode(' ', trim($row)); + $data['KPX'][$bits[1]][$bits[2]] = $bits[3]; + break; + } + } + } + + // echo $cidtogid; die("CIDtoGID Displayed!"); + if ($this->compressionReady && $this->options['compression']) { + // then implement ZLIB based compression on CIDtoGID string + $data['CIDtoGID_Compressed'] = true; + $cidtogid = gzcompress($cidtogid, 6); + } + $data['CIDtoGID'] = base64_encode($cidtogid); + $data['_version_'] = $this->fontcacheVersion; + $this->fonts[$font] = $data; + + //Because of potential trouble with php safe mode, expect that the folder already exists. + //If not existing, this will hit performance because of missing cached results. + if ( is_dir(substr($fontcache,0,-1)) && is_writable(substr($fontcache,0,-1)) ) { + file_put_contents($fontcache . $cache_name, 'fonts[$font])) { + $this->addMessage("openFont: no font file found for $font. Do you need to run load_font.php?"); + //echo 'Font not Found '.$font; + } + + //pre_r($this->messages); + } + + /** + * if the font is not loaded then load it and make the required object + * else just make it the current font + * the encoding array can contain 'encoding'=> 'none','WinAnsiEncoding','MacRomanEncoding' or 'MacExpertEncoding' + * note that encoding='none' will need to be used for symbolic fonts + * and 'differences' => an array of mappings between numbers 0->255 and character names. + * + */ + function selectFont($fontName, $encoding = '', $set = true) { + $ext = substr($fontName, -4); + if ($ext === '.afm' || $ext === '.ufm') { + $fontName = substr($fontName, 0, mb_strlen($fontName)-4); + } + + if (!isset($this->fonts[$fontName])) { + $this->addMessage("selectFont: selecting - $fontName - $encoding, $set"); + + // load the file + $this->openFont($fontName); + + if (isset($this->fonts[$fontName])) { + $this->numObj++; + $this->numFonts++; + + //$this->numFonts = md5($fontName); + $pos = strrpos($fontName, '/'); + // $dir = substr($fontName,0,$pos+1); + $name = substr($fontName, $pos+1); + $options = array('name' => $name, 'fontFileName' => $fontName); + + if (is_array($encoding)) { + // then encoding and differences might be set + if (isset($encoding['encoding'])) { + $options['encoding'] = $encoding['encoding']; + } + + if (isset($encoding['differences'])) { + $options['differences'] = $encoding['differences']; + } + } else if (mb_strlen($encoding, '8bit')) { + // then perhaps only the encoding has been set + $options['encoding'] = $encoding; + } + + $fontObj = $this->numObj; + $this->o_font($this->numObj, 'new', $options); + $this->fonts[$fontName]['fontNum'] = $this->numFonts; + + // if this is a '.afm' font, and there is a '.pfa' file to go with it ( as there + // should be for all non-basic fonts), then load it into an object and put the + // references into the font object + $basefile = $fontName; + if (file_exists($basefile.'.pfb')) { + $fbtype = 'pfb'; + } else if (file_exists($basefile.'.ttf')) { + $fbtype = 'ttf'; + } else { + $fbtype = ''; + } + + $fbfile = $basefile.'.'.$fbtype; + + // $pfbfile = substr($fontName,0,strlen($fontName)-4).'.pfb'; + // $ttffile = substr($fontName,0,strlen($fontName)-4).'.ttf'; + $this->addMessage('selectFont: checking for - '.$fbfile); + + // OAR - I don't understand this old check + // if (substr($fontName, -4) === '.afm' && strlen($fbtype)) { + if (mb_strlen($fbtype, '8bit')) { + $adobeFontName = $this->fonts[$fontName]['FontName']; + // $fontObj = $this->numObj; + $this->addMessage('selectFont: adding font file - '.$fbfile.' - '.$adobeFontName); + + // find the array of font widths, and put that into an object. + $firstChar = -1; + $lastChar = 0; + $widths = array(); + $cid_widths = array(); + + foreach ($this->fonts[$fontName]['C'] as $num => $d) { + if (intval($num) >0 || $num == '0') { + if (!$this->fonts[$fontName]['isUnicode']) { + // With Unicode, widths array isn't used + if ($lastChar>0 && $num>$lastChar+1) { + for ($i = $lastChar+1;$i<$num;$i++) { + $widths[] = 0; + } + } + } + + $widths[] = $d; + + if ($this->fonts[$fontName]['isUnicode']) { + $cid_widths[$num] = $d; + } + + if ($firstChar == -1) { + $firstChar = $num; + } + + $lastChar = $num; + } + } + + // also need to adjust the widths for the differences array + if (isset($options['differences'])) { + foreach($options['differences'] as $charNum => $charName) { + if ($charNum > $lastChar) { + if (!$this->fonts[$fontName]['isUnicode']) { + // With Unicode, widths array isn't used + for ($i = $lastChar + 1; $i <= $charNum; $i++) { + $widths[] = 0; + } + } + + $lastChar = $charNum; + } + + if (isset($this->fonts[$fontName]['C'][$charName])) { + $widths[$charNum-$firstChar] = $this->fonts[$fontName]['C'][$charName]; + if ($this->fonts[$fontName]['isUnicode']) { + $cid_widths[$charName] = $this->fonts[$fontName]['C'][$charName]; + } + } + } + } + + if ($this->fonts[$fontName]['isUnicode']) { + $this->fonts[$fontName]['CIDWidths'] = $cid_widths; + } + + $this->addMessage('selectFont: FirstChar = '.$firstChar); + $this->addMessage('selectFont: LastChar = '.$lastChar); + + $widthid = -1; + + if (!$this->fonts[$fontName]['isUnicode']) { + // With Unicode, widths array isn't used + + $this->numObj++; + $this->o_contents($this->numObj, 'new', 'raw'); + $this->objects[$this->numObj]['c'].= '['; + + foreach($widths as $width) { + $this->objects[$this->numObj]['c'].= ' '.$width; + } + + $this->objects[$this->numObj]['c'].= ' ]'; + $widthid = $this->numObj; + } + + $missing_width = 500; + $stemV = 70; + + if (isset($this->fonts[$fontName]['MissingWidth'])) { + $missing_width = $this->fonts[$fontName]['MissingWidth']; + } + if (isset($this->fonts[$fontName]['StdVW'])) { + $stemV = $this->fonts[$fontName]['StdVW']; + } elseif (isset($this->fonts[$fontName]['Weight']) && preg_match('!(bold|black)!i', $this->fonts[$fontName]['Weight'])) { + $stemV = 120; + } + + // load the pfb file, and put that into an object too. + // note that pdf supports only binary format type 1 font files, though there is a + // simple utility to convert them from pfa to pfb. + $data = file_get_contents($fbfile); + + // create the font descriptor + $this->numObj++; + $fontDescriptorId = $this->numObj; + + $this->numObj++; + $pfbid = $this->numObj; + + // determine flags (more than a little flakey, hopefully will not matter much) + $flags = 0; + + if ($this->fonts[$fontName]['ItalicAngle'] != 0) { + $flags+= pow(2, 6); + } + + if ($this->fonts[$fontName]['IsFixedPitch'] === 'true') { + $flags+= 1; + } + + $flags+= pow(2, 5); // assume non-sybolic + $list = array( + 'Ascent' => 'Ascender', + 'CapHeight' => 'CapHeight', + 'MissingWidth' => 'MissingWidth', + 'Descent' => 'Descender', + 'FontBBox' => 'FontBBox', + 'ItalicAngle' => 'ItalicAngle' + ); + $fdopt = array( + 'Flags' => $flags, + 'FontName' => $adobeFontName, + 'StemV' => $stemV + ); + + foreach($list as $k => $v) { + if (isset($this->fonts[$fontName][$v])) { + $fdopt[$k] = $this->fonts[$fontName][$v]; + } + } + + if ($fbtype === 'pfb') { + $fdopt['FontFile'] = $pfbid; + } else if ($fbtype === 'ttf') { + $fdopt['FontFile2'] = $pfbid; + } + + $this->o_fontDescriptor($fontDescriptorId, 'new', $fdopt); + + // embed the font program + $this->o_contents($this->numObj, 'new'); + $this->objects[$pfbid]['c'].= $data; + + // determine the cruicial lengths within this file + if ($fbtype === 'pfb') { + $l1 = strpos($data, 'eexec') +6; + $l2 = strpos($data, '00000000') -$l1; + $l3 = mb_strlen($data, '8bit') -$l2-$l1; + $this->o_contents($this->numObj, 'add', array('Length1' => $l1, 'Length2' => $l2, 'Length3' => $l3)); + } else if ($fbtype == 'ttf') { + $l1 = mb_strlen($data, '8bit'); + $this->o_contents($this->numObj, 'add', array('Length1' => $l1)); + } + + // tell the font object about all this new stuff + $tmp = array( + 'BaseFont' => $adobeFontName, + 'MissingWidth' => $missing_width, + 'Widths' => $widthid, + 'FirstChar' => $firstChar, + 'LastChar' => $lastChar, + 'FontDescriptor' => $fontDescriptorId, + ); + + if ($fbtype === 'ttf') { + $tmp['SubType'] = 'TrueType'; + } + + $this->addMessage('adding extra info to font.('.$fontObj.')'); + + foreach($tmp as $fk => $fv) { + $this->addMessage($fk." : ".$fv); + } + + $this->o_font($fontObj, 'add', $tmp); + } else { + $this->addMessage('selectFont: pfb or ttf file not found, ok if this is one of the 14 standard fonts'); + } + + // also set the differences here, note that this means that these will take effect only the + //first time that a font is selected, else they are ignored + if (isset($options['differences'])) { + $this->fonts[$fontName]['differences'] = $options['differences']; + } + } + } + + if ($set && isset($this->fonts[$fontName])) { + // so if for some reason the font was not set in the last one then it will not be selected + $this->currentBaseFont = $fontName; + + // the next lines mean that if a new font is selected, then the current text state will be + // applied to it as well. + $this->currentFont = $this->currentBaseFont; + $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum']; + + //$this->setCurrentFont(); + } + + return $this->currentFontNum; + //return $this->numObj; + } + + /** + * sets up the current font, based on the font families, and the current text state + * note that this system is quite flexible, a bold-italic font can be completely different to a + * italic-bold font, and even bold-bold will have to be defined within the family to have meaning + * This function is to be called whenever the currentTextState is changed, it will update + * the currentFont setting to whatever the appropriatte family one is. + * If the user calls selectFont themselves then that will reset the currentBaseFont, and the currentFont + * This function will change the currentFont to whatever it should be, but will not change the + * currentBaseFont. + * + * @access private + */ + function setCurrentFont() { + // if (strlen($this->currentBaseFont) == 0){ + // // then assume an initial font + // $this->selectFont($this->defaultFont); + // } + // $cf = substr($this->currentBaseFont,strrpos($this->currentBaseFont,'/')+1); + // if (strlen($this->currentTextState) + // && isset($this->fontFamilies[$cf]) + // && isset($this->fontFamilies[$cf][$this->currentTextState])){ + // // then we are in some state or another + // // and this font has a family, and the current setting exists within it + // // select the font, then return it + // $nf = substr($this->currentBaseFont,0,strrpos($this->currentBaseFont,'/')+1).$this->fontFamilies[$cf][$this->currentTextState]; + // $this->selectFont($nf,'',0); + // $this->currentFont = $nf; + // $this->currentFontNum = $this->fonts[$nf]['fontNum']; + // } else { + // // the this font must not have the right family member for the current state + // // simply assume the base font + $this->currentFont = $this->currentBaseFont; + $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum']; + // } + } + + + /** + * function for the user to find out what the ID is of the first page that was created during + * startup - useful if they wish to add something to it later. + */ + function getFirstPageId() { + return $this->firstPageId; + } + + + /** + * add content to the currently active object + * + * @access private + */ + function addContent($content) { + $this->objects[$this->currentContents]['c'].= $content; + } + + + /** + * sets the colour for fill operations + */ + function setColor($color, $force = false) { + $new_color = array($color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null); + + if (!$force && $this->currentColour == $new_color) return; + + if (isset($new_color[3])) { + $this->currentColour = $new_color; + $this->objects[$this->currentContents]['c'] .= vsprintf("\n%.3F %.3F %.3F %.3F k", $this->currentColour); + } + + elseif (isset($new_color[2])) { + $this->currentColour = $new_color; + $this->objects[$this->currentContents]['c'] .= vsprintf("\n%.3F %.3F %.3F rg", $this->currentColour); + } + } + + + /** + * sets the colour for stroke operations + */ + function setStrokeColor($color, $force = false) { + $new_color = array($color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null); + + if (!$force && $this->currentStrokeColour == $new_color) return; + + if (isset($new_color[3])) { + $this->currentStrokeColour = $new_color; + $this->objects[$this->currentContents]['c'] .= vsprintf("\n%.3F %.3F %.3F %.3F K", $this->currentStrokeColour); + } + + elseif (isset($new_color[2])) { + $this->currentStrokeColour = $new_color; + $this->objects[$this->currentContents]['c'] .= vsprintf("\n%.3F %.3F %.3F RG", $this->currentStrokeColour); + } + } + + + /** + * Set the graphics state for compositions + */ + function setGraphicsState($parameters) { + // Create a new graphics state object + // FIXME: should actually keep track of states that have already been created... + $this->numObj++; + $this->o_extGState($this->numObj, 'new', $parameters); + $this->objects[ $this->currentContents ]['c'].= "\n/GS$this->numStates gs"; + } + + + /** + * Set current blend mode & opacity for lines. + * + * Valid blend modes are: + * + * Normal, Multiply, Screen, Overlay, Darken, Lighten, + * ColorDogde, ColorBurn, HardLight, SoftLight, Difference, + * Exclusion + * + * @param string $mode the blend mode to use + * @param float $opacity 0.0 fully transparent, 1.0 fully opaque + */ + function setLineTransparency($mode, $opacity) { + static $blend_modes = array("Normal", "Multiply", "Screen", + "Overlay", "Darken", "Lighten", + "ColorDogde", "ColorBurn", "HardLight", + "SoftLight", "Difference", "Exclusion"); + + if ( !in_array($mode, $blend_modes) ) + $mode = "Normal"; + + // Only create a new graphics state if required + if ( $mode === $this->currentLineTransparency["mode"] && + $opacity == $this->currentLineTransparency["opacity"] ) + return; + + $this->currentLineTransparency["mode"] = $mode; + $this->currentLineTransparency["opacity"] = $opacity; + + $options = array("BM" => "/$mode", + "CA" => (float)$opacity); + + $this->setGraphicsState($options); + } + + /** + * Set current blend mode & opacity for filled objects. + * + * Valid blend modes are: + * + * Normal, Multiply, Screen, Overlay, Darken, Lighten, + * ColorDogde, ColorBurn, HardLight, SoftLight, Difference, + * Exclusion + * + * @param string $mode the blend mode to use + * @param float $opacity 0.0 fully transparent, 1.0 fully opaque + */ + function setFillTransparency($mode, $opacity) { + static $blend_modes = array("Normal", "Multiply", "Screen", + "Overlay", "Darken", "Lighten", + "ColorDogde", "ColorBurn", "HardLight", + "SoftLight", "Difference", "Exclusion"); + + if ( !in_array($mode, $blend_modes) ) + $mode = "Normal"; + + if ( $mode === $this->currentFillTransparency["mode"] && + $opacity == $this->currentFillTransparency["opacity"] ) + return; + + $this->currentFillTransparency["mode"] = $mode; + $this->currentFillTransparency["opacity"] = $opacity; + + $options = array("BM" => "/$mode", + "ca" => (float)$opacity); + + $this->setGraphicsState($options); + } + + /** + * draw a line from one set of coordinates to another + */ + function line($x1, $y1, $x2, $y2) { + $this->objects[$this->currentContents]['c'] .= sprintf("\n%.3F %.3F m %.3F %.3F l S", $x1, $y1, $x2, $y2); + } + + + /** + * draw a bezier curve based on 4 control points + */ + function curve($x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3) { + // in the current line style, draw a bezier curve from (x0,y0) to (x3,y3) using the other two points + // as the control points for the curve. + $this->objects[$this->currentContents]['c'] .= + sprintf("\n%.3F %.3F m %.3F %.3F %.3F %.3F %.3F %.3F c S", $x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3); + } + + + /** + * draw a part of an ellipse + */ + function partEllipse($x0, $y0, $astart, $afinish, $r1, $r2 = 0, $angle = 0, $nSeg = 8) { + $this->ellipse($x0, $y0, $r1, $r2, $angle, $nSeg, $astart, $afinish, false); + } + + + /** + * draw a filled ellipse + */ + function filledEllipse($x0, $y0, $r1, $r2 = 0, $angle = 0, $nSeg = 8, $astart = 0, $afinish = 360) { + return $this->ellipse($x0, $y0, $r1, $r2 = 0, $angle, $nSeg, $astart, $afinish, true, true); + } + + + /** + * draw an ellipse + * note that the part and filled ellipse are just special cases of this function + * + * draws an ellipse in the current line style + * centered at $x0,$y0, radii $r1,$r2 + * if $r2 is not set, then a circle is drawn + * nSeg is not allowed to be less than 2, as this will simply draw a line (and will even draw a + * pretty crappy shape at 2, as we are approximating with bezier curves. + */ + function ellipse($x0, $y0, $r1, $r2 = 0, $angle = 0, $nSeg = 8, $astart = 0, $afinish = 360, $close = true, $fill = false) { + if ($r1 == 0) { + return; + } + + if ($r2 == 0) { + $r2 = $r1; + } + + if ($nSeg < 2) { + $nSeg = 2; + } + + $astart = deg2rad((float)$astart); + $afinish = deg2rad((float)$afinish); + $totalAngle = $afinish-$astart; + + $dt = $totalAngle/$nSeg; + $dtm = $dt/3; + + if ($angle != 0) { + $a = -1*deg2rad((float)$angle); + + $this->objects[$this->currentContents]['c'] .= + sprintf("\n q %.3F %.3F %.3F %.3F %.3F %.3F cm", cos($a), -sin($a), sin($a), cos($a), $x0, $y0); + + $x0 = 0; + $y0 = 0; + } + + $t1 = $astart; + $a0 = $x0 + $r1*cos($t1); + $b0 = $y0 + $r2*sin($t1); + $c0 = -$r1 * sin($t1); + $d0 = $r2 * cos($t1); + + $this->objects[$this->currentContents]['c'] .= sprintf("\n%.3F %.3F m ", $a0, $b0); + + for ($i = 1; $i <= $nSeg; $i++) { + // draw this bit of the total curve + $t1 = $i * $dt + $astart; + $a1 = $x0 + $r1 * cos($t1); + $b1 = $y0 + $r2 * sin($t1); + $c1 = -$r1 * sin($t1); + $d1 = $r2 * cos($t1); + + $this->objects[$this->currentContents]['c'] .= + sprintf("\n%.3F %.3F %.3F %.3F %.3F %.3F c", ($a0+$c0*$dtm), ($b0+$d0*$dtm), ($a1-$c1*$dtm), ($b1-$d1*$dtm), $a1, $b1); + + $a0 = $a1; + $b0 = $b1; + $c0 = $c1; + $d0 = $d1; + } + + if ($fill) { + $this->objects[$this->currentContents]['c'].= ' f'; + } else if ($close) { + $this->objects[$this->currentContents]['c'].= ' s'; // small 's' signifies closing the path as well + } else { + $this->objects[$this->currentContents]['c'].= ' S'; + } + + if ($angle != 0) { + $this->objects[$this->currentContents]['c'].= ' Q'; + } + } + + + /** + * this sets the line drawing style. + * width, is the thickness of the line in user units + * cap is the type of cap to put on the line, values can be 'butt','round','square' + * where the diffference between 'square' and 'butt' is that 'square' projects a flat end past the + * end of the line. + * join can be 'miter', 'round', 'bevel' + * dash is an array which sets the dash pattern, is a series of length values, which are the lengths of the + * on and off dashes. + * (2) represents 2 on, 2 off, 2 on , 2 off ... + * (2,1) is 2 on, 1 off, 2 on, 1 off.. etc + * phase is a modifier on the dash pattern which is used to shift the point at which the pattern starts. + */ + function setLineStyle($width = 1, $cap = '', $join = '', $dash = '', $phase = 0) { + // this is quite inefficient in that it sets all the parameters whenever 1 is changed, but will fix another day + $string = ''; + + if ($width>0) { + $string.= "$width w"; + } + + $ca = array('butt' => 0, 'round' => 1, 'square' => 2); + + if (isset($ca[$cap])) { + $string.= " $ca[$cap] J"; + } + + $ja = array('miter' => 0, 'round' => 1, 'bevel' => 2); + + if (isset($ja[$join])) { + $string.= " $ja[$join] j"; + } + + if (is_array($dash)) { + $string.= ' [ ' . implode(' ', $dash) . " ] $phase d"; + } + + $this->currentLineStyle = $string; + $this->objects[$this->currentContents]['c'].= "\n$string"; + } + + + + /** + * draw a polygon, the syntax for this is similar to the GD polygon command + */ + function polygon($p, $np, $f = false) { + $this->objects[$this->currentContents]['c'].= sprintf("\n%.3F %.3F m ", $p[0], $p[1]); + + for ($i = 2; $i < $np * 2; $i = $i + 2) { + $this->objects[$this->currentContents]['c'].= sprintf("%.3F %.3F l ", $p[$i], $p[$i+1]); + } + + if ($f) { + $this->objects[$this->currentContents]['c'].= ' f'; + } else { + $this->objects[$this->currentContents]['c'].= ' S'; + } + } + + + /** + * a filled rectangle, note that it is the width and height of the rectangle which are the secondary paramaters, not + * the coordinates of the upper-right corner + */ + function filledRectangle($x1, $y1, $width, $height) { + $this->objects[$this->currentContents]['c'].= sprintf("\n%.3F %.3F %.3F %.3F re f", $x1, $y1, $width, $height); + } + + + /** + * draw a rectangle, note that it is the width and height of the rectangle which are the secondary paramaters, not + * the coordinates of the upper-right corner + */ + function rectangle($x1, $y1, $width, $height) { + $this->objects[$this->currentContents]['c'].= sprintf("\n%.3F %.3F %.3F %.3F re S", $x1, $y1, $width, $height); + } + + + /** + * save the current graphic state + */ + function save() { + $this->objects[$this->currentContents]['c'].= "\nq"; + } + + /** + * restore the last graphic state + */ + function restore() { + $this->objects[$this->currentContents]['c'].= "\nQ"; + } + + /** + * draw a clipping rectangle, all the elements added after this will be clipped + */ + function clippingRectangle($x1, $y1, $width, $height) { + $this->save(); + $this->objects[$this->currentContents]['c'].= sprintf("\n%.3F %.3F %.3F %.3F re W n", $x1, $y1, $width, $height); + } + + + /* + * ends the last clipping shape + */ + function clippingEnd() { + $this->restore(); + } + + /** + * scale + * @param float $s_x scaling factor for width as percent + * @param float $s_y scaling factor for height as percent + * @param float $x Origin abscisse + * @param float $y Origin ordinate + */ + function scale($s_x, $s_y, $x, $y) { + $y = $this->currentPageSize["height"] - $y; + + $tm = array( + $s_x, 0, + 0, $s_y, + $x*(1-$s_x), $y*(1-$s_y) + ); + + $this->transform($tm); + } + + /** + * translate + * @param float $t_x movement to the right + * @param float $t_y movement to the bottom + */ + function translate($t_x, $t_y) { + $tm = array( + 1, 0, + 0, 1, + $t_x, -$t_y + ); + + $this->transform($tm); + } + + /** + * rotate + * @param float $angle angle in degrees for counter-clockwise rotation + * @param float $x Origin abscisse + * @param float $y Origin ordinate + */ + function rotate($angle, $x, $y) { + $y = $this->currentPageSize["height"] - $y; + + $a = deg2rad($angle); + $cos_a = cos($a); + $sin_a = sin($a); + + $tm = array( + $cos_a, -$sin_a, + $sin_a, $cos_a, + $x - $sin_a*$y - $cos_a*$x, $y - $cos_a*$y + $sin_a*$x, + ); + + $this->transform($tm); + } + + /** + * skew + * @param float $angle_x + * @param float $angle_y + * @param float $x Origin abscisse + * @param float $y Origin ordinate + */ + function skew($angle_x, $angle_y, $x, $y) { + $y = $this->currentPageSize["height"] - $y; + + $tan_x = tan(deg2rad($angle_x)); + $tan_y = tan(deg2rad($angle_y)); + + $tm = array( + 1, -$tan_y, + -$tan_x, 1, + $tan_x*$y, $tan_y*$x, + ); + + $this->transform($tm); + } + + /** + * apply graphic transformations + * @param array $tm transformation matrix + */ + function transform($tm) { + $this->objects[$this->currentContents]['c'].= + vsprintf("\n %.3F %.3F %.3F %.3F %.3F %.3F cm", $tm); + } + + + /** + * add a new page to the document + * this also makes the new page the current active object + */ + function newPage($insert = 0, $id = 0, $pos = 'after') { + // if there is a state saved, then go up the stack closing them + // then on the new page, re-open them with the right setings + + if ($this->nStateStack) { + for ($i = $this->nStateStack;$i >= 1;$i--) { + $this->restoreState($i); + } + } + + $this->numObj++; + + if ($insert) { + // the id from the ezPdf class is the id of the contents of the page, not the page object itself + // query that object to find the parent + $rid = $this->objects[$id]['onPage']; + $opt = array('rid' => $rid, 'pos' => $pos); + $this->o_page($this->numObj, 'new', $opt); + } else { + $this->o_page($this->numObj, 'new'); + } + + // if there is a stack saved, then put that onto the page + if ($this->nStateStack) { + for ($i = 1;$i <= $this->nStateStack;$i++) { + $this->saveState($i); + } + } + + // and if there has been a stroke or fill colour set, then transfer them + if (isset($this->currentColour)) { + $this->setColor($this->currentColour, true); + } + + if (isset($this->currentStrokeColour)) { + $this->setStrokeColor($this->currentStrokeColour, true); + } + + // if there is a line style set, then put this in too + if (mb_strlen($this->currentLineStyle, '8bit')) { + $this->objects[$this->currentContents]['c'].= "\n$this->currentLineStyle"; + } + + // the call to the o_page object set currentContents to the present page, so this can be returned as the page id + return $this->currentContents; + } + + + /** + * output the pdf code, streaming it to the browser + * the relevant headers are set so that hopefully the browser will recognise it + */ + function stream($options = '') { + // setting the options allows the adjustment of the headers + // values at the moment are: + // 'Content-Disposition' => 'filename' - sets the filename, though not too sure how well this will + // work as in my trial the browser seems to use the filename of the php file with .pdf on the end + // 'Accept-Ranges' => 1 or 0 - if this is not set to 1, then this header is not included, off by default + // this header seems to have caused some problems despite tha fact that it is supposed to solve + // them, so I am leaving it off by default. + // 'compress' = > 1 or 0 - apply content stream compression, this is on (1) by default + // 'Attachment' => 1 or 0 - if 1, force the browser to open a download dialog + if (!is_array($options)) { + $options = array(); + } + + if ( headers_sent()) + die("Unable to stream pdf: headers already sent"); + + $debug = empty($options['compression']); + $tmp = ltrim($this->output($debug)); + + header("Cache-Control: private"); + header("Content-type: application/pdf"); + + //FIXME: I don't know that this is sufficient for determining content length (i.e. what about transport compression?) + header("Content-Length: " . mb_strlen($tmp, '8bit')); + $fileName = (isset($options['Content-Disposition']) ? $options['Content-Disposition'] : 'file.pdf'); + + if ( !isset($options["Attachment"])) + $options["Attachment"] = true; + + $attachment = $options["Attachment"] ? "attachment" : "inline"; + + header("Content-Disposition: $attachment; filename=\"$fileName\""); + + if (isset($options['Accept-Ranges']) && $options['Accept-Ranges'] == 1) { + //FIXME: Is this the correct value ... spec says 1#range-unit + header("Accept-Ranges: " . mb_strlen($tmp, '8bit')); + } + + echo $tmp; + flush(); + } + + + /** + * return the height in units of the current font in the given size + */ + function getFontHeight($size) { + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + $font = $this->fonts[$this->currentFont]; + + // for the current font, and the given size, what is the height of the font in user units + if ( isset($font['Ascender']) && isset($font['Descender']) ) { + $h = $font['Ascender']-$font['Descender']; + } + else { + $h = $font['FontBBox'][3]-$font['FontBBox'][1]; + } + + // have to adjust by a font offset for Windows fonts. unfortunately it looks like + // the bounding box calculations are wrong and I don't know why. + if (isset($font['FontHeightOffset'])) { + // For CourierNew from Windows this needs to be -646 to match the + // Adobe native Courier font. + // + // For FreeMono from GNU this needs to be -337 to match the + // Courier font. + // + // Both have been added manually to the .afm and .ufm files. + $h += (int)$font['FontHeightOffset']; + } + + return $size*$h/1000; + } + + + /** + * return the font descender, this will normally return a negative number + * if you add this number to the baseline, you get the level of the bottom of the font + * it is in the pdf user units + */ + function getFontDescender($size) { + // note that this will most likely return a negative value + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + //$h = $this->fonts[$this->currentFont]['FontBBox'][1]; + $h = $this->fonts[$this->currentFont]['Descender']; + + return $size*$h/1000; + } + + + /** + * filter the text, this is applied to all text just before being inserted into the pdf document + * it escapes the various things that need to be escaped, and so on + * + * @access private + */ + function filterText($text, $bom = true, $convert_encoding = true) { + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + if ($convert_encoding) { + $cf = $this->currentFont; + if (isset($this->fonts[$cf]) && $this->fonts[$cf]['isUnicode']) { + //$text = html_entity_decode($text, ENT_QUOTES, 'UTF-8'); + $text = $this->utf8toUtf16BE($text, $bom); + } else { + //$text = html_entity_decode($text, ENT_QUOTES); + $text = mb_convert_encoding($text, self::$targetEncoding, 'UTF-8'); + } + } + + // the chr(13) substitution fixes a bug seen in TCPDF (bug #1421290) + return strtr($text, array(')' => '\\)', '(' => '\\(', '\\' => '\\\\', chr(13) => '\r')); + } + + /** + * return array containing codepoints (UTF-8 character values) for the + * string passed in. + * + * based on the excellent TCPDF code by Nicola Asuni and the + * RFC for UTF-8 at http://www.faqs.org/rfcs/rfc3629.html + * + * @access private + * @author Orion Richardson + * @since January 5, 2008 + * @param string $text UTF-8 string to process + * @return array UTF-8 codepoints array for the string + */ + function utf8toCodePointsArray(&$text) { + $length = mb_strlen($text, '8bit'); // http://www.php.net/manual/en/function.mb-strlen.php#77040 + $unicode = array(); // array containing unicode values + $bytes = array(); // array containing single character byte sequences + $numbytes = 1; // number of octetc needed to represent the UTF-8 character + + for ($i = 0; $i < $length; $i++) { + $c = ord($text[$i]); // get one string character at time + if (count($bytes) === 0) { // get starting octect + if ($c <= 0x7F) { + $unicode[] = $c; // use the character "as is" because is ASCII + $numbytes = 1; + } elseif (($c >> 0x05) === 0x06) { // 2 bytes character (0x06 = 110 BIN) + $bytes[] = ($c - 0xC0) << 0x06; + $numbytes = 2; + } elseif (($c >> 0x04) === 0x0E) { // 3 bytes character (0x0E = 1110 BIN) + $bytes[] = ($c - 0xE0) << 0x0C; + $numbytes = 3; + } elseif (($c >> 0x03) === 0x1E) { // 4 bytes character (0x1E = 11110 BIN) + $bytes[] = ($c - 0xF0) << 0x12; + $numbytes = 4; + } else { + // use replacement character for other invalid sequences + $unicode[] = 0xFFFD; + $bytes = array(); + $numbytes = 1; + } + } elseif (($c >> 0x06) === 0x02) { // bytes 2, 3 and 4 must start with 0x02 = 10 BIN + $bytes[] = $c - 0x80; + if (count($bytes) === $numbytes) { + // compose UTF-8 bytes to a single unicode value + $c = $bytes[0]; + for ($j = 1; $j < $numbytes; $j++) { + $c += ($bytes[$j] << (($numbytes - $j - 1) * 0x06)); + } + if ((($c >= 0xD800) AND ($c <= 0xDFFF)) OR ($c >= 0x10FFFF)) { + // The definition of UTF-8 prohibits encoding character numbers between + // U+D800 and U+DFFF, which are reserved for use with the UTF-16 + // encoding form (as surrogate pairs) and do not directly represent + // characters. + $unicode[] = 0xFFFD; // use replacement character + } else { + $unicode[] = $c; // add char to array + } + // reset data for next char + $bytes = array(); + $numbytes = 1; + } + } else { + // use replacement character for other invalid sequences + $unicode[] = 0xFFFD; + $bytes = array(); + $numbytes = 1; + } + } + return $unicode; + } + + /** + * convert UTF-8 to UTF-16 with an additional byte order marker + * at the front if required. + * + * based on the excellent TCPDF code by Nicola Asuni and the + * RFC for UTF-8 at http://www.faqs.org/rfcs/rfc3629.html + * + * @access private + * @author Orion Richardson + * @since January 5, 2008 + * @param string $text UTF-8 string to process + * @param boolean $bom whether to add the byte order marker + * @return string UTF-16 result string + */ + function utf8toUtf16BE(&$text, $bom = true) { + $cf = $this->currentFont; + if (!$this->fonts[$cf]['isUnicode']) return $text; + $out = $bom ? "\xFE\xFF" : ''; + + $unicode = $this->utf8toCodePointsArray($text); + foreach ($unicode as $c) { + if ($c === 0xFFFD) { + $out .= "\xFF\xFD"; // replacement character + } elseif ($c < 0x10000) { + $out .= chr($c >> 0x08) . chr($c & 0xFF); + } else { + $c -= 0x10000; + $w1 = 0xD800 | ($c >> 0x10); + $w2 = 0xDC00 | ($c & 0x3FF); + $out .= chr($w1 >> 0x08) . chr($w1 & 0xFF) . chr($w2 >> 0x08) . chr($w2 & 0xFF); + } + } + return $out; + } + + + /** + * given a start position and information about how text is to be laid out, calculate where + * on the page the text will end + * + * @access private + */ + function PRVTgetTextPosition($x, $y, $angle, $size, $wa, $text) { + // given this information return an array containing x and y for the end position as elements 0 and 1 + $w = $this->getTextWidth($size, $text); + + // need to adjust for the number of spaces in this text + $words = explode(' ', $text); + $nspaces = count($words) -1; + $w+= $wa*$nspaces; + $a = deg2rad((float)$angle); + + return array(cos($a) *$w+$x, -sin($a) *$w+$y); + } + + + /** + * wrapper function for PRVTcheckTextDirective1 + * + * @access private + */ + function PRVTcheckTextDirective(&$text, $i, &$f) { + return 0; + $x = 0; + $y = 0; + return $this->PRVTcheckTextDirective1($text, $i, $f, 0, $x, $y); + } + + + /** + * checks if the text stream contains a control directive + * if so then makes some changes and returns the number of characters involved in the directive + * this has been re-worked to include everything neccesary to find the current writing point, so that + * the location can be sent to the callback function if required + * if the directive does not require a font change, then $f should be set to 0 + * + * @access private + */ + function PRVTcheckTextDirective1(&$text, $i, &$f, $final, &$x, &$y, $size = 0, $angle = 0, $wordSpaceAdjust = 0) { + return 0; + $directive = 0; + $j = $i; + if ($text[$j] === '<') { + $j++; + switch ($text[$j]) { + case '/': + $j++; + if (mb_strlen($text) <= $j) { + return $directive; + } + + switch ($text[$j]) { + case 'b': + case 'i': + $j++; + if ($text[$j] === '>') { + $p = mb_strrpos($this->currentTextState, $text[$j-1]); + + if ($p !== false) { + // then there is one to remove + $this->currentTextState = mb_substr($this->currentTextState, 0, $p) .substr($this->currentTextState, $p+1); + } + + $directive = $j-$i+1; + } + break; + + case 'c': + // this this might be a callback function + $j++; + $k = mb_strpos($text, '>', $j); + + if ($k !== false && $text[$j] === ':') { + // then this will be treated as a callback directive + $directive = $k-$i+1; + $f = 0; + // split the remainder on colons to get the function name and the paramater + $tmp = mb_substr($text, $j+1, $k-$j-1); + $b1 = mb_strpos($tmp, ':'); + + if ($b1 !== false) { + $func = mb_substr($tmp, 0, $b1); + $parm = mb_substr($tmp, $b1+1); + } else { + $func = $tmp; + $parm = ''; + } + + if (!isset($func) || !mb_strlen(trim($func), '8bit')) { + $directive = 0; + } else { + // only call the function if this is the final call + if ($final) { + // need to assess the text position, calculate the text width to this point + // can use getTextWidth to find the text width I think + $tmp = $this->PRVTgetTextPosition($x, $y, $angle, $size, $wordSpaceAdjust, mb_substr($text, 0, $i)); + + $info = array('x' => $tmp[0], 'y' => $tmp[1], 'angle' => $angle, 'status' => 'end', 'p' => $parm, 'nCallback' => $this->nCallback); + $x = $tmp[0]; + $y = $tmp[1]; + $ret = $this->$func($info); + + if (is_array($ret)) { + // then the return from the callback function could set the position, to start with, later will do font colour, and font + foreach($ret as $rk => $rv) { + switch ($rk) { + case 'x': + case 'y': + $$rk = $rv; + break; + } + } + } + + // also remove from to the stack + // for simplicity, just take from the end, fix this another day + $this->nCallback--; + if ($this->nCallback<0) { + $this->nCallBack = 0; + } + } + } + } + break; + } + break; + + case 'b': + case 'i': + $j++; + if ($text[$j] === '>') { + $this->currentTextState.= $text[$j-1]; + $directive = $j-$i+1; + } + break; + + case 'C': + $noClose = 1; + case 'c': + // this this might be a callback function + $j++; + $k = mb_strpos($text, '>', $j); + + if ($k !== false && $text[$j] === ':') { + // then this will be treated as a callback directive + $directive = $k-$i+1; + + $f = 0; + + // split the remainder on colons to get the function name and the paramater + // $bits = explode(':',substr($text,$j+1,$k-$j-1)); + $tmp = mb_substr($text, $j+1, $k-$j-1); + $b1 = mb_strpos($tmp, ':'); + + if ($b1 !== false) { + $func = mb_substr($tmp, 0, $b1); + $parm = mb_substr($tmp, $b1+1); + } else { + $func = $tmp; + $parm = ''; + } + + if (!isset($func) || !mb_strlen(trim($func), '8bit')) { + $directive = 0; + } else { + // only call the function if this is the final call, ie, the one actually doing printing, not measurement + if ($final) { + // need to assess the text position, calculate the text width to this point + // can use getTextWidth to find the text width I think + // also add the text height and descender + $tmp = $this->PRVTgetTextPosition($x, $y, $angle, $size, $wordSpaceAdjust, mb_substr($text, 0, $i)); + + $info = array( + 'x' => $tmp[0], + 'y' => $tmp[1], + 'angle' => $angle, + 'status' => 'start', + 'p' => $parm, + 'f' => $func, + 'height' => $this->getFontHeight($size), + 'descender' => $this->getFontDescender($size) + ); + $x = $tmp[0]; + $y = $tmp[1]; + + if (!isset($noClose) || !$noClose) { + // only add to the stack if this is a small 'c', therefore is a start-stop pair + $this->nCallback++; + $info['nCallback'] = $this->nCallback; + $this->callback[$this->nCallback] = $info; + } + + $ret = $this->$func($info); + if (is_array($ret)) { + // then the return from the callback function could set the position, to start with, later will do font colour, and font + foreach($ret as $rk => $rv) { + switch ($rk) { + case 'x': + case 'y': + $$rk = $rv; + break; + } + } + } + } + } + } + break; + } + } + + return $directive; + } + + function toUpper($matches) { + return mb_strtoupper($matches[0]); + } + + + /** + * add text to the document, at a specified location, size and angle on the page + */ + function addText($x, $y, $size, $text, $angle = 0, $wordSpaceAdjust = 0, $charSpaceAdjust = 0, $smallCaps = false) { + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + if ($smallCaps) { + $text = preg_replace_callback("/\p{Ll}/u", array($this, "toUpper"), $text); + } + + // if there are any open callbacks, then they should be called, to show the start of the line + if ($this->nCallback>0) { + for ($i = $this->nCallback;$i>0;$i--) { + // call each function + $info = array('x' => $x, + 'y' => $y, + 'angle' => $angle, + 'status' => 'sol', + 'p' => $this->callback[$i]['p'], + 'nCallback' => $this->callback[$i]['nCallback'], + 'height' => $this->callback[$i]['height'], + 'descender' => $this->callback[$i]['descender']); + + $func = $this->callback[$i]['f']; + $this->$func($info); + } + } + + if ($angle == 0) { + $this->objects[$this->currentContents]['c'].= sprintf("\nBT %.3F %.3F Td", $x, $y); + } else { + $a = deg2rad((float)$angle); + $this->objects[$this->currentContents]['c'].= + sprintf("\nBT %.3F %.3F %.3F %.3F %.3F %.3F Tm", cos($a), -sin($a), sin($a), cos($a), $x, $y); + } + + if ($wordSpaceAdjust != 0 || $wordSpaceAdjust != $this->wordSpaceAdjust) { + $this->wordSpaceAdjust = $wordSpaceAdjust; + $this->objects[$this->currentContents]['c'].= sprintf(" %.3F Tw", $wordSpaceAdjust); + } + + if ($charSpaceAdjust != 0 || $charSpaceAdjust != $this->charSpaceAdjust) { + $this->charSpaceAdjust = $charSpaceAdjust; + $this->objects[$this->currentContents]['c'].= sprintf(" %.3F Tc", $charSpaceAdjust); + } + + $len = mb_strlen($text); + $start = 0; + + /* + for ($i = 0;$i<$len;$i++){ + $f = 1; + $directive = 0; //$this->PRVTcheckTextDirective($text,$i,$f); + if ($directive){ + // then we should write what we need to + if ($i>$start){ + $part = mb_substr($text,$start,$i-$start); + $this->objects[$this->currentContents]['c'] .= ' /F'.$this->currentFontNum.' '.sprintf('%.1F',$size).' Tf '; + $this->objects[$this->currentContents]['c'] .= ' ('.$this->filterText($part, false).') Tj'; + } + if ($f){ + // then there was nothing drastic done here, restore the contents + $this->setCurrentFont(); + } else { + $this->objects[$this->currentContents]['c'] .= ' ET'; + $f = 1; + $xp = $x; + $yp = $y; + $directive = 0; //$this->PRVTcheckTextDirective1($text,$i,$f,1,$xp,$yp,$size,$angle,$wordSpaceAdjust); + + // restart the text object + if ($angle == 0){ + $this->objects[$this->currentContents]['c'] .= "\n".'BT '.sprintf('%.3F',$xp).' '.sprintf('%.3F',$yp).' Td'; + } else { + $a = deg2rad((float)$angle); + $tmp = "\n".'BT '; + $tmp .= sprintf('%.3F',cos($a)).' '.sprintf('%.3F',(-1.0*sin($a))).' '.sprintf('%.3F',sin($a)).' '.sprintf('%.3F',cos($a)).' '; + $tmp .= sprintf('%.3F',$xp).' '.sprintf('%.3F',$yp).' Tm'; + $this->objects[$this->currentContents]['c'] .= $tmp; + } + if ($wordSpaceAdjust != 0 || $wordSpaceAdjust != $this->wordSpaceAdjust){ + $this->wordSpaceAdjust = $wordSpaceAdjust; + $this->objects[$this->currentContents]['c'] .= ' '.sprintf('%.3F',$wordSpaceAdjust).' Tw'; + } + } + // and move the writing point to the next piece of text + $i = $i+$directive-1; + $start = $i+1; + } + + } + */ + if ($start < $len) { + $part = $text; // OAR - Don't need this anymore, given that $start always equals zero. substr($text, $start); + $place_text = $this->filterText($part, false); + // modify unicode text so that extra word spacing is manually implemented (bug #) + $cf = $this->currentFont; + if ($this->fonts[$cf]['isUnicode'] && $wordSpaceAdjust != 0) { + $space_scale = 1000 / $size; + //$place_text = str_replace(' ', ') ( ) '.($this->getTextWidth($size, chr(32), $wordSpaceAdjust)*-75).' (', $place_text); + $place_text = str_replace(' ', ' ) '.(-round($space_scale*$wordSpaceAdjust)).' (', $place_text); + } + $this->objects[$this->currentContents]['c'].= " /F$this->currentFontNum ".sprintf('%.1F Tf ', $size); + $this->objects[$this->currentContents]['c'].= " [($place_text)] TJ"; + } + + $this->objects[$this->currentContents]['c'].= ' ET'; + + // if there are any open callbacks, then they should be called, to show the end of the line + if ($this->nCallback>0) { + for ($i = $this->nCallback;$i>0;$i--) { + // call each function + $tmp = $this->PRVTgetTextPosition($x, $y, $angle, $size, $wordSpaceAdjust, $text); + $info = array( + 'x' => $tmp[0], + 'y' => $tmp[1], + 'angle' => $angle, + 'status' => 'eol', + 'p' => $this->callback[$i]['p'], + 'nCallback' => $this->callback[$i]['nCallback'], + 'height' => $this->callback[$i]['height'], + 'descender' => $this->callback[$i]['descender'] + ); + $func = $this->callback[$i]['f']; + $this->$func($info); + } + } + } + + + /** + * calculate how wide a given text string will be on a page, at a given size. + * this can be called externally, but is alse used by the other class functions + */ + function getTextWidth($size, $text, $word_spacing = 0, $char_spacing = 0) { + // this function should not change any of the settings, though it will need to + // track any directives which change during calculation, so copy them at the start + // and put them back at the end. + $store_currentTextState = $this->currentTextState; + + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + // converts a number or a float to a string so it can get the width + $text = "$text"; + + // hmm, this is where it all starts to get tricky - use the font information to + // calculate the width of each character, add them up and convert to user units + $w = 0; + $cf = $this->currentFont; + $current_font = $this->fonts[$cf]; + $space_scale = 1000 / $size; + $n_spaces = 0; + + if ( $current_font['isUnicode']) { + // for Unicode, use the code points array to calculate width rather + // than just the string itself + $unicode = $this->utf8toCodePointsArray($text); + + foreach ($unicode as $char) { + // check if we have to replace character + if ( isset($current_font['differences'][$char])) { + $char = $current_font['differences'][$char]; + } + + if ( isset($current_font['C'][$char]) ) { + $char_width = $current_font['C'][$char]; + + // add the character width + $w += $char_width; + + // add additional padding for space + if ( isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space' ) { // Space + $w += $word_spacing * $space_scale; + $n_spaces++; + } + } + } + + // add additionnal char spacing + if ( $char_spacing != 0 ) { + $w += $char_spacing * $space_scale * (count($unicode) + $n_spaces); + } + + } else { + // If CPDF is in Unicode mode but the current font does not support Unicode we need to convert the character set to Windows-1252 + if ( $this->isUnicode ) { + $text = mb_convert_encoding($text, 'Windows-1252', 'UTF-8'); + } + + $len = mb_strlen($text, 'Windows-1252'); + + for ($i = 0; $i < $len; $i++) { + $char = ord($text[$i]); + + // check if we have to replace character + if ( isset($current_font['differences'][$char])) { + $char = $current_font['differences'][$char]; + } + + if ( isset($current_font['C'][$char]) ) { + $char_width = $current_font['C'][$char]; + + // add the character width + $w += $char_width; + + // add additional padding for space + if ( isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space' ) { // Space + $w += $word_spacing * $space_scale; + $n_spaces++; + } + } + } + + // add additionnal char spacing + if ( $char_spacing != 0 ) { + $w += $char_spacing * $space_scale * ($len + $n_spaces); + } + } + + $this->currentTextState = $store_currentTextState; + $this->setCurrentFont(); + + return $w*$size/1000; + } + + + /** + * do a part of the calculation for sorting out the justification of the text + * + * @access private + */ + function PRVTadjustWrapText($text, $actual, $width, &$x, &$adjust, $justification) { + switch ($justification) { + case 'left': + return; + + case 'right': + $x+= $width-$actual; + break; + + case 'center': + case 'centre': + $x+= ($width-$actual) /2; + break; + + case 'full': + // count the number of words + $words = explode(' ', $text); + $nspaces = count($words) -1; + + if ($nspaces>0) { + $adjust = ($width-$actual) /$nspaces; + } else { + $adjust = 0; + } + break; + } + } + + + /** + * add text to the page, but ensure that it fits within a certain width + * if it does not fit then put in as much as possible, splitting at word boundaries + * and return the remainder. + * justification and angle can also be specified for the text + */ + function addTextWrap($x, $y, $width, $size, $text, $justification = 'left', $angle = 0, $test = 0) { + // TODO - need to support Unicode + $cf = $this->currentFont; + if ($this->fonts[$cf]['isUnicode']) { + die("addTextWrap does not support Unicode yet!"); + } + + // this will display the text, and if it goes beyond the width $width, will backtrack to the + // previous space or hyphen, and return the remainder of the text. + + // $justification can be set to 'left','right','center','centre','full' + + // need to store the initial text state, as this will change during the width calculation + // but will need to be re-set before printing, so that the chars work out right + $store_currentTextState = $this->currentTextState; + + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + if ($width <= 0) { + // error, pretend it printed ok, otherwise risking a loop + return ''; + } + + $w = 0; + $break = 0; + $breakWidth = 0; + $len = mb_strlen($text); + $cf = $this->currentFont; + $tw = $width/$size*1000; + + for ($i = 0;$i<$len;$i++) { + $f = 1; + $directive = 0; + //$this->PRVTcheckTextDirective($text,$i,$f); + if ($directive) { + if ($f) { + $this->setCurrentFont(); + $cf = $this->currentFont; + } + + $i = $i+$directive-1; + } else { + $cOrd = ord($text[$i]); + + if (isset($this->fonts[$cf]['differences'][$cOrd])) { + // then this character is being replaced by another + $cOrd2 = $this->fonts[$cf]['differences'][$cOrd]; + } else { + $cOrd2 = $cOrd; + } + + if (isset($this->fonts[$cf]['C'][$cOrd2])) { + $w+= $this->fonts[$cf]['C'][$cOrd2]; + } + + if ($w>$tw) { + // then we need to truncate this line + if ($break>0) { + // then we have somewhere that we can split :) + if ($text[$break] === ' ') { + $tmp = mb_substr($text, 0, $break); + } else { + $tmp = mb_substr($text, 0, $break+1); + } + + $adjust = 0; + $this->PRVTadjustWrapText($tmp, $breakWidth, $width, $x, $adjust, $justification); + + // reset the text state + $this->currentTextState = $store_currentTextState; + $this->setCurrentFont(); + + if (!$test) { + $this->addText($x, $y, $size, $tmp, $angle, $adjust); + } + + return mb_substr($text, $break+1); + } else { + // just split before the current character + $tmp = mb_substr($text, 0, $i); + $adjust = 0; + $ctmp = ord($text[$i]); + + if (isset($this->fonts[$cf]['differences'][$ctmp])) { + $ctmp = $this->fonts[$cf]['differences'][$ctmp]; + } + + $tmpw = ($w-$this->fonts[$cf]['C'][$ctmp]) *$size/1000; + $this->PRVTadjustWrapText($tmp, $tmpw, $width, $x, $adjust, $justification); + + // reset the text state + $this->currentTextState = $store_currentTextState; + $this->setCurrentFont(); + + if (!$test) { + $this->addText($x, $y, $size, $tmp, $angle, $adjust); + } + + return mb_substr($text, $i); + } + } + + if ($text[$i] === '-') { + $break = $i; + $breakWidth = $w*$size/1000; + } + + if ($text[$i] === ' ') { + $break = $i; + $ctmp = ord($text[$i]); + + if (isset($this->fonts[$cf]['differences'][$ctmp])) { + $ctmp = $this->fonts[$cf]['differences'][$ctmp]; + } + + $breakWidth = ($w-$this->fonts[$cf]['C'][$ctmp]) *$size/1000; + } + } + } + + // then there was no need to break this line + if ($justification === 'full') { + $justification = 'left'; + } + + $adjust = 0; + $tmpw = $w*$size/1000; + + $this->PRVTadjustWrapText($text, $tmpw, $width, $x, $adjust, $justification); + + // reset the text state + $this->currentTextState = $store_currentTextState; + $this->setCurrentFont(); + + if (!$test) { + $this->addText($x, $y, $size, $text, $angle, $adjust); + } + + return ''; + } + + + /** + * this will be called at a new page to return the state to what it was on the + * end of the previous page, before the stack was closed down + * This is to get around not being able to have open 'q' across pages + * + */ + function saveState($pageEnd = 0) { + if ($pageEnd) { + // this will be called at a new page to return the state to what it was on the + // end of the previous page, before the stack was closed down + // This is to get around not being able to have open 'q' across pages + $opt = $this->stateStack[$pageEnd]; + // ok to use this as stack starts numbering at 1 + $this->setColor($opt['col'], true); + $this->setStrokeColor($opt['str'], true); + $this->objects[$this->currentContents]['c'].= "\n".$opt['lin']; + // $this->currentLineStyle = $opt['lin']; + } else { + $this->nStateStack++; + $this->stateStack[$this->nStateStack] = array( + 'col' => $this->currentColour, + 'str' => $this->currentStrokeColour, + 'lin' => $this->currentLineStyle + ); + } + + $this->save(); + } + + + /** + * restore a previously saved state + */ + function restoreState($pageEnd = 0) { + if (!$pageEnd) { + $n = $this->nStateStack; + $this->currentColour = $this->stateStack[$n]['col']; + $this->currentStrokeColour = $this->stateStack[$n]['str']; + $this->objects[$this->currentContents]['c'].= "\n".$this->stateStack[$n]['lin']; + $this->currentLineStyle = $this->stateStack[$n]['lin']; + $this->stateStack[$n] = null; + unset($this->stateStack[$n]); + $this->nStateStack--; + } + + $this->restore(); + } + + + /** + * make a loose object, the output will go into this object, until it is closed, then will revert to + * the current one. + * this object will not appear until it is included within a page. + * the function will return the object number + */ + function openObject() { + $this->nStack++; + $this->stack[$this->nStack] = array('c' => $this->currentContents, 'p' => $this->currentPage); + // add a new object of the content type, to hold the data flow + $this->numObj++; + $this->o_contents($this->numObj, 'new'); + $this->currentContents = $this->numObj; + $this->looseObjects[$this->numObj] = 1; + + return $this->numObj; + } + + + /** + * open an existing object for editing + */ + function reopenObject($id) { + $this->nStack++; + $this->stack[$this->nStack] = array('c' => $this->currentContents, 'p' => $this->currentPage); + $this->currentContents = $id; + + // also if this object is the primary contents for a page, then set the current page to its parent + if (isset($this->objects[$id]['onPage'])) { + $this->currentPage = $this->objects[$id]['onPage']; + } + } + + + /** + * close an object + */ + function closeObject() { + // close the object, as long as there was one open in the first place, which will be indicated by + // an objectId on the stack. + if ($this->nStack>0) { + $this->currentContents = $this->stack[$this->nStack]['c']; + $this->currentPage = $this->stack[$this->nStack]['p']; + $this->nStack--; + // easier to probably not worry about removing the old entries, they will be overwritten + // if there are new ones. + } + } + + + /** + * stop an object from appearing on pages from this point on + */ + function stopObject($id) { + // if an object has been appearing on pages up to now, then stop it, this page will + // be the last one that could contian it. + if (isset($this->addLooseObjects[$id])) { + $this->addLooseObjects[$id] = ''; + } + } + + + /** + * after an object has been created, it wil only show if it has been added, using this function. + */ + function addObject($id, $options = 'add') { + // add the specified object to the page + if (isset($this->looseObjects[$id]) && $this->currentContents != $id) { + // then it is a valid object, and it is not being added to itself + switch ($options) { + case 'all': + // then this object is to be added to this page (done in the next block) and + // all future new pages. + $this->addLooseObjects[$id] = 'all'; + + case 'add': + if (isset($this->objects[$this->currentContents]['onPage'])) { + // then the destination contents is the primary for the page + // (though this object is actually added to that page) + $this->o_page($this->objects[$this->currentContents]['onPage'], 'content', $id); + } + break; + + case 'even': + $this->addLooseObjects[$id] = 'even'; + $pageObjectId = $this->objects[$this->currentContents]['onPage']; + if ($this->objects[$pageObjectId]['info']['pageNum']%2 == 0) { + $this->addObject($id); + // hacky huh :) + } + break; + + case 'odd': + $this->addLooseObjects[$id] = 'odd'; + $pageObjectId = $this->objects[$this->currentContents]['onPage']; + if ($this->objects[$pageObjectId]['info']['pageNum']%2 == 1) { + $this->addObject($id); + // hacky huh :) + } + break; + + case 'next': + $this->addLooseObjects[$id] = 'all'; + break; + + case 'nexteven': + $this->addLooseObjects[$id] = 'even'; + break; + + case 'nextodd': + $this->addLooseObjects[$id] = 'odd'; + break; + } + } + } + + + /** + * return a storable representation of a specific object + */ + function serializeObject($id) { + if ( array_key_exists($id, $this->objects)) + return var_export($this->objects[$id], true); + } + + + /** + * restore an object from its stored representation. returns its new object id. + */ + function restoreSerializedObject($obj) { + $obj_id = $this->openObject(); + eval('$this->objects[$obj_id] = ' . $obj . ';'); + $this->closeObject(); + return $obj_id; + } + + + /** + * add content to the documents info object + */ + function addInfo($label, $value = 0) { + // this will only work if the label is one of the valid ones. + // modify this so that arrays can be passed as well. + // if $label is an array then assume that it is key => value pairs + // else assume that they are both scalar, anything else will probably error + if (is_array($label)) { + foreach ($label as $l => $v) { + $this->o_info($this->infoObject, $l, $v); + } + } else { + $this->o_info($this->infoObject, $label, $value); + } + } + + + /** + * set the viewer preferences of the document, it is up to the browser to obey these. + */ + function setPreferences($label, $value = 0) { + // this will only work if the label is one of the valid ones. + if (is_array($label)) { + foreach ($label as $l => $v) { + $this->o_catalog($this->catalogId, 'viewerPreferences', array($l => $v)); + } + } else { + $this->o_catalog($this->catalogId, 'viewerPreferences', array($label => $value)); + } + } + + + /** + * extract an integer from a position in a byte stream + * + * @access private + */ + function PRVT_getBytes(&$data, $pos, $num) { + // return the integer represented by $num bytes from $pos within $data + $ret = 0; + for ($i = 0;$i<$num;$i++) { + $ret = $ret*256; + $ret+= ord($data[$pos+$i]); + } + + return $ret; + } + + + /** + * add a PNG image into the document, from a GD object + * this should work with remote files + * + * @param string $file The PNG file + * @param float $x X position + * @param float $y Y position + * @param float $w Width + * @param float $h Height + * @param resource $img A GD resource + * @param bool $is_mask true if the image is a mask + * @param bool $mask true if the image is masked + */ + function addImagePng($file, $x, $y, $w = 0, $h = 0, &$img, $is_mask = false, $mask = null) { + //if already cached, need not to read again + if ( isset($this->imagelist[$file]) ) { + $data = null; + } else { + // Example for transparency handling on new image. Retain for current image + // $tIndex = imagecolortransparent($img); + // if ($tIndex > 0) { + // $tColor = imagecolorsforindex($img, $tIndex); + // $new_tIndex = imagecolorallocate($new_img, $tColor['red'], $tColor['green'], $tColor['blue']); + // imagefill($new_img, 0, 0, $new_tIndex); + // imagecolortransparent($new_img, $new_tIndex); + // } + // blending mode (literal/blending) on drawing into current image. not relevant when not saved or not drawn + //imagealphablending($img, true); + + //default, but explicitely set to ensure pdf compatibility + imagesavealpha($img, false/*!$is_mask && !$mask*/); + + $error = 0; + //DEBUG_IMG_TEMP + //debugpng + if (DEBUGPNG) print '[addImagePng '.$file.']'; + + ob_start(); + @imagepng($img); + $data = ob_get_clean(); + + if ($data == '') { + $error = 1; + $errormsg = 'trouble writing file from GD'; + //DEBUG_IMG_TEMP + //debugpng + if (DEBUGPNG) print 'trouble writing file from GD'; + } + + if ($error) { + $this->addMessage('PNG error - ('.$file.') '.$errormsg); + return; + } + } //End isset($this->imagelist[$file]) (png Duplicate removal) + + $this->addPngFromBuf($file, $x, $y, $w, $h, $data, $is_mask, $mask); + } + + protected function addImagePngAlpha($file, $x, $y, $w, $h, $byte) { + // generate images + $img = imagecreatefrompng($file); + + if ($img === false) { + return; + } + + $wpx = imagesx($img); + $hpx = imagesy($img); + + imagesavealpha($img, false); + + $imgalpha = imagecreate($wpx, $hpx); + imagesavealpha($imgalpha, false); + + // generate gray scale palette (0 -> 255) + for ($c = 0; $c < 256; ++$c) { + imagecolorallocate($imgalpha, $c, $c, $c); + } + + // FIXME The pixel transformation doesn't work well with 8bit PNGs + $eight_bit = ($byte & 4) !== 4; + + // allocated colors cache + $allocated_colors = array(); + + // extract alpha channel + for ($xpx = 0; $xpx < $wpx; ++$xpx) { + for ($ypx = 0; $ypx < $hpx; ++$ypx) { + $color = imagecolorat($img, $xpx, $ypx); + $col = imagecolorsforindex($img, $color); + $alpha = $col['alpha']; + + if ($eight_bit) { + // with gamma correction + $gammacorr = 2.2; + $pixel = pow((((127 - $alpha) * 255 / 127) / 255), $gammacorr) * 255; + } + + else { + // without gamma correction + $pixel = (127 - $alpha) * 2; + + $key = implode("-", array($col['red'], $col['green'], $col['blue'])); + + if (!isset($allocated_colors[$key])) { + $pixel_img = imagecolorallocate($img, $col['red'], $col['green'], $col['blue']); + $allocated_colors[$key] = $pixel_img; + } + else { + $pixel_img = $allocated_colors[$key]; + } + + imagesetpixel($img, $xpx, $ypx, $pixel_img); + } + + imagesetpixel($imgalpha, $xpx, $ypx, $pixel); + } + } + + // create temp alpha file + $tempfile_alpha = tempnam($this->tmp, "cpdf_img_").'.png'; + imagepng($imgalpha, $tempfile_alpha); + + // extract image without alpha channel + $imgplain = imagecreatetruecolor($wpx, $hpx); + imagecopy($imgplain, $img, 0, 0, 0, 0, $wpx, $hpx); + imagedestroy($img); + + // create temp image file + $tempfile_plain = tempnam($this->tmp, "cpdf_img_").'.png'; + imagepng($imgplain, $tempfile_plain); + + // embed mask image + $this->addImagePng($tempfile_alpha, $x, $y, $w, $h, $imgalpha, true); + imagedestroy($imgalpha); + + // embed image, masked with previously embedded mask + $this->addImagePng($tempfile_plain, $x, $y, $w, $h, $imgplain, false, true); + imagedestroy($imgplain); + + // remove temp files + unlink($tempfile_alpha); + unlink($tempfile_plain); + } + + + /** + * add a PNG image into the document, from a file + * this should work with remote files + */ + function addPngFromFile($file, $x, $y, $w = 0, $h = 0) { + //if already cached, need not to read again + if ( isset($this->imagelist[$file]) ) { + $img = null; + } + + else { + $byte = ord (file_get_contents ($file, false, null, 25, 1)); + $is_alpha = ($byte & 6); // 6 => 32b, 4 => 8b + + if ($is_alpha) { // exclude grayscale alpha + return $this->addImagePngAlpha($file, $x, $y, $w, $h, $byte); + } + + //png files typically contain an alpha channel. + //pdf file format or class.pdf does not support alpha blending. + //on alpha blended images, more transparent areas have a color near black. + //This appears in the result on not storing the alpha channel. + //Correct would be the box background image or its parent when transparent. + //But this would make the image dependent on the background. + //Therefore create an image with white background and copy in + //A more natural background than black is white. + //Therefore create an empty image with white background and merge the + //image in with alpha blending. + $imgtmp = @imagecreatefrompng($file); + if (!$imgtmp) { + return; + } + $sx = imagesx($imgtmp); + $sy = imagesy($imgtmp); + $img = imagecreatetruecolor($sx,$sy); + imagealphablending($img, true); + + // @todo is it still needed ?? + $ti = imagecolortransparent($imgtmp); + if ($ti >= 0) { + $tc = imagecolorsforindex($imgtmp,$ti); + $ti = imagecolorallocate($img,$tc['red'],$tc['green'],$tc['blue']); + imagefill($img,0,0,$ti); + imagecolortransparent($img, $ti); + } else { + imagefill($img,1,1,imagecolorallocate($img,255,255,255)); + } + + imagecopy($img,$imgtmp,0,0,0,0,$sx,$sy); + imagedestroy($imgtmp); + } + $this->addImagePng($file, $x, $y, $w, $h, $img); + imagedestroy($img); + } + + + /** + * add a PNG image into the document, from a memory buffer of the file + */ + function addPngFromBuf($file, $x, $y, $w = 0, $h = 0, &$data, $is_mask = false, $mask = null) { + if ( isset($this->imagelist[$file]) ) { + //debugpng + //if (DEBUGPNG) print '[addPngFromBuf Duplicate '.$file.']'; + $data = null; + $info['width'] = $this->imagelist[$file]['w']; + $info['height'] = $this->imagelist[$file]['h']; + $label = $this->imagelist[$file]['label']; + } + + else { + if ($data == null) { + $this->addMessage('addPngFromBuf error - ('.$imgname.') data not present!'); + return; + } + //debugpng + //if (DEBUGPNG) print '[addPngFromBuf file='.$file.']'; + $error = 0; + + if (!$error) { + $header = chr(137) .chr(80) .chr(78) .chr(71) .chr(13) .chr(10) .chr(26) .chr(10); + if (mb_substr($data, 0, 8, '8bit') != $header) { + $error = 1; + //debugpng + if (DEBUGPNG) print '[addPngFromFile this file does not have a valid header '.$file.']'; + + $errormsg = 'this file does not have a valid header'; + } + } + + if (!$error) { + // set pointer + $p = 8; + $len = mb_strlen($data, '8bit'); + + // cycle through the file, identifying chunks + $haveHeader = 0; + $info = array(); + $idata = ''; + $pdata = ''; + + while ($p < $len) { + $chunkLen = $this->PRVT_getBytes($data, $p, 4); + $chunkType = mb_substr($data, $p+4, 4, '8bit'); + // echo $chunkType.' - '.$chunkLen.'
'; + switch ($chunkType) { + case 'IHDR': + // this is where all the file information comes from + $info['width'] = $this->PRVT_getBytes($data, $p+8, 4); + $info['height'] = $this->PRVT_getBytes($data, $p+12, 4); + $info['bitDepth'] = ord($data[$p+16]); + $info['colorType'] = ord($data[$p+17]); + $info['compressionMethod'] = ord($data[$p+18]); + $info['filterMethod'] = ord($data[$p+19]); + $info['interlaceMethod'] = ord($data[$p+20]); + + //print_r($info); + $haveHeader = 1; + if ($info['compressionMethod'] != 0) { + $error = 1; + + //debugpng + if (DEBUGPNG) print '[addPngFromFile unsupported compression method '.$file.']'; + + $errormsg = 'unsupported compression method'; + } + + if ($info['filterMethod'] != 0) { + $error = 1; + + //debugpng + if (DEBUGPNG) print '[addPngFromFile unsupported filter method '.$file.']'; + + $errormsg = 'unsupported filter method'; + } + break; + + case 'PLTE': + $pdata.= mb_substr($data, $p+8, $chunkLen, '8bit'); + break; + + case 'IDAT': + $idata.= mb_substr($data, $p+8, $chunkLen, '8bit'); + break; + + case 'tRNS': + //this chunk can only occur once and it must occur after the PLTE chunk and before IDAT chunk + //print "tRNS found, color type = ".$info['colorType']."\n"; + $transparency = array(); + + if ($info['colorType'] == 3) { + // indexed color, rbg + /* corresponding to entries in the plte chunk + Alpha for palette index 0: 1 byte + Alpha for palette index 1: 1 byte + ...etc... + */ + // there will be one entry for each palette entry. up until the last non-opaque entry. + // set up an array, stretching over all palette entries which will be o (opaque) or 1 (transparent) + $transparency['type'] = 'indexed'; + $numPalette = mb_strlen($pdata, '8bit')/3; + $trans = 0; + + for ($i = $chunkLen;$i >= 0;$i--) { + if (ord($data[$p+8+$i]) == 0) { + $trans = $i; + } + } + + $transparency['data'] = $trans; + } elseif ($info['colorType'] == 0) { + // grayscale + /* corresponding to entries in the plte chunk + Gray: 2 bytes, range 0 .. (2^bitdepth)-1 + */ + // $transparency['grayscale'] = $this->PRVT_getBytes($data,$p+8,2); // g = grayscale + $transparency['type'] = 'indexed'; + + $transparency['data'] = ord($data[$p+8+1]); + } elseif ($info['colorType'] == 2) { + // truecolor + /* corresponding to entries in the plte chunk + Red: 2 bytes, range 0 .. (2^bitdepth)-1 + Green: 2 bytes, range 0 .. (2^bitdepth)-1 + Blue: 2 bytes, range 0 .. (2^bitdepth)-1 + */ + $transparency['r'] = $this->PRVT_getBytes($data, $p+8, 2); + // r from truecolor + $transparency['g'] = $this->PRVT_getBytes($data, $p+10, 2); + // g from truecolor + $transparency['b'] = $this->PRVT_getBytes($data, $p+12, 2); + // b from truecolor + + $transparency['type'] = 'color-key'; + + } else { + //unsupported transparency type + //debugpng + if (DEBUGPNG) print '[addPngFromFile unsupported transparency type '.$file.']'; + } + // KS End new code + break; + + default: + break; + } + + $p+= $chunkLen+12; + } + + + if (!$haveHeader) { + $error = 1; + + //debugpng + if (DEBUGPNG) print '[addPngFromFile information header is missing '.$file.']'; + + $errormsg = 'information header is missing'; + } + + if (isset($info['interlaceMethod']) && $info['interlaceMethod']) { + $error = 1; + + //debugpng + if (DEBUGPNG) print '[addPngFromFile no support for interlaced images in pdf '.$file.']'; + + $errormsg = 'There appears to be no support for interlaced images in pdf.'; + } + } + + if (!$error && $info['bitDepth'] > 8) { + $error = 1; + + //debugpng + if (DEBUGPNG) print '[addPngFromFile bit depth of 8 or less is supported '.$file.']'; + + $errormsg = 'only bit depth of 8 or less is supported'; + } + + if (!$error) { + switch ($info['colorType']) { + case 3: + $color = 'DeviceRGB'; + $ncolor = 1; + break; + + case 2: + $color = 'DeviceRGB'; + $ncolor = 3; + break; + + case 0: + $color = 'DeviceGray'; + $ncolor = 1; + break; + + default: + $error = 1; + + //debugpng + if (DEBUGPNG) print '[addPngFromFile alpha channel not supported: '.$info['colorType'].' '.$file.']'; + + $errormsg = 'transparancey alpha channel not supported, transparency only supported for palette images.'; + } + } + + if ($error) { + $this->addMessage('PNG error - ('.$file.') '.$errormsg); + return; + } + + //print_r($info); + // so this image is ok... add it in. + $this->numImages++; + $im = $this->numImages; + $label = 'I'.$im; + $this->numObj++; + + // $this->o_image($this->numObj,'new',array('label' => $label,'data' => $idata,'iw' => $w,'ih' => $h,'type' => 'png','ic' => $info['width'])); + $options = array( + 'label' => $label, + 'data' => $idata, + 'bitsPerComponent' => $info['bitDepth'], + 'pdata' => $pdata, + 'iw' => $info['width'], + 'ih' => $info['height'], + 'type' => 'png', + 'color' => $color, + 'ncolor' => $ncolor, + 'masked' => $mask, + 'isMask' => $is_mask, + ); + + if (isset($transparency)) { + $options['transparency'] = $transparency; + } + + $this->o_image($this->numObj, 'new', $options); + $this->imagelist[$file] = array('label' =>$label, 'w' => $info['width'], 'h' => $info['height']); + } + + if ($is_mask) { + return; + } + + if ($w <= 0 && $h <= 0) { + $w = $info['width']; + $h = $info['height']; + } + + if ($w <= 0) { + $w = $h/$info['height']*$info['width']; + } + + if ($h <= 0) { + $h = $w*$info['height']/$info['width']; + } + + $this->objects[$this->currentContents]['c'].= sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm", $w, $h, $x, $y); + $this->objects[$this->currentContents]['c'].= "\n/$label Do\nQ"; + } + + + /** + * add a JPEG image into the document, from a file + */ + function addJpegFromFile($img, $x, $y, $w = 0, $h = 0) { + // attempt to add a jpeg image straight from a file, using no GD commands + // note that this function is unable to operate on a remote file. + + if (!file_exists($img)) { + return; + } + + if ( isset($this->imagelist[$img]) ) { + $data = null; + $imageWidth = $this->imagelist[$img]['w']; + $imageHeight = $this->imagelist[$img]['h']; + $channels = $this->imagelist[$img]['c']; + } else { + $tmp = getimagesize($img); + $imageWidth = $tmp[0]; + $imageHeight = $tmp[1]; + + if (isset($tmp['channels'])) { + $channels = $tmp['channels']; + } else { + $channels = 3; + } + + $data = file_get_contents($img); + } + + if ($w <= 0 && $h <= 0) { + $w = $imageWidth; + } + + if ($w == 0) { + $w = $h/$imageHeight*$imageWidth; + } + + if ($h == 0) { + $h = $w*$imageHeight/$imageWidth; + } + + $this->addJpegImage_common($data, $x, $y, $w, $h, $imageWidth, $imageHeight, $channels, $img); + } + + + /** + * add an image into the document, from a GD object + * this function is not all that reliable, and I would probably encourage people to use + * the file based functions + */ + function addImage(&$img, $x, $y, $w = 0, $h = 0, $quality = 75) { + /* Todo: + * Pass in original filename as $imgname + * If already cached like image_iscached(), allow empty $img + * How to get w and h in this case? + * Then caller can check with image_iscached() whether generation of image is needed. + * + * But anyway, this function is not used! + */ + $imgname = tempnam($this->tmp, "cpdf_img_").'.jpeg'; + + // add a new image into the current location, as an external object + // add the image at $x,$y, and with width and height as defined by $w & $h + + // note that this will only work with full colour images and makes them jpg images for display + // later versions could present lossless image formats if there is interest. + + // there seems to be some problem here in that images that have quality set above 75 do not appear + // not too sure why this is, but in the meantime I have restricted this to 75. + if ($quality>75) { + $quality = 75; + } + + // if the width or height are set to zero, then set the other one based on keeping the image + // height/width ratio the same, if they are both zero, then give up :) + $imageWidth = imagesx($img); + $imageHeight = imagesy($img); + + if ($w <= 0 && $h <= 0) { + return; + } + + if ($w == 0) { + $w = $h/$imageHeight*$imageWidth; + } + + if ($h == 0) { + $h = $w*$imageHeight/$imageWidth; + } + + // gotta get the data out of the img.. + ob_start(); + imagejpeg($img, '', $quality); + $data = ob_get_clean(); + + $this->addJpegImage_common($data, $x, $y, $w, $h, $imageWidth, $imageHeight, $imgname); + } + + + /* Check if image already added to pdf image directory. + * If yes, need not to create again (pass empty data) + */ + function image_iscached($imgname) { + return isset($this->imagelist[$imgname]); + } + + + /** + * common code used by the two JPEG adding functions + * + * @access private + */ + function addJpegImage_common(&$data, $x, $y, $w = 0, $h = 0, $imageWidth, $imageHeight, $channels = 3, $imgname) { + if ( isset($this->imagelist[$imgname]) ) { + $label = $this->imagelist[$imgname]['label']; + //debugpng + //if (DEBUGPNG) print '[addJpegImage_common Duplicate '.$imgname.']'; + + } else { + if ($data == null) { + $this->addMessage('addJpegImage_common error - ('.$imgname.') data not present!'); + return; + } + + // note that this function is not to be called externally + // it is just the common code between the GD and the file options + $this->numImages++; + $im = $this->numImages; + $label = 'I'.$im; + $this->numObj++; + + $this->o_image($this->numObj, 'new', array( + 'label' => $label, + 'data' => &$data, + 'iw' => $imageWidth, + 'ih' => $imageHeight, + 'channels' => $channels + )); + $this->imagelist[$imgname] = array('label' =>$label, 'w' => $imageWidth, 'h' => $imageHeight, 'c'=> $channels ); + } + + $this->objects[$this->currentContents]['c'].= sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm", $w, $h, $x, $y); + $this->objects[$this->currentContents]['c'].= "\n/$label Do\nQ"; + } + + + /** + * specify where the document should open when it first starts + */ + function openHere($style, $a = 0, $b = 0, $c = 0) { + // this function will open the document at a specified page, in a specified style + // the values for style, and the required paramters are: + // 'XYZ' left, top, zoom + // 'Fit' + // 'FitH' top + // 'FitV' left + // 'FitR' left,bottom,right + // 'FitB' + // 'FitBH' top + // 'FitBV' left + $this->numObj++; + $this->o_destination($this->numObj, 'new', array('page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c)); + $id = $this->catalogId; + $this->o_catalog($id, 'openHere', $this->numObj); + } + + function addJavascript($code) { + $this->javascript .= $code; + } + + + /** + * create a labelled destination within the document + */ + function addDestination($label, $style, $a = 0, $b = 0, $c = 0) { + // associates the given label with the destination, it is done this way so that a destination can be specified after + // it has been linked to + // styles are the same as the 'openHere' function + $this->numObj++; + $this->o_destination($this->numObj, 'new', array('page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c)); + $id = $this->numObj; + + // store the label->idf relationship, note that this means that labels can be used only once + $this->destinations["$label"] = $id; + } + + + /** + * define font families, this is used to initialize the font families for the default fonts + * and for the user to add new ones for their fonts. The default bahavious can be overridden should + * that be desired. + */ + function setFontFamily($family, $options = '') { + if (!is_array($options)) { + if ($family === 'init') { + // set the known family groups + // these font families will be used to enable bold and italic markers to be included + // within text streams. html forms will be used... + $this->fontFamilies['Helvetica.afm'] = + array('b' => 'Helvetica-Bold.afm', + 'i' => 'Helvetica-Oblique.afm', + 'bi' => 'Helvetica-BoldOblique.afm', + 'ib' => 'Helvetica-BoldOblique.afm'); + + $this->fontFamilies['Courier.afm'] = + array('b' => 'Courier-Bold.afm', + 'i' => 'Courier-Oblique.afm', + 'bi' => 'Courier-BoldOblique.afm', + 'ib' => 'Courier-BoldOblique.afm'); + + $this->fontFamilies['Times-Roman.afm'] = + array('b' => 'Times-Bold.afm', + 'i' => 'Times-Italic.afm', + 'bi' => 'Times-BoldItalic.afm', + 'ib' => 'Times-BoldItalic.afm'); + } + } else { + + // the user is trying to set a font family + // note that this can also be used to set the base ones to something else + if (mb_strlen($family)) { + $this->fontFamilies[$family] = $options; + } + } + } + + /** + * used to add messages for use in debugging + */ + function addMessage($message) { + $this->messages.= $message."\n"; + } + + + /** + * a few functions which should allow the document to be treated transactionally. + */ + function transaction($action) { + switch ($action) { + case 'start': + // store all the data away into the checkpoint variable + $data = get_object_vars($this); + $this->checkpoint = $data; + unset($data); + break; + + case 'commit': + if (is_array($this->checkpoint) && isset($this->checkpoint['checkpoint'])) { + $tmp = $this->checkpoint['checkpoint']; + $this->checkpoint = $tmp; + unset($tmp); + } else { + $this->checkpoint = ''; + } + break; + + case 'rewind': + // do not destroy the current checkpoint, but move us back to the state then, so that we can try again + if (is_array($this->checkpoint)) { + // can only abort if were inside a checkpoint + $tmp = $this->checkpoint; + + foreach ($tmp as $k => $v) { + if ($k !== 'checkpoint') { + $this->$k = $v; + } + } + unset($tmp); + } + break; + + case 'abort': + if (is_array($this->checkpoint)) { + // can only abort if were inside a checkpoint + $tmp = $this->checkpoint; + foreach ($tmp as $k => $v) { + $this->$k = $v; + } + unset($tmp); + } + break; + } + } +} +// end of class diff --git a/application/third_party/dompdf/lib/fonts/Courier-Bold.afm b/application/third_party/dompdf/lib/fonts/Courier-Bold.afm new file mode 100755 index 00000000..0ccfd618 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Courier-Bold.afm @@ -0,0 +1,344 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Mon Jun 23 16:28:00 0:00:00 +Comment UniqueID 43048 +Comment VMusage 41139 52164 +FontName Courier-Bold +FullName Courier Bold +FamilyName Courier +Weight Bold +ItalicAngle 0 +IsFixedPitch true +CharacterSet ExtendedRoman +FontBBox -113 -250 749 801 +UnderlinePosition -100 +UnderlineThickness 50 +Version 003.000 +Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +EncodingScheme WinAnsiEncoding +CapHeight 562 +XHeight 439 +Ascender 629 +Descender -157 +StdHW 84 +StdVW 106 +StartCharMetrics 317 +C 32 ; WX 600 ; N space ; B 0 0 0 0 ; +C 160 ; WX 600 ; N space ; B 0 0 0 0 ; +C 33 ; WX 600 ; N exclam ; B 202 -15 398 572 ; +C 34 ; WX 600 ; N quotedbl ; B 135 277 465 562 ; +C 35 ; WX 600 ; N numbersign ; B 56 -45 544 651 ; +C 36 ; WX 600 ; N dollar ; B 82 -126 519 666 ; +C 37 ; WX 600 ; N percent ; B 5 -15 595 616 ; +C 38 ; WX 600 ; N ampersand ; B 36 -15 546 543 ; +C 146 ; WX 600 ; N quoteright ; B 171 277 423 562 ; +C 40 ; WX 600 ; N parenleft ; B 219 -102 461 616 ; +C 41 ; WX 600 ; N parenright ; B 139 -102 381 616 ; +C 42 ; WX 600 ; N asterisk ; B 91 219 509 601 ; +C 43 ; WX 600 ; N plus ; B 71 39 529 478 ; +C 44 ; WX 600 ; N comma ; B 123 -111 393 174 ; +C 45 ; WX 600 ; N hyphen ; B 100 203 500 313 ; +C 173 ; WX 600 ; N hyphen ; B 100 203 500 313 ; +C 46 ; WX 600 ; N period ; B 192 -15 408 171 ; +C 47 ; WX 600 ; N slash ; B 98 -77 502 626 ; +C 48 ; WX 600 ; N zero ; B 87 -15 513 616 ; +C 49 ; WX 600 ; N one ; B 81 0 539 616 ; +C 50 ; WX 600 ; N two ; B 61 0 499 616 ; +C 51 ; WX 600 ; N three ; B 63 -15 501 616 ; +C 52 ; WX 600 ; N four ; B 53 0 507 616 ; +C 53 ; WX 600 ; N five ; B 70 -15 521 601 ; +C 54 ; WX 600 ; N six ; B 90 -15 521 616 ; +C 55 ; WX 600 ; N seven ; B 55 0 494 601 ; +C 56 ; WX 600 ; N eight ; B 83 -15 517 616 ; +C 57 ; WX 600 ; N nine ; B 79 -15 510 616 ; +C 58 ; WX 600 ; N colon ; B 191 -15 407 425 ; +C 59 ; WX 600 ; N semicolon ; B 123 -111 408 425 ; +C 60 ; WX 600 ; N less ; B 66 15 523 501 ; +C 61 ; WX 600 ; N equal ; B 71 118 529 398 ; +C 62 ; WX 600 ; N greater ; B 77 15 534 501 ; +C 63 ; WX 600 ; N question ; B 98 -14 501 580 ; +C 64 ; WX 600 ; N at ; B 16 -15 584 616 ; +C 65 ; WX 600 ; N A ; B -9 0 609 562 ; +C 66 ; WX 600 ; N B ; B 30 0 573 562 ; +C 67 ; WX 600 ; N C ; B 22 -18 560 580 ; +C 68 ; WX 600 ; N D ; B 30 0 594 562 ; +C 69 ; WX 600 ; N E ; B 25 0 560 562 ; +C 70 ; WX 600 ; N F ; B 39 0 570 562 ; +C 71 ; WX 600 ; N G ; B 22 -18 594 580 ; +C 72 ; WX 600 ; N H ; B 20 0 580 562 ; +C 73 ; WX 600 ; N I ; B 77 0 523 562 ; +C 74 ; WX 600 ; N J ; B 37 -18 601 562 ; +C 75 ; WX 600 ; N K ; B 21 0 599 562 ; +C 76 ; WX 600 ; N L ; B 39 0 578 562 ; +C 77 ; WX 600 ; N M ; B -2 0 602 562 ; +C 78 ; WX 600 ; N N ; B 8 -12 610 562 ; +C 79 ; WX 600 ; N O ; B 22 -18 578 580 ; +C 80 ; WX 600 ; N P ; B 48 0 559 562 ; +C 81 ; WX 600 ; N Q ; B 32 -138 578 580 ; +C 82 ; WX 600 ; N R ; B 24 0 599 562 ; +C 83 ; WX 600 ; N S ; B 47 -22 553 582 ; +C 84 ; WX 600 ; N T ; B 21 0 579 562 ; +C 85 ; WX 600 ; N U ; B 4 -18 596 562 ; +C 86 ; WX 600 ; N V ; B -13 0 613 562 ; +C 87 ; WX 600 ; N W ; B -18 0 618 562 ; +C 88 ; WX 600 ; N X ; B 12 0 588 562 ; +C 89 ; WX 600 ; N Y ; B 12 0 589 562 ; +C 90 ; WX 600 ; N Z ; B 62 0 539 562 ; +C 91 ; WX 600 ; N bracketleft ; B 245 -102 475 616 ; +C 92 ; WX 600 ; N backslash ; B 99 -77 503 626 ; +C 93 ; WX 600 ; N bracketright ; B 125 -102 355 616 ; +C 94 ; WX 600 ; N asciicircum ; B 108 250 492 616 ; +C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ; +C 145 ; WX 600 ; N quoteleft ; B 178 277 428 562 ; +C 97 ; WX 600 ; N a ; B 35 -15 570 454 ; +C 98 ; WX 600 ; N b ; B 0 -15 584 626 ; +C 99 ; WX 600 ; N c ; B 40 -15 545 459 ; +C 100 ; WX 600 ; N d ; B 20 -15 591 626 ; +C 101 ; WX 600 ; N e ; B 40 -15 563 454 ; +C 102 ; WX 600 ; N f ; B 83 0 547 626 ; L i fi ; L l fl ; +C 103 ; WX 600 ; N g ; B 30 -146 580 454 ; +C 104 ; WX 600 ; N h ; B 5 0 592 626 ; +C 105 ; WX 600 ; N i ; B 77 0 523 658 ; +C 106 ; WX 600 ; N j ; B 63 -146 440 658 ; +C 107 ; WX 600 ; N k ; B 20 0 585 626 ; +C 108 ; WX 600 ; N l ; B 77 0 523 626 ; +C 109 ; WX 600 ; N m ; B -22 0 626 454 ; +C 110 ; WX 600 ; N n ; B 18 0 592 454 ; +C 111 ; WX 600 ; N o ; B 30 -15 570 454 ; +C 112 ; WX 600 ; N p ; B -1 -142 570 454 ; +C 113 ; WX 600 ; N q ; B 20 -142 591 454 ; +C 114 ; WX 600 ; N r ; B 47 0 580 454 ; +C 115 ; WX 600 ; N s ; B 68 -17 535 459 ; +C 116 ; WX 600 ; N t ; B 47 -15 532 562 ; +C 117 ; WX 600 ; N u ; B -1 -15 569 439 ; +C 118 ; WX 600 ; N v ; B -1 0 601 439 ; +C 119 ; WX 600 ; N w ; B -18 0 618 439 ; +C 120 ; WX 600 ; N x ; B 6 0 594 439 ; +C 121 ; WX 600 ; N y ; B -4 -142 601 439 ; +C 122 ; WX 600 ; N z ; B 81 0 520 439 ; +C 123 ; WX 600 ; N braceleft ; B 160 -102 464 616 ; +C 124 ; WX 600 ; N bar ; B 255 -250 345 750 ; +C 125 ; WX 600 ; N braceright ; B 136 -102 440 616 ; +C 126 ; WX 600 ; N asciitilde ; B 71 153 530 356 ; +C 161 ; WX 600 ; N exclamdown ; B 202 -146 398 449 ; +C 162 ; WX 600 ; N cent ; B 66 -49 518 614 ; +C 163 ; WX 600 ; N sterling ; B 72 -28 558 611 ; +C -1 ; WX 600 ; N fraction ; B 25 -60 576 661 ; +C 165 ; WX 600 ; N yen ; B 10 0 590 562 ; +C 131 ; WX 600 ; N florin ; B -30 -131 572 616 ; +C 167 ; WX 600 ; N section ; B 83 -70 517 580 ; +C 164 ; WX 600 ; N currency ; B 54 49 546 517 ; +C 39 ; WX 600 ; N quotesingle ; B 227 277 373 562 ; +C 147 ; WX 600 ; N quotedblleft ; B 71 277 535 562 ; +C 170 ; WX 600 ; N guillemotleft ; B 8 70 553 446 ; +C 139 ; WX 600 ; N guilsinglleft ; B 141 70 459 446 ; +C 155 ; WX 600 ; N guilsinglright ; B 141 70 459 446 ; +C -1 ; WX 600 ; N fi ; B 12 0 593 626 ; +C -1 ; WX 600 ; N fl ; B 12 0 593 626 ; +C 150 ; WX 600 ; N endash ; B 65 203 535 313 ; +C 134 ; WX 600 ; N dagger ; B 106 -70 494 580 ; +C 135 ; WX 600 ; N daggerdbl ; B 106 -70 494 580 ; +C 183 ; WX 600 ; N periodcentered ; B 196 165 404 351 ; +C 182 ; WX 600 ; N paragraph ; B 6 -70 576 580 ; +C 149 ; WX 600 ; N bullet ; B 140 132 460 430 ; +C 130 ; WX 600 ; N quotesinglbase ; B 175 -142 427 143 ; +C 132 ; WX 600 ; N quotedblbase ; B 65 -142 529 143 ; +C 148 ; WX 600 ; N quotedblright ; B 61 277 525 562 ; +C 187 ; WX 600 ; N guillemotright ; B 47 70 592 446 ; +C 133 ; WX 600 ; N ellipsis ; B 26 -15 574 116 ; +C 137 ; WX 600 ; N perthousand ; B -113 -15 713 616 ; +C 191 ; WX 600 ; N questiondown ; B 99 -146 502 449 ; +C 96 ; WX 600 ; N grave ; B 132 508 395 661 ; +C 180 ; WX 600 ; N acute ; B 205 508 468 661 ; +C 136 ; WX 600 ; N circumflex ; B 103 483 497 657 ; +C 152 ; WX 600 ; N tilde ; B 89 493 512 636 ; +C 175 ; WX 600 ; N macron ; B 88 505 512 585 ; +C -1 ; WX 600 ; N breve ; B 83 468 517 631 ; +C -1 ; WX 600 ; N dotaccent ; B 230 498 370 638 ; +C 168 ; WX 600 ; N dieresis ; B 128 498 472 638 ; +C -1 ; WX 600 ; N ring ; B 198 481 402 678 ; +C 184 ; WX 600 ; N cedilla ; B 205 -206 387 0 ; +C -1 ; WX 600 ; N hungarumlaut ; B 68 488 588 661 ; +C -1 ; WX 600 ; N ogonek ; B 169 -199 400 0 ; +C -1 ; WX 600 ; N caron ; B 103 493 497 667 ; +C 151 ; WX 600 ; N emdash ; B -10 203 610 313 ; +C 198 ; WX 600 ; N AE ; B -29 0 602 562 ; +C 170 ; WX 600 ; N ordfeminine ; B 147 196 453 580 ; +C -1 ; WX 600 ; N Lslash ; B 39 0 578 562 ; +C 216 ; WX 600 ; N Oslash ; B 22 -22 578 584 ; +C 140 ; WX 600 ; N OE ; B -25 0 595 562 ; +C 186 ; WX 600 ; N ordmasculine ; B 147 196 453 580 ; +C 230 ; WX 600 ; N ae ; B -4 -15 601 454 ; +C -1 ; WX 600 ; N dotlessi ; B 77 0 523 439 ; +C -1 ; WX 600 ; N lslash ; B 77 0 523 626 ; +C 248 ; WX 600 ; N oslash ; B 30 -24 570 463 ; +C 156 ; WX 600 ; N oe ; B -18 -15 611 454 ; +C 223 ; WX 600 ; N germandbls ; B 22 -15 596 626 ; +C 207 ; WX 600 ; N Idieresis ; B 77 0 523 761 ; +C 233 ; WX 600 ; N eacute ; B 40 -15 563 661 ; +C -1 ; WX 600 ; N abreve ; B 35 -15 570 661 ; +C -1 ; WX 600 ; N uhungarumlaut ; B -1 -15 628 661 ; +C -1 ; WX 600 ; N ecaron ; B 40 -15 563 667 ; +C 159 ; WX 600 ; N Ydieresis ; B 12 0 589 761 ; +C 247 ; WX 600 ; N divide ; B 71 16 529 500 ; +C 221 ; WX 600 ; N Yacute ; B 12 0 589 784 ; +C 194 ; WX 600 ; N Acircumflex ; B -9 0 609 780 ; +C 225 ; WX 600 ; N aacute ; B 35 -15 570 661 ; +C 219 ; WX 600 ; N Ucircumflex ; B 4 -18 596 780 ; +C 253 ; WX 600 ; N yacute ; B -4 -142 601 661 ; +C -1 ; WX 600 ; N scommaaccent ; B 68 -250 535 459 ; +C 234 ; WX 600 ; N ecircumflex ; B 40 -15 563 657 ; +C -1 ; WX 600 ; N Uring ; B 4 -18 596 801 ; +C 220 ; WX 600 ; N Udieresis ; B 4 -18 596 761 ; +C -1 ; WX 600 ; N aogonek ; B 35 -199 586 454 ; +C 218 ; WX 600 ; N Uacute ; B 4 -18 596 784 ; +C -1 ; WX 600 ; N uogonek ; B -1 -199 585 439 ; +C 203 ; WX 600 ; N Edieresis ; B 25 0 560 761 ; +C -1 ; WX 600 ; N Dcroat ; B 30 0 594 562 ; +C -1 ; WX 600 ; N commaaccent ; B 205 -250 397 -57 ; +C 169 ; WX 600 ; N copyright ; B 0 -18 600 580 ; +C -1 ; WX 600 ; N Emacron ; B 25 0 560 708 ; +C -1 ; WX 600 ; N ccaron ; B 40 -15 545 667 ; +C 229 ; WX 600 ; N aring ; B 35 -15 570 678 ; +C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 610 562 ; +C -1 ; WX 600 ; N lacute ; B 77 0 523 801 ; +C 224 ; WX 600 ; N agrave ; B 35 -15 570 661 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 21 -250 579 562 ; +C -1 ; WX 600 ; N Cacute ; B 22 -18 560 784 ; +C 227 ; WX 600 ; N atilde ; B 35 -15 570 636 ; +C -1 ; WX 600 ; N Edotaccent ; B 25 0 560 761 ; +C 154 ; WX 600 ; N scaron ; B 68 -17 535 667 ; +C -1 ; WX 600 ; N scedilla ; B 68 -206 535 459 ; +C 237 ; WX 600 ; N iacute ; B 77 0 523 661 ; +C -1 ; WX 600 ; N lozenge ; B 66 0 534 740 ; +C -1 ; WX 600 ; N Rcaron ; B 24 0 599 790 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 22 -250 594 580 ; +C 251 ; WX 600 ; N ucircumflex ; B -1 -15 569 657 ; +C 226 ; WX 600 ; N acircumflex ; B 35 -15 570 657 ; +C -1 ; WX 600 ; N Amacron ; B -9 0 609 708 ; +C -1 ; WX 600 ; N rcaron ; B 47 0 580 667 ; +C 231 ; WX 600 ; N ccedilla ; B 40 -206 545 459 ; +C -1 ; WX 600 ; N Zdotaccent ; B 62 0 539 761 ; +C 222 ; WX 600 ; N Thorn ; B 48 0 557 562 ; +C -1 ; WX 600 ; N Omacron ; B 22 -18 578 708 ; +C -1 ; WX 600 ; N Racute ; B 24 0 599 784 ; +C -1 ; WX 600 ; N Sacute ; B 47 -22 553 784 ; +C -1 ; WX 600 ; N dcaron ; B 20 -15 727 626 ; +C -1 ; WX 600 ; N Umacron ; B 4 -18 596 708 ; +C -1 ; WX 600 ; N uring ; B -1 -15 569 678 ; +C 179 ; WX 600 ; N threesuperior ; B 138 222 433 616 ; +C 210 ; WX 600 ; N Ograve ; B 22 -18 578 784 ; +C 192 ; WX 600 ; N Agrave ; B -9 0 609 784 ; +C -1 ; WX 600 ; N Abreve ; B -9 0 609 784 ; +C 215 ; WX 600 ; N multiply ; B 81 39 520 478 ; +C 250 ; WX 600 ; N uacute ; B -1 -15 569 661 ; +C -1 ; WX 600 ; N Tcaron ; B 21 0 579 790 ; +C -1 ; WX 600 ; N partialdiff ; B 63 -38 537 728 ; +C 255 ; WX 600 ; N ydieresis ; B -4 -142 601 638 ; +C -1 ; WX 600 ; N Nacute ; B 8 -12 610 784 ; +C 238 ; WX 600 ; N icircumflex ; B 73 0 523 657 ; +C 202 ; WX 600 ; N Ecircumflex ; B 25 0 560 780 ; +C 228 ; WX 600 ; N adieresis ; B 35 -15 570 638 ; +C 235 ; WX 600 ; N edieresis ; B 40 -15 563 638 ; +C -1 ; WX 600 ; N cacute ; B 40 -15 545 661 ; +C -1 ; WX 600 ; N nacute ; B 18 0 592 661 ; +C -1 ; WX 600 ; N umacron ; B -1 -15 569 585 ; +C -1 ; WX 600 ; N Ncaron ; B 8 -12 610 790 ; +C 205 ; WX 600 ; N Iacute ; B 77 0 523 784 ; +C 177 ; WX 600 ; N plusminus ; B 71 24 529 515 ; +C 166 ; WX 600 ; N brokenbar ; B 255 -175 345 675 ; +C 174 ; WX 600 ; N registered ; B 0 -18 600 580 ; +C -1 ; WX 600 ; N Gbreve ; B 22 -18 594 784 ; +C -1 ; WX 600 ; N Idotaccent ; B 77 0 523 761 ; +C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ; +C 200 ; WX 600 ; N Egrave ; B 25 0 560 784 ; +C -1 ; WX 600 ; N racute ; B 47 0 580 661 ; +C -1 ; WX 600 ; N omacron ; B 30 -15 570 585 ; +C -1 ; WX 600 ; N Zacute ; B 62 0 539 784 ; +C 142 ; WX 600 ; N Zcaron ; B 62 0 539 790 ; +C -1 ; WX 600 ; N greaterequal ; B 26 0 523 696 ; +C 208 ; WX 600 ; N Eth ; B 30 0 594 562 ; +C 199 ; WX 600 ; N Ccedilla ; B 22 -206 560 580 ; +C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 523 626 ; +C -1 ; WX 600 ; N tcaron ; B 47 -15 532 703 ; +C -1 ; WX 600 ; N eogonek ; B 40 -199 563 454 ; +C -1 ; WX 600 ; N Uogonek ; B 4 -199 596 562 ; +C 193 ; WX 600 ; N Aacute ; B -9 0 609 784 ; +C 196 ; WX 600 ; N Adieresis ; B -9 0 609 761 ; +C 232 ; WX 600 ; N egrave ; B 40 -15 563 661 ; +C -1 ; WX 600 ; N zacute ; B 81 0 520 661 ; +C -1 ; WX 600 ; N iogonek ; B 77 -199 523 658 ; +C 211 ; WX 600 ; N Oacute ; B 22 -18 578 784 ; +C 243 ; WX 600 ; N oacute ; B 30 -15 570 661 ; +C -1 ; WX 600 ; N amacron ; B 35 -15 570 585 ; +C -1 ; WX 600 ; N sacute ; B 68 -17 535 661 ; +C 239 ; WX 600 ; N idieresis ; B 77 0 523 618 ; +C 212 ; WX 600 ; N Ocircumflex ; B 22 -18 578 780 ; +C 217 ; WX 600 ; N Ugrave ; B 4 -18 596 784 ; +C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ; +C 254 ; WX 600 ; N thorn ; B -14 -142 570 626 ; +C 178 ; WX 600 ; N twosuperior ; B 143 230 436 616 ; +C 214 ; WX 600 ; N Odieresis ; B 22 -18 578 761 ; +C 181 ; WX 600 ; N mu ; B -1 -142 569 439 ; +C 236 ; WX 600 ; N igrave ; B 77 0 523 661 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 30 -15 668 661 ; +C -1 ; WX 600 ; N Eogonek ; B 25 -199 576 562 ; +C -1 ; WX 600 ; N dcroat ; B 20 -15 591 626 ; +C 190 ; WX 600 ; N threequarters ; B -47 -60 648 661 ; +C -1 ; WX 600 ; N Scedilla ; B 47 -206 553 582 ; +C -1 ; WX 600 ; N lcaron ; B 77 0 597 626 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 599 562 ; +C -1 ; WX 600 ; N Lacute ; B 39 0 578 784 ; +C 153 ; WX 600 ; N trademark ; B -9 230 749 562 ; +C -1 ; WX 600 ; N edotaccent ; B 40 -15 563 638 ; +C 204 ; WX 600 ; N Igrave ; B 77 0 523 784 ; +C -1 ; WX 600 ; N Imacron ; B 77 0 523 708 ; +C -1 ; WX 600 ; N Lcaron ; B 39 0 637 562 ; +C 189 ; WX 600 ; N onehalf ; B -47 -60 648 661 ; +C -1 ; WX 600 ; N lessequal ; B 26 0 523 696 ; +C 244 ; WX 600 ; N ocircumflex ; B 30 -15 570 657 ; +C 241 ; WX 600 ; N ntilde ; B 18 0 592 636 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 4 -18 638 784 ; +C 201 ; WX 600 ; N Eacute ; B 25 0 560 784 ; +C -1 ; WX 600 ; N emacron ; B 40 -15 563 585 ; +C -1 ; WX 600 ; N gbreve ; B 30 -146 580 661 ; +C 188 ; WX 600 ; N onequarter ; B -56 -60 656 661 ; +C 138 ; WX 600 ; N Scaron ; B 47 -22 553 790 ; +C -1 ; WX 600 ; N Scommaaccent ; B 47 -250 553 582 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 22 -18 628 784 ; +C 176 ; WX 600 ; N degree ; B 86 243 474 616 ; +C 242 ; WX 600 ; N ograve ; B 30 -15 570 661 ; +C -1 ; WX 600 ; N Ccaron ; B 22 -18 560 790 ; +C 249 ; WX 600 ; N ugrave ; B -1 -15 569 661 ; +C -1 ; WX 600 ; N radical ; B -19 -104 473 778 ; +C -1 ; WX 600 ; N Dcaron ; B 30 0 594 790 ; +C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 580 454 ; +C 209 ; WX 600 ; N Ntilde ; B 8 -12 610 759 ; +C 245 ; WX 600 ; N otilde ; B 30 -15 570 636 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 599 562 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 578 562 ; +C 195 ; WX 600 ; N Atilde ; B -9 0 609 759 ; +C -1 ; WX 600 ; N Aogonek ; B -9 -199 625 562 ; +C 197 ; WX 600 ; N Aring ; B -9 0 609 801 ; +C 213 ; WX 600 ; N Otilde ; B 22 -18 578 759 ; +C -1 ; WX 600 ; N zdotaccent ; B 81 0 520 638 ; +C -1 ; WX 600 ; N Ecaron ; B 25 0 560 790 ; +C -1 ; WX 600 ; N Iogonek ; B 77 -199 523 562 ; +C -1 ; WX 600 ; N kcommaaccent ; B 20 -250 585 626 ; +C -1 ; WX 600 ; N minus ; B 71 203 529 313 ; +C 206 ; WX 600 ; N Icircumflex ; B 77 0 523 780 ; +C -1 ; WX 600 ; N ncaron ; B 18 0 592 667 ; +C -1 ; WX 600 ; N tcommaaccent ; B 47 -250 532 562 ; +C 172 ; WX 600 ; N logicalnot ; B 71 103 529 413 ; +C 246 ; WX 600 ; N odieresis ; B 30 -15 570 638 ; +C 252 ; WX 600 ; N udieresis ; B -1 -15 569 638 ; +C -1 ; WX 600 ; N notequal ; B 12 -47 537 563 ; +C -1 ; WX 600 ; N gcommaaccent ; B 30 -146 580 714 ; +C 240 ; WX 600 ; N eth ; B 58 -27 543 626 ; +C 158 ; WX 600 ; N zcaron ; B 81 0 520 667 ; +C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 592 454 ; +C 185 ; WX 600 ; N onesuperior ; B 153 230 447 616 ; +C -1 ; WX 600 ; N imacron ; B 77 0 523 585 ; +C 128 ; WX 600 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Courier-BoldOblique.afm b/application/third_party/dompdf/lib/fonts/Courier-BoldOblique.afm new file mode 100755 index 00000000..215d8be6 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Courier-BoldOblique.afm @@ -0,0 +1,344 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Mon Jun 23 16:28:46 0:00:00 +Comment UniqueID 43049 +Comment VMusage 17529 79244 +FontName Courier-BoldOblique +FullName Courier Bold Oblique +FamilyName Courier +Weight Bold +ItalicAngle -12 +IsFixedPitch true +CharacterSet ExtendedRoman +FontBBox -57 -250 869 801 +UnderlinePosition -100 +UnderlineThickness 50 +Version 3 +Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +EncodingScheme WinAnsiEncoding +CapHeight 562 +XHeight 439 +Ascender 629 +Descender -157 +StdHW 84 +StdVW 106 +StartCharMetrics 317 +C 32 ; WX 600 ; N space ; B 0 0 0 0 ; +C 160 ; WX 600 ; N space ; B 0 0 0 0 ; +C 33 ; WX 600 ; N exclam ; B 215 -15 495 572 ; +C 34 ; WX 600 ; N quotedbl ; B 211 277 585 562 ; +C 35 ; WX 600 ; N numbersign ; B 88 -45 641 651 ; +C 36 ; WX 600 ; N dollar ; B 87 -126 630 666 ; +C 37 ; WX 600 ; N percent ; B 101 -15 625 616 ; +C 38 ; WX 600 ; N ampersand ; B 61 -15 595 543 ; +C 146 ; WX 600 ; N quoteright ; B 229 277 543 562 ; +C 40 ; WX 600 ; N parenleft ; B 265 -102 592 616 ; +C 41 ; WX 600 ; N parenright ; B 117 -102 444 616 ; +C 42 ; WX 600 ; N asterisk ; B 179 219 598 601 ; +C 43 ; WX 600 ; N plus ; B 114 39 596 478 ; +C 44 ; WX 600 ; N comma ; B 99 -111 430 174 ; +C 45 ; WX 600 ; N hyphen ; B 143 203 567 313 ; +C 173 ; WX 600 ; N hyphen ; B 143 203 567 313 ; +C 46 ; WX 600 ; N period ; B 206 -15 427 171 ; +C 47 ; WX 600 ; N slash ; B 90 -77 626 626 ; +C 48 ; WX 600 ; N zero ; B 135 -15 593 616 ; +C 49 ; WX 600 ; N one ; B 93 0 562 616 ; +C 50 ; WX 600 ; N two ; B 61 0 594 616 ; +C 51 ; WX 600 ; N three ; B 71 -15 571 616 ; +C 52 ; WX 600 ; N four ; B 81 0 559 616 ; +C 53 ; WX 600 ; N five ; B 77 -15 621 601 ; +C 54 ; WX 600 ; N six ; B 135 -15 652 616 ; +C 55 ; WX 600 ; N seven ; B 147 0 622 601 ; +C 56 ; WX 600 ; N eight ; B 115 -15 604 616 ; +C 57 ; WX 600 ; N nine ; B 75 -15 592 616 ; +C 58 ; WX 600 ; N colon ; B 205 -15 480 425 ; +C 59 ; WX 600 ; N semicolon ; B 99 -111 481 425 ; +C 60 ; WX 600 ; N less ; B 120 15 613 501 ; +C 61 ; WX 600 ; N equal ; B 96 118 614 398 ; +C 62 ; WX 600 ; N greater ; B 97 15 589 501 ; +C 63 ; WX 600 ; N question ; B 183 -14 592 580 ; +C 64 ; WX 600 ; N at ; B 65 -15 642 616 ; +C 65 ; WX 600 ; N A ; B -9 0 632 562 ; +C 66 ; WX 600 ; N B ; B 30 0 630 562 ; +C 67 ; WX 600 ; N C ; B 74 -18 675 580 ; +C 68 ; WX 600 ; N D ; B 30 0 664 562 ; +C 69 ; WX 600 ; N E ; B 25 0 670 562 ; +C 70 ; WX 600 ; N F ; B 39 0 684 562 ; +C 71 ; WX 600 ; N G ; B 74 -18 675 580 ; +C 72 ; WX 600 ; N H ; B 20 0 700 562 ; +C 73 ; WX 600 ; N I ; B 77 0 643 562 ; +C 74 ; WX 600 ; N J ; B 58 -18 721 562 ; +C 75 ; WX 600 ; N K ; B 21 0 692 562 ; +C 76 ; WX 600 ; N L ; B 39 0 636 562 ; +C 77 ; WX 600 ; N M ; B -2 0 722 562 ; +C 78 ; WX 600 ; N N ; B 8 -12 730 562 ; +C 79 ; WX 600 ; N O ; B 74 -18 645 580 ; +C 80 ; WX 600 ; N P ; B 48 0 643 562 ; +C 81 ; WX 600 ; N Q ; B 83 -138 636 580 ; +C 82 ; WX 600 ; N R ; B 24 0 617 562 ; +C 83 ; WX 600 ; N S ; B 54 -22 673 582 ; +C 84 ; WX 600 ; N T ; B 86 0 679 562 ; +C 85 ; WX 600 ; N U ; B 101 -18 716 562 ; +C 86 ; WX 600 ; N V ; B 84 0 733 562 ; +C 87 ; WX 600 ; N W ; B 79 0 738 562 ; +C 88 ; WX 600 ; N X ; B 12 0 690 562 ; +C 89 ; WX 600 ; N Y ; B 109 0 709 562 ; +C 90 ; WX 600 ; N Z ; B 62 0 637 562 ; +C 91 ; WX 600 ; N bracketleft ; B 223 -102 606 616 ; +C 92 ; WX 600 ; N backslash ; B 222 -77 496 626 ; +C 93 ; WX 600 ; N bracketright ; B 103 -102 486 616 ; +C 94 ; WX 600 ; N asciicircum ; B 171 250 556 616 ; +C 95 ; WX 600 ; N underscore ; B -27 -125 585 -75 ; +C 145 ; WX 600 ; N quoteleft ; B 297 277 487 562 ; +C 97 ; WX 600 ; N a ; B 61 -15 593 454 ; +C 98 ; WX 600 ; N b ; B 13 -15 636 626 ; +C 99 ; WX 600 ; N c ; B 81 -15 631 459 ; +C 100 ; WX 600 ; N d ; B 60 -15 645 626 ; +C 101 ; WX 600 ; N e ; B 81 -15 605 454 ; +C 102 ; WX 600 ; N f ; B 83 0 677 626 ; L i fi ; L l fl ; +C 103 ; WX 600 ; N g ; B 40 -146 674 454 ; +C 104 ; WX 600 ; N h ; B 18 0 615 626 ; +C 105 ; WX 600 ; N i ; B 77 0 546 658 ; +C 106 ; WX 600 ; N j ; B 36 -146 580 658 ; +C 107 ; WX 600 ; N k ; B 33 0 643 626 ; +C 108 ; WX 600 ; N l ; B 77 0 546 626 ; +C 109 ; WX 600 ; N m ; B -22 0 649 454 ; +C 110 ; WX 600 ; N n ; B 18 0 615 454 ; +C 111 ; WX 600 ; N o ; B 71 -15 622 454 ; +C 112 ; WX 600 ; N p ; B -32 -142 622 454 ; +C 113 ; WX 600 ; N q ; B 60 -142 685 454 ; +C 114 ; WX 600 ; N r ; B 47 0 655 454 ; +C 115 ; WX 600 ; N s ; B 66 -17 608 459 ; +C 116 ; WX 600 ; N t ; B 118 -15 567 562 ; +C 117 ; WX 600 ; N u ; B 70 -15 592 439 ; +C 118 ; WX 600 ; N v ; B 70 0 695 439 ; +C 119 ; WX 600 ; N w ; B 53 0 712 439 ; +C 120 ; WX 600 ; N x ; B 6 0 671 439 ; +C 121 ; WX 600 ; N y ; B -21 -142 695 439 ; +C 122 ; WX 600 ; N z ; B 81 0 614 439 ; +C 123 ; WX 600 ; N braceleft ; B 203 -102 595 616 ; +C 124 ; WX 600 ; N bar ; B 201 -250 505 750 ; +C 125 ; WX 600 ; N braceright ; B 114 -102 506 616 ; +C 126 ; WX 600 ; N asciitilde ; B 120 153 590 356 ; +C 161 ; WX 600 ; N exclamdown ; B 196 -146 477 449 ; +C 162 ; WX 600 ; N cent ; B 121 -49 605 614 ; +C 163 ; WX 600 ; N sterling ; B 106 -28 650 611 ; +C -1 ; WX 600 ; N fraction ; B 22 -60 708 661 ; +C 165 ; WX 600 ; N yen ; B 98 0 710 562 ; +C 131 ; WX 600 ; N florin ; B -57 -131 702 616 ; +C 167 ; WX 600 ; N section ; B 74 -70 620 580 ; +C 164 ; WX 600 ; N currency ; B 77 49 644 517 ; +C 39 ; WX 600 ; N quotesingle ; B 303 277 493 562 ; +C 147 ; WX 600 ; N quotedblleft ; B 190 277 594 562 ; +C 170 ; WX 600 ; N guillemotleft ; B 62 70 639 446 ; +C 139 ; WX 600 ; N guilsinglleft ; B 195 70 545 446 ; +C 155 ; WX 600 ; N guilsinglright ; B 165 70 514 446 ; +C -1 ; WX 600 ; N fi ; B 12 0 644 626 ; +C -1 ; WX 600 ; N fl ; B 12 0 644 626 ; +C 150 ; WX 600 ; N endash ; B 108 203 602 313 ; +C 134 ; WX 600 ; N dagger ; B 175 -70 586 580 ; +C 135 ; WX 600 ; N daggerdbl ; B 121 -70 587 580 ; +C 183 ; WX 600 ; N periodcentered ; B 248 165 461 351 ; +C 182 ; WX 600 ; N paragraph ; B 61 -70 700 580 ; +C 149 ; WX 600 ; N bullet ; B 196 132 523 430 ; +C 130 ; WX 600 ; N quotesinglbase ; B 144 -142 458 143 ; +C 132 ; WX 600 ; N quotedblbase ; B 34 -142 560 143 ; +C 148 ; WX 600 ; N quotedblright ; B 119 277 645 562 ; +C 187 ; WX 600 ; N guillemotright ; B 71 70 647 446 ; +C 133 ; WX 600 ; N ellipsis ; B 35 -15 587 116 ; +C 137 ; WX 600 ; N perthousand ; B -45 -15 743 616 ; +C 191 ; WX 600 ; N questiondown ; B 100 -146 509 449 ; +C 96 ; WX 600 ; N grave ; B 272 508 503 661 ; +C 180 ; WX 600 ; N acute ; B 312 508 609 661 ; +C 136 ; WX 600 ; N circumflex ; B 212 483 607 657 ; +C 152 ; WX 600 ; N tilde ; B 199 493 643 636 ; +C 175 ; WX 600 ; N macron ; B 195 505 637 585 ; +C -1 ; WX 600 ; N breve ; B 217 468 652 631 ; +C -1 ; WX 600 ; N dotaccent ; B 348 498 493 638 ; +C 168 ; WX 600 ; N dieresis ; B 246 498 595 638 ; +C -1 ; WX 600 ; N ring ; B 319 481 528 678 ; +C 184 ; WX 600 ; N cedilla ; B 168 -206 368 0 ; +C -1 ; WX 600 ; N hungarumlaut ; B 171 488 729 661 ; +C -1 ; WX 600 ; N ogonek ; B 143 -199 367 0 ; +C -1 ; WX 600 ; N caron ; B 238 493 633 667 ; +C 151 ; WX 600 ; N emdash ; B 33 203 677 313 ; +C 198 ; WX 600 ; N AE ; B -29 0 708 562 ; +C 170 ; WX 600 ; N ordfeminine ; B 188 196 526 580 ; +C -1 ; WX 600 ; N Lslash ; B 39 0 636 562 ; +C 216 ; WX 600 ; N Oslash ; B 48 -22 673 584 ; +C 140 ; WX 600 ; N OE ; B 26 0 701 562 ; +C 186 ; WX 600 ; N ordmasculine ; B 188 196 543 580 ; +C 230 ; WX 600 ; N ae ; B 21 -15 652 454 ; +C -1 ; WX 600 ; N dotlessi ; B 77 0 546 439 ; +C -1 ; WX 600 ; N lslash ; B 77 0 587 626 ; +C 248 ; WX 600 ; N oslash ; B 54 -24 638 463 ; +C 156 ; WX 600 ; N oe ; B 18 -15 662 454 ; +C 223 ; WX 600 ; N germandbls ; B 22 -15 629 626 ; +C 207 ; WX 600 ; N Idieresis ; B 77 0 643 761 ; +C 233 ; WX 600 ; N eacute ; B 81 -15 609 661 ; +C -1 ; WX 600 ; N abreve ; B 61 -15 658 661 ; +C -1 ; WX 600 ; N uhungarumlaut ; B 70 -15 769 661 ; +C -1 ; WX 600 ; N ecaron ; B 81 -15 633 667 ; +C 159 ; WX 600 ; N Ydieresis ; B 109 0 709 761 ; +C 247 ; WX 600 ; N divide ; B 114 16 596 500 ; +C 221 ; WX 600 ; N Yacute ; B 109 0 709 784 ; +C 194 ; WX 600 ; N Acircumflex ; B -9 0 632 780 ; +C 225 ; WX 600 ; N aacute ; B 61 -15 609 661 ; +C 219 ; WX 600 ; N Ucircumflex ; B 101 -18 716 780 ; +C 253 ; WX 600 ; N yacute ; B -21 -142 695 661 ; +C -1 ; WX 600 ; N scommaaccent ; B 66 -250 608 459 ; +C 234 ; WX 600 ; N ecircumflex ; B 81 -15 607 657 ; +C -1 ; WX 600 ; N Uring ; B 101 -18 716 801 ; +C 220 ; WX 600 ; N Udieresis ; B 101 -18 716 761 ; +C -1 ; WX 600 ; N aogonek ; B 61 -199 593 454 ; +C 218 ; WX 600 ; N Uacute ; B 101 -18 716 784 ; +C -1 ; WX 600 ; N uogonek ; B 70 -199 592 439 ; +C 203 ; WX 600 ; N Edieresis ; B 25 0 670 761 ; +C -1 ; WX 600 ; N Dcroat ; B 30 0 664 562 ; +C -1 ; WX 600 ; N commaaccent ; B 151 -250 385 -57 ; +C 169 ; WX 600 ; N copyright ; B 53 -18 667 580 ; +C -1 ; WX 600 ; N Emacron ; B 25 0 670 708 ; +C -1 ; WX 600 ; N ccaron ; B 81 -15 633 667 ; +C 229 ; WX 600 ; N aring ; B 61 -15 593 678 ; +C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 730 562 ; +C -1 ; WX 600 ; N lacute ; B 77 0 639 801 ; +C 224 ; WX 600 ; N agrave ; B 61 -15 593 661 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 86 -250 679 562 ; +C -1 ; WX 600 ; N Cacute ; B 74 -18 675 784 ; +C 227 ; WX 600 ; N atilde ; B 61 -15 643 636 ; +C -1 ; WX 600 ; N Edotaccent ; B 25 0 670 761 ; +C 154 ; WX 600 ; N scaron ; B 66 -17 633 667 ; +C -1 ; WX 600 ; N scedilla ; B 66 -206 608 459 ; +C 237 ; WX 600 ; N iacute ; B 77 0 609 661 ; +C -1 ; WX 600 ; N lozenge ; B 145 0 614 740 ; +C -1 ; WX 600 ; N Rcaron ; B 24 0 659 790 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 74 -250 675 580 ; +C 251 ; WX 600 ; N ucircumflex ; B 70 -15 597 657 ; +C 226 ; WX 600 ; N acircumflex ; B 61 -15 607 657 ; +C -1 ; WX 600 ; N Amacron ; B -9 0 633 708 ; +C -1 ; WX 600 ; N rcaron ; B 47 0 655 667 ; +C 231 ; WX 600 ; N ccedilla ; B 81 -206 631 459 ; +C -1 ; WX 600 ; N Zdotaccent ; B 62 0 637 761 ; +C 222 ; WX 600 ; N Thorn ; B 48 0 620 562 ; +C -1 ; WX 600 ; N Omacron ; B 74 -18 663 708 ; +C -1 ; WX 600 ; N Racute ; B 24 0 665 784 ; +C -1 ; WX 600 ; N Sacute ; B 54 -22 673 784 ; +C -1 ; WX 600 ; N dcaron ; B 60 -15 861 626 ; +C -1 ; WX 600 ; N Umacron ; B 101 -18 716 708 ; +C -1 ; WX 600 ; N uring ; B 70 -15 592 678 ; +C 179 ; WX 600 ; N threesuperior ; B 193 222 526 616 ; +C 210 ; WX 600 ; N Ograve ; B 74 -18 645 784 ; +C 192 ; WX 600 ; N Agrave ; B -9 0 632 784 ; +C -1 ; WX 600 ; N Abreve ; B -9 0 684 784 ; +C 215 ; WX 600 ; N multiply ; B 104 39 606 478 ; +C 250 ; WX 600 ; N uacute ; B 70 -15 599 661 ; +C -1 ; WX 600 ; N Tcaron ; B 86 0 679 790 ; +C -1 ; WX 600 ; N partialdiff ; B 91 -38 627 728 ; +C 255 ; WX 600 ; N ydieresis ; B -21 -142 695 638 ; +C -1 ; WX 600 ; N Nacute ; B 8 -12 730 784 ; +C 238 ; WX 600 ; N icircumflex ; B 77 0 577 657 ; +C 202 ; WX 600 ; N Ecircumflex ; B 25 0 670 780 ; +C 228 ; WX 600 ; N adieresis ; B 61 -15 595 638 ; +C 235 ; WX 600 ; N edieresis ; B 81 -15 605 638 ; +C -1 ; WX 600 ; N cacute ; B 81 -15 649 661 ; +C -1 ; WX 600 ; N nacute ; B 18 0 639 661 ; +C -1 ; WX 600 ; N umacron ; B 70 -15 637 585 ; +C -1 ; WX 600 ; N Ncaron ; B 8 -12 730 790 ; +C 205 ; WX 600 ; N Iacute ; B 77 0 643 784 ; +C 177 ; WX 600 ; N plusminus ; B 76 24 614 515 ; +C 166 ; WX 600 ; N brokenbar ; B 217 -175 489 675 ; +C 174 ; WX 600 ; N registered ; B 53 -18 667 580 ; +C -1 ; WX 600 ; N Gbreve ; B 74 -18 684 784 ; +C -1 ; WX 600 ; N Idotaccent ; B 77 0 643 761 ; +C -1 ; WX 600 ; N summation ; B 15 -10 672 706 ; +C 200 ; WX 600 ; N Egrave ; B 25 0 670 784 ; +C -1 ; WX 600 ; N racute ; B 47 0 655 661 ; +C -1 ; WX 600 ; N omacron ; B 71 -15 637 585 ; +C -1 ; WX 600 ; N Zacute ; B 62 0 665 784 ; +C 142 ; WX 600 ; N Zcaron ; B 62 0 659 790 ; +C -1 ; WX 600 ; N greaterequal ; B 26 0 627 696 ; +C 208 ; WX 600 ; N Eth ; B 30 0 664 562 ; +C 199 ; WX 600 ; N Ccedilla ; B 74 -206 675 580 ; +C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 546 626 ; +C -1 ; WX 600 ; N tcaron ; B 118 -15 627 703 ; +C -1 ; WX 600 ; N eogonek ; B 81 -199 605 454 ; +C -1 ; WX 600 ; N Uogonek ; B 101 -199 716 562 ; +C 193 ; WX 600 ; N Aacute ; B -9 0 655 784 ; +C 196 ; WX 600 ; N Adieresis ; B -9 0 632 761 ; +C 232 ; WX 600 ; N egrave ; B 81 -15 605 661 ; +C -1 ; WX 600 ; N zacute ; B 81 0 614 661 ; +C -1 ; WX 600 ; N iogonek ; B 77 -199 546 658 ; +C 211 ; WX 600 ; N Oacute ; B 74 -18 645 784 ; +C 243 ; WX 600 ; N oacute ; B 71 -15 649 661 ; +C -1 ; WX 600 ; N amacron ; B 61 -15 637 585 ; +C -1 ; WX 600 ; N sacute ; B 66 -17 609 661 ; +C 239 ; WX 600 ; N idieresis ; B 77 0 561 618 ; +C 212 ; WX 600 ; N Ocircumflex ; B 74 -18 645 780 ; +C 217 ; WX 600 ; N Ugrave ; B 101 -18 716 784 ; +C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ; +C 254 ; WX 600 ; N thorn ; B -32 -142 622 626 ; +C 178 ; WX 600 ; N twosuperior ; B 191 230 542 616 ; +C 214 ; WX 600 ; N Odieresis ; B 74 -18 645 761 ; +C 181 ; WX 600 ; N mu ; B 49 -142 592 439 ; +C 236 ; WX 600 ; N igrave ; B 77 0 546 661 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 71 -15 809 661 ; +C -1 ; WX 600 ; N Eogonek ; B 25 -199 670 562 ; +C -1 ; WX 600 ; N dcroat ; B 60 -15 712 626 ; +C 190 ; WX 600 ; N threequarters ; B 8 -60 699 661 ; +C -1 ; WX 600 ; N Scedilla ; B 54 -206 673 582 ; +C -1 ; WX 600 ; N lcaron ; B 77 0 731 626 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 692 562 ; +C -1 ; WX 600 ; N Lacute ; B 39 0 636 784 ; +C 153 ; WX 600 ; N trademark ; B 86 230 869 562 ; +C -1 ; WX 600 ; N edotaccent ; B 81 -15 605 638 ; +C 204 ; WX 600 ; N Igrave ; B 77 0 643 784 ; +C -1 ; WX 600 ; N Imacron ; B 77 0 663 708 ; +C -1 ; WX 600 ; N Lcaron ; B 39 0 757 562 ; +C 189 ; WX 600 ; N onehalf ; B 22 -60 716 661 ; +C -1 ; WX 600 ; N lessequal ; B 26 0 671 696 ; +C 244 ; WX 600 ; N ocircumflex ; B 71 -15 622 657 ; +C 241 ; WX 600 ; N ntilde ; B 18 0 643 636 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 101 -18 805 784 ; +C 201 ; WX 600 ; N Eacute ; B 25 0 670 784 ; +C -1 ; WX 600 ; N emacron ; B 81 -15 637 585 ; +C -1 ; WX 600 ; N gbreve ; B 40 -146 674 661 ; +C 188 ; WX 600 ; N onequarter ; B 13 -60 707 661 ; +C 138 ; WX 600 ; N Scaron ; B 54 -22 689 790 ; +C -1 ; WX 600 ; N Scommaaccent ; B 54 -250 673 582 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 74 -18 795 784 ; +C 176 ; WX 600 ; N degree ; B 173 243 570 616 ; +C 242 ; WX 600 ; N ograve ; B 71 -15 622 661 ; +C -1 ; WX 600 ; N Ccaron ; B 74 -18 689 790 ; +C 249 ; WX 600 ; N ugrave ; B 70 -15 592 661 ; +C -1 ; WX 600 ; N radical ; B 67 -104 635 778 ; +C -1 ; WX 600 ; N Dcaron ; B 30 0 664 790 ; +C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 655 454 ; +C 209 ; WX 600 ; N Ntilde ; B 8 -12 730 759 ; +C 245 ; WX 600 ; N otilde ; B 71 -15 643 636 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 617 562 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 636 562 ; +C 195 ; WX 600 ; N Atilde ; B -9 0 669 759 ; +C -1 ; WX 600 ; N Aogonek ; B -9 -199 632 562 ; +C 197 ; WX 600 ; N Aring ; B -9 0 632 801 ; +C 213 ; WX 600 ; N Otilde ; B 74 -18 669 759 ; +C -1 ; WX 600 ; N zdotaccent ; B 81 0 614 638 ; +C -1 ; WX 600 ; N Ecaron ; B 25 0 670 790 ; +C -1 ; WX 600 ; N Iogonek ; B 77 -199 643 562 ; +C -1 ; WX 600 ; N kcommaaccent ; B 33 -250 643 626 ; +C -1 ; WX 600 ; N minus ; B 114 203 596 313 ; +C 206 ; WX 600 ; N Icircumflex ; B 77 0 643 780 ; +C -1 ; WX 600 ; N ncaron ; B 18 0 633 667 ; +C -1 ; WX 600 ; N tcommaaccent ; B 118 -250 567 562 ; +C 172 ; WX 600 ; N logicalnot ; B 135 103 617 413 ; +C 246 ; WX 600 ; N odieresis ; B 71 -15 622 638 ; +C 252 ; WX 600 ; N udieresis ; B 70 -15 595 638 ; +C -1 ; WX 600 ; N notequal ; B 30 -47 626 563 ; +C -1 ; WX 600 ; N gcommaaccent ; B 40 -146 674 714 ; +C 240 ; WX 600 ; N eth ; B 93 -27 661 626 ; +C 158 ; WX 600 ; N zcaron ; B 81 0 643 667 ; +C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 615 454 ; +C 185 ; WX 600 ; N onesuperior ; B 212 230 514 616 ; +C -1 ; WX 600 ; N imacron ; B 77 0 575 585 ; +C 128 ; WX 600 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Courier-Oblique.afm b/application/third_party/dompdf/lib/fonts/Courier-Oblique.afm new file mode 100755 index 00000000..271aa192 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Courier-Oblique.afm @@ -0,0 +1,344 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 0:00:00 17:37:52 1997 +Comment UniqueID 43051 +Comment VMusage 16248 75829 +FontName Courier-Oblique +FullName Courier Oblique +FamilyName Courier +Weight Medium +ItalicAngle -12 +IsFixedPitch true +CharacterSet ExtendedRoman +FontBBox -27 -250 849 805 +UnderlinePosition -100 +UnderlineThickness 50 +Version 003.000 +Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +EncodingScheme WinAnsiEncoding +CapHeight 562 +XHeight 426 +Ascender 629 +Descender -157 +StdHW 51 +StdVW 51 +StartCharMetrics 317 +C 32 ; WX 600 ; N space ; B 0 0 0 0 ; +C 160 ; WX 600 ; N space ; B 0 0 0 0 ; +C 33 ; WX 600 ; N exclam ; B 243 -15 464 572 ; +C 34 ; WX 600 ; N quotedbl ; B 273 328 532 562 ; +C 35 ; WX 600 ; N numbersign ; B 133 -32 596 639 ; +C 36 ; WX 600 ; N dollar ; B 108 -126 596 662 ; +C 37 ; WX 600 ; N percent ; B 134 -15 599 622 ; +C 38 ; WX 600 ; N ampersand ; B 87 -15 580 543 ; +C 146 ; WX 600 ; N quoteright ; B 283 328 495 562 ; +C 40 ; WX 600 ; N parenleft ; B 313 -108 572 622 ; +C 41 ; WX 600 ; N parenright ; B 137 -108 396 622 ; +C 42 ; WX 600 ; N asterisk ; B 212 257 580 607 ; +C 43 ; WX 600 ; N plus ; B 129 44 580 470 ; +C 44 ; WX 600 ; N comma ; B 157 -112 370 122 ; +C 45 ; WX 600 ; N hyphen ; B 152 231 558 285 ; +C 173 ; WX 600 ; N hyphen ; B 152 231 558 285 ; +C 46 ; WX 600 ; N period ; B 238 -15 382 109 ; +C 47 ; WX 600 ; N slash ; B 112 -80 604 629 ; +C 48 ; WX 600 ; N zero ; B 154 -15 575 622 ; +C 49 ; WX 600 ; N one ; B 98 0 515 622 ; +C 50 ; WX 600 ; N two ; B 70 0 568 622 ; +C 51 ; WX 600 ; N three ; B 82 -15 538 622 ; +C 52 ; WX 600 ; N four ; B 108 0 541 622 ; +C 53 ; WX 600 ; N five ; B 99 -15 589 607 ; +C 54 ; WX 600 ; N six ; B 155 -15 629 622 ; +C 55 ; WX 600 ; N seven ; B 182 0 612 607 ; +C 56 ; WX 600 ; N eight ; B 132 -15 588 622 ; +C 57 ; WX 600 ; N nine ; B 93 -15 574 622 ; +C 58 ; WX 600 ; N colon ; B 238 -15 441 385 ; +C 59 ; WX 600 ; N semicolon ; B 157 -112 441 385 ; +C 60 ; WX 600 ; N less ; B 96 42 610 472 ; +C 61 ; WX 600 ; N equal ; B 109 138 600 376 ; +C 62 ; WX 600 ; N greater ; B 85 42 599 472 ; +C 63 ; WX 600 ; N question ; B 222 -15 583 572 ; +C 64 ; WX 600 ; N at ; B 127 -15 582 622 ; +C 65 ; WX 600 ; N A ; B 3 0 607 562 ; +C 66 ; WX 600 ; N B ; B 43 0 616 562 ; +C 67 ; WX 600 ; N C ; B 93 -18 655 580 ; +C 68 ; WX 600 ; N D ; B 43 0 645 562 ; +C 69 ; WX 600 ; N E ; B 53 0 660 562 ; +C 70 ; WX 600 ; N F ; B 53 0 660 562 ; +C 71 ; WX 600 ; N G ; B 83 -18 645 580 ; +C 72 ; WX 600 ; N H ; B 32 0 687 562 ; +C 73 ; WX 600 ; N I ; B 96 0 623 562 ; +C 74 ; WX 600 ; N J ; B 52 -18 685 562 ; +C 75 ; WX 600 ; N K ; B 38 0 671 562 ; +C 76 ; WX 600 ; N L ; B 47 0 607 562 ; +C 77 ; WX 600 ; N M ; B 4 0 715 562 ; +C 78 ; WX 600 ; N N ; B 7 -13 712 562 ; +C 79 ; WX 600 ; N O ; B 94 -18 625 580 ; +C 80 ; WX 600 ; N P ; B 79 0 644 562 ; +C 81 ; WX 600 ; N Q ; B 95 -138 625 580 ; +C 82 ; WX 600 ; N R ; B 38 0 598 562 ; +C 83 ; WX 600 ; N S ; B 76 -20 650 580 ; +C 84 ; WX 600 ; N T ; B 108 0 665 562 ; +C 85 ; WX 600 ; N U ; B 125 -18 702 562 ; +C 86 ; WX 600 ; N V ; B 105 -13 723 562 ; +C 87 ; WX 600 ; N W ; B 106 -13 722 562 ; +C 88 ; WX 600 ; N X ; B 23 0 675 562 ; +C 89 ; WX 600 ; N Y ; B 133 0 695 562 ; +C 90 ; WX 600 ; N Z ; B 86 0 610 562 ; +C 91 ; WX 600 ; N bracketleft ; B 246 -108 574 622 ; +C 92 ; WX 600 ; N backslash ; B 249 -80 468 629 ; +C 93 ; WX 600 ; N bracketright ; B 135 -108 463 622 ; +C 94 ; WX 600 ; N asciicircum ; B 175 354 587 622 ; +C 95 ; WX 600 ; N underscore ; B -27 -125 584 -75 ; +C 145 ; WX 600 ; N quoteleft ; B 343 328 457 562 ; +C 97 ; WX 600 ; N a ; B 76 -15 569 441 ; +C 98 ; WX 600 ; N b ; B 29 -15 625 629 ; +C 99 ; WX 600 ; N c ; B 106 -15 608 441 ; +C 100 ; WX 600 ; N d ; B 85 -15 640 629 ; +C 101 ; WX 600 ; N e ; B 106 -15 598 441 ; +C 102 ; WX 600 ; N f ; B 114 0 662 629 ; L i fi ; L l fl ; +C 103 ; WX 600 ; N g ; B 61 -157 657 441 ; +C 104 ; WX 600 ; N h ; B 33 0 592 629 ; +C 105 ; WX 600 ; N i ; B 95 0 515 657 ; +C 106 ; WX 600 ; N j ; B 52 -157 550 657 ; +C 107 ; WX 600 ; N k ; B 58 0 633 629 ; +C 108 ; WX 600 ; N l ; B 95 0 515 629 ; +C 109 ; WX 600 ; N m ; B -5 0 615 441 ; +C 110 ; WX 600 ; N n ; B 26 0 585 441 ; +C 111 ; WX 600 ; N o ; B 102 -15 588 441 ; +C 112 ; WX 600 ; N p ; B -24 -157 605 441 ; +C 113 ; WX 600 ; N q ; B 85 -157 682 441 ; +C 114 ; WX 600 ; N r ; B 60 0 636 441 ; +C 115 ; WX 600 ; N s ; B 78 -15 584 441 ; +C 116 ; WX 600 ; N t ; B 167 -15 561 561 ; +C 117 ; WX 600 ; N u ; B 101 -15 572 426 ; +C 118 ; WX 600 ; N v ; B 90 -10 681 426 ; +C 119 ; WX 600 ; N w ; B 76 -10 695 426 ; +C 120 ; WX 600 ; N x ; B 20 0 655 426 ; +C 121 ; WX 600 ; N y ; B -4 -157 683 426 ; +C 122 ; WX 600 ; N z ; B 99 0 593 426 ; +C 123 ; WX 600 ; N braceleft ; B 233 -108 569 622 ; +C 124 ; WX 600 ; N bar ; B 222 -250 485 750 ; +C 125 ; WX 600 ; N braceright ; B 140 -108 477 622 ; +C 126 ; WX 600 ; N asciitilde ; B 116 197 600 320 ; +C 161 ; WX 600 ; N exclamdown ; B 225 -157 445 430 ; +C 162 ; WX 600 ; N cent ; B 151 -49 588 614 ; +C 163 ; WX 600 ; N sterling ; B 124 -21 621 611 ; +C -1 ; WX 600 ; N fraction ; B 84 -57 646 665 ; +C 165 ; WX 600 ; N yen ; B 120 0 693 562 ; +C 131 ; WX 600 ; N florin ; B -26 -143 671 622 ; +C 167 ; WX 600 ; N section ; B 104 -78 590 580 ; +C 164 ; WX 600 ; N currency ; B 94 58 628 506 ; +C 39 ; WX 600 ; N quotesingle ; B 345 328 460 562 ; +C 147 ; WX 600 ; N quotedblleft ; B 262 328 541 562 ; +C 170 ; WX 600 ; N guillemotleft ; B 92 70 652 446 ; +C 139 ; WX 600 ; N guilsinglleft ; B 204 70 540 446 ; +C 155 ; WX 600 ; N guilsinglright ; B 170 70 506 446 ; +C -1 ; WX 600 ; N fi ; B 3 0 619 629 ; +C -1 ; WX 600 ; N fl ; B 3 0 619 629 ; +C 150 ; WX 600 ; N endash ; B 124 231 586 285 ; +C 134 ; WX 600 ; N dagger ; B 217 -78 546 580 ; +C 135 ; WX 600 ; N daggerdbl ; B 163 -78 546 580 ; +C 183 ; WX 600 ; N periodcentered ; B 275 189 434 327 ; +C 182 ; WX 600 ; N paragraph ; B 100 -78 630 562 ; +C 149 ; WX 600 ; N bullet ; B 224 130 485 383 ; +C 130 ; WX 600 ; N quotesinglbase ; B 185 -134 397 100 ; +C 132 ; WX 600 ; N quotedblbase ; B 115 -134 478 100 ; +C 148 ; WX 600 ; N quotedblright ; B 213 328 576 562 ; +C 187 ; WX 600 ; N guillemotright ; B 58 70 618 446 ; +C 133 ; WX 600 ; N ellipsis ; B 46 -15 575 111 ; +C 137 ; WX 600 ; N perthousand ; B 59 -15 627 622 ; +C 191 ; WX 600 ; N questiondown ; B 105 -157 466 430 ; +C 96 ; WX 600 ; N grave ; B 294 497 484 672 ; +C 180 ; WX 600 ; N acute ; B 348 497 612 672 ; +C 136 ; WX 600 ; N circumflex ; B 229 477 581 654 ; +C 152 ; WX 600 ; N tilde ; B 212 489 629 606 ; +C 175 ; WX 600 ; N macron ; B 232 525 600 565 ; +C -1 ; WX 600 ; N breve ; B 279 501 576 609 ; +C -1 ; WX 600 ; N dotaccent ; B 373 537 478 640 ; +C 168 ; WX 600 ; N dieresis ; B 272 537 579 640 ; +C -1 ; WX 600 ; N ring ; B 332 463 500 627 ; +C 184 ; WX 600 ; N cedilla ; B 197 -151 344 10 ; +C -1 ; WX 600 ; N hungarumlaut ; B 239 497 683 672 ; +C -1 ; WX 600 ; N ogonek ; B 189 -172 377 4 ; +C -1 ; WX 600 ; N caron ; B 262 492 614 669 ; +C 151 ; WX 600 ; N emdash ; B 49 231 661 285 ; +C 198 ; WX 600 ; N AE ; B 3 0 655 562 ; +C 170 ; WX 600 ; N ordfeminine ; B 209 249 512 580 ; +C -1 ; WX 600 ; N Lslash ; B 47 0 607 562 ; +C 216 ; WX 600 ; N Oslash ; B 94 -80 625 629 ; +C 140 ; WX 600 ; N OE ; B 59 0 672 562 ; +C 186 ; WX 600 ; N ordmasculine ; B 210 249 535 580 ; +C 230 ; WX 600 ; N ae ; B 41 -15 626 441 ; +C -1 ; WX 600 ; N dotlessi ; B 95 0 515 426 ; +C -1 ; WX 600 ; N lslash ; B 95 0 587 629 ; +C 248 ; WX 600 ; N oslash ; B 102 -80 588 506 ; +C 156 ; WX 600 ; N oe ; B 54 -15 615 441 ; +C 223 ; WX 600 ; N germandbls ; B 48 -15 617 629 ; +C 207 ; WX 600 ; N Idieresis ; B 96 0 623 753 ; +C 233 ; WX 600 ; N eacute ; B 106 -15 612 672 ; +C -1 ; WX 600 ; N abreve ; B 76 -15 576 609 ; +C -1 ; WX 600 ; N uhungarumlaut ; B 101 -15 723 672 ; +C -1 ; WX 600 ; N ecaron ; B 106 -15 614 669 ; +C 159 ; WX 600 ; N Ydieresis ; B 133 0 695 753 ; +C 247 ; WX 600 ; N divide ; B 136 48 573 467 ; +C 221 ; WX 600 ; N Yacute ; B 133 0 695 805 ; +C 194 ; WX 600 ; N Acircumflex ; B 3 0 607 787 ; +C 225 ; WX 600 ; N aacute ; B 76 -15 612 672 ; +C 219 ; WX 600 ; N Ucircumflex ; B 125 -18 702 787 ; +C 253 ; WX 600 ; N yacute ; B -4 -157 683 672 ; +C -1 ; WX 600 ; N scommaaccent ; B 78 -250 584 441 ; +C 234 ; WX 600 ; N ecircumflex ; B 106 -15 598 654 ; +C -1 ; WX 600 ; N Uring ; B 125 -18 702 760 ; +C 220 ; WX 600 ; N Udieresis ; B 125 -18 702 753 ; +C -1 ; WX 600 ; N aogonek ; B 76 -172 569 441 ; +C 218 ; WX 600 ; N Uacute ; B 125 -18 702 805 ; +C -1 ; WX 600 ; N uogonek ; B 101 -172 572 426 ; +C 203 ; WX 600 ; N Edieresis ; B 53 0 660 753 ; +C -1 ; WX 600 ; N Dcroat ; B 43 0 645 562 ; +C -1 ; WX 600 ; N commaaccent ; B 145 -250 323 -58 ; +C 169 ; WX 600 ; N copyright ; B 53 -18 667 580 ; +C -1 ; WX 600 ; N Emacron ; B 53 0 660 698 ; +C -1 ; WX 600 ; N ccaron ; B 106 -15 614 669 ; +C 229 ; WX 600 ; N aring ; B 76 -15 569 627 ; +C -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 712 562 ; +C -1 ; WX 600 ; N lacute ; B 95 0 640 805 ; +C 224 ; WX 600 ; N agrave ; B 76 -15 569 672 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 108 -250 665 562 ; +C -1 ; WX 600 ; N Cacute ; B 93 -18 655 805 ; +C 227 ; WX 600 ; N atilde ; B 76 -15 629 606 ; +C -1 ; WX 600 ; N Edotaccent ; B 53 0 660 753 ; +C 154 ; WX 600 ; N scaron ; B 78 -15 614 669 ; +C -1 ; WX 600 ; N scedilla ; B 78 -151 584 441 ; +C 237 ; WX 600 ; N iacute ; B 95 0 612 672 ; +C -1 ; WX 600 ; N lozenge ; B 94 0 519 706 ; +C -1 ; WX 600 ; N Rcaron ; B 38 0 642 802 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 83 -250 645 580 ; +C 251 ; WX 600 ; N ucircumflex ; B 101 -15 572 654 ; +C 226 ; WX 600 ; N acircumflex ; B 76 -15 581 654 ; +C -1 ; WX 600 ; N Amacron ; B 3 0 607 698 ; +C -1 ; WX 600 ; N rcaron ; B 60 0 636 669 ; +C 231 ; WX 600 ; N ccedilla ; B 106 -151 614 441 ; +C -1 ; WX 600 ; N Zdotaccent ; B 86 0 610 753 ; +C 222 ; WX 600 ; N Thorn ; B 79 0 606 562 ; +C -1 ; WX 600 ; N Omacron ; B 94 -18 628 698 ; +C -1 ; WX 600 ; N Racute ; B 38 0 670 805 ; +C -1 ; WX 600 ; N Sacute ; B 76 -20 650 805 ; +C -1 ; WX 600 ; N dcaron ; B 85 -15 849 629 ; +C -1 ; WX 600 ; N Umacron ; B 125 -18 702 698 ; +C -1 ; WX 600 ; N uring ; B 101 -15 572 627 ; +C 179 ; WX 600 ; N threesuperior ; B 213 240 501 622 ; +C 210 ; WX 600 ; N Ograve ; B 94 -18 625 805 ; +C 192 ; WX 600 ; N Agrave ; B 3 0 607 805 ; +C -1 ; WX 600 ; N Abreve ; B 3 0 607 732 ; +C 215 ; WX 600 ; N multiply ; B 103 43 607 470 ; +C 250 ; WX 600 ; N uacute ; B 101 -15 602 672 ; +C -1 ; WX 600 ; N Tcaron ; B 108 0 665 802 ; +C -1 ; WX 600 ; N partialdiff ; B 45 -38 546 710 ; +C 255 ; WX 600 ; N ydieresis ; B -4 -157 683 620 ; +C -1 ; WX 600 ; N Nacute ; B 7 -13 712 805 ; +C 238 ; WX 600 ; N icircumflex ; B 95 0 551 654 ; +C 202 ; WX 600 ; N Ecircumflex ; B 53 0 660 787 ; +C 228 ; WX 600 ; N adieresis ; B 76 -15 575 620 ; +C 235 ; WX 600 ; N edieresis ; B 106 -15 598 620 ; +C -1 ; WX 600 ; N cacute ; B 106 -15 612 672 ; +C -1 ; WX 600 ; N nacute ; B 26 0 602 672 ; +C -1 ; WX 600 ; N umacron ; B 101 -15 600 565 ; +C -1 ; WX 600 ; N Ncaron ; B 7 -13 712 802 ; +C 205 ; WX 600 ; N Iacute ; B 96 0 640 805 ; +C 177 ; WX 600 ; N plusminus ; B 96 44 594 558 ; +C 166 ; WX 600 ; N brokenbar ; B 238 -175 469 675 ; +C 174 ; WX 600 ; N registered ; B 53 -18 667 580 ; +C -1 ; WX 600 ; N Gbreve ; B 83 -18 645 732 ; +C -1 ; WX 600 ; N Idotaccent ; B 96 0 623 753 ; +C -1 ; WX 600 ; N summation ; B 15 -10 670 706 ; +C 200 ; WX 600 ; N Egrave ; B 53 0 660 805 ; +C -1 ; WX 600 ; N racute ; B 60 0 636 672 ; +C -1 ; WX 600 ; N omacron ; B 102 -15 600 565 ; +C -1 ; WX 600 ; N Zacute ; B 86 0 670 805 ; +C 142 ; WX 600 ; N Zcaron ; B 86 0 642 802 ; +C -1 ; WX 600 ; N greaterequal ; B 98 0 594 710 ; +C 208 ; WX 600 ; N Eth ; B 43 0 645 562 ; +C 199 ; WX 600 ; N Ccedilla ; B 93 -151 658 580 ; +C -1 ; WX 600 ; N lcommaaccent ; B 95 -250 515 629 ; +C -1 ; WX 600 ; N tcaron ; B 167 -15 587 717 ; +C -1 ; WX 600 ; N eogonek ; B 106 -172 598 441 ; +C -1 ; WX 600 ; N Uogonek ; B 124 -172 702 562 ; +C 193 ; WX 600 ; N Aacute ; B 3 0 660 805 ; +C 196 ; WX 600 ; N Adieresis ; B 3 0 607 753 ; +C 232 ; WX 600 ; N egrave ; B 106 -15 598 672 ; +C -1 ; WX 600 ; N zacute ; B 99 0 612 672 ; +C -1 ; WX 600 ; N iogonek ; B 95 -172 515 657 ; +C 211 ; WX 600 ; N Oacute ; B 94 -18 640 805 ; +C 243 ; WX 600 ; N oacute ; B 102 -15 612 672 ; +C -1 ; WX 600 ; N amacron ; B 76 -15 600 565 ; +C -1 ; WX 600 ; N sacute ; B 78 -15 612 672 ; +C 239 ; WX 600 ; N idieresis ; B 95 0 545 620 ; +C 212 ; WX 600 ; N Ocircumflex ; B 94 -18 625 787 ; +C 217 ; WX 600 ; N Ugrave ; B 125 -18 702 805 ; +C -1 ; WX 600 ; N Delta ; B 6 0 598 688 ; +C 254 ; WX 600 ; N thorn ; B -24 -157 605 629 ; +C 178 ; WX 600 ; N twosuperior ; B 230 249 535 622 ; +C 214 ; WX 600 ; N Odieresis ; B 94 -18 625 753 ; +C 181 ; WX 600 ; N mu ; B 72 -157 572 426 ; +C 236 ; WX 600 ; N igrave ; B 95 0 515 672 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 102 -15 723 672 ; +C -1 ; WX 600 ; N Eogonek ; B 53 -172 660 562 ; +C -1 ; WX 600 ; N dcroat ; B 85 -15 704 629 ; +C 190 ; WX 600 ; N threequarters ; B 73 -56 659 666 ; +C -1 ; WX 600 ; N Scedilla ; B 76 -151 650 580 ; +C -1 ; WX 600 ; N lcaron ; B 95 0 667 629 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 671 562 ; +C -1 ; WX 600 ; N Lacute ; B 47 0 607 805 ; +C 153 ; WX 600 ; N trademark ; B 75 263 742 562 ; +C -1 ; WX 600 ; N edotaccent ; B 106 -15 598 620 ; +C 204 ; WX 600 ; N Igrave ; B 96 0 623 805 ; +C -1 ; WX 600 ; N Imacron ; B 96 0 628 698 ; +C -1 ; WX 600 ; N Lcaron ; B 47 0 632 562 ; +C 189 ; WX 600 ; N onehalf ; B 65 -57 669 665 ; +C -1 ; WX 600 ; N lessequal ; B 98 0 645 710 ; +C 244 ; WX 600 ; N ocircumflex ; B 102 -15 588 654 ; +C 241 ; WX 600 ; N ntilde ; B 26 0 629 606 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 125 -18 761 805 ; +C 201 ; WX 600 ; N Eacute ; B 53 0 670 805 ; +C -1 ; WX 600 ; N emacron ; B 106 -15 600 565 ; +C -1 ; WX 600 ; N gbreve ; B 61 -157 657 609 ; +C 188 ; WX 600 ; N onequarter ; B 65 -57 674 665 ; +C 138 ; WX 600 ; N Scaron ; B 76 -20 672 802 ; +C -1 ; WX 600 ; N Scommaaccent ; B 76 -250 650 580 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 94 -18 751 805 ; +C 176 ; WX 600 ; N degree ; B 214 269 576 622 ; +C 242 ; WX 600 ; N ograve ; B 102 -15 588 672 ; +C -1 ; WX 600 ; N Ccaron ; B 93 -18 672 802 ; +C 249 ; WX 600 ; N ugrave ; B 101 -15 572 672 ; +C -1 ; WX 600 ; N radical ; B 85 -15 765 792 ; +C -1 ; WX 600 ; N Dcaron ; B 43 0 645 802 ; +C -1 ; WX 600 ; N rcommaaccent ; B 60 -250 636 441 ; +C 209 ; WX 600 ; N Ntilde ; B 7 -13 712 729 ; +C 245 ; WX 600 ; N otilde ; B 102 -15 629 606 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 598 562 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 607 562 ; +C 195 ; WX 600 ; N Atilde ; B 3 0 655 729 ; +C -1 ; WX 600 ; N Aogonek ; B 3 -172 607 562 ; +C 197 ; WX 600 ; N Aring ; B 3 0 607 750 ; +C 213 ; WX 600 ; N Otilde ; B 94 -18 655 729 ; +C -1 ; WX 600 ; N zdotaccent ; B 99 0 593 620 ; +C -1 ; WX 600 ; N Ecaron ; B 53 0 660 802 ; +C -1 ; WX 600 ; N Iogonek ; B 96 -172 623 562 ; +C -1 ; WX 600 ; N kcommaaccent ; B 58 -250 633 629 ; +C -1 ; WX 600 ; N minus ; B 129 232 580 283 ; +C 206 ; WX 600 ; N Icircumflex ; B 96 0 623 787 ; +C -1 ; WX 600 ; N ncaron ; B 26 0 614 669 ; +C -1 ; WX 600 ; N tcommaaccent ; B 165 -250 561 561 ; +C 172 ; WX 600 ; N logicalnot ; B 155 108 591 369 ; +C 246 ; WX 600 ; N odieresis ; B 102 -15 588 620 ; +C 252 ; WX 600 ; N udieresis ; B 101 -15 575 620 ; +C -1 ; WX 600 ; N notequal ; B 43 -16 621 529 ; +C -1 ; WX 600 ; N gcommaaccent ; B 61 -157 657 708 ; +C 240 ; WX 600 ; N eth ; B 102 -15 639 629 ; +C 158 ; WX 600 ; N zcaron ; B 99 0 624 669 ; +C -1 ; WX 600 ; N ncommaaccent ; B 26 -250 585 441 ; +C 185 ; WX 600 ; N onesuperior ; B 231 249 491 622 ; +C -1 ; WX 600 ; N imacron ; B 95 0 543 565 ; +C 128 ; WX 600 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Courier.afm b/application/third_party/dompdf/lib/fonts/Courier.afm new file mode 100755 index 00000000..530d5f8f --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Courier.afm @@ -0,0 +1,344 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 17:27:09 1997 +Comment UniqueID 43050 +Comment VMusage 39754 50779 +FontName Courier +FullName Courier +FamilyName Courier +Weight Medium +ItalicAngle 0 +IsFixedPitch true +CharacterSet ExtendedRoman +FontBBox -23 -250 715 805 +UnderlinePosition -100 +UnderlineThickness 50 +Version 003.000 +Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +EncodingScheme WinAnsiEncoding +CapHeight 562 +XHeight 426 +Ascender 629 +Descender -157 +StdHW 51 +StdVW 51 +StartCharMetrics 317 +C 32 ; WX 600 ; N space ; B 0 0 0 0 ; +C 160 ; WX 600 ; N space ; B 0 0 0 0 ; +C 33 ; WX 600 ; N exclam ; B 236 -15 364 572 ; +C 34 ; WX 600 ; N quotedbl ; B 187 328 413 562 ; +C 35 ; WX 600 ; N numbersign ; B 93 -32 507 639 ; +C 36 ; WX 600 ; N dollar ; B 105 -126 496 662 ; +C 37 ; WX 600 ; N percent ; B 81 -15 518 622 ; +C 38 ; WX 600 ; N ampersand ; B 63 -15 538 543 ; +C 146 ; WX 600 ; N quoteright ; B 213 328 376 562 ; +C 40 ; WX 600 ; N parenleft ; B 269 -108 440 622 ; +C 41 ; WX 600 ; N parenright ; B 160 -108 331 622 ; +C 42 ; WX 600 ; N asterisk ; B 116 257 484 607 ; +C 43 ; WX 600 ; N plus ; B 80 44 520 470 ; +C 44 ; WX 600 ; N comma ; B 181 -112 344 122 ; +C 45 ; WX 600 ; N hyphen ; B 103 231 497 285 ; +C 173 ; WX 600 ; N hyphen ; B 103 231 497 285 ; +C 46 ; WX 600 ; N period ; B 229 -15 371 109 ; +C 47 ; WX 600 ; N slash ; B 125 -80 475 629 ; +C 48 ; WX 600 ; N zero ; B 106 -15 494 622 ; +C 49 ; WX 600 ; N one ; B 96 0 505 622 ; +C 50 ; WX 600 ; N two ; B 70 0 471 622 ; +C 51 ; WX 600 ; N three ; B 75 -15 466 622 ; +C 52 ; WX 600 ; N four ; B 78 0 500 622 ; +C 53 ; WX 600 ; N five ; B 92 -15 497 607 ; +C 54 ; WX 600 ; N six ; B 111 -15 497 622 ; +C 55 ; WX 600 ; N seven ; B 82 0 483 607 ; +C 56 ; WX 600 ; N eight ; B 102 -15 498 622 ; +C 57 ; WX 600 ; N nine ; B 96 -15 489 622 ; +C 58 ; WX 600 ; N colon ; B 229 -15 371 385 ; +C 59 ; WX 600 ; N semicolon ; B 181 -112 371 385 ; +C 60 ; WX 600 ; N less ; B 41 42 519 472 ; +C 61 ; WX 600 ; N equal ; B 80 138 520 376 ; +C 62 ; WX 600 ; N greater ; B 66 42 544 472 ; +C 63 ; WX 600 ; N question ; B 129 -15 492 572 ; +C 64 ; WX 600 ; N at ; B 77 -15 533 622 ; +C 65 ; WX 600 ; N A ; B 3 0 597 562 ; +C 66 ; WX 600 ; N B ; B 43 0 559 562 ; +C 67 ; WX 600 ; N C ; B 41 -18 540 580 ; +C 68 ; WX 600 ; N D ; B 43 0 574 562 ; +C 69 ; WX 600 ; N E ; B 53 0 550 562 ; +C 70 ; WX 600 ; N F ; B 53 0 545 562 ; +C 71 ; WX 600 ; N G ; B 31 -18 575 580 ; +C 72 ; WX 600 ; N H ; B 32 0 568 562 ; +C 73 ; WX 600 ; N I ; B 96 0 504 562 ; +C 74 ; WX 600 ; N J ; B 34 -18 566 562 ; +C 75 ; WX 600 ; N K ; B 38 0 582 562 ; +C 76 ; WX 600 ; N L ; B 47 0 554 562 ; +C 77 ; WX 600 ; N M ; B 4 0 596 562 ; +C 78 ; WX 600 ; N N ; B 7 -13 593 562 ; +C 79 ; WX 600 ; N O ; B 43 -18 557 580 ; +C 80 ; WX 600 ; N P ; B 79 0 558 562 ; +C 81 ; WX 600 ; N Q ; B 43 -138 557 580 ; +C 82 ; WX 600 ; N R ; B 38 0 588 562 ; +C 83 ; WX 600 ; N S ; B 72 -20 529 580 ; +C 84 ; WX 600 ; N T ; B 38 0 563 562 ; +C 85 ; WX 600 ; N U ; B 17 -18 583 562 ; +C 86 ; WX 600 ; N V ; B -4 -13 604 562 ; +C 87 ; WX 600 ; N W ; B -3 -13 603 562 ; +C 88 ; WX 600 ; N X ; B 23 0 577 562 ; +C 89 ; WX 600 ; N Y ; B 24 0 576 562 ; +C 90 ; WX 600 ; N Z ; B 86 0 514 562 ; +C 91 ; WX 600 ; N bracketleft ; B 269 -108 442 622 ; +C 92 ; WX 600 ; N backslash ; B 118 -80 482 629 ; +C 93 ; WX 600 ; N bracketright ; B 158 -108 331 622 ; +C 94 ; WX 600 ; N asciicircum ; B 94 354 506 622 ; +C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ; +C 145 ; WX 600 ; N quoteleft ; B 224 328 387 562 ; +C 97 ; WX 600 ; N a ; B 53 -15 559 441 ; +C 98 ; WX 600 ; N b ; B 14 -15 575 629 ; +C 99 ; WX 600 ; N c ; B 66 -15 529 441 ; +C 100 ; WX 600 ; N d ; B 45 -15 591 629 ; +C 101 ; WX 600 ; N e ; B 66 -15 548 441 ; +C 102 ; WX 600 ; N f ; B 114 0 531 629 ; L i fi ; L l fl ; +C 103 ; WX 600 ; N g ; B 45 -157 566 441 ; +C 104 ; WX 600 ; N h ; B 18 0 582 629 ; +C 105 ; WX 600 ; N i ; B 95 0 505 657 ; +C 106 ; WX 600 ; N j ; B 82 -157 410 657 ; +C 107 ; WX 600 ; N k ; B 43 0 580 629 ; +C 108 ; WX 600 ; N l ; B 95 0 505 629 ; +C 109 ; WX 600 ; N m ; B -5 0 605 441 ; +C 110 ; WX 600 ; N n ; B 26 0 575 441 ; +C 111 ; WX 600 ; N o ; B 62 -15 538 441 ; +C 112 ; WX 600 ; N p ; B 9 -157 555 441 ; +C 113 ; WX 600 ; N q ; B 45 -157 591 441 ; +C 114 ; WX 600 ; N r ; B 60 0 559 441 ; +C 115 ; WX 600 ; N s ; B 80 -15 513 441 ; +C 116 ; WX 600 ; N t ; B 87 -15 530 561 ; +C 117 ; WX 600 ; N u ; B 21 -15 562 426 ; +C 118 ; WX 600 ; N v ; B 10 -10 590 426 ; +C 119 ; WX 600 ; N w ; B -4 -10 604 426 ; +C 120 ; WX 600 ; N x ; B 20 0 580 426 ; +C 121 ; WX 600 ; N y ; B 7 -157 592 426 ; +C 122 ; WX 600 ; N z ; B 99 0 502 426 ; +C 123 ; WX 600 ; N braceleft ; B 182 -108 437 622 ; +C 124 ; WX 600 ; N bar ; B 275 -250 326 750 ; +C 125 ; WX 600 ; N braceright ; B 163 -108 418 622 ; +C 126 ; WX 600 ; N asciitilde ; B 63 197 540 320 ; +C 161 ; WX 600 ; N exclamdown ; B 236 -157 364 430 ; +C 162 ; WX 600 ; N cent ; B 96 -49 500 614 ; +C 163 ; WX 600 ; N sterling ; B 84 -21 521 611 ; +C -1 ; WX 600 ; N fraction ; B 92 -57 509 665 ; +C 165 ; WX 600 ; N yen ; B 26 0 574 562 ; +C 131 ; WX 600 ; N florin ; B 4 -143 539 622 ; +C 167 ; WX 600 ; N section ; B 113 -78 488 580 ; +C 164 ; WX 600 ; N currency ; B 73 58 527 506 ; +C 39 ; WX 600 ; N quotesingle ; B 259 328 341 562 ; +C 147 ; WX 600 ; N quotedblleft ; B 143 328 471 562 ; +C 170 ; WX 600 ; N guillemotleft ; B 37 70 563 446 ; +C 139 ; WX 600 ; N guilsinglleft ; B 149 70 451 446 ; +C 155 ; WX 600 ; N guilsinglright ; B 149 70 451 446 ; +C -1 ; WX 600 ; N fi ; B 3 0 597 629 ; +C -1 ; WX 600 ; N fl ; B 3 0 597 629 ; +C 150 ; WX 600 ; N endash ; B 75 231 525 285 ; +C 134 ; WX 600 ; N dagger ; B 141 -78 459 580 ; +C 135 ; WX 600 ; N daggerdbl ; B 141 -78 459 580 ; +C 183 ; WX 600 ; N periodcentered ; B 222 189 378 327 ; +C 182 ; WX 600 ; N paragraph ; B 50 -78 511 562 ; +C 149 ; WX 600 ; N bullet ; B 172 130 428 383 ; +C 130 ; WX 600 ; N quotesinglbase ; B 213 -134 376 100 ; +C 132 ; WX 600 ; N quotedblbase ; B 143 -134 457 100 ; +C 148 ; WX 600 ; N quotedblright ; B 143 328 457 562 ; +C 187 ; WX 600 ; N guillemotright ; B 37 70 563 446 ; +C 133 ; WX 600 ; N ellipsis ; B 37 -15 563 111 ; +C 137 ; WX 600 ; N perthousand ; B 3 -15 600 622 ; +C 191 ; WX 600 ; N questiondown ; B 108 -157 471 430 ; +C 96 ; WX 600 ; N grave ; B 151 497 378 672 ; +C 180 ; WX 600 ; N acute ; B 242 497 469 672 ; +C 136 ; WX 600 ; N circumflex ; B 124 477 476 654 ; +C 152 ; WX 600 ; N tilde ; B 105 489 503 606 ; +C 175 ; WX 600 ; N macron ; B 120 525 480 565 ; +C -1 ; WX 600 ; N breve ; B 153 501 447 609 ; +C -1 ; WX 600 ; N dotaccent ; B 249 537 352 640 ; +C 168 ; WX 600 ; N dieresis ; B 148 537 453 640 ; +C -1 ; WX 600 ; N ring ; B 218 463 382 627 ; +C 184 ; WX 600 ; N cedilla ; B 224 -151 362 10 ; +C -1 ; WX 600 ; N hungarumlaut ; B 133 497 540 672 ; +C -1 ; WX 600 ; N ogonek ; B 211 -172 407 4 ; +C -1 ; WX 600 ; N caron ; B 124 492 476 669 ; +C 151 ; WX 600 ; N emdash ; B 0 231 600 285 ; +C 198 ; WX 600 ; N AE ; B 3 0 550 562 ; +C 170 ; WX 600 ; N ordfeminine ; B 156 249 442 580 ; +C -1 ; WX 600 ; N Lslash ; B 47 0 554 562 ; +C 216 ; WX 600 ; N Oslash ; B 43 -80 557 629 ; +C 140 ; WX 600 ; N OE ; B 7 0 567 562 ; +C 186 ; WX 600 ; N ordmasculine ; B 157 249 443 580 ; +C 230 ; WX 600 ; N ae ; B 19 -15 570 441 ; +C -1 ; WX 600 ; N dotlessi ; B 95 0 505 426 ; +C -1 ; WX 600 ; N lslash ; B 95 0 505 629 ; +C 248 ; WX 600 ; N oslash ; B 62 -80 538 506 ; +C 156 ; WX 600 ; N oe ; B 19 -15 559 441 ; +C 223 ; WX 600 ; N germandbls ; B 48 -15 588 629 ; +C 207 ; WX 600 ; N Idieresis ; B 96 0 504 753 ; +C 233 ; WX 600 ; N eacute ; B 66 -15 548 672 ; +C -1 ; WX 600 ; N abreve ; B 53 -15 559 609 ; +C -1 ; WX 600 ; N uhungarumlaut ; B 21 -15 580 672 ; +C -1 ; WX 600 ; N ecaron ; B 66 -15 548 669 ; +C 159 ; WX 600 ; N Ydieresis ; B 24 0 576 753 ; +C 247 ; WX 600 ; N divide ; B 87 48 513 467 ; +C 221 ; WX 600 ; N Yacute ; B 24 0 576 805 ; +C 194 ; WX 600 ; N Acircumflex ; B 3 0 597 787 ; +C 225 ; WX 600 ; N aacute ; B 53 -15 559 672 ; +C 219 ; WX 600 ; N Ucircumflex ; B 17 -18 583 787 ; +C 253 ; WX 600 ; N yacute ; B 7 -157 592 672 ; +C -1 ; WX 600 ; N scommaaccent ; B 80 -250 513 441 ; +C 234 ; WX 600 ; N ecircumflex ; B 66 -15 548 654 ; +C -1 ; WX 600 ; N Uring ; B 17 -18 583 760 ; +C 220 ; WX 600 ; N Udieresis ; B 17 -18 583 753 ; +C -1 ; WX 600 ; N aogonek ; B 53 -172 587 441 ; +C 218 ; WX 600 ; N Uacute ; B 17 -18 583 805 ; +C -1 ; WX 600 ; N uogonek ; B 21 -172 590 426 ; +C 203 ; WX 600 ; N Edieresis ; B 53 0 550 753 ; +C -1 ; WX 600 ; N Dcroat ; B 30 0 574 562 ; +C -1 ; WX 600 ; N commaaccent ; B 198 -250 335 -58 ; +C 169 ; WX 600 ; N copyright ; B 0 -18 600 580 ; +C -1 ; WX 600 ; N Emacron ; B 53 0 550 698 ; +C -1 ; WX 600 ; N ccaron ; B 66 -15 529 669 ; +C 229 ; WX 600 ; N aring ; B 53 -15 559 627 ; +C -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 593 562 ; +C -1 ; WX 600 ; N lacute ; B 95 0 505 805 ; +C 224 ; WX 600 ; N agrave ; B 53 -15 559 672 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 38 -250 563 562 ; +C -1 ; WX 600 ; N Cacute ; B 41 -18 540 805 ; +C 227 ; WX 600 ; N atilde ; B 53 -15 559 606 ; +C -1 ; WX 600 ; N Edotaccent ; B 53 0 550 753 ; +C 154 ; WX 600 ; N scaron ; B 80 -15 513 669 ; +C -1 ; WX 600 ; N scedilla ; B 80 -151 513 441 ; +C 237 ; WX 600 ; N iacute ; B 95 0 505 672 ; +C -1 ; WX 600 ; N lozenge ; B 18 0 443 706 ; +C -1 ; WX 600 ; N Rcaron ; B 38 0 588 802 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 31 -250 575 580 ; +C 251 ; WX 600 ; N ucircumflex ; B 21 -15 562 654 ; +C 226 ; WX 600 ; N acircumflex ; B 53 -15 559 654 ; +C -1 ; WX 600 ; N Amacron ; B 3 0 597 698 ; +C -1 ; WX 600 ; N rcaron ; B 60 0 559 669 ; +C 231 ; WX 600 ; N ccedilla ; B 66 -151 529 441 ; +C -1 ; WX 600 ; N Zdotaccent ; B 86 0 514 753 ; +C 222 ; WX 600 ; N Thorn ; B 79 0 538 562 ; +C -1 ; WX 600 ; N Omacron ; B 43 -18 557 698 ; +C -1 ; WX 600 ; N Racute ; B 38 0 588 805 ; +C -1 ; WX 600 ; N Sacute ; B 72 -20 529 805 ; +C -1 ; WX 600 ; N dcaron ; B 45 -15 715 629 ; +C -1 ; WX 600 ; N Umacron ; B 17 -18 583 698 ; +C -1 ; WX 600 ; N uring ; B 21 -15 562 627 ; +C 179 ; WX 600 ; N threesuperior ; B 155 240 406 622 ; +C 210 ; WX 600 ; N Ograve ; B 43 -18 557 805 ; +C 192 ; WX 600 ; N Agrave ; B 3 0 597 805 ; +C -1 ; WX 600 ; N Abreve ; B 3 0 597 732 ; +C 215 ; WX 600 ; N multiply ; B 87 43 515 470 ; +C 250 ; WX 600 ; N uacute ; B 21 -15 562 672 ; +C -1 ; WX 600 ; N Tcaron ; B 38 0 563 802 ; +C -1 ; WX 600 ; N partialdiff ; B 17 -38 459 710 ; +C 255 ; WX 600 ; N ydieresis ; B 7 -157 592 620 ; +C -1 ; WX 600 ; N Nacute ; B 7 -13 593 805 ; +C 238 ; WX 600 ; N icircumflex ; B 94 0 505 654 ; +C 202 ; WX 600 ; N Ecircumflex ; B 53 0 550 787 ; +C 228 ; WX 600 ; N adieresis ; B 53 -15 559 620 ; +C 235 ; WX 600 ; N edieresis ; B 66 -15 548 620 ; +C -1 ; WX 600 ; N cacute ; B 66 -15 529 672 ; +C -1 ; WX 600 ; N nacute ; B 26 0 575 672 ; +C -1 ; WX 600 ; N umacron ; B 21 -15 562 565 ; +C -1 ; WX 600 ; N Ncaron ; B 7 -13 593 802 ; +C 205 ; WX 600 ; N Iacute ; B 96 0 504 805 ; +C 177 ; WX 600 ; N plusminus ; B 87 44 513 558 ; +C 166 ; WX 600 ; N brokenbar ; B 275 -175 326 675 ; +C 174 ; WX 600 ; N registered ; B 0 -18 600 580 ; +C -1 ; WX 600 ; N Gbreve ; B 31 -18 575 732 ; +C -1 ; WX 600 ; N Idotaccent ; B 96 0 504 753 ; +C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ; +C 200 ; WX 600 ; N Egrave ; B 53 0 550 805 ; +C -1 ; WX 600 ; N racute ; B 60 0 559 672 ; +C -1 ; WX 600 ; N omacron ; B 62 -15 538 565 ; +C -1 ; WX 600 ; N Zacute ; B 86 0 514 805 ; +C 142 ; WX 600 ; N Zcaron ; B 86 0 514 802 ; +C -1 ; WX 600 ; N greaterequal ; B 98 0 502 710 ; +C 208 ; WX 600 ; N Eth ; B 30 0 574 562 ; +C 199 ; WX 600 ; N Ccedilla ; B 41 -151 540 580 ; +C -1 ; WX 600 ; N lcommaaccent ; B 95 -250 505 629 ; +C -1 ; WX 600 ; N tcaron ; B 87 -15 530 717 ; +C -1 ; WX 600 ; N eogonek ; B 66 -172 548 441 ; +C -1 ; WX 600 ; N Uogonek ; B 17 -172 583 562 ; +C 193 ; WX 600 ; N Aacute ; B 3 0 597 805 ; +C 196 ; WX 600 ; N Adieresis ; B 3 0 597 753 ; +C 232 ; WX 600 ; N egrave ; B 66 -15 548 672 ; +C -1 ; WX 600 ; N zacute ; B 99 0 502 672 ; +C -1 ; WX 600 ; N iogonek ; B 95 -172 505 657 ; +C 211 ; WX 600 ; N Oacute ; B 43 -18 557 805 ; +C 243 ; WX 600 ; N oacute ; B 62 -15 538 672 ; +C -1 ; WX 600 ; N amacron ; B 53 -15 559 565 ; +C -1 ; WX 600 ; N sacute ; B 80 -15 513 672 ; +C 239 ; WX 600 ; N idieresis ; B 95 0 505 620 ; +C 212 ; WX 600 ; N Ocircumflex ; B 43 -18 557 787 ; +C 217 ; WX 600 ; N Ugrave ; B 17 -18 583 805 ; +C -1 ; WX 600 ; N Delta ; B 6 0 598 688 ; +C 254 ; WX 600 ; N thorn ; B -6 -157 555 629 ; +C 178 ; WX 600 ; N twosuperior ; B 177 249 424 622 ; +C 214 ; WX 600 ; N Odieresis ; B 43 -18 557 753 ; +C 181 ; WX 600 ; N mu ; B 21 -157 562 426 ; +C 236 ; WX 600 ; N igrave ; B 95 0 505 672 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 62 -15 580 672 ; +C -1 ; WX 600 ; N Eogonek ; B 53 -172 561 562 ; +C -1 ; WX 600 ; N dcroat ; B 45 -15 591 629 ; +C 190 ; WX 600 ; N threequarters ; B 8 -56 593 666 ; +C -1 ; WX 600 ; N Scedilla ; B 72 -151 529 580 ; +C -1 ; WX 600 ; N lcaron ; B 95 0 533 629 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 582 562 ; +C -1 ; WX 600 ; N Lacute ; B 47 0 554 805 ; +C 153 ; WX 600 ; N trademark ; B -23 263 623 562 ; +C -1 ; WX 600 ; N edotaccent ; B 66 -15 548 620 ; +C 204 ; WX 600 ; N Igrave ; B 96 0 504 805 ; +C -1 ; WX 600 ; N Imacron ; B 96 0 504 698 ; +C -1 ; WX 600 ; N Lcaron ; B 47 0 554 562 ; +C 189 ; WX 600 ; N onehalf ; B 0 -57 611 665 ; +C -1 ; WX 600 ; N lessequal ; B 98 0 502 710 ; +C 244 ; WX 600 ; N ocircumflex ; B 62 -15 538 654 ; +C 241 ; WX 600 ; N ntilde ; B 26 0 575 606 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 17 -18 590 805 ; +C 201 ; WX 600 ; N Eacute ; B 53 0 550 805 ; +C -1 ; WX 600 ; N emacron ; B 66 -15 548 565 ; +C -1 ; WX 600 ; N gbreve ; B 45 -157 566 609 ; +C 188 ; WX 600 ; N onequarter ; B 0 -57 600 665 ; +C 138 ; WX 600 ; N Scaron ; B 72 -20 529 802 ; +C -1 ; WX 600 ; N Scommaaccent ; B 72 -250 529 580 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 43 -18 580 805 ; +C 176 ; WX 600 ; N degree ; B 123 269 477 622 ; +C 242 ; WX 600 ; N ograve ; B 62 -15 538 672 ; +C -1 ; WX 600 ; N Ccaron ; B 41 -18 540 802 ; +C 249 ; WX 600 ; N ugrave ; B 21 -15 562 672 ; +C -1 ; WX 600 ; N radical ; B 3 -15 597 792 ; +C -1 ; WX 600 ; N Dcaron ; B 43 0 574 802 ; +C -1 ; WX 600 ; N rcommaaccent ; B 60 -250 559 441 ; +C 209 ; WX 600 ; N Ntilde ; B 7 -13 593 729 ; +C 245 ; WX 600 ; N otilde ; B 62 -15 538 606 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 588 562 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 554 562 ; +C 195 ; WX 600 ; N Atilde ; B 3 0 597 729 ; +C -1 ; WX 600 ; N Aogonek ; B 3 -172 608 562 ; +C 197 ; WX 600 ; N Aring ; B 3 0 597 750 ; +C 213 ; WX 600 ; N Otilde ; B 43 -18 557 729 ; +C -1 ; WX 600 ; N zdotaccent ; B 99 0 502 620 ; +C -1 ; WX 600 ; N Ecaron ; B 53 0 550 802 ; +C -1 ; WX 600 ; N Iogonek ; B 96 -172 504 562 ; +C -1 ; WX 600 ; N kcommaaccent ; B 43 -250 580 629 ; +C -1 ; WX 600 ; N minus ; B 80 232 520 283 ; +C 206 ; WX 600 ; N Icircumflex ; B 96 0 504 787 ; +C -1 ; WX 600 ; N ncaron ; B 26 0 575 669 ; +C -1 ; WX 600 ; N tcommaaccent ; B 87 -250 530 561 ; +C 172 ; WX 600 ; N logicalnot ; B 87 108 513 369 ; +C 246 ; WX 600 ; N odieresis ; B 62 -15 538 620 ; +C 252 ; WX 600 ; N udieresis ; B 21 -15 562 620 ; +C -1 ; WX 600 ; N notequal ; B 15 -16 540 529 ; +C -1 ; WX 600 ; N gcommaaccent ; B 45 -157 566 708 ; +C 240 ; WX 600 ; N eth ; B 62 -15 538 629 ; +C 158 ; WX 600 ; N zcaron ; B 99 0 502 669 ; +C -1 ; WX 600 ; N ncommaaccent ; B 26 -250 575 441 ; +C 185 ; WX 600 ; N onesuperior ; B 172 249 428 622 ; +C -1 ; WX 600 ; N imacron ; B 95 0 505 565 ; +C 128 ; WX 600 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Helvetica-Bold.afm b/application/third_party/dompdf/lib/fonts/Helvetica-Bold.afm new file mode 100755 index 00000000..a9298483 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Helvetica-Bold.afm @@ -0,0 +1,2829 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:43:52 1997 +Comment UniqueID 43052 +Comment VMusage 37169 48194 +FontName Helvetica-Bold +FullName Helvetica Bold +FamilyName Helvetica +Weight Bold +ItalicAngle 0 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -170 -228 1003 962 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 718 +XHeight 532 +Ascender 718 +Descender -207 +StdHW 118 +StdVW 140 +StartCharMetrics 317 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 160 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 90 0 244 718 ; +C 34 ; WX 474 ; N quotedbl ; B 98 447 376 718 ; +C 35 ; WX 556 ; N numbersign ; B 18 0 538 698 ; +C 36 ; WX 556 ; N dollar ; B 30 -115 523 775 ; +C 37 ; WX 889 ; N percent ; B 28 -19 861 710 ; +C 38 ; WX 722 ; N ampersand ; B 54 -19 701 718 ; +C 146 ; WX 278 ; N quoteright ; B 69 445 209 718 ; +C 40 ; WX 333 ; N parenleft ; B 35 -208 314 734 ; +C 41 ; WX 333 ; N parenright ; B 19 -208 298 734 ; +C 42 ; WX 389 ; N asterisk ; B 27 387 362 718 ; +C 43 ; WX 584 ; N plus ; B 40 0 544 506 ; +C 44 ; WX 278 ; N comma ; B 64 -168 214 146 ; +C 45 ; WX 333 ; N hyphen ; B 27 215 306 345 ; +C 173 ; WX 333 ; N hyphen ; B 44 232 289 322 ; +C 46 ; WX 278 ; N period ; B 64 0 214 146 ; +C 47 ; WX 278 ; N slash ; B -33 -19 311 737 ; +C 48 ; WX 556 ; N zero ; B 32 -19 524 710 ; +C 49 ; WX 556 ; N one ; B 69 0 378 710 ; +C 50 ; WX 556 ; N two ; B 26 0 511 710 ; +C 51 ; WX 556 ; N three ; B 27 -19 516 710 ; +C 52 ; WX 556 ; N four ; B 27 0 526 710 ; +C 53 ; WX 556 ; N five ; B 27 -19 516 698 ; +C 54 ; WX 556 ; N six ; B 31 -19 520 710 ; +C 55 ; WX 556 ; N seven ; B 25 0 528 698 ; +C 56 ; WX 556 ; N eight ; B 32 -19 524 710 ; +C 57 ; WX 556 ; N nine ; B 30 -19 522 710 ; +C 58 ; WX 333 ; N colon ; B 92 0 242 512 ; +C 59 ; WX 333 ; N semicolon ; B 92 -168 242 512 ; +C 60 ; WX 584 ; N less ; B 38 -8 546 514 ; +C 61 ; WX 584 ; N equal ; B 40 87 544 419 ; +C 62 ; WX 584 ; N greater ; B 38 -8 546 514 ; +C 63 ; WX 611 ; N question ; B 60 0 556 727 ; +C 64 ; WX 975 ; N at ; B 118 -19 856 737 ; +C 65 ; WX 722 ; N A ; B 20 0 702 718 ; +C 66 ; WX 722 ; N B ; B 76 0 669 718 ; +C 67 ; WX 722 ; N C ; B 44 -19 684 737 ; +C 68 ; WX 722 ; N D ; B 76 0 685 718 ; +C 69 ; WX 667 ; N E ; B 76 0 621 718 ; +C 70 ; WX 611 ; N F ; B 76 0 587 718 ; +C 71 ; WX 778 ; N G ; B 44 -19 713 737 ; +C 72 ; WX 722 ; N H ; B 71 0 651 718 ; +C 73 ; WX 278 ; N I ; B 64 0 214 718 ; +C 74 ; WX 556 ; N J ; B 22 -18 484 718 ; +C 75 ; WX 722 ; N K ; B 87 0 722 718 ; +C 76 ; WX 611 ; N L ; B 76 0 583 718 ; +C 77 ; WX 833 ; N M ; B 69 0 765 718 ; +C 78 ; WX 722 ; N N ; B 69 0 654 718 ; +C 79 ; WX 778 ; N O ; B 44 -19 734 737 ; +C 80 ; WX 667 ; N P ; B 76 0 627 718 ; +C 81 ; WX 778 ; N Q ; B 44 -52 737 737 ; +C 82 ; WX 722 ; N R ; B 76 0 677 718 ; +C 83 ; WX 667 ; N S ; B 39 -19 629 737 ; +C 84 ; WX 611 ; N T ; B 14 0 598 718 ; +C 85 ; WX 722 ; N U ; B 72 -19 651 718 ; +C 86 ; WX 667 ; N V ; B 19 0 648 718 ; +C 87 ; WX 944 ; N W ; B 16 0 929 718 ; +C 88 ; WX 667 ; N X ; B 14 0 653 718 ; +C 89 ; WX 667 ; N Y ; B 15 0 653 718 ; +C 90 ; WX 611 ; N Z ; B 25 0 586 718 ; +C 91 ; WX 333 ; N bracketleft ; B 63 -196 309 722 ; +C 92 ; WX 278 ; N backslash ; B -33 -19 311 737 ; +C 93 ; WX 333 ; N bracketright ; B 24 -196 270 722 ; +C 94 ; WX 584 ; N asciicircum ; B 62 323 522 698 ; +C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ; +C 145 ; WX 278 ; N quoteleft ; B 69 454 209 727 ; +C 97 ; WX 556 ; N a ; B 29 -14 527 546 ; +C 98 ; WX 611 ; N b ; B 61 -14 578 718 ; +C 99 ; WX 556 ; N c ; B 34 -14 524 546 ; +C 100 ; WX 611 ; N d ; B 34 -14 551 718 ; +C 101 ; WX 556 ; N e ; B 23 -14 528 546 ; +C 102 ; WX 333 ; N f ; B 10 0 318 727 ; L i fi ; L l fl ; +C 103 ; WX 611 ; N g ; B 40 -217 553 546 ; +C 104 ; WX 611 ; N h ; B 65 0 546 718 ; +C 105 ; WX 278 ; N i ; B 69 0 209 725 ; +C 106 ; WX 278 ; N j ; B 3 -214 209 725 ; +C 107 ; WX 556 ; N k ; B 69 0 562 718 ; +C 108 ; WX 278 ; N l ; B 69 0 209 718 ; +C 109 ; WX 889 ; N m ; B 64 0 826 546 ; +C 110 ; WX 611 ; N n ; B 65 0 546 546 ; +C 111 ; WX 611 ; N o ; B 34 -14 578 546 ; +C 112 ; WX 611 ; N p ; B 62 -207 578 546 ; +C 113 ; WX 611 ; N q ; B 34 -207 552 546 ; +C 114 ; WX 389 ; N r ; B 64 0 373 546 ; +C 115 ; WX 556 ; N s ; B 30 -14 519 546 ; +C 116 ; WX 333 ; N t ; B 10 -6 309 676 ; +C 117 ; WX 611 ; N u ; B 66 -14 545 532 ; +C 118 ; WX 556 ; N v ; B 13 0 543 532 ; +C 119 ; WX 778 ; N w ; B 10 0 769 532 ; +C 120 ; WX 556 ; N x ; B 15 0 541 532 ; +C 121 ; WX 556 ; N y ; B 10 -214 539 532 ; +C 122 ; WX 500 ; N z ; B 20 0 480 532 ; +C 123 ; WX 389 ; N braceleft ; B 48 -196 365 722 ; +C 124 ; WX 280 ; N bar ; B 84 -225 196 775 ; +C 125 ; WX 389 ; N braceright ; B 24 -196 341 722 ; +C 126 ; WX 584 ; N asciitilde ; B 61 163 523 343 ; +C 161 ; WX 333 ; N exclamdown ; B 90 -186 244 532 ; +C 162 ; WX 556 ; N cent ; B 34 -118 524 628 ; +C 163 ; WX 556 ; N sterling ; B 28 -16 541 718 ; +C -1 ; WX 167 ; N fraction ; B -170 -19 336 710 ; +C 165 ; WX 556 ; N yen ; B -9 0 565 698 ; +C 131 ; WX 556 ; N florin ; B -10 -210 516 737 ; +C 167 ; WX 556 ; N section ; B 34 -184 522 727 ; +C 164 ; WX 556 ; N currency ; B -3 76 559 636 ; +C 39 ; WX 238 ; N quotesingle ; B 70 447 168 718 ; +C 147 ; WX 500 ; N quotedblleft ; B 64 454 436 727 ; +C 170 ; WX 556 ; N guillemotleft ; B 88 76 468 484 ; +C 139 ; WX 333 ; N guilsinglleft ; B 83 76 250 484 ; +C 155 ; WX 333 ; N guilsinglright ; B 83 76 250 484 ; +C -1 ; WX 611 ; N fi ; B 10 0 542 727 ; +C -1 ; WX 611 ; N fl ; B 10 0 542 727 ; +C 150 ; WX 556 ; N endash ; B 0 227 556 333 ; +C 134 ; WX 556 ; N dagger ; B 36 -171 520 718 ; +C 135 ; WX 556 ; N daggerdbl ; B 36 -171 520 718 ; +C 183 ; WX 278 ; N periodcentered ; B 58 172 220 334 ; +C 182 ; WX 556 ; N paragraph ; B -8 -191 539 700 ; +C 149 ; WX 350 ; N bullet ; B 10 194 340 524 ; +C 130 ; WX 278 ; N quotesinglbase ; B 69 -146 209 127 ; +C 132 ; WX 500 ; N quotedblbase ; B 64 -146 436 127 ; +C 148 ; WX 500 ; N quotedblright ; B 64 445 436 718 ; +C 187 ; WX 556 ; N guillemotright ; B 88 76 468 484 ; +C 133 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ; +C 137 ; WX 1000 ; N perthousand ; B -3 -19 1003 710 ; +C 191 ; WX 611 ; N questiondown ; B 55 -195 551 532 ; +C 96 ; WX 333 ; N grave ; B -23 604 225 750 ; +C 180 ; WX 333 ; N acute ; B 108 604 356 750 ; +C 136 ; WX 333 ; N circumflex ; B -10 604 343 750 ; +C 152 ; WX 333 ; N tilde ; B -17 610 350 737 ; +C 175 ; WX 333 ; N macron ; B -6 604 339 678 ; +C -1 ; WX 333 ; N breve ; B -2 604 335 750 ; +C -1 ; WX 333 ; N dotaccent ; B 104 614 230 729 ; +C 168 ; WX 333 ; N dieresis ; B 6 614 327 729 ; +C -1 ; WX 333 ; N ring ; B 59 568 275 776 ; +C 184 ; WX 333 ; N cedilla ; B 6 -228 245 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B 9 604 486 750 ; +C -1 ; WX 333 ; N ogonek ; B 71 -228 304 0 ; +C -1 ; WX 333 ; N caron ; B -10 604 343 750 ; +C 151 ; WX 1000 ; N emdash ; B 0 227 1000 333 ; +C 198 ; WX 1000 ; N AE ; B 5 0 954 718 ; +C 170 ; WX 370 ; N ordfeminine ; B 22 401 347 737 ; +C -1 ; WX 611 ; N Lslash ; B -20 0 583 718 ; +C 216 ; WX 778 ; N Oslash ; B 33 -27 744 745 ; +C 140 ; WX 1000 ; N OE ; B 37 -19 961 737 ; +C 186 ; WX 365 ; N ordmasculine ; B 6 401 360 737 ; +C 230 ; WX 889 ; N ae ; B 29 -14 858 546 ; +C -1 ; WX 278 ; N dotlessi ; B 69 0 209 532 ; +C -1 ; WX 278 ; N lslash ; B -18 0 296 718 ; +C 248 ; WX 611 ; N oslash ; B 22 -29 589 560 ; +C 156 ; WX 944 ; N oe ; B 34 -14 912 546 ; +C 223 ; WX 611 ; N germandbls ; B 69 -14 579 731 ; +C 207 ; WX 278 ; N Idieresis ; B -21 0 300 915 ; +C 233 ; WX 556 ; N eacute ; B 23 -14 528 750 ; +C -1 ; WX 556 ; N abreve ; B 29 -14 527 750 ; +C -1 ; WX 611 ; N uhungarumlaut ; B 66 -14 625 750 ; +C -1 ; WX 556 ; N ecaron ; B 23 -14 528 750 ; +C 159 ; WX 667 ; N Ydieresis ; B 15 0 653 915 ; +C 247 ; WX 584 ; N divide ; B 40 -42 544 548 ; +C 221 ; WX 667 ; N Yacute ; B 15 0 653 936 ; +C 194 ; WX 722 ; N Acircumflex ; B 20 0 702 936 ; +C 225 ; WX 556 ; N aacute ; B 29 -14 527 750 ; +C 219 ; WX 722 ; N Ucircumflex ; B 72 -19 651 936 ; +C 253 ; WX 556 ; N yacute ; B 10 -214 539 750 ; +C -1 ; WX 556 ; N scommaaccent ; B 30 -228 519 546 ; +C 234 ; WX 556 ; N ecircumflex ; B 23 -14 528 750 ; +C -1 ; WX 722 ; N Uring ; B 72 -19 651 962 ; +C 220 ; WX 722 ; N Udieresis ; B 72 -19 651 915 ; +C -1 ; WX 556 ; N aogonek ; B 29 -224 545 546 ; +C 218 ; WX 722 ; N Uacute ; B 72 -19 651 936 ; +C -1 ; WX 611 ; N uogonek ; B 66 -228 545 532 ; +C 203 ; WX 667 ; N Edieresis ; B 76 0 621 915 ; +C -1 ; WX 722 ; N Dcroat ; B -5 0 685 718 ; +C -1 ; WX 250 ; N commaaccent ; B 64 -228 199 -50 ; +C 169 ; WX 737 ; N copyright ; B -11 -19 749 737 ; +C -1 ; WX 667 ; N Emacron ; B 76 0 621 864 ; +C -1 ; WX 556 ; N ccaron ; B 34 -14 524 750 ; +C 229 ; WX 556 ; N aring ; B 29 -14 527 776 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 654 718 ; +C -1 ; WX 278 ; N lacute ; B 69 0 329 936 ; +C 224 ; WX 556 ; N agrave ; B 29 -14 527 750 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 14 -228 598 718 ; +C -1 ; WX 722 ; N Cacute ; B 44 -19 684 936 ; +C 227 ; WX 556 ; N atilde ; B 29 -14 527 737 ; +C -1 ; WX 667 ; N Edotaccent ; B 76 0 621 915 ; +C 154 ; WX 556 ; N scaron ; B 30 -14 519 750 ; +C -1 ; WX 556 ; N scedilla ; B 30 -228 519 546 ; +C 237 ; WX 278 ; N iacute ; B 69 0 329 750 ; +C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; +C -1 ; WX 722 ; N Rcaron ; B 76 0 677 936 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 44 -228 713 737 ; +C 251 ; WX 611 ; N ucircumflex ; B 66 -14 545 750 ; +C 226 ; WX 556 ; N acircumflex ; B 29 -14 527 750 ; +C -1 ; WX 722 ; N Amacron ; B 20 0 702 864 ; +C -1 ; WX 389 ; N rcaron ; B 18 0 373 750 ; +C 231 ; WX 556 ; N ccedilla ; B 34 -228 524 546 ; +C -1 ; WX 611 ; N Zdotaccent ; B 25 0 586 915 ; +C 222 ; WX 667 ; N Thorn ; B 76 0 627 718 ; +C -1 ; WX 778 ; N Omacron ; B 44 -19 734 864 ; +C -1 ; WX 722 ; N Racute ; B 76 0 677 936 ; +C -1 ; WX 667 ; N Sacute ; B 39 -19 629 936 ; +C -1 ; WX 743 ; N dcaron ; B 34 -14 750 718 ; +C -1 ; WX 722 ; N Umacron ; B 72 -19 651 864 ; +C -1 ; WX 611 ; N uring ; B 66 -14 545 776 ; +C 179 ; WX 333 ; N threesuperior ; B 8 271 326 710 ; +C 210 ; WX 778 ; N Ograve ; B 44 -19 734 936 ; +C 192 ; WX 722 ; N Agrave ; B 20 0 702 936 ; +C -1 ; WX 722 ; N Abreve ; B 20 0 702 936 ; +C 215 ; WX 584 ; N multiply ; B 40 1 545 505 ; +C 250 ; WX 611 ; N uacute ; B 66 -14 545 750 ; +C -1 ; WX 611 ; N Tcaron ; B 14 0 598 936 ; +C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; +C 255 ; WX 556 ; N ydieresis ; B 10 -214 539 729 ; +C -1 ; WX 722 ; N Nacute ; B 69 0 654 936 ; +C 238 ; WX 278 ; N icircumflex ; B -37 0 316 750 ; +C 202 ; WX 667 ; N Ecircumflex ; B 76 0 621 936 ; +C 228 ; WX 556 ; N adieresis ; B 29 -14 527 729 ; +C 235 ; WX 556 ; N edieresis ; B 23 -14 528 729 ; +C -1 ; WX 556 ; N cacute ; B 34 -14 524 750 ; +C -1 ; WX 611 ; N nacute ; B 65 0 546 750 ; +C -1 ; WX 611 ; N umacron ; B 66 -14 545 678 ; +C -1 ; WX 722 ; N Ncaron ; B 69 0 654 936 ; +C 205 ; WX 278 ; N Iacute ; B 64 0 329 936 ; +C 177 ; WX 584 ; N plusminus ; B 40 0 544 506 ; +C 166 ; WX 280 ; N brokenbar ; B 84 -150 196 700 ; +C 174 ; WX 737 ; N registered ; B -11 -19 748 737 ; +C -1 ; WX 778 ; N Gbreve ; B 44 -19 713 936 ; +C -1 ; WX 278 ; N Idotaccent ; B 64 0 214 915 ; +C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; +C 200 ; WX 667 ; N Egrave ; B 76 0 621 936 ; +C -1 ; WX 389 ; N racute ; B 64 0 384 750 ; +C -1 ; WX 611 ; N omacron ; B 34 -14 578 678 ; +C -1 ; WX 611 ; N Zacute ; B 25 0 586 936 ; +C 142 ; WX 611 ; N Zcaron ; B 25 0 586 936 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; +C 208 ; WX 722 ; N Eth ; B -5 0 685 718 ; +C 199 ; WX 722 ; N Ccedilla ; B 44 -228 684 737 ; +C -1 ; WX 278 ; N lcommaaccent ; B 69 -228 213 718 ; +C -1 ; WX 389 ; N tcaron ; B 10 -6 421 878 ; +C -1 ; WX 556 ; N eogonek ; B 23 -228 528 546 ; +C -1 ; WX 722 ; N Uogonek ; B 72 -228 651 718 ; +C 193 ; WX 722 ; N Aacute ; B 20 0 702 936 ; +C 196 ; WX 722 ; N Adieresis ; B 20 0 702 915 ; +C 232 ; WX 556 ; N egrave ; B 23 -14 528 750 ; +C -1 ; WX 500 ; N zacute ; B 20 0 480 750 ; +C -1 ; WX 278 ; N iogonek ; B 16 -224 249 725 ; +C 211 ; WX 778 ; N Oacute ; B 44 -19 734 936 ; +C 243 ; WX 611 ; N oacute ; B 34 -14 578 750 ; +C -1 ; WX 556 ; N amacron ; B 29 -14 527 678 ; +C -1 ; WX 556 ; N sacute ; B 30 -14 519 750 ; +C 239 ; WX 278 ; N idieresis ; B -21 0 300 729 ; +C 212 ; WX 778 ; N Ocircumflex ; B 44 -19 734 936 ; +C 217 ; WX 722 ; N Ugrave ; B 72 -19 651 936 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 611 ; N thorn ; B 62 -208 578 718 ; +C 178 ; WX 333 ; N twosuperior ; B 9 283 324 710 ; +C 214 ; WX 778 ; N Odieresis ; B 44 -19 734 915 ; +C 181 ; WX 611 ; N mu ; B 66 -207 545 532 ; +C 236 ; WX 278 ; N igrave ; B -50 0 209 750 ; +C -1 ; WX 611 ; N ohungarumlaut ; B 34 -14 625 750 ; +C -1 ; WX 667 ; N Eogonek ; B 76 -224 639 718 ; +C -1 ; WX 611 ; N dcroat ; B 34 -14 650 718 ; +C 190 ; WX 834 ; N threequarters ; B 16 -19 799 710 ; +C -1 ; WX 667 ; N Scedilla ; B 39 -228 629 737 ; +C -1 ; WX 400 ; N lcaron ; B 69 0 408 718 ; +C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 722 718 ; +C -1 ; WX 611 ; N Lacute ; B 76 0 583 936 ; +C 153 ; WX 1000 ; N trademark ; B 44 306 956 718 ; +C -1 ; WX 556 ; N edotaccent ; B 23 -14 528 729 ; +C 204 ; WX 278 ; N Igrave ; B -50 0 214 936 ; +C -1 ; WX 278 ; N Imacron ; B -33 0 312 864 ; +C -1 ; WX 611 ; N Lcaron ; B 76 0 583 718 ; +C 189 ; WX 834 ; N onehalf ; B 26 -19 794 710 ; +C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; +C 244 ; WX 611 ; N ocircumflex ; B 34 -14 578 750 ; +C 241 ; WX 611 ; N ntilde ; B 65 0 546 737 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 72 -19 681 936 ; +C 201 ; WX 667 ; N Eacute ; B 76 0 621 936 ; +C -1 ; WX 556 ; N emacron ; B 23 -14 528 678 ; +C -1 ; WX 611 ; N gbreve ; B 40 -217 553 750 ; +C 188 ; WX 834 ; N onequarter ; B 26 -19 766 710 ; +C 138 ; WX 667 ; N Scaron ; B 39 -19 629 936 ; +C -1 ; WX 667 ; N Scommaaccent ; B 39 -228 629 737 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 44 -19 734 936 ; +C 176 ; WX 400 ; N degree ; B 57 426 343 712 ; +C 242 ; WX 611 ; N ograve ; B 34 -14 578 750 ; +C -1 ; WX 722 ; N Ccaron ; B 44 -19 684 936 ; +C 249 ; WX 611 ; N ugrave ; B 66 -14 545 750 ; +C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; +C -1 ; WX 722 ; N Dcaron ; B 76 0 685 936 ; +C -1 ; WX 389 ; N rcommaaccent ; B 64 -228 373 546 ; +C 209 ; WX 722 ; N Ntilde ; B 69 0 654 923 ; +C 245 ; WX 611 ; N otilde ; B 34 -14 578 737 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 677 718 ; +C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 583 718 ; +C 195 ; WX 722 ; N Atilde ; B 20 0 702 923 ; +C -1 ; WX 722 ; N Aogonek ; B 20 -224 742 718 ; +C 197 ; WX 722 ; N Aring ; B 20 0 702 962 ; +C 213 ; WX 778 ; N Otilde ; B 44 -19 734 923 ; +C -1 ; WX 500 ; N zdotaccent ; B 20 0 480 729 ; +C -1 ; WX 667 ; N Ecaron ; B 76 0 621 936 ; +C -1 ; WX 278 ; N Iogonek ; B -11 -228 222 718 ; +C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 562 718 ; +C -1 ; WX 584 ; N minus ; B 40 197 544 309 ; +C 206 ; WX 278 ; N Icircumflex ; B -37 0 316 936 ; +C -1 ; WX 611 ; N ncaron ; B 65 0 546 750 ; +C -1 ; WX 333 ; N tcommaaccent ; B 10 -228 309 676 ; +C 172 ; WX 584 ; N logicalnot ; B 40 108 544 419 ; +C 246 ; WX 611 ; N odieresis ; B 34 -14 578 729 ; +C 252 ; WX 611 ; N udieresis ; B 66 -14 545 729 ; +C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; +C -1 ; WX 611 ; N gcommaaccent ; B 40 -217 553 850 ; +C 240 ; WX 611 ; N eth ; B 34 -14 578 737 ; +C 158 ; WX 500 ; N zcaron ; B 20 0 480 750 ; +C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 546 546 ; +C 185 ; WX 333 ; N onesuperior ; B 26 283 237 710 ; +C -1 ; WX 278 ; N imacron ; B -8 0 285 678 ; +C 128 ; WX 556 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2481 +KPX A C -40 +KPX A Cacute -40 +KPX A Ccaron -40 +KPX A Ccedilla -40 +KPX A G -50 +KPX A Gbreve -50 +KPX A Gcommaaccent -50 +KPX A O -40 +KPX A Oacute -40 +KPX A Ocircumflex -40 +KPX A Odieresis -40 +KPX A Ograve -40 +KPX A Ohungarumlaut -40 +KPX A Omacron -40 +KPX A Oslash -40 +KPX A Otilde -40 +KPX A Q -40 +KPX A T -90 +KPX A Tcaron -90 +KPX A Tcommaaccent -90 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -80 +KPX A W -60 +KPX A Y -110 +KPX A Yacute -110 +KPX A Ydieresis -110 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -40 +KPX A w -30 +KPX A y -30 +KPX A yacute -30 +KPX A ydieresis -30 +KPX Aacute C -40 +KPX Aacute Cacute -40 +KPX Aacute Ccaron -40 +KPX Aacute Ccedilla -40 +KPX Aacute G -50 +KPX Aacute Gbreve -50 +KPX Aacute Gcommaaccent -50 +KPX Aacute O -40 +KPX Aacute Oacute -40 +KPX Aacute Ocircumflex -40 +KPX Aacute Odieresis -40 +KPX Aacute Ograve -40 +KPX Aacute Ohungarumlaut -40 +KPX Aacute Omacron -40 +KPX Aacute Oslash -40 +KPX Aacute Otilde -40 +KPX Aacute Q -40 +KPX Aacute T -90 +KPX Aacute Tcaron -90 +KPX Aacute Tcommaaccent -90 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -80 +KPX Aacute W -60 +KPX Aacute Y -110 +KPX Aacute Yacute -110 +KPX Aacute Ydieresis -110 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -40 +KPX Aacute w -30 +KPX Aacute y -30 +KPX Aacute yacute -30 +KPX Aacute ydieresis -30 +KPX Abreve C -40 +KPX Abreve Cacute -40 +KPX Abreve Ccaron -40 +KPX Abreve Ccedilla -40 +KPX Abreve G -50 +KPX Abreve Gbreve -50 +KPX Abreve Gcommaaccent -50 +KPX Abreve O -40 +KPX Abreve Oacute -40 +KPX Abreve Ocircumflex -40 +KPX Abreve Odieresis -40 +KPX Abreve Ograve -40 +KPX Abreve Ohungarumlaut -40 +KPX Abreve Omacron -40 +KPX Abreve Oslash -40 +KPX Abreve Otilde -40 +KPX Abreve Q -40 +KPX Abreve T -90 +KPX Abreve Tcaron -90 +KPX Abreve Tcommaaccent -90 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -80 +KPX Abreve W -60 +KPX Abreve Y -110 +KPX Abreve Yacute -110 +KPX Abreve Ydieresis -110 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -40 +KPX Abreve w -30 +KPX Abreve y -30 +KPX Abreve yacute -30 +KPX Abreve ydieresis -30 +KPX Acircumflex C -40 +KPX Acircumflex Cacute -40 +KPX Acircumflex Ccaron -40 +KPX Acircumflex Ccedilla -40 +KPX Acircumflex G -50 +KPX Acircumflex Gbreve -50 +KPX Acircumflex Gcommaaccent -50 +KPX Acircumflex O -40 +KPX Acircumflex Oacute -40 +KPX Acircumflex Ocircumflex -40 +KPX Acircumflex Odieresis -40 +KPX Acircumflex Ograve -40 +KPX Acircumflex Ohungarumlaut -40 +KPX Acircumflex Omacron -40 +KPX Acircumflex Oslash -40 +KPX Acircumflex Otilde -40 +KPX Acircumflex Q -40 +KPX Acircumflex T -90 +KPX Acircumflex Tcaron -90 +KPX Acircumflex Tcommaaccent -90 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -80 +KPX Acircumflex W -60 +KPX Acircumflex Y -110 +KPX Acircumflex Yacute -110 +KPX Acircumflex Ydieresis -110 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -40 +KPX Acircumflex w -30 +KPX Acircumflex y -30 +KPX Acircumflex yacute -30 +KPX Acircumflex ydieresis -30 +KPX Adieresis C -40 +KPX Adieresis Cacute -40 +KPX Adieresis Ccaron -40 +KPX Adieresis Ccedilla -40 +KPX Adieresis G -50 +KPX Adieresis Gbreve -50 +KPX Adieresis Gcommaaccent -50 +KPX Adieresis O -40 +KPX Adieresis Oacute -40 +KPX Adieresis Ocircumflex -40 +KPX Adieresis Odieresis -40 +KPX Adieresis Ograve -40 +KPX Adieresis Ohungarumlaut -40 +KPX Adieresis Omacron -40 +KPX Adieresis Oslash -40 +KPX Adieresis Otilde -40 +KPX Adieresis Q -40 +KPX Adieresis T -90 +KPX Adieresis Tcaron -90 +KPX Adieresis Tcommaaccent -90 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -80 +KPX Adieresis W -60 +KPX Adieresis Y -110 +KPX Adieresis Yacute -110 +KPX Adieresis Ydieresis -110 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -40 +KPX Adieresis w -30 +KPX Adieresis y -30 +KPX Adieresis yacute -30 +KPX Adieresis ydieresis -30 +KPX Agrave C -40 +KPX Agrave Cacute -40 +KPX Agrave Ccaron -40 +KPX Agrave Ccedilla -40 +KPX Agrave G -50 +KPX Agrave Gbreve -50 +KPX Agrave Gcommaaccent -50 +KPX Agrave O -40 +KPX Agrave Oacute -40 +KPX Agrave Ocircumflex -40 +KPX Agrave Odieresis -40 +KPX Agrave Ograve -40 +KPX Agrave Ohungarumlaut -40 +KPX Agrave Omacron -40 +KPX Agrave Oslash -40 +KPX Agrave Otilde -40 +KPX Agrave Q -40 +KPX Agrave T -90 +KPX Agrave Tcaron -90 +KPX Agrave Tcommaaccent -90 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -80 +KPX Agrave W -60 +KPX Agrave Y -110 +KPX Agrave Yacute -110 +KPX Agrave Ydieresis -110 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -40 +KPX Agrave w -30 +KPX Agrave y -30 +KPX Agrave yacute -30 +KPX Agrave ydieresis -30 +KPX Amacron C -40 +KPX Amacron Cacute -40 +KPX Amacron Ccaron -40 +KPX Amacron Ccedilla -40 +KPX Amacron G -50 +KPX Amacron Gbreve -50 +KPX Amacron Gcommaaccent -50 +KPX Amacron O -40 +KPX Amacron Oacute -40 +KPX Amacron Ocircumflex -40 +KPX Amacron Odieresis -40 +KPX Amacron Ograve -40 +KPX Amacron Ohungarumlaut -40 +KPX Amacron Omacron -40 +KPX Amacron Oslash -40 +KPX Amacron Otilde -40 +KPX Amacron Q -40 +KPX Amacron T -90 +KPX Amacron Tcaron -90 +KPX Amacron Tcommaaccent -90 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -80 +KPX Amacron W -60 +KPX Amacron Y -110 +KPX Amacron Yacute -110 +KPX Amacron Ydieresis -110 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -40 +KPX Amacron w -30 +KPX Amacron y -30 +KPX Amacron yacute -30 +KPX Amacron ydieresis -30 +KPX Aogonek C -40 +KPX Aogonek Cacute -40 +KPX Aogonek Ccaron -40 +KPX Aogonek Ccedilla -40 +KPX Aogonek G -50 +KPX Aogonek Gbreve -50 +KPX Aogonek Gcommaaccent -50 +KPX Aogonek O -40 +KPX Aogonek Oacute -40 +KPX Aogonek Ocircumflex -40 +KPX Aogonek Odieresis -40 +KPX Aogonek Ograve -40 +KPX Aogonek Ohungarumlaut -40 +KPX Aogonek Omacron -40 +KPX Aogonek Oslash -40 +KPX Aogonek Otilde -40 +KPX Aogonek Q -40 +KPX Aogonek T -90 +KPX Aogonek Tcaron -90 +KPX Aogonek Tcommaaccent -90 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -80 +KPX Aogonek W -60 +KPX Aogonek Y -110 +KPX Aogonek Yacute -110 +KPX Aogonek Ydieresis -110 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -40 +KPX Aogonek w -30 +KPX Aogonek y -30 +KPX Aogonek yacute -30 +KPX Aogonek ydieresis -30 +KPX Aring C -40 +KPX Aring Cacute -40 +KPX Aring Ccaron -40 +KPX Aring Ccedilla -40 +KPX Aring G -50 +KPX Aring Gbreve -50 +KPX Aring Gcommaaccent -50 +KPX Aring O -40 +KPX Aring Oacute -40 +KPX Aring Ocircumflex -40 +KPX Aring Odieresis -40 +KPX Aring Ograve -40 +KPX Aring Ohungarumlaut -40 +KPX Aring Omacron -40 +KPX Aring Oslash -40 +KPX Aring Otilde -40 +KPX Aring Q -40 +KPX Aring T -90 +KPX Aring Tcaron -90 +KPX Aring Tcommaaccent -90 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -80 +KPX Aring W -60 +KPX Aring Y -110 +KPX Aring Yacute -110 +KPX Aring Ydieresis -110 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -40 +KPX Aring w -30 +KPX Aring y -30 +KPX Aring yacute -30 +KPX Aring ydieresis -30 +KPX Atilde C -40 +KPX Atilde Cacute -40 +KPX Atilde Ccaron -40 +KPX Atilde Ccedilla -40 +KPX Atilde G -50 +KPX Atilde Gbreve -50 +KPX Atilde Gcommaaccent -50 +KPX Atilde O -40 +KPX Atilde Oacute -40 +KPX Atilde Ocircumflex -40 +KPX Atilde Odieresis -40 +KPX Atilde Ograve -40 +KPX Atilde Ohungarumlaut -40 +KPX Atilde Omacron -40 +KPX Atilde Oslash -40 +KPX Atilde Otilde -40 +KPX Atilde Q -40 +KPX Atilde T -90 +KPX Atilde Tcaron -90 +KPX Atilde Tcommaaccent -90 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -80 +KPX Atilde W -60 +KPX Atilde Y -110 +KPX Atilde Yacute -110 +KPX Atilde Ydieresis -110 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -40 +KPX Atilde w -30 +KPX Atilde y -30 +KPX Atilde yacute -30 +KPX Atilde ydieresis -30 +KPX B A -30 +KPX B Aacute -30 +KPX B Abreve -30 +KPX B Acircumflex -30 +KPX B Adieresis -30 +KPX B Agrave -30 +KPX B Amacron -30 +KPX B Aogonek -30 +KPX B Aring -30 +KPX B Atilde -30 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -40 +KPX D W -40 +KPX D Y -70 +KPX D Yacute -70 +KPX D Ydieresis -70 +KPX D comma -30 +KPX D period -30 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -40 +KPX Dcaron W -40 +KPX Dcaron Y -70 +KPX Dcaron Yacute -70 +KPX Dcaron Ydieresis -70 +KPX Dcaron comma -30 +KPX Dcaron period -30 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -40 +KPX Dcroat W -40 +KPX Dcroat Y -70 +KPX Dcroat Yacute -70 +KPX Dcroat Ydieresis -70 +KPX Dcroat comma -30 +KPX Dcroat period -30 +KPX F A -80 +KPX F Aacute -80 +KPX F Abreve -80 +KPX F Acircumflex -80 +KPX F Adieresis -80 +KPX F Agrave -80 +KPX F Amacron -80 +KPX F Aogonek -80 +KPX F Aring -80 +KPX F Atilde -80 +KPX F a -20 +KPX F aacute -20 +KPX F abreve -20 +KPX F acircumflex -20 +KPX F adieresis -20 +KPX F agrave -20 +KPX F amacron -20 +KPX F aogonek -20 +KPX F aring -20 +KPX F atilde -20 +KPX F comma -100 +KPX F period -100 +KPX J A -20 +KPX J Aacute -20 +KPX J Abreve -20 +KPX J Acircumflex -20 +KPX J Adieresis -20 +KPX J Agrave -20 +KPX J Amacron -20 +KPX J Aogonek -20 +KPX J Aring -20 +KPX J Atilde -20 +KPX J comma -20 +KPX J period -20 +KPX J u -20 +KPX J uacute -20 +KPX J ucircumflex -20 +KPX J udieresis -20 +KPX J ugrave -20 +KPX J uhungarumlaut -20 +KPX J umacron -20 +KPX J uogonek -20 +KPX J uring -20 +KPX K O -30 +KPX K Oacute -30 +KPX K Ocircumflex -30 +KPX K Odieresis -30 +KPX K Ograve -30 +KPX K Ohungarumlaut -30 +KPX K Omacron -30 +KPX K Oslash -30 +KPX K Otilde -30 +KPX K e -15 +KPX K eacute -15 +KPX K ecaron -15 +KPX K ecircumflex -15 +KPX K edieresis -15 +KPX K edotaccent -15 +KPX K egrave -15 +KPX K emacron -15 +KPX K eogonek -15 +KPX K o -35 +KPX K oacute -35 +KPX K ocircumflex -35 +KPX K odieresis -35 +KPX K ograve -35 +KPX K ohungarumlaut -35 +KPX K omacron -35 +KPX K oslash -35 +KPX K otilde -35 +KPX K u -30 +KPX K uacute -30 +KPX K ucircumflex -30 +KPX K udieresis -30 +KPX K ugrave -30 +KPX K uhungarumlaut -30 +KPX K umacron -30 +KPX K uogonek -30 +KPX K uring -30 +KPX K y -40 +KPX K yacute -40 +KPX K ydieresis -40 +KPX Kcommaaccent O -30 +KPX Kcommaaccent Oacute -30 +KPX Kcommaaccent Ocircumflex -30 +KPX Kcommaaccent Odieresis -30 +KPX Kcommaaccent Ograve -30 +KPX Kcommaaccent Ohungarumlaut -30 +KPX Kcommaaccent Omacron -30 +KPX Kcommaaccent Oslash -30 +KPX Kcommaaccent Otilde -30 +KPX Kcommaaccent e -15 +KPX Kcommaaccent eacute -15 +KPX Kcommaaccent ecaron -15 +KPX Kcommaaccent ecircumflex -15 +KPX Kcommaaccent edieresis -15 +KPX Kcommaaccent edotaccent -15 +KPX Kcommaaccent egrave -15 +KPX Kcommaaccent emacron -15 +KPX Kcommaaccent eogonek -15 +KPX Kcommaaccent o -35 +KPX Kcommaaccent oacute -35 +KPX Kcommaaccent ocircumflex -35 +KPX Kcommaaccent odieresis -35 +KPX Kcommaaccent ograve -35 +KPX Kcommaaccent ohungarumlaut -35 +KPX Kcommaaccent omacron -35 +KPX Kcommaaccent oslash -35 +KPX Kcommaaccent otilde -35 +KPX Kcommaaccent u -30 +KPX Kcommaaccent uacute -30 +KPX Kcommaaccent ucircumflex -30 +KPX Kcommaaccent udieresis -30 +KPX Kcommaaccent ugrave -30 +KPX Kcommaaccent uhungarumlaut -30 +KPX Kcommaaccent umacron -30 +KPX Kcommaaccent uogonek -30 +KPX Kcommaaccent uring -30 +KPX Kcommaaccent y -40 +KPX Kcommaaccent yacute -40 +KPX Kcommaaccent ydieresis -40 +KPX L T -90 +KPX L Tcaron -90 +KPX L Tcommaaccent -90 +KPX L V -110 +KPX L W -80 +KPX L Y -120 +KPX L Yacute -120 +KPX L Ydieresis -120 +KPX L quotedblright -140 +KPX L quoteright -140 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -90 +KPX Lacute Tcaron -90 +KPX Lacute Tcommaaccent -90 +KPX Lacute V -110 +KPX Lacute W -80 +KPX Lacute Y -120 +KPX Lacute Yacute -120 +KPX Lacute Ydieresis -120 +KPX Lacute quotedblright -140 +KPX Lacute quoteright -140 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcommaaccent T -90 +KPX Lcommaaccent Tcaron -90 +KPX Lcommaaccent Tcommaaccent -90 +KPX Lcommaaccent V -110 +KPX Lcommaaccent W -80 +KPX Lcommaaccent Y -120 +KPX Lcommaaccent Yacute -120 +KPX Lcommaaccent Ydieresis -120 +KPX Lcommaaccent quotedblright -140 +KPX Lcommaaccent quoteright -140 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -90 +KPX Lslash Tcaron -90 +KPX Lslash Tcommaaccent -90 +KPX Lslash V -110 +KPX Lslash W -80 +KPX Lslash Y -120 +KPX Lslash Yacute -120 +KPX Lslash Ydieresis -120 +KPX Lslash quotedblright -140 +KPX Lslash quoteright -140 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX O A -50 +KPX O Aacute -50 +KPX O Abreve -50 +KPX O Acircumflex -50 +KPX O Adieresis -50 +KPX O Agrave -50 +KPX O Amacron -50 +KPX O Aogonek -50 +KPX O Aring -50 +KPX O Atilde -50 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -50 +KPX O X -50 +KPX O Y -70 +KPX O Yacute -70 +KPX O Ydieresis -70 +KPX O comma -40 +KPX O period -40 +KPX Oacute A -50 +KPX Oacute Aacute -50 +KPX Oacute Abreve -50 +KPX Oacute Acircumflex -50 +KPX Oacute Adieresis -50 +KPX Oacute Agrave -50 +KPX Oacute Amacron -50 +KPX Oacute Aogonek -50 +KPX Oacute Aring -50 +KPX Oacute Atilde -50 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -50 +KPX Oacute X -50 +KPX Oacute Y -70 +KPX Oacute Yacute -70 +KPX Oacute Ydieresis -70 +KPX Oacute comma -40 +KPX Oacute period -40 +KPX Ocircumflex A -50 +KPX Ocircumflex Aacute -50 +KPX Ocircumflex Abreve -50 +KPX Ocircumflex Acircumflex -50 +KPX Ocircumflex Adieresis -50 +KPX Ocircumflex Agrave -50 +KPX Ocircumflex Amacron -50 +KPX Ocircumflex Aogonek -50 +KPX Ocircumflex Aring -50 +KPX Ocircumflex Atilde -50 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -50 +KPX Ocircumflex X -50 +KPX Ocircumflex Y -70 +KPX Ocircumflex Yacute -70 +KPX Ocircumflex Ydieresis -70 +KPX Ocircumflex comma -40 +KPX Ocircumflex period -40 +KPX Odieresis A -50 +KPX Odieresis Aacute -50 +KPX Odieresis Abreve -50 +KPX Odieresis Acircumflex -50 +KPX Odieresis Adieresis -50 +KPX Odieresis Agrave -50 +KPX Odieresis Amacron -50 +KPX Odieresis Aogonek -50 +KPX Odieresis Aring -50 +KPX Odieresis Atilde -50 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -50 +KPX Odieresis X -50 +KPX Odieresis Y -70 +KPX Odieresis Yacute -70 +KPX Odieresis Ydieresis -70 +KPX Odieresis comma -40 +KPX Odieresis period -40 +KPX Ograve A -50 +KPX Ograve Aacute -50 +KPX Ograve Abreve -50 +KPX Ograve Acircumflex -50 +KPX Ograve Adieresis -50 +KPX Ograve Agrave -50 +KPX Ograve Amacron -50 +KPX Ograve Aogonek -50 +KPX Ograve Aring -50 +KPX Ograve Atilde -50 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -50 +KPX Ograve X -50 +KPX Ograve Y -70 +KPX Ograve Yacute -70 +KPX Ograve Ydieresis -70 +KPX Ograve comma -40 +KPX Ograve period -40 +KPX Ohungarumlaut A -50 +KPX Ohungarumlaut Aacute -50 +KPX Ohungarumlaut Abreve -50 +KPX Ohungarumlaut Acircumflex -50 +KPX Ohungarumlaut Adieresis -50 +KPX Ohungarumlaut Agrave -50 +KPX Ohungarumlaut Amacron -50 +KPX Ohungarumlaut Aogonek -50 +KPX Ohungarumlaut Aring -50 +KPX Ohungarumlaut Atilde -50 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -50 +KPX Ohungarumlaut X -50 +KPX Ohungarumlaut Y -70 +KPX Ohungarumlaut Yacute -70 +KPX Ohungarumlaut Ydieresis -70 +KPX Ohungarumlaut comma -40 +KPX Ohungarumlaut period -40 +KPX Omacron A -50 +KPX Omacron Aacute -50 +KPX Omacron Abreve -50 +KPX Omacron Acircumflex -50 +KPX Omacron Adieresis -50 +KPX Omacron Agrave -50 +KPX Omacron Amacron -50 +KPX Omacron Aogonek -50 +KPX Omacron Aring -50 +KPX Omacron Atilde -50 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -50 +KPX Omacron X -50 +KPX Omacron Y -70 +KPX Omacron Yacute -70 +KPX Omacron Ydieresis -70 +KPX Omacron comma -40 +KPX Omacron period -40 +KPX Oslash A -50 +KPX Oslash Aacute -50 +KPX Oslash Abreve -50 +KPX Oslash Acircumflex -50 +KPX Oslash Adieresis -50 +KPX Oslash Agrave -50 +KPX Oslash Amacron -50 +KPX Oslash Aogonek -50 +KPX Oslash Aring -50 +KPX Oslash Atilde -50 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -50 +KPX Oslash X -50 +KPX Oslash Y -70 +KPX Oslash Yacute -70 +KPX Oslash Ydieresis -70 +KPX Oslash comma -40 +KPX Oslash period -40 +KPX Otilde A -50 +KPX Otilde Aacute -50 +KPX Otilde Abreve -50 +KPX Otilde Acircumflex -50 +KPX Otilde Adieresis -50 +KPX Otilde Agrave -50 +KPX Otilde Amacron -50 +KPX Otilde Aogonek -50 +KPX Otilde Aring -50 +KPX Otilde Atilde -50 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -50 +KPX Otilde X -50 +KPX Otilde Y -70 +KPX Otilde Yacute -70 +KPX Otilde Ydieresis -70 +KPX Otilde comma -40 +KPX Otilde period -40 +KPX P A -100 +KPX P Aacute -100 +KPX P Abreve -100 +KPX P Acircumflex -100 +KPX P Adieresis -100 +KPX P Agrave -100 +KPX P Amacron -100 +KPX P Aogonek -100 +KPX P Aring -100 +KPX P Atilde -100 +KPX P a -30 +KPX P aacute -30 +KPX P abreve -30 +KPX P acircumflex -30 +KPX P adieresis -30 +KPX P agrave -30 +KPX P amacron -30 +KPX P aogonek -30 +KPX P aring -30 +KPX P atilde -30 +KPX P comma -120 +KPX P e -30 +KPX P eacute -30 +KPX P ecaron -30 +KPX P ecircumflex -30 +KPX P edieresis -30 +KPX P edotaccent -30 +KPX P egrave -30 +KPX P emacron -30 +KPX P eogonek -30 +KPX P o -40 +KPX P oacute -40 +KPX P ocircumflex -40 +KPX P odieresis -40 +KPX P ograve -40 +KPX P ohungarumlaut -40 +KPX P omacron -40 +KPX P oslash -40 +KPX P otilde -40 +KPX P period -120 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX Q comma 20 +KPX Q period 20 +KPX R O -20 +KPX R Oacute -20 +KPX R Ocircumflex -20 +KPX R Odieresis -20 +KPX R Ograve -20 +KPX R Ohungarumlaut -20 +KPX R Omacron -20 +KPX R Oslash -20 +KPX R Otilde -20 +KPX R T -20 +KPX R Tcaron -20 +KPX R Tcommaaccent -20 +KPX R U -20 +KPX R Uacute -20 +KPX R Ucircumflex -20 +KPX R Udieresis -20 +KPX R Ugrave -20 +KPX R Uhungarumlaut -20 +KPX R Umacron -20 +KPX R Uogonek -20 +KPX R Uring -20 +KPX R V -50 +KPX R W -40 +KPX R Y -50 +KPX R Yacute -50 +KPX R Ydieresis -50 +KPX Racute O -20 +KPX Racute Oacute -20 +KPX Racute Ocircumflex -20 +KPX Racute Odieresis -20 +KPX Racute Ograve -20 +KPX Racute Ohungarumlaut -20 +KPX Racute Omacron -20 +KPX Racute Oslash -20 +KPX Racute Otilde -20 +KPX Racute T -20 +KPX Racute Tcaron -20 +KPX Racute Tcommaaccent -20 +KPX Racute U -20 +KPX Racute Uacute -20 +KPX Racute Ucircumflex -20 +KPX Racute Udieresis -20 +KPX Racute Ugrave -20 +KPX Racute Uhungarumlaut -20 +KPX Racute Umacron -20 +KPX Racute Uogonek -20 +KPX Racute Uring -20 +KPX Racute V -50 +KPX Racute W -40 +KPX Racute Y -50 +KPX Racute Yacute -50 +KPX Racute Ydieresis -50 +KPX Rcaron O -20 +KPX Rcaron Oacute -20 +KPX Rcaron Ocircumflex -20 +KPX Rcaron Odieresis -20 +KPX Rcaron Ograve -20 +KPX Rcaron Ohungarumlaut -20 +KPX Rcaron Omacron -20 +KPX Rcaron Oslash -20 +KPX Rcaron Otilde -20 +KPX Rcaron T -20 +KPX Rcaron Tcaron -20 +KPX Rcaron Tcommaaccent -20 +KPX Rcaron U -20 +KPX Rcaron Uacute -20 +KPX Rcaron Ucircumflex -20 +KPX Rcaron Udieresis -20 +KPX Rcaron Ugrave -20 +KPX Rcaron Uhungarumlaut -20 +KPX Rcaron Umacron -20 +KPX Rcaron Uogonek -20 +KPX Rcaron Uring -20 +KPX Rcaron V -50 +KPX Rcaron W -40 +KPX Rcaron Y -50 +KPX Rcaron Yacute -50 +KPX Rcaron Ydieresis -50 +KPX Rcommaaccent O -20 +KPX Rcommaaccent Oacute -20 +KPX Rcommaaccent Ocircumflex -20 +KPX Rcommaaccent Odieresis -20 +KPX Rcommaaccent Ograve -20 +KPX Rcommaaccent Ohungarumlaut -20 +KPX Rcommaaccent Omacron -20 +KPX Rcommaaccent Oslash -20 +KPX Rcommaaccent Otilde -20 +KPX Rcommaaccent T -20 +KPX Rcommaaccent Tcaron -20 +KPX Rcommaaccent Tcommaaccent -20 +KPX Rcommaaccent U -20 +KPX Rcommaaccent Uacute -20 +KPX Rcommaaccent Ucircumflex -20 +KPX Rcommaaccent Udieresis -20 +KPX Rcommaaccent Ugrave -20 +KPX Rcommaaccent Uhungarumlaut -20 +KPX Rcommaaccent Umacron -20 +KPX Rcommaaccent Uogonek -20 +KPX Rcommaaccent Uring -20 +KPX Rcommaaccent V -50 +KPX Rcommaaccent W -40 +KPX Rcommaaccent Y -50 +KPX Rcommaaccent Yacute -50 +KPX Rcommaaccent Ydieresis -50 +KPX T A -90 +KPX T Aacute -90 +KPX T Abreve -90 +KPX T Acircumflex -90 +KPX T Adieresis -90 +KPX T Agrave -90 +KPX T Amacron -90 +KPX T Aogonek -90 +KPX T Aring -90 +KPX T Atilde -90 +KPX T O -40 +KPX T Oacute -40 +KPX T Ocircumflex -40 +KPX T Odieresis -40 +KPX T Ograve -40 +KPX T Ohungarumlaut -40 +KPX T Omacron -40 +KPX T Oslash -40 +KPX T Otilde -40 +KPX T a -80 +KPX T aacute -80 +KPX T abreve -80 +KPX T acircumflex -80 +KPX T adieresis -80 +KPX T agrave -80 +KPX T amacron -80 +KPX T aogonek -80 +KPX T aring -80 +KPX T atilde -80 +KPX T colon -40 +KPX T comma -80 +KPX T e -60 +KPX T eacute -60 +KPX T ecaron -60 +KPX T ecircumflex -60 +KPX T edieresis -60 +KPX T edotaccent -60 +KPX T egrave -60 +KPX T emacron -60 +KPX T eogonek -60 +KPX T hyphen -120 +KPX T o -80 +KPX T oacute -80 +KPX T ocircumflex -80 +KPX T odieresis -80 +KPX T ograve -80 +KPX T ohungarumlaut -80 +KPX T omacron -80 +KPX T oslash -80 +KPX T otilde -80 +KPX T period -80 +KPX T r -80 +KPX T racute -80 +KPX T rcommaaccent -80 +KPX T semicolon -40 +KPX T u -90 +KPX T uacute -90 +KPX T ucircumflex -90 +KPX T udieresis -90 +KPX T ugrave -90 +KPX T uhungarumlaut -90 +KPX T umacron -90 +KPX T uogonek -90 +KPX T uring -90 +KPX T w -60 +KPX T y -60 +KPX T yacute -60 +KPX T ydieresis -60 +KPX Tcaron A -90 +KPX Tcaron Aacute -90 +KPX Tcaron Abreve -90 +KPX Tcaron Acircumflex -90 +KPX Tcaron Adieresis -90 +KPX Tcaron Agrave -90 +KPX Tcaron Amacron -90 +KPX Tcaron Aogonek -90 +KPX Tcaron Aring -90 +KPX Tcaron Atilde -90 +KPX Tcaron O -40 +KPX Tcaron Oacute -40 +KPX Tcaron Ocircumflex -40 +KPX Tcaron Odieresis -40 +KPX Tcaron Ograve -40 +KPX Tcaron Ohungarumlaut -40 +KPX Tcaron Omacron -40 +KPX Tcaron Oslash -40 +KPX Tcaron Otilde -40 +KPX Tcaron a -80 +KPX Tcaron aacute -80 +KPX Tcaron abreve -80 +KPX Tcaron acircumflex -80 +KPX Tcaron adieresis -80 +KPX Tcaron agrave -80 +KPX Tcaron amacron -80 +KPX Tcaron aogonek -80 +KPX Tcaron aring -80 +KPX Tcaron atilde -80 +KPX Tcaron colon -40 +KPX Tcaron comma -80 +KPX Tcaron e -60 +KPX Tcaron eacute -60 +KPX Tcaron ecaron -60 +KPX Tcaron ecircumflex -60 +KPX Tcaron edieresis -60 +KPX Tcaron edotaccent -60 +KPX Tcaron egrave -60 +KPX Tcaron emacron -60 +KPX Tcaron eogonek -60 +KPX Tcaron hyphen -120 +KPX Tcaron o -80 +KPX Tcaron oacute -80 +KPX Tcaron ocircumflex -80 +KPX Tcaron odieresis -80 +KPX Tcaron ograve -80 +KPX Tcaron ohungarumlaut -80 +KPX Tcaron omacron -80 +KPX Tcaron oslash -80 +KPX Tcaron otilde -80 +KPX Tcaron period -80 +KPX Tcaron r -80 +KPX Tcaron racute -80 +KPX Tcaron rcommaaccent -80 +KPX Tcaron semicolon -40 +KPX Tcaron u -90 +KPX Tcaron uacute -90 +KPX Tcaron ucircumflex -90 +KPX Tcaron udieresis -90 +KPX Tcaron ugrave -90 +KPX Tcaron uhungarumlaut -90 +KPX Tcaron umacron -90 +KPX Tcaron uogonek -90 +KPX Tcaron uring -90 +KPX Tcaron w -60 +KPX Tcaron y -60 +KPX Tcaron yacute -60 +KPX Tcaron ydieresis -60 +KPX Tcommaaccent A -90 +KPX Tcommaaccent Aacute -90 +KPX Tcommaaccent Abreve -90 +KPX Tcommaaccent Acircumflex -90 +KPX Tcommaaccent Adieresis -90 +KPX Tcommaaccent Agrave -90 +KPX Tcommaaccent Amacron -90 +KPX Tcommaaccent Aogonek -90 +KPX Tcommaaccent Aring -90 +KPX Tcommaaccent Atilde -90 +KPX Tcommaaccent O -40 +KPX Tcommaaccent Oacute -40 +KPX Tcommaaccent Ocircumflex -40 +KPX Tcommaaccent Odieresis -40 +KPX Tcommaaccent Ograve -40 +KPX Tcommaaccent Ohungarumlaut -40 +KPX Tcommaaccent Omacron -40 +KPX Tcommaaccent Oslash -40 +KPX Tcommaaccent Otilde -40 +KPX Tcommaaccent a -80 +KPX Tcommaaccent aacute -80 +KPX Tcommaaccent abreve -80 +KPX Tcommaaccent acircumflex -80 +KPX Tcommaaccent adieresis -80 +KPX Tcommaaccent agrave -80 +KPX Tcommaaccent amacron -80 +KPX Tcommaaccent aogonek -80 +KPX Tcommaaccent aring -80 +KPX Tcommaaccent atilde -80 +KPX Tcommaaccent colon -40 +KPX Tcommaaccent comma -80 +KPX Tcommaaccent e -60 +KPX Tcommaaccent eacute -60 +KPX Tcommaaccent ecaron -60 +KPX Tcommaaccent ecircumflex -60 +KPX Tcommaaccent edieresis -60 +KPX Tcommaaccent edotaccent -60 +KPX Tcommaaccent egrave -60 +KPX Tcommaaccent emacron -60 +KPX Tcommaaccent eogonek -60 +KPX Tcommaaccent hyphen -120 +KPX Tcommaaccent o -80 +KPX Tcommaaccent oacute -80 +KPX Tcommaaccent ocircumflex -80 +KPX Tcommaaccent odieresis -80 +KPX Tcommaaccent ograve -80 +KPX Tcommaaccent ohungarumlaut -80 +KPX Tcommaaccent omacron -80 +KPX Tcommaaccent oslash -80 +KPX Tcommaaccent otilde -80 +KPX Tcommaaccent period -80 +KPX Tcommaaccent r -80 +KPX Tcommaaccent racute -80 +KPX Tcommaaccent rcommaaccent -80 +KPX Tcommaaccent semicolon -40 +KPX Tcommaaccent u -90 +KPX Tcommaaccent uacute -90 +KPX Tcommaaccent ucircumflex -90 +KPX Tcommaaccent udieresis -90 +KPX Tcommaaccent ugrave -90 +KPX Tcommaaccent uhungarumlaut -90 +KPX Tcommaaccent umacron -90 +KPX Tcommaaccent uogonek -90 +KPX Tcommaaccent uring -90 +KPX Tcommaaccent w -60 +KPX Tcommaaccent y -60 +KPX Tcommaaccent yacute -60 +KPX Tcommaaccent ydieresis -60 +KPX U A -50 +KPX U Aacute -50 +KPX U Abreve -50 +KPX U Acircumflex -50 +KPX U Adieresis -50 +KPX U Agrave -50 +KPX U Amacron -50 +KPX U Aogonek -50 +KPX U Aring -50 +KPX U Atilde -50 +KPX U comma -30 +KPX U period -30 +KPX Uacute A -50 +KPX Uacute Aacute -50 +KPX Uacute Abreve -50 +KPX Uacute Acircumflex -50 +KPX Uacute Adieresis -50 +KPX Uacute Agrave -50 +KPX Uacute Amacron -50 +KPX Uacute Aogonek -50 +KPX Uacute Aring -50 +KPX Uacute Atilde -50 +KPX Uacute comma -30 +KPX Uacute period -30 +KPX Ucircumflex A -50 +KPX Ucircumflex Aacute -50 +KPX Ucircumflex Abreve -50 +KPX Ucircumflex Acircumflex -50 +KPX Ucircumflex Adieresis -50 +KPX Ucircumflex Agrave -50 +KPX Ucircumflex Amacron -50 +KPX Ucircumflex Aogonek -50 +KPX Ucircumflex Aring -50 +KPX Ucircumflex Atilde -50 +KPX Ucircumflex comma -30 +KPX Ucircumflex period -30 +KPX Udieresis A -50 +KPX Udieresis Aacute -50 +KPX Udieresis Abreve -50 +KPX Udieresis Acircumflex -50 +KPX Udieresis Adieresis -50 +KPX Udieresis Agrave -50 +KPX Udieresis Amacron -50 +KPX Udieresis Aogonek -50 +KPX Udieresis Aring -50 +KPX Udieresis Atilde -50 +KPX Udieresis comma -30 +KPX Udieresis period -30 +KPX Ugrave A -50 +KPX Ugrave Aacute -50 +KPX Ugrave Abreve -50 +KPX Ugrave Acircumflex -50 +KPX Ugrave Adieresis -50 +KPX Ugrave Agrave -50 +KPX Ugrave Amacron -50 +KPX Ugrave Aogonek -50 +KPX Ugrave Aring -50 +KPX Ugrave Atilde -50 +KPX Ugrave comma -30 +KPX Ugrave period -30 +KPX Uhungarumlaut A -50 +KPX Uhungarumlaut Aacute -50 +KPX Uhungarumlaut Abreve -50 +KPX Uhungarumlaut Acircumflex -50 +KPX Uhungarumlaut Adieresis -50 +KPX Uhungarumlaut Agrave -50 +KPX Uhungarumlaut Amacron -50 +KPX Uhungarumlaut Aogonek -50 +KPX Uhungarumlaut Aring -50 +KPX Uhungarumlaut Atilde -50 +KPX Uhungarumlaut comma -30 +KPX Uhungarumlaut period -30 +KPX Umacron A -50 +KPX Umacron Aacute -50 +KPX Umacron Abreve -50 +KPX Umacron Acircumflex -50 +KPX Umacron Adieresis -50 +KPX Umacron Agrave -50 +KPX Umacron Amacron -50 +KPX Umacron Aogonek -50 +KPX Umacron Aring -50 +KPX Umacron Atilde -50 +KPX Umacron comma -30 +KPX Umacron period -30 +KPX Uogonek A -50 +KPX Uogonek Aacute -50 +KPX Uogonek Abreve -50 +KPX Uogonek Acircumflex -50 +KPX Uogonek Adieresis -50 +KPX Uogonek Agrave -50 +KPX Uogonek Amacron -50 +KPX Uogonek Aogonek -50 +KPX Uogonek Aring -50 +KPX Uogonek Atilde -50 +KPX Uogonek comma -30 +KPX Uogonek period -30 +KPX Uring A -50 +KPX Uring Aacute -50 +KPX Uring Abreve -50 +KPX Uring Acircumflex -50 +KPX Uring Adieresis -50 +KPX Uring Agrave -50 +KPX Uring Amacron -50 +KPX Uring Aogonek -50 +KPX Uring Aring -50 +KPX Uring Atilde -50 +KPX Uring comma -30 +KPX Uring period -30 +KPX V A -80 +KPX V Aacute -80 +KPX V Abreve -80 +KPX V Acircumflex -80 +KPX V Adieresis -80 +KPX V Agrave -80 +KPX V Amacron -80 +KPX V Aogonek -80 +KPX V Aring -80 +KPX V Atilde -80 +KPX V G -50 +KPX V Gbreve -50 +KPX V Gcommaaccent -50 +KPX V O -50 +KPX V Oacute -50 +KPX V Ocircumflex -50 +KPX V Odieresis -50 +KPX V Ograve -50 +KPX V Ohungarumlaut -50 +KPX V Omacron -50 +KPX V Oslash -50 +KPX V Otilde -50 +KPX V a -60 +KPX V aacute -60 +KPX V abreve -60 +KPX V acircumflex -60 +KPX V adieresis -60 +KPX V agrave -60 +KPX V amacron -60 +KPX V aogonek -60 +KPX V aring -60 +KPX V atilde -60 +KPX V colon -40 +KPX V comma -120 +KPX V e -50 +KPX V eacute -50 +KPX V ecaron -50 +KPX V ecircumflex -50 +KPX V edieresis -50 +KPX V edotaccent -50 +KPX V egrave -50 +KPX V emacron -50 +KPX V eogonek -50 +KPX V hyphen -80 +KPX V o -90 +KPX V oacute -90 +KPX V ocircumflex -90 +KPX V odieresis -90 +KPX V ograve -90 +KPX V ohungarumlaut -90 +KPX V omacron -90 +KPX V oslash -90 +KPX V otilde -90 +KPX V period -120 +KPX V semicolon -40 +KPX V u -60 +KPX V uacute -60 +KPX V ucircumflex -60 +KPX V udieresis -60 +KPX V ugrave -60 +KPX V uhungarumlaut -60 +KPX V umacron -60 +KPX V uogonek -60 +KPX V uring -60 +KPX W A -60 +KPX W Aacute -60 +KPX W Abreve -60 +KPX W Acircumflex -60 +KPX W Adieresis -60 +KPX W Agrave -60 +KPX W Amacron -60 +KPX W Aogonek -60 +KPX W Aring -60 +KPX W Atilde -60 +KPX W O -20 +KPX W Oacute -20 +KPX W Ocircumflex -20 +KPX W Odieresis -20 +KPX W Ograve -20 +KPX W Ohungarumlaut -20 +KPX W Omacron -20 +KPX W Oslash -20 +KPX W Otilde -20 +KPX W a -40 +KPX W aacute -40 +KPX W abreve -40 +KPX W acircumflex -40 +KPX W adieresis -40 +KPX W agrave -40 +KPX W amacron -40 +KPX W aogonek -40 +KPX W aring -40 +KPX W atilde -40 +KPX W colon -10 +KPX W comma -80 +KPX W e -35 +KPX W eacute -35 +KPX W ecaron -35 +KPX W ecircumflex -35 +KPX W edieresis -35 +KPX W edotaccent -35 +KPX W egrave -35 +KPX W emacron -35 +KPX W eogonek -35 +KPX W hyphen -40 +KPX W o -60 +KPX W oacute -60 +KPX W ocircumflex -60 +KPX W odieresis -60 +KPX W ograve -60 +KPX W ohungarumlaut -60 +KPX W omacron -60 +KPX W oslash -60 +KPX W otilde -60 +KPX W period -80 +KPX W semicolon -10 +KPX W u -45 +KPX W uacute -45 +KPX W ucircumflex -45 +KPX W udieresis -45 +KPX W ugrave -45 +KPX W uhungarumlaut -45 +KPX W umacron -45 +KPX W uogonek -45 +KPX W uring -45 +KPX W y -20 +KPX W yacute -20 +KPX W ydieresis -20 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -70 +KPX Y Oacute -70 +KPX Y Ocircumflex -70 +KPX Y Odieresis -70 +KPX Y Ograve -70 +KPX Y Ohungarumlaut -70 +KPX Y Omacron -70 +KPX Y Oslash -70 +KPX Y Otilde -70 +KPX Y a -90 +KPX Y aacute -90 +KPX Y abreve -90 +KPX Y acircumflex -90 +KPX Y adieresis -90 +KPX Y agrave -90 +KPX Y amacron -90 +KPX Y aogonek -90 +KPX Y aring -90 +KPX Y atilde -90 +KPX Y colon -50 +KPX Y comma -100 +KPX Y e -80 +KPX Y eacute -80 +KPX Y ecaron -80 +KPX Y ecircumflex -80 +KPX Y edieresis -80 +KPX Y edotaccent -80 +KPX Y egrave -80 +KPX Y emacron -80 +KPX Y eogonek -80 +KPX Y o -100 +KPX Y oacute -100 +KPX Y ocircumflex -100 +KPX Y odieresis -100 +KPX Y ograve -100 +KPX Y ohungarumlaut -100 +KPX Y omacron -100 +KPX Y oslash -100 +KPX Y otilde -100 +KPX Y period -100 +KPX Y semicolon -50 +KPX Y u -100 +KPX Y uacute -100 +KPX Y ucircumflex -100 +KPX Y udieresis -100 +KPX Y ugrave -100 +KPX Y uhungarumlaut -100 +KPX Y umacron -100 +KPX Y uogonek -100 +KPX Y uring -100 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -70 +KPX Yacute Oacute -70 +KPX Yacute Ocircumflex -70 +KPX Yacute Odieresis -70 +KPX Yacute Ograve -70 +KPX Yacute Ohungarumlaut -70 +KPX Yacute Omacron -70 +KPX Yacute Oslash -70 +KPX Yacute Otilde -70 +KPX Yacute a -90 +KPX Yacute aacute -90 +KPX Yacute abreve -90 +KPX Yacute acircumflex -90 +KPX Yacute adieresis -90 +KPX Yacute agrave -90 +KPX Yacute amacron -90 +KPX Yacute aogonek -90 +KPX Yacute aring -90 +KPX Yacute atilde -90 +KPX Yacute colon -50 +KPX Yacute comma -100 +KPX Yacute e -80 +KPX Yacute eacute -80 +KPX Yacute ecaron -80 +KPX Yacute ecircumflex -80 +KPX Yacute edieresis -80 +KPX Yacute edotaccent -80 +KPX Yacute egrave -80 +KPX Yacute emacron -80 +KPX Yacute eogonek -80 +KPX Yacute o -100 +KPX Yacute oacute -100 +KPX Yacute ocircumflex -100 +KPX Yacute odieresis -100 +KPX Yacute ograve -100 +KPX Yacute ohungarumlaut -100 +KPX Yacute omacron -100 +KPX Yacute oslash -100 +KPX Yacute otilde -100 +KPX Yacute period -100 +KPX Yacute semicolon -50 +KPX Yacute u -100 +KPX Yacute uacute -100 +KPX Yacute ucircumflex -100 +KPX Yacute udieresis -100 +KPX Yacute ugrave -100 +KPX Yacute uhungarumlaut -100 +KPX Yacute umacron -100 +KPX Yacute uogonek -100 +KPX Yacute uring -100 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -70 +KPX Ydieresis Oacute -70 +KPX Ydieresis Ocircumflex -70 +KPX Ydieresis Odieresis -70 +KPX Ydieresis Ograve -70 +KPX Ydieresis Ohungarumlaut -70 +KPX Ydieresis Omacron -70 +KPX Ydieresis Oslash -70 +KPX Ydieresis Otilde -70 +KPX Ydieresis a -90 +KPX Ydieresis aacute -90 +KPX Ydieresis abreve -90 +KPX Ydieresis acircumflex -90 +KPX Ydieresis adieresis -90 +KPX Ydieresis agrave -90 +KPX Ydieresis amacron -90 +KPX Ydieresis aogonek -90 +KPX Ydieresis aring -90 +KPX Ydieresis atilde -90 +KPX Ydieresis colon -50 +KPX Ydieresis comma -100 +KPX Ydieresis e -80 +KPX Ydieresis eacute -80 +KPX Ydieresis ecaron -80 +KPX Ydieresis ecircumflex -80 +KPX Ydieresis edieresis -80 +KPX Ydieresis edotaccent -80 +KPX Ydieresis egrave -80 +KPX Ydieresis emacron -80 +KPX Ydieresis eogonek -80 +KPX Ydieresis o -100 +KPX Ydieresis oacute -100 +KPX Ydieresis ocircumflex -100 +KPX Ydieresis odieresis -100 +KPX Ydieresis ograve -100 +KPX Ydieresis ohungarumlaut -100 +KPX Ydieresis omacron -100 +KPX Ydieresis oslash -100 +KPX Ydieresis otilde -100 +KPX Ydieresis period -100 +KPX Ydieresis semicolon -50 +KPX Ydieresis u -100 +KPX Ydieresis uacute -100 +KPX Ydieresis ucircumflex -100 +KPX Ydieresis udieresis -100 +KPX Ydieresis ugrave -100 +KPX Ydieresis uhungarumlaut -100 +KPX Ydieresis umacron -100 +KPX Ydieresis uogonek -100 +KPX Ydieresis uring -100 +KPX a g -10 +KPX a gbreve -10 +KPX a gcommaaccent -10 +KPX a v -15 +KPX a w -15 +KPX a y -20 +KPX a yacute -20 +KPX a ydieresis -20 +KPX aacute g -10 +KPX aacute gbreve -10 +KPX aacute gcommaaccent -10 +KPX aacute v -15 +KPX aacute w -15 +KPX aacute y -20 +KPX aacute yacute -20 +KPX aacute ydieresis -20 +KPX abreve g -10 +KPX abreve gbreve -10 +KPX abreve gcommaaccent -10 +KPX abreve v -15 +KPX abreve w -15 +KPX abreve y -20 +KPX abreve yacute -20 +KPX abreve ydieresis -20 +KPX acircumflex g -10 +KPX acircumflex gbreve -10 +KPX acircumflex gcommaaccent -10 +KPX acircumflex v -15 +KPX acircumflex w -15 +KPX acircumflex y -20 +KPX acircumflex yacute -20 +KPX acircumflex ydieresis -20 +KPX adieresis g -10 +KPX adieresis gbreve -10 +KPX adieresis gcommaaccent -10 +KPX adieresis v -15 +KPX adieresis w -15 +KPX adieresis y -20 +KPX adieresis yacute -20 +KPX adieresis ydieresis -20 +KPX agrave g -10 +KPX agrave gbreve -10 +KPX agrave gcommaaccent -10 +KPX agrave v -15 +KPX agrave w -15 +KPX agrave y -20 +KPX agrave yacute -20 +KPX agrave ydieresis -20 +KPX amacron g -10 +KPX amacron gbreve -10 +KPX amacron gcommaaccent -10 +KPX amacron v -15 +KPX amacron w -15 +KPX amacron y -20 +KPX amacron yacute -20 +KPX amacron ydieresis -20 +KPX aogonek g -10 +KPX aogonek gbreve -10 +KPX aogonek gcommaaccent -10 +KPX aogonek v -15 +KPX aogonek w -15 +KPX aogonek y -20 +KPX aogonek yacute -20 +KPX aogonek ydieresis -20 +KPX aring g -10 +KPX aring gbreve -10 +KPX aring gcommaaccent -10 +KPX aring v -15 +KPX aring w -15 +KPX aring y -20 +KPX aring yacute -20 +KPX aring ydieresis -20 +KPX atilde g -10 +KPX atilde gbreve -10 +KPX atilde gcommaaccent -10 +KPX atilde v -15 +KPX atilde w -15 +KPX atilde y -20 +KPX atilde yacute -20 +KPX atilde ydieresis -20 +KPX b l -10 +KPX b lacute -10 +KPX b lcommaaccent -10 +KPX b lslash -10 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -20 +KPX b y -20 +KPX b yacute -20 +KPX b ydieresis -20 +KPX c h -10 +KPX c k -20 +KPX c kcommaaccent -20 +KPX c l -20 +KPX c lacute -20 +KPX c lcommaaccent -20 +KPX c lslash -20 +KPX c y -10 +KPX c yacute -10 +KPX c ydieresis -10 +KPX cacute h -10 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX cacute l -20 +KPX cacute lacute -20 +KPX cacute lcommaaccent -20 +KPX cacute lslash -20 +KPX cacute y -10 +KPX cacute yacute -10 +KPX cacute ydieresis -10 +KPX ccaron h -10 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccaron l -20 +KPX ccaron lacute -20 +KPX ccaron lcommaaccent -20 +KPX ccaron lslash -20 +KPX ccaron y -10 +KPX ccaron yacute -10 +KPX ccaron ydieresis -10 +KPX ccedilla h -10 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX ccedilla l -20 +KPX ccedilla lacute -20 +KPX ccedilla lcommaaccent -20 +KPX ccedilla lslash -20 +KPX ccedilla y -10 +KPX ccedilla yacute -10 +KPX ccedilla ydieresis -10 +KPX colon space -40 +KPX comma quotedblright -120 +KPX comma quoteright -120 +KPX comma space -40 +KPX d d -10 +KPX d dcroat -10 +KPX d v -15 +KPX d w -15 +KPX d y -15 +KPX d yacute -15 +KPX d ydieresis -15 +KPX dcroat d -10 +KPX dcroat dcroat -10 +KPX dcroat v -15 +KPX dcroat w -15 +KPX dcroat y -15 +KPX dcroat yacute -15 +KPX dcroat ydieresis -15 +KPX e comma 10 +KPX e period 20 +KPX e v -15 +KPX e w -15 +KPX e x -15 +KPX e y -15 +KPX e yacute -15 +KPX e ydieresis -15 +KPX eacute comma 10 +KPX eacute period 20 +KPX eacute v -15 +KPX eacute w -15 +KPX eacute x -15 +KPX eacute y -15 +KPX eacute yacute -15 +KPX eacute ydieresis -15 +KPX ecaron comma 10 +KPX ecaron period 20 +KPX ecaron v -15 +KPX ecaron w -15 +KPX ecaron x -15 +KPX ecaron y -15 +KPX ecaron yacute -15 +KPX ecaron ydieresis -15 +KPX ecircumflex comma 10 +KPX ecircumflex period 20 +KPX ecircumflex v -15 +KPX ecircumflex w -15 +KPX ecircumflex x -15 +KPX ecircumflex y -15 +KPX ecircumflex yacute -15 +KPX ecircumflex ydieresis -15 +KPX edieresis comma 10 +KPX edieresis period 20 +KPX edieresis v -15 +KPX edieresis w -15 +KPX edieresis x -15 +KPX edieresis y -15 +KPX edieresis yacute -15 +KPX edieresis ydieresis -15 +KPX edotaccent comma 10 +KPX edotaccent period 20 +KPX edotaccent v -15 +KPX edotaccent w -15 +KPX edotaccent x -15 +KPX edotaccent y -15 +KPX edotaccent yacute -15 +KPX edotaccent ydieresis -15 +KPX egrave comma 10 +KPX egrave period 20 +KPX egrave v -15 +KPX egrave w -15 +KPX egrave x -15 +KPX egrave y -15 +KPX egrave yacute -15 +KPX egrave ydieresis -15 +KPX emacron comma 10 +KPX emacron period 20 +KPX emacron v -15 +KPX emacron w -15 +KPX emacron x -15 +KPX emacron y -15 +KPX emacron yacute -15 +KPX emacron ydieresis -15 +KPX eogonek comma 10 +KPX eogonek period 20 +KPX eogonek v -15 +KPX eogonek w -15 +KPX eogonek x -15 +KPX eogonek y -15 +KPX eogonek yacute -15 +KPX eogonek ydieresis -15 +KPX f comma -10 +KPX f e -10 +KPX f eacute -10 +KPX f ecaron -10 +KPX f ecircumflex -10 +KPX f edieresis -10 +KPX f edotaccent -10 +KPX f egrave -10 +KPX f emacron -10 +KPX f eogonek -10 +KPX f o -20 +KPX f oacute -20 +KPX f ocircumflex -20 +KPX f odieresis -20 +KPX f ograve -20 +KPX f ohungarumlaut -20 +KPX f omacron -20 +KPX f oslash -20 +KPX f otilde -20 +KPX f period -10 +KPX f quotedblright 30 +KPX f quoteright 30 +KPX g e 10 +KPX g eacute 10 +KPX g ecaron 10 +KPX g ecircumflex 10 +KPX g edieresis 10 +KPX g edotaccent 10 +KPX g egrave 10 +KPX g emacron 10 +KPX g eogonek 10 +KPX g g -10 +KPX g gbreve -10 +KPX g gcommaaccent -10 +KPX gbreve e 10 +KPX gbreve eacute 10 +KPX gbreve ecaron 10 +KPX gbreve ecircumflex 10 +KPX gbreve edieresis 10 +KPX gbreve edotaccent 10 +KPX gbreve egrave 10 +KPX gbreve emacron 10 +KPX gbreve eogonek 10 +KPX gbreve g -10 +KPX gbreve gbreve -10 +KPX gbreve gcommaaccent -10 +KPX gcommaaccent e 10 +KPX gcommaaccent eacute 10 +KPX gcommaaccent ecaron 10 +KPX gcommaaccent ecircumflex 10 +KPX gcommaaccent edieresis 10 +KPX gcommaaccent edotaccent 10 +KPX gcommaaccent egrave 10 +KPX gcommaaccent emacron 10 +KPX gcommaaccent eogonek 10 +KPX gcommaaccent g -10 +KPX gcommaaccent gbreve -10 +KPX gcommaaccent gcommaaccent -10 +KPX h y -20 +KPX h yacute -20 +KPX h ydieresis -20 +KPX k o -15 +KPX k oacute -15 +KPX k ocircumflex -15 +KPX k odieresis -15 +KPX k ograve -15 +KPX k ohungarumlaut -15 +KPX k omacron -15 +KPX k oslash -15 +KPX k otilde -15 +KPX kcommaaccent o -15 +KPX kcommaaccent oacute -15 +KPX kcommaaccent ocircumflex -15 +KPX kcommaaccent odieresis -15 +KPX kcommaaccent ograve -15 +KPX kcommaaccent ohungarumlaut -15 +KPX kcommaaccent omacron -15 +KPX kcommaaccent oslash -15 +KPX kcommaaccent otilde -15 +KPX l w -15 +KPX l y -15 +KPX l yacute -15 +KPX l ydieresis -15 +KPX lacute w -15 +KPX lacute y -15 +KPX lacute yacute -15 +KPX lacute ydieresis -15 +KPX lcommaaccent w -15 +KPX lcommaaccent y -15 +KPX lcommaaccent yacute -15 +KPX lcommaaccent ydieresis -15 +KPX lslash w -15 +KPX lslash y -15 +KPX lslash yacute -15 +KPX lslash ydieresis -15 +KPX m u -20 +KPX m uacute -20 +KPX m ucircumflex -20 +KPX m udieresis -20 +KPX m ugrave -20 +KPX m uhungarumlaut -20 +KPX m umacron -20 +KPX m uogonek -20 +KPX m uring -20 +KPX m y -30 +KPX m yacute -30 +KPX m ydieresis -30 +KPX n u -10 +KPX n uacute -10 +KPX n ucircumflex -10 +KPX n udieresis -10 +KPX n ugrave -10 +KPX n uhungarumlaut -10 +KPX n umacron -10 +KPX n uogonek -10 +KPX n uring -10 +KPX n v -40 +KPX n y -20 +KPX n yacute -20 +KPX n ydieresis -20 +KPX nacute u -10 +KPX nacute uacute -10 +KPX nacute ucircumflex -10 +KPX nacute udieresis -10 +KPX nacute ugrave -10 +KPX nacute uhungarumlaut -10 +KPX nacute umacron -10 +KPX nacute uogonek -10 +KPX nacute uring -10 +KPX nacute v -40 +KPX nacute y -20 +KPX nacute yacute -20 +KPX nacute ydieresis -20 +KPX ncaron u -10 +KPX ncaron uacute -10 +KPX ncaron ucircumflex -10 +KPX ncaron udieresis -10 +KPX ncaron ugrave -10 +KPX ncaron uhungarumlaut -10 +KPX ncaron umacron -10 +KPX ncaron uogonek -10 +KPX ncaron uring -10 +KPX ncaron v -40 +KPX ncaron y -20 +KPX ncaron yacute -20 +KPX ncaron ydieresis -20 +KPX ncommaaccent u -10 +KPX ncommaaccent uacute -10 +KPX ncommaaccent ucircumflex -10 +KPX ncommaaccent udieresis -10 +KPX ncommaaccent ugrave -10 +KPX ncommaaccent uhungarumlaut -10 +KPX ncommaaccent umacron -10 +KPX ncommaaccent uogonek -10 +KPX ncommaaccent uring -10 +KPX ncommaaccent v -40 +KPX ncommaaccent y -20 +KPX ncommaaccent yacute -20 +KPX ncommaaccent ydieresis -20 +KPX ntilde u -10 +KPX ntilde uacute -10 +KPX ntilde ucircumflex -10 +KPX ntilde udieresis -10 +KPX ntilde ugrave -10 +KPX ntilde uhungarumlaut -10 +KPX ntilde umacron -10 +KPX ntilde uogonek -10 +KPX ntilde uring -10 +KPX ntilde v -40 +KPX ntilde y -20 +KPX ntilde yacute -20 +KPX ntilde ydieresis -20 +KPX o v -20 +KPX o w -15 +KPX o x -30 +KPX o y -20 +KPX o yacute -20 +KPX o ydieresis -20 +KPX oacute v -20 +KPX oacute w -15 +KPX oacute x -30 +KPX oacute y -20 +KPX oacute yacute -20 +KPX oacute ydieresis -20 +KPX ocircumflex v -20 +KPX ocircumflex w -15 +KPX ocircumflex x -30 +KPX ocircumflex y -20 +KPX ocircumflex yacute -20 +KPX ocircumflex ydieresis -20 +KPX odieresis v -20 +KPX odieresis w -15 +KPX odieresis x -30 +KPX odieresis y -20 +KPX odieresis yacute -20 +KPX odieresis ydieresis -20 +KPX ograve v -20 +KPX ograve w -15 +KPX ograve x -30 +KPX ograve y -20 +KPX ograve yacute -20 +KPX ograve ydieresis -20 +KPX ohungarumlaut v -20 +KPX ohungarumlaut w -15 +KPX ohungarumlaut x -30 +KPX ohungarumlaut y -20 +KPX ohungarumlaut yacute -20 +KPX ohungarumlaut ydieresis -20 +KPX omacron v -20 +KPX omacron w -15 +KPX omacron x -30 +KPX omacron y -20 +KPX omacron yacute -20 +KPX omacron ydieresis -20 +KPX oslash v -20 +KPX oslash w -15 +KPX oslash x -30 +KPX oslash y -20 +KPX oslash yacute -20 +KPX oslash ydieresis -20 +KPX otilde v -20 +KPX otilde w -15 +KPX otilde x -30 +KPX otilde y -20 +KPX otilde yacute -20 +KPX otilde ydieresis -20 +KPX p y -15 +KPX p yacute -15 +KPX p ydieresis -15 +KPX period quotedblright -120 +KPX period quoteright -120 +KPX period space -40 +KPX quotedblright space -80 +KPX quoteleft quoteleft -46 +KPX quoteright d -80 +KPX quoteright dcroat -80 +KPX quoteright l -20 +KPX quoteright lacute -20 +KPX quoteright lcommaaccent -20 +KPX quoteright lslash -20 +KPX quoteright quoteright -46 +KPX quoteright r -40 +KPX quoteright racute -40 +KPX quoteright rcaron -40 +KPX quoteright rcommaaccent -40 +KPX quoteright s -60 +KPX quoteright sacute -60 +KPX quoteright scaron -60 +KPX quoteright scedilla -60 +KPX quoteright scommaaccent -60 +KPX quoteright space -80 +KPX quoteright v -20 +KPX r c -20 +KPX r cacute -20 +KPX r ccaron -20 +KPX r ccedilla -20 +KPX r comma -60 +KPX r d -20 +KPX r dcroat -20 +KPX r g -15 +KPX r gbreve -15 +KPX r gcommaaccent -15 +KPX r hyphen -20 +KPX r o -20 +KPX r oacute -20 +KPX r ocircumflex -20 +KPX r odieresis -20 +KPX r ograve -20 +KPX r ohungarumlaut -20 +KPX r omacron -20 +KPX r oslash -20 +KPX r otilde -20 +KPX r period -60 +KPX r q -20 +KPX r s -15 +KPX r sacute -15 +KPX r scaron -15 +KPX r scedilla -15 +KPX r scommaaccent -15 +KPX r t 20 +KPX r tcommaaccent 20 +KPX r v 10 +KPX r y 10 +KPX r yacute 10 +KPX r ydieresis 10 +KPX racute c -20 +KPX racute cacute -20 +KPX racute ccaron -20 +KPX racute ccedilla -20 +KPX racute comma -60 +KPX racute d -20 +KPX racute dcroat -20 +KPX racute g -15 +KPX racute gbreve -15 +KPX racute gcommaaccent -15 +KPX racute hyphen -20 +KPX racute o -20 +KPX racute oacute -20 +KPX racute ocircumflex -20 +KPX racute odieresis -20 +KPX racute ograve -20 +KPX racute ohungarumlaut -20 +KPX racute omacron -20 +KPX racute oslash -20 +KPX racute otilde -20 +KPX racute period -60 +KPX racute q -20 +KPX racute s -15 +KPX racute sacute -15 +KPX racute scaron -15 +KPX racute scedilla -15 +KPX racute scommaaccent -15 +KPX racute t 20 +KPX racute tcommaaccent 20 +KPX racute v 10 +KPX racute y 10 +KPX racute yacute 10 +KPX racute ydieresis 10 +KPX rcaron c -20 +KPX rcaron cacute -20 +KPX rcaron ccaron -20 +KPX rcaron ccedilla -20 +KPX rcaron comma -60 +KPX rcaron d -20 +KPX rcaron dcroat -20 +KPX rcaron g -15 +KPX rcaron gbreve -15 +KPX rcaron gcommaaccent -15 +KPX rcaron hyphen -20 +KPX rcaron o -20 +KPX rcaron oacute -20 +KPX rcaron ocircumflex -20 +KPX rcaron odieresis -20 +KPX rcaron ograve -20 +KPX rcaron ohungarumlaut -20 +KPX rcaron omacron -20 +KPX rcaron oslash -20 +KPX rcaron otilde -20 +KPX rcaron period -60 +KPX rcaron q -20 +KPX rcaron s -15 +KPX rcaron sacute -15 +KPX rcaron scaron -15 +KPX rcaron scedilla -15 +KPX rcaron scommaaccent -15 +KPX rcaron t 20 +KPX rcaron tcommaaccent 20 +KPX rcaron v 10 +KPX rcaron y 10 +KPX rcaron yacute 10 +KPX rcaron ydieresis 10 +KPX rcommaaccent c -20 +KPX rcommaaccent cacute -20 +KPX rcommaaccent ccaron -20 +KPX rcommaaccent ccedilla -20 +KPX rcommaaccent comma -60 +KPX rcommaaccent d -20 +KPX rcommaaccent dcroat -20 +KPX rcommaaccent g -15 +KPX rcommaaccent gbreve -15 +KPX rcommaaccent gcommaaccent -15 +KPX rcommaaccent hyphen -20 +KPX rcommaaccent o -20 +KPX rcommaaccent oacute -20 +KPX rcommaaccent ocircumflex -20 +KPX rcommaaccent odieresis -20 +KPX rcommaaccent ograve -20 +KPX rcommaaccent ohungarumlaut -20 +KPX rcommaaccent omacron -20 +KPX rcommaaccent oslash -20 +KPX rcommaaccent otilde -20 +KPX rcommaaccent period -60 +KPX rcommaaccent q -20 +KPX rcommaaccent s -15 +KPX rcommaaccent sacute -15 +KPX rcommaaccent scaron -15 +KPX rcommaaccent scedilla -15 +KPX rcommaaccent scommaaccent -15 +KPX rcommaaccent t 20 +KPX rcommaaccent tcommaaccent 20 +KPX rcommaaccent v 10 +KPX rcommaaccent y 10 +KPX rcommaaccent yacute 10 +KPX rcommaaccent ydieresis 10 +KPX s w -15 +KPX sacute w -15 +KPX scaron w -15 +KPX scedilla w -15 +KPX scommaaccent w -15 +KPX semicolon space -40 +KPX space T -100 +KPX space Tcaron -100 +KPX space Tcommaaccent -100 +KPX space V -80 +KPX space W -80 +KPX space Y -120 +KPX space Yacute -120 +KPX space Ydieresis -120 +KPX space quotedblleft -80 +KPX space quoteleft -60 +KPX v a -20 +KPX v aacute -20 +KPX v abreve -20 +KPX v acircumflex -20 +KPX v adieresis -20 +KPX v agrave -20 +KPX v amacron -20 +KPX v aogonek -20 +KPX v aring -20 +KPX v atilde -20 +KPX v comma -80 +KPX v o -30 +KPX v oacute -30 +KPX v ocircumflex -30 +KPX v odieresis -30 +KPX v ograve -30 +KPX v ohungarumlaut -30 +KPX v omacron -30 +KPX v oslash -30 +KPX v otilde -30 +KPX v period -80 +KPX w comma -40 +KPX w o -20 +KPX w oacute -20 +KPX w ocircumflex -20 +KPX w odieresis -20 +KPX w ograve -20 +KPX w ohungarumlaut -20 +KPX w omacron -20 +KPX w oslash -20 +KPX w otilde -20 +KPX w period -40 +KPX x e -10 +KPX x eacute -10 +KPX x ecaron -10 +KPX x ecircumflex -10 +KPX x edieresis -10 +KPX x edotaccent -10 +KPX x egrave -10 +KPX x emacron -10 +KPX x eogonek -10 +KPX y a -30 +KPX y aacute -30 +KPX y abreve -30 +KPX y acircumflex -30 +KPX y adieresis -30 +KPX y agrave -30 +KPX y amacron -30 +KPX y aogonek -30 +KPX y aring -30 +KPX y atilde -30 +KPX y comma -80 +KPX y e -10 +KPX y eacute -10 +KPX y ecaron -10 +KPX y ecircumflex -10 +KPX y edieresis -10 +KPX y edotaccent -10 +KPX y egrave -10 +KPX y emacron -10 +KPX y eogonek -10 +KPX y o -25 +KPX y oacute -25 +KPX y ocircumflex -25 +KPX y odieresis -25 +KPX y ograve -25 +KPX y ohungarumlaut -25 +KPX y omacron -25 +KPX y oslash -25 +KPX y otilde -25 +KPX y period -80 +KPX yacute a -30 +KPX yacute aacute -30 +KPX yacute abreve -30 +KPX yacute acircumflex -30 +KPX yacute adieresis -30 +KPX yacute agrave -30 +KPX yacute amacron -30 +KPX yacute aogonek -30 +KPX yacute aring -30 +KPX yacute atilde -30 +KPX yacute comma -80 +KPX yacute e -10 +KPX yacute eacute -10 +KPX yacute ecaron -10 +KPX yacute ecircumflex -10 +KPX yacute edieresis -10 +KPX yacute edotaccent -10 +KPX yacute egrave -10 +KPX yacute emacron -10 +KPX yacute eogonek -10 +KPX yacute o -25 +KPX yacute oacute -25 +KPX yacute ocircumflex -25 +KPX yacute odieresis -25 +KPX yacute ograve -25 +KPX yacute ohungarumlaut -25 +KPX yacute omacron -25 +KPX yacute oslash -25 +KPX yacute otilde -25 +KPX yacute period -80 +KPX ydieresis a -30 +KPX ydieresis aacute -30 +KPX ydieresis abreve -30 +KPX ydieresis acircumflex -30 +KPX ydieresis adieresis -30 +KPX ydieresis agrave -30 +KPX ydieresis amacron -30 +KPX ydieresis aogonek -30 +KPX ydieresis aring -30 +KPX ydieresis atilde -30 +KPX ydieresis comma -80 +KPX ydieresis e -10 +KPX ydieresis eacute -10 +KPX ydieresis ecaron -10 +KPX ydieresis ecircumflex -10 +KPX ydieresis edieresis -10 +KPX ydieresis edotaccent -10 +KPX ydieresis egrave -10 +KPX ydieresis emacron -10 +KPX ydieresis eogonek -10 +KPX ydieresis o -25 +KPX ydieresis oacute -25 +KPX ydieresis ocircumflex -25 +KPX ydieresis odieresis -25 +KPX ydieresis ograve -25 +KPX ydieresis ohungarumlaut -25 +KPX ydieresis omacron -25 +KPX ydieresis oslash -25 +KPX ydieresis otilde -25 +KPX ydieresis period -80 +KPX z e 10 +KPX z eacute 10 +KPX z ecaron 10 +KPX z ecircumflex 10 +KPX z edieresis 10 +KPX z edotaccent 10 +KPX z egrave 10 +KPX z emacron 10 +KPX z eogonek 10 +KPX zacute e 10 +KPX zacute eacute 10 +KPX zacute ecaron 10 +KPX zacute ecircumflex 10 +KPX zacute edieresis 10 +KPX zacute edotaccent 10 +KPX zacute egrave 10 +KPX zacute emacron 10 +KPX zacute eogonek 10 +KPX zcaron e 10 +KPX zcaron eacute 10 +KPX zcaron ecaron 10 +KPX zcaron ecircumflex 10 +KPX zcaron edieresis 10 +KPX zcaron edotaccent 10 +KPX zcaron egrave 10 +KPX zcaron emacron 10 +KPX zcaron eogonek 10 +KPX zdotaccent e 10 +KPX zdotaccent eacute 10 +KPX zdotaccent ecaron 10 +KPX zdotaccent ecircumflex 10 +KPX zdotaccent edieresis 10 +KPX zdotaccent edotaccent 10 +KPX zdotaccent egrave 10 +KPX zdotaccent emacron 10 +KPX zdotaccent eogonek 10 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Helvetica-Bold.afm.php b/application/third_party/dompdf/lib/fonts/Helvetica-Bold.afm.php new file mode 100755 index 00000000..c783fb3f --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Helvetica-Bold.afm.php @@ -0,0 +1,570 @@ + + array ( + 32 => 'space', + 160 => 'space', + 33 => 'exclam', + 34 => 'quotedbl', + 35 => 'numbersign', + 36 => 'dollar', + 37 => 'percent', + 38 => 'ampersand', + 146 => 'quoteright', + 40 => 'parenleft', + 41 => 'parenright', + 42 => 'asterisk', + 43 => 'plus', + 44 => 'comma', + 45 => 'hyphen', + 173 => 'hyphen', + 46 => 'period', + 47 => 'slash', + 48 => 'zero', + 49 => 'one', + 50 => 'two', + 51 => 'three', + 52 => 'four', + 53 => 'five', + 54 => 'six', + 55 => 'seven', + 56 => 'eight', + 57 => 'nine', + 58 => 'colon', + 59 => 'semicolon', + 60 => 'less', + 61 => 'equal', + 62 => 'greater', + 63 => 'question', + 64 => 'at', + 65 => 'A', + 66 => 'B', + 67 => 'C', + 68 => 'D', + 69 => 'E', + 70 => 'F', + 71 => 'G', + 72 => 'H', + 73 => 'I', + 74 => 'J', + 75 => 'K', + 76 => 'L', + 77 => 'M', + 78 => 'N', + 79 => 'O', + 80 => 'P', + 81 => 'Q', + 82 => 'R', + 83 => 'S', + 84 => 'T', + 85 => 'U', + 86 => 'V', + 87 => 'W', + 88 => 'X', + 89 => 'Y', + 90 => 'Z', + 91 => 'bracketleft', + 92 => 'backslash', + 93 => 'bracketright', + 94 => 'asciicircum', + 95 => 'underscore', + 145 => 'quoteleft', + 97 => 'a', + 98 => 'b', + 99 => 'c', + 100 => 'd', + 101 => 'e', + 102 => 'f', + 103 => 'g', + 104 => 'h', + 105 => 'i', + 106 => 'j', + 107 => 'k', + 108 => 'l', + 109 => 'm', + 110 => 'n', + 111 => 'o', + 112 => 'p', + 113 => 'q', + 114 => 'r', + 115 => 's', + 116 => 't', + 117 => 'u', + 118 => 'v', + 119 => 'w', + 120 => 'x', + 121 => 'y', + 122 => 'z', + 123 => 'braceleft', + 124 => 'bar', + 125 => 'braceright', + 126 => 'asciitilde', + 161 => 'exclamdown', + 162 => 'cent', + 163 => 'sterling', + 165 => 'yen', + 131 => 'florin', + 167 => 'section', + 164 => 'currency', + 39 => 'quotesingle', + 147 => 'quotedblleft', + 170 => 'ordfeminine', + 139 => 'guilsinglleft', + 155 => 'guilsinglright', + 150 => 'endash', + 134 => 'dagger', + 135 => 'daggerdbl', + 183 => 'periodcentered', + 182 => 'paragraph', + 149 => 'bullet', + 130 => 'quotesinglbase', + 132 => 'quotedblbase', + 148 => 'quotedblright', + 187 => 'guillemotright', + 133 => 'ellipsis', + 137 => 'perthousand', + 191 => 'questiondown', + 96 => 'grave', + 180 => 'acute', + 136 => 'circumflex', + 152 => 'tilde', + 175 => 'macron', + 168 => 'dieresis', + 184 => 'cedilla', + 151 => 'emdash', + 198 => 'AE', + 216 => 'Oslash', + 140 => 'OE', + 186 => 'ordmasculine', + 230 => 'ae', + 248 => 'oslash', + 156 => 'oe', + 223 => 'germandbls', + 207 => 'Idieresis', + 233 => 'eacute', + 159 => 'Ydieresis', + 247 => 'divide', + 221 => 'Yacute', + 194 => 'Acircumflex', + 225 => 'aacute', + 219 => 'Ucircumflex', + 253 => 'yacute', + 234 => 'ecircumflex', + 220 => 'Udieresis', + 218 => 'Uacute', + 203 => 'Edieresis', + 169 => 'copyright', + 229 => 'aring', + 224 => 'agrave', + 227 => 'atilde', + 154 => 'scaron', + 237 => 'iacute', + 251 => 'ucircumflex', + 226 => 'acircumflex', + 231 => 'ccedilla', + 222 => 'Thorn', + 179 => 'threesuperior', + 210 => 'Ograve', + 192 => 'Agrave', + 215 => 'multiply', + 250 => 'uacute', + 255 => 'ydieresis', + 238 => 'icircumflex', + 202 => 'Ecircumflex', + 228 => 'adieresis', + 235 => 'edieresis', + 205 => 'Iacute', + 177 => 'plusminus', + 166 => 'brokenbar', + 174 => 'registered', + 200 => 'Egrave', + 142 => 'Zcaron', + 208 => 'Eth', + 199 => 'Ccedilla', + 193 => 'Aacute', + 196 => 'Adieresis', + 232 => 'egrave', + 211 => 'Oacute', + 243 => 'oacute', + 239 => 'idieresis', + 212 => 'Ocircumflex', + 217 => 'Ugrave', + 254 => 'thorn', + 178 => 'twosuperior', + 214 => 'Odieresis', + 181 => 'mu', + 236 => 'igrave', + 190 => 'threequarters', + 153 => 'trademark', + 204 => 'Igrave', + 189 => 'onehalf', + 244 => 'ocircumflex', + 241 => 'ntilde', + 201 => 'Eacute', + 188 => 'onequarter', + 138 => 'Scaron', + 176 => 'degree', + 242 => 'ograve', + 249 => 'ugrave', + 209 => 'Ntilde', + 245 => 'otilde', + 195 => 'Atilde', + 197 => 'Aring', + 213 => 'Otilde', + 206 => 'Icircumflex', + 172 => 'logicalnot', + 246 => 'odieresis', + 252 => 'udieresis', + 240 => 'eth', + 158 => 'zcaron', + 185 => 'onesuperior', + 128 => 'Euro', + ), + 'isUnicode' => false, + 'FontName' => 'Helvetica-Bold', + 'FullName' => 'Helvetica Bold', + 'FamilyName' => 'Helvetica', + 'Weight' => 'Bold', + 'ItalicAngle' => '0', + 'IsFixedPitch' => 'false', + 'CharacterSet' => 'ExtendedRoman', + 'FontBBox' => + array ( + 0 => '-170', + 1 => '-228', + 2 => '1003', + 3 => '962', + ), + 'UnderlinePosition' => '-100', + 'UnderlineThickness' => '50', + 'Version' => '002.000', + 'EncodingScheme' => 'WinAnsiEncoding', + 'CapHeight' => '718', + 'XHeight' => '532', + 'Ascender' => '718', + 'Descender' => '-207', + 'StdHW' => '118', + 'StdVW' => '140', + 'StartCharMetrics' => '317', + 'C' => + array ( + 32 => 278.0, + 160 => 278.0, + 33 => 333.0, + 34 => 474.0, + 35 => 556.0, + 36 => 556.0, + 37 => 889.0, + 38 => 722.0, + 146 => 278.0, + 40 => 333.0, + 41 => 333.0, + 42 => 389.0, + 43 => 584.0, + 44 => 278.0, + 45 => 333.0, + 173 => 333.0, + 46 => 278.0, + 47 => 278.0, + 48 => 556.0, + 49 => 556.0, + 50 => 556.0, + 51 => 556.0, + 52 => 556.0, + 53 => 556.0, + 54 => 556.0, + 55 => 556.0, + 56 => 556.0, + 57 => 556.0, + 58 => 333.0, + 59 => 333.0, + 60 => 584.0, + 61 => 584.0, + 62 => 584.0, + 63 => 611.0, + 64 => 975.0, + 65 => 722.0, + 66 => 722.0, + 67 => 722.0, + 68 => 722.0, + 69 => 667.0, + 70 => 611.0, + 71 => 778.0, + 72 => 722.0, + 73 => 278.0, + 74 => 556.0, + 75 => 722.0, + 76 => 611.0, + 77 => 833.0, + 78 => 722.0, + 79 => 778.0, + 80 => 667.0, + 81 => 778.0, + 82 => 722.0, + 83 => 667.0, + 84 => 611.0, + 85 => 722.0, + 86 => 667.0, + 87 => 944.0, + 88 => 667.0, + 89 => 667.0, + 90 => 611.0, + 91 => 333.0, + 92 => 278.0, + 93 => 333.0, + 94 => 584.0, + 95 => 556.0, + 145 => 278.0, + 97 => 556.0, + 98 => 611.0, + 99 => 556.0, + 100 => 611.0, + 101 => 556.0, + 102 => 333.0, + 103 => 611.0, + 104 => 611.0, + 105 => 278.0, + 106 => 278.0, + 107 => 556.0, + 108 => 278.0, + 109 => 889.0, + 110 => 611.0, + 111 => 611.0, + 112 => 611.0, + 113 => 611.0, + 114 => 389.0, + 115 => 556.0, + 116 => 333.0, + 117 => 611.0, + 118 => 556.0, + 119 => 778.0, + 120 => 556.0, + 121 => 556.0, + 122 => 500.0, + 123 => 389.0, + 124 => 280.0, + 125 => 389.0, + 126 => 584.0, + 161 => 333.0, + 162 => 556.0, + 163 => 556.0, + 'fraction' => 167.0, + 165 => 556.0, + 131 => 556.0, + 167 => 556.0, + 164 => 556.0, + 39 => 238.0, + 147 => 500.0, + 170 => 370.0, + 139 => 333.0, + 155 => 333.0, + 'fi' => 611.0, + 'fl' => 611.0, + 150 => 556.0, + 134 => 556.0, + 135 => 556.0, + 183 => 278.0, + 182 => 556.0, + 149 => 350.0, + 130 => 278.0, + 132 => 500.0, + 148 => 500.0, + 187 => 556.0, + 133 => 1000.0, + 137 => 1000.0, + 191 => 611.0, + 96 => 333.0, + 180 => 333.0, + 136 => 333.0, + 152 => 333.0, + 175 => 333.0, + 'breve' => 333.0, + 'dotaccent' => 333.0, + 168 => 333.0, + 'ring' => 333.0, + 184 => 333.0, + 'hungarumlaut' => 333.0, + 'ogonek' => 333.0, + 'caron' => 333.0, + 151 => 1000.0, + 198 => 1000.0, + 'Lslash' => 611.0, + 216 => 778.0, + 140 => 1000.0, + 186 => 365.0, + 230 => 889.0, + 'dotlessi' => 278.0, + 'lslash' => 278.0, + 248 => 611.0, + 156 => 944.0, + 223 => 611.0, + 207 => 278.0, + 233 => 556.0, + 'abreve' => 556.0, + 'uhungarumlaut' => 611.0, + 'ecaron' => 556.0, + 159 => 667.0, + 247 => 584.0, + 221 => 667.0, + 194 => 722.0, + 225 => 556.0, + 219 => 722.0, + 253 => 556.0, + 'scommaaccent' => 556.0, + 234 => 556.0, + 'Uring' => 722.0, + 220 => 722.0, + 'aogonek' => 556.0, + 218 => 722.0, + 'uogonek' => 611.0, + 203 => 667.0, + 'Dcroat' => 722.0, + 'commaaccent' => 250.0, + 169 => 737.0, + 'Emacron' => 667.0, + 'ccaron' => 556.0, + 229 => 556.0, + 'Ncommaaccent' => 722.0, + 'lacute' => 278.0, + 224 => 556.0, + 'Tcommaaccent' => 611.0, + 'Cacute' => 722.0, + 227 => 556.0, + 'Edotaccent' => 667.0, + 154 => 556.0, + 'scedilla' => 556.0, + 237 => 278.0, + 'lozenge' => 494.0, + 'Rcaron' => 722.0, + 'Gcommaaccent' => 778.0, + 251 => 611.0, + 226 => 556.0, + 'Amacron' => 722.0, + 'rcaron' => 389.0, + 231 => 556.0, + 'Zdotaccent' => 611.0, + 222 => 667.0, + 'Omacron' => 778.0, + 'Racute' => 722.0, + 'Sacute' => 667.0, + 'dcaron' => 743.0, + 'Umacron' => 722.0, + 'uring' => 611.0, + 179 => 333.0, + 210 => 778.0, + 192 => 722.0, + 'Abreve' => 722.0, + 215 => 584.0, + 250 => 611.0, + 'Tcaron' => 611.0, + 'partialdiff' => 494.0, + 255 => 556.0, + 'Nacute' => 722.0, + 238 => 278.0, + 202 => 667.0, + 228 => 556.0, + 235 => 556.0, + 'cacute' => 556.0, + 'nacute' => 611.0, + 'umacron' => 611.0, + 'Ncaron' => 722.0, + 205 => 278.0, + 177 => 584.0, + 166 => 280.0, + 174 => 737.0, + 'Gbreve' => 778.0, + 'Idotaccent' => 278.0, + 'summation' => 600.0, + 200 => 667.0, + 'racute' => 389.0, + 'omacron' => 611.0, + 'Zacute' => 611.0, + 142 => 611.0, + 'greaterequal' => 549.0, + 208 => 722.0, + 199 => 722.0, + 'lcommaaccent' => 278.0, + 'tcaron' => 389.0, + 'eogonek' => 556.0, + 'Uogonek' => 722.0, + 193 => 722.0, + 196 => 722.0, + 232 => 556.0, + 'zacute' => 500.0, + 'iogonek' => 278.0, + 211 => 778.0, + 243 => 611.0, + 'amacron' => 556.0, + 'sacute' => 556.0, + 239 => 278.0, + 212 => 778.0, + 217 => 722.0, + 'Delta' => 612.0, + 254 => 611.0, + 178 => 333.0, + 214 => 778.0, + 181 => 611.0, + 236 => 278.0, + 'ohungarumlaut' => 611.0, + 'Eogonek' => 667.0, + 'dcroat' => 611.0, + 190 => 834.0, + 'Scedilla' => 667.0, + 'lcaron' => 400.0, + 'Kcommaaccent' => 722.0, + 'Lacute' => 611.0, + 153 => 1000.0, + 'edotaccent' => 556.0, + 204 => 278.0, + 'Imacron' => 278.0, + 'Lcaron' => 611.0, + 189 => 834.0, + 'lessequal' => 549.0, + 244 => 611.0, + 241 => 611.0, + 'Uhungarumlaut' => 722.0, + 201 => 667.0, + 'emacron' => 556.0, + 'gbreve' => 611.0, + 188 => 834.0, + 138 => 667.0, + 'Scommaaccent' => 667.0, + 'Ohungarumlaut' => 778.0, + 176 => 400.0, + 242 => 611.0, + 'Ccaron' => 722.0, + 249 => 611.0, + 'radical' => 549.0, + 'Dcaron' => 722.0, + 'rcommaaccent' => 389.0, + 209 => 722.0, + 245 => 611.0, + 'Rcommaaccent' => 722.0, + 'Lcommaaccent' => 611.0, + 195 => 722.0, + 'Aogonek' => 722.0, + 197 => 722.0, + 213 => 778.0, + 'zdotaccent' => 500.0, + 'Ecaron' => 667.0, + 'Iogonek' => 278.0, + 'kcommaaccent' => 556.0, + 'minus' => 584.0, + 206 => 278.0, + 'ncaron' => 611.0, + 'tcommaaccent' => 333.0, + 172 => 584.0, + 246 => 611.0, + 252 => 611.0, + 'notequal' => 549.0, + 'gcommaaccent' => 611.0, + 240 => 611.0, + 158 => 500.0, + 'ncommaaccent' => 611.0, + 185 => 333.0, + 'imacron' => 278.0, + 128 => 556.0, + ), + 'CIDtoGID_Compressed' => true, + 'CIDtoGID' => 'eJwDAAAAAAE=', + '_version_' => 4, +); \ No newline at end of file diff --git a/application/third_party/dompdf/lib/fonts/Helvetica-BoldOblique.afm b/application/third_party/dompdf/lib/fonts/Helvetica-BoldOblique.afm new file mode 100755 index 00000000..76b19e45 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Helvetica-BoldOblique.afm @@ -0,0 +1,2829 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:45:12 1997 +Comment UniqueID 43053 +Comment VMusage 14482 68586 +FontName Helvetica-BoldOblique +FullName Helvetica Bold Oblique +FamilyName Helvetica +Weight Bold +ItalicAngle -12 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -174 -228 1114 962 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 718 +XHeight 532 +Ascender 718 +Descender -207 +StdHW 118 +StdVW 140 +StartCharMetrics 317 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 160 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 94 0 397 718 ; +C 34 ; WX 474 ; N quotedbl ; B 193 447 529 718 ; +C 35 ; WX 556 ; N numbersign ; B 60 0 644 698 ; +C 36 ; WX 556 ; N dollar ; B 67 -115 622 775 ; +C 37 ; WX 889 ; N percent ; B 136 -19 901 710 ; +C 38 ; WX 722 ; N ampersand ; B 89 -19 732 718 ; +C 146 ; WX 278 ; N quoteright ; B 167 445 362 718 ; +C 40 ; WX 333 ; N parenleft ; B 76 -208 470 734 ; +C 41 ; WX 333 ; N parenright ; B -25 -208 369 734 ; +C 42 ; WX 389 ; N asterisk ; B 146 387 481 718 ; +C 43 ; WX 584 ; N plus ; B 82 0 610 506 ; +C 44 ; WX 278 ; N comma ; B 28 -168 245 146 ; +C 45 ; WX 333 ; N hyphen ; B 73 215 379 345 ; +C 173 ; WX 333 ; N hyphen ; B 44 232 289 322 ; +C 46 ; WX 278 ; N period ; B 64 0 245 146 ; +C 47 ; WX 278 ; N slash ; B -37 -19 468 737 ; +C 48 ; WX 556 ; N zero ; B 86 -19 617 710 ; +C 49 ; WX 556 ; N one ; B 173 0 529 710 ; +C 50 ; WX 556 ; N two ; B 26 0 619 710 ; +C 51 ; WX 556 ; N three ; B 65 -19 608 710 ; +C 52 ; WX 556 ; N four ; B 60 0 598 710 ; +C 53 ; WX 556 ; N five ; B 64 -19 636 698 ; +C 54 ; WX 556 ; N six ; B 85 -19 619 710 ; +C 55 ; WX 556 ; N seven ; B 125 0 676 698 ; +C 56 ; WX 556 ; N eight ; B 69 -19 616 710 ; +C 57 ; WX 556 ; N nine ; B 78 -19 615 710 ; +C 58 ; WX 333 ; N colon ; B 92 0 351 512 ; +C 59 ; WX 333 ; N semicolon ; B 56 -168 351 512 ; +C 60 ; WX 584 ; N less ; B 82 -8 655 514 ; +C 61 ; WX 584 ; N equal ; B 58 87 633 419 ; +C 62 ; WX 584 ; N greater ; B 36 -8 609 514 ; +C 63 ; WX 611 ; N question ; B 165 0 671 727 ; +C 64 ; WX 975 ; N at ; B 186 -19 954 737 ; +C 65 ; WX 722 ; N A ; B 20 0 702 718 ; +C 66 ; WX 722 ; N B ; B 76 0 764 718 ; +C 67 ; WX 722 ; N C ; B 107 -19 789 737 ; +C 68 ; WX 722 ; N D ; B 76 0 777 718 ; +C 69 ; WX 667 ; N E ; B 76 0 757 718 ; +C 70 ; WX 611 ; N F ; B 76 0 740 718 ; +C 71 ; WX 778 ; N G ; B 108 -19 817 737 ; +C 72 ; WX 722 ; N H ; B 71 0 804 718 ; +C 73 ; WX 278 ; N I ; B 64 0 367 718 ; +C 74 ; WX 556 ; N J ; B 60 -18 637 718 ; +C 75 ; WX 722 ; N K ; B 87 0 858 718 ; +C 76 ; WX 611 ; N L ; B 76 0 611 718 ; +C 77 ; WX 833 ; N M ; B 69 0 918 718 ; +C 78 ; WX 722 ; N N ; B 69 0 807 718 ; +C 79 ; WX 778 ; N O ; B 107 -19 823 737 ; +C 80 ; WX 667 ; N P ; B 76 0 738 718 ; +C 81 ; WX 778 ; N Q ; B 107 -52 823 737 ; +C 82 ; WX 722 ; N R ; B 76 0 778 718 ; +C 83 ; WX 667 ; N S ; B 81 -19 718 737 ; +C 84 ; WX 611 ; N T ; B 140 0 751 718 ; +C 85 ; WX 722 ; N U ; B 116 -19 804 718 ; +C 86 ; WX 667 ; N V ; B 172 0 801 718 ; +C 87 ; WX 944 ; N W ; B 169 0 1082 718 ; +C 88 ; WX 667 ; N X ; B 14 0 791 718 ; +C 89 ; WX 667 ; N Y ; B 168 0 806 718 ; +C 90 ; WX 611 ; N Z ; B 25 0 737 718 ; +C 91 ; WX 333 ; N bracketleft ; B 21 -196 462 722 ; +C 92 ; WX 278 ; N backslash ; B 124 -19 307 737 ; +C 93 ; WX 333 ; N bracketright ; B -18 -196 423 722 ; +C 94 ; WX 584 ; N asciicircum ; B 131 323 591 698 ; +C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ; +C 145 ; WX 278 ; N quoteleft ; B 165 454 361 727 ; +C 97 ; WX 556 ; N a ; B 55 -14 583 546 ; +C 98 ; WX 611 ; N b ; B 61 -14 645 718 ; +C 99 ; WX 556 ; N c ; B 79 -14 599 546 ; +C 100 ; WX 611 ; N d ; B 82 -14 704 718 ; +C 101 ; WX 556 ; N e ; B 70 -14 593 546 ; +C 102 ; WX 333 ; N f ; B 87 0 469 727 ; L i fi ; L l fl ; +C 103 ; WX 611 ; N g ; B 38 -217 666 546 ; +C 104 ; WX 611 ; N h ; B 65 0 629 718 ; +C 105 ; WX 278 ; N i ; B 69 0 363 725 ; +C 106 ; WX 278 ; N j ; B -42 -214 363 725 ; +C 107 ; WX 556 ; N k ; B 69 0 670 718 ; +C 108 ; WX 278 ; N l ; B 69 0 362 718 ; +C 109 ; WX 889 ; N m ; B 64 0 909 546 ; +C 110 ; WX 611 ; N n ; B 65 0 629 546 ; +C 111 ; WX 611 ; N o ; B 82 -14 643 546 ; +C 112 ; WX 611 ; N p ; B 18 -207 645 546 ; +C 113 ; WX 611 ; N q ; B 80 -207 665 546 ; +C 114 ; WX 389 ; N r ; B 64 0 489 546 ; +C 115 ; WX 556 ; N s ; B 63 -14 584 546 ; +C 116 ; WX 333 ; N t ; B 100 -6 422 676 ; +C 117 ; WX 611 ; N u ; B 98 -14 658 532 ; +C 118 ; WX 556 ; N v ; B 126 0 656 532 ; +C 119 ; WX 778 ; N w ; B 123 0 882 532 ; +C 120 ; WX 556 ; N x ; B 15 0 648 532 ; +C 121 ; WX 556 ; N y ; B 42 -214 652 532 ; +C 122 ; WX 500 ; N z ; B 20 0 583 532 ; +C 123 ; WX 389 ; N braceleft ; B 94 -196 518 722 ; +C 124 ; WX 280 ; N bar ; B 36 -225 361 775 ; +C 125 ; WX 389 ; N braceright ; B -18 -196 407 722 ; +C 126 ; WX 584 ; N asciitilde ; B 115 163 577 343 ; +C 161 ; WX 333 ; N exclamdown ; B 50 -186 353 532 ; +C 162 ; WX 556 ; N cent ; B 79 -118 599 628 ; +C 163 ; WX 556 ; N sterling ; B 50 -16 635 718 ; +C -1 ; WX 167 ; N fraction ; B -174 -19 487 710 ; +C 165 ; WX 556 ; N yen ; B 60 0 713 698 ; +C 131 ; WX 556 ; N florin ; B -50 -210 669 737 ; +C 167 ; WX 556 ; N section ; B 61 -184 598 727 ; +C 164 ; WX 556 ; N currency ; B 27 76 680 636 ; +C 39 ; WX 238 ; N quotesingle ; B 165 447 321 718 ; +C 147 ; WX 500 ; N quotedblleft ; B 160 454 588 727 ; +C 170 ; WX 556 ; N guillemotleft ; B 135 76 571 484 ; +C 139 ; WX 333 ; N guilsinglleft ; B 130 76 353 484 ; +C 155 ; WX 333 ; N guilsinglright ; B 99 76 322 484 ; +C -1 ; WX 611 ; N fi ; B 87 0 696 727 ; +C -1 ; WX 611 ; N fl ; B 87 0 695 727 ; +C 150 ; WX 556 ; N endash ; B 48 227 627 333 ; +C 134 ; WX 556 ; N dagger ; B 118 -171 626 718 ; +C 135 ; WX 556 ; N daggerdbl ; B 46 -171 628 718 ; +C 183 ; WX 278 ; N periodcentered ; B 110 172 276 334 ; +C 182 ; WX 556 ; N paragraph ; B 98 -191 688 700 ; +C 149 ; WX 350 ; N bullet ; B 83 194 420 524 ; +C 130 ; WX 278 ; N quotesinglbase ; B 41 -146 236 127 ; +C 132 ; WX 500 ; N quotedblbase ; B 36 -146 463 127 ; +C 148 ; WX 500 ; N quotedblright ; B 162 445 589 718 ; +C 187 ; WX 556 ; N guillemotright ; B 104 76 540 484 ; +C 133 ; WX 1000 ; N ellipsis ; B 92 0 939 146 ; +C 137 ; WX 1000 ; N perthousand ; B 76 -19 1038 710 ; +C 191 ; WX 611 ; N questiondown ; B 53 -195 559 532 ; +C 96 ; WX 333 ; N grave ; B 136 604 353 750 ; +C 180 ; WX 333 ; N acute ; B 236 604 515 750 ; +C 136 ; WX 333 ; N circumflex ; B 118 604 471 750 ; +C 152 ; WX 333 ; N tilde ; B 113 610 507 737 ; +C 175 ; WX 333 ; N macron ; B 122 604 483 678 ; +C -1 ; WX 333 ; N breve ; B 156 604 494 750 ; +C -1 ; WX 333 ; N dotaccent ; B 235 614 385 729 ; +C 168 ; WX 333 ; N dieresis ; B 137 614 482 729 ; +C -1 ; WX 333 ; N ring ; B 200 568 420 776 ; +C 184 ; WX 333 ; N cedilla ; B -37 -228 220 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B 137 604 645 750 ; +C -1 ; WX 333 ; N ogonek ; B 41 -228 264 0 ; +C -1 ; WX 333 ; N caron ; B 149 604 502 750 ; +C 151 ; WX 1000 ; N emdash ; B 48 227 1071 333 ; +C 198 ; WX 1000 ; N AE ; B 5 0 1100 718 ; +C 170 ; WX 370 ; N ordfeminine ; B 125 401 465 737 ; +C -1 ; WX 611 ; N Lslash ; B 34 0 611 718 ; +C 216 ; WX 778 ; N Oslash ; B 35 -27 894 745 ; +C 140 ; WX 1000 ; N OE ; B 99 -19 1114 737 ; +C 186 ; WX 365 ; N ordmasculine ; B 123 401 485 737 ; +C 230 ; WX 889 ; N ae ; B 56 -14 923 546 ; +C -1 ; WX 278 ; N dotlessi ; B 69 0 322 532 ; +C -1 ; WX 278 ; N lslash ; B 40 0 407 718 ; +C 248 ; WX 611 ; N oslash ; B 22 -29 701 560 ; +C 156 ; WX 944 ; N oe ; B 82 -14 977 546 ; +C 223 ; WX 611 ; N germandbls ; B 69 -14 657 731 ; +C 207 ; WX 278 ; N Idieresis ; B 64 0 494 915 ; +C 233 ; WX 556 ; N eacute ; B 70 -14 627 750 ; +C -1 ; WX 556 ; N abreve ; B 55 -14 606 750 ; +C -1 ; WX 611 ; N uhungarumlaut ; B 98 -14 784 750 ; +C -1 ; WX 556 ; N ecaron ; B 70 -14 614 750 ; +C 159 ; WX 667 ; N Ydieresis ; B 168 0 806 915 ; +C 247 ; WX 584 ; N divide ; B 82 -42 610 548 ; +C 221 ; WX 667 ; N Yacute ; B 168 0 806 936 ; +C 194 ; WX 722 ; N Acircumflex ; B 20 0 706 936 ; +C 225 ; WX 556 ; N aacute ; B 55 -14 627 750 ; +C 219 ; WX 722 ; N Ucircumflex ; B 116 -19 804 936 ; +C 253 ; WX 556 ; N yacute ; B 42 -214 652 750 ; +C -1 ; WX 556 ; N scommaaccent ; B 63 -228 584 546 ; +C 234 ; WX 556 ; N ecircumflex ; B 70 -14 593 750 ; +C -1 ; WX 722 ; N Uring ; B 116 -19 804 962 ; +C 220 ; WX 722 ; N Udieresis ; B 116 -19 804 915 ; +C -1 ; WX 556 ; N aogonek ; B 55 -224 583 546 ; +C 218 ; WX 722 ; N Uacute ; B 116 -19 804 936 ; +C -1 ; WX 611 ; N uogonek ; B 98 -228 658 532 ; +C 203 ; WX 667 ; N Edieresis ; B 76 0 757 915 ; +C -1 ; WX 722 ; N Dcroat ; B 62 0 777 718 ; +C -1 ; WX 250 ; N commaaccent ; B 16 -228 188 -50 ; +C 169 ; WX 737 ; N copyright ; B 56 -19 835 737 ; +C -1 ; WX 667 ; N Emacron ; B 76 0 757 864 ; +C -1 ; WX 556 ; N ccaron ; B 79 -14 614 750 ; +C 229 ; WX 556 ; N aring ; B 55 -14 583 776 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 807 718 ; +C -1 ; WX 278 ; N lacute ; B 69 0 528 936 ; +C 224 ; WX 556 ; N agrave ; B 55 -14 583 750 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 140 -228 751 718 ; +C -1 ; WX 722 ; N Cacute ; B 107 -19 789 936 ; +C 227 ; WX 556 ; N atilde ; B 55 -14 619 737 ; +C -1 ; WX 667 ; N Edotaccent ; B 76 0 757 915 ; +C 154 ; WX 556 ; N scaron ; B 63 -14 614 750 ; +C -1 ; WX 556 ; N scedilla ; B 63 -228 584 546 ; +C 237 ; WX 278 ; N iacute ; B 69 0 488 750 ; +C -1 ; WX 494 ; N lozenge ; B 90 0 564 745 ; +C -1 ; WX 722 ; N Rcaron ; B 76 0 778 936 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 108 -228 817 737 ; +C 251 ; WX 611 ; N ucircumflex ; B 98 -14 658 750 ; +C 226 ; WX 556 ; N acircumflex ; B 55 -14 583 750 ; +C -1 ; WX 722 ; N Amacron ; B 20 0 718 864 ; +C -1 ; WX 389 ; N rcaron ; B 64 0 530 750 ; +C 231 ; WX 556 ; N ccedilla ; B 79 -228 599 546 ; +C -1 ; WX 611 ; N Zdotaccent ; B 25 0 737 915 ; +C 222 ; WX 667 ; N Thorn ; B 76 0 716 718 ; +C -1 ; WX 778 ; N Omacron ; B 107 -19 823 864 ; +C -1 ; WX 722 ; N Racute ; B 76 0 778 936 ; +C -1 ; WX 667 ; N Sacute ; B 81 -19 722 936 ; +C -1 ; WX 743 ; N dcaron ; B 82 -14 903 718 ; +C -1 ; WX 722 ; N Umacron ; B 116 -19 804 864 ; +C -1 ; WX 611 ; N uring ; B 98 -14 658 776 ; +C 179 ; WX 333 ; N threesuperior ; B 91 271 441 710 ; +C 210 ; WX 778 ; N Ograve ; B 107 -19 823 936 ; +C 192 ; WX 722 ; N Agrave ; B 20 0 702 936 ; +C -1 ; WX 722 ; N Abreve ; B 20 0 729 936 ; +C 215 ; WX 584 ; N multiply ; B 57 1 635 505 ; +C 250 ; WX 611 ; N uacute ; B 98 -14 658 750 ; +C -1 ; WX 611 ; N Tcaron ; B 140 0 751 936 ; +C -1 ; WX 494 ; N partialdiff ; B 43 -21 585 750 ; +C 255 ; WX 556 ; N ydieresis ; B 42 -214 652 729 ; +C -1 ; WX 722 ; N Nacute ; B 69 0 807 936 ; +C 238 ; WX 278 ; N icircumflex ; B 69 0 444 750 ; +C 202 ; WX 667 ; N Ecircumflex ; B 76 0 757 936 ; +C 228 ; WX 556 ; N adieresis ; B 55 -14 594 729 ; +C 235 ; WX 556 ; N edieresis ; B 70 -14 594 729 ; +C -1 ; WX 556 ; N cacute ; B 79 -14 627 750 ; +C -1 ; WX 611 ; N nacute ; B 65 0 654 750 ; +C -1 ; WX 611 ; N umacron ; B 98 -14 658 678 ; +C -1 ; WX 722 ; N Ncaron ; B 69 0 807 936 ; +C 205 ; WX 278 ; N Iacute ; B 64 0 528 936 ; +C 177 ; WX 584 ; N plusminus ; B 40 0 625 506 ; +C 166 ; WX 280 ; N brokenbar ; B 52 -150 345 700 ; +C 174 ; WX 737 ; N registered ; B 55 -19 834 737 ; +C -1 ; WX 778 ; N Gbreve ; B 108 -19 817 936 ; +C -1 ; WX 278 ; N Idotaccent ; B 64 0 397 915 ; +C -1 ; WX 600 ; N summation ; B 14 -10 670 706 ; +C 200 ; WX 667 ; N Egrave ; B 76 0 757 936 ; +C -1 ; WX 389 ; N racute ; B 64 0 543 750 ; +C -1 ; WX 611 ; N omacron ; B 82 -14 643 678 ; +C -1 ; WX 611 ; N Zacute ; B 25 0 737 936 ; +C 142 ; WX 611 ; N Zcaron ; B 25 0 737 936 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 629 704 ; +C 208 ; WX 722 ; N Eth ; B 62 0 777 718 ; +C 199 ; WX 722 ; N Ccedilla ; B 107 -228 789 737 ; +C -1 ; WX 278 ; N lcommaaccent ; B 30 -228 362 718 ; +C -1 ; WX 389 ; N tcaron ; B 100 -6 608 878 ; +C -1 ; WX 556 ; N eogonek ; B 70 -228 593 546 ; +C -1 ; WX 722 ; N Uogonek ; B 116 -228 804 718 ; +C 193 ; WX 722 ; N Aacute ; B 20 0 750 936 ; +C 196 ; WX 722 ; N Adieresis ; B 20 0 716 915 ; +C 232 ; WX 556 ; N egrave ; B 70 -14 593 750 ; +C -1 ; WX 500 ; N zacute ; B 20 0 599 750 ; +C -1 ; WX 278 ; N iogonek ; B -14 -224 363 725 ; +C 211 ; WX 778 ; N Oacute ; B 107 -19 823 936 ; +C 243 ; WX 611 ; N oacute ; B 82 -14 654 750 ; +C -1 ; WX 556 ; N amacron ; B 55 -14 595 678 ; +C -1 ; WX 556 ; N sacute ; B 63 -14 627 750 ; +C 239 ; WX 278 ; N idieresis ; B 69 0 455 729 ; +C 212 ; WX 778 ; N Ocircumflex ; B 107 -19 823 936 ; +C 217 ; WX 722 ; N Ugrave ; B 116 -19 804 936 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 611 ; N thorn ; B 18 -208 645 718 ; +C 178 ; WX 333 ; N twosuperior ; B 69 283 449 710 ; +C 214 ; WX 778 ; N Odieresis ; B 107 -19 823 915 ; +C 181 ; WX 611 ; N mu ; B 22 -207 658 532 ; +C 236 ; WX 278 ; N igrave ; B 69 0 326 750 ; +C -1 ; WX 611 ; N ohungarumlaut ; B 82 -14 784 750 ; +C -1 ; WX 667 ; N Eogonek ; B 76 -224 757 718 ; +C -1 ; WX 611 ; N dcroat ; B 82 -14 789 718 ; +C 190 ; WX 834 ; N threequarters ; B 99 -19 839 710 ; +C -1 ; WX 667 ; N Scedilla ; B 81 -228 718 737 ; +C -1 ; WX 400 ; N lcaron ; B 69 0 561 718 ; +C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 858 718 ; +C -1 ; WX 611 ; N Lacute ; B 76 0 611 936 ; +C 153 ; WX 1000 ; N trademark ; B 179 306 1109 718 ; +C -1 ; WX 556 ; N edotaccent ; B 70 -14 593 729 ; +C 204 ; WX 278 ; N Igrave ; B 64 0 367 936 ; +C -1 ; WX 278 ; N Imacron ; B 64 0 496 864 ; +C -1 ; WX 611 ; N Lcaron ; B 76 0 643 718 ; +C 189 ; WX 834 ; N onehalf ; B 132 -19 858 710 ; +C -1 ; WX 549 ; N lessequal ; B 29 0 676 704 ; +C 244 ; WX 611 ; N ocircumflex ; B 82 -14 643 750 ; +C 241 ; WX 611 ; N ntilde ; B 65 0 646 737 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 116 -19 880 936 ; +C 201 ; WX 667 ; N Eacute ; B 76 0 757 936 ; +C -1 ; WX 556 ; N emacron ; B 70 -14 595 678 ; +C -1 ; WX 611 ; N gbreve ; B 38 -217 666 750 ; +C 188 ; WX 834 ; N onequarter ; B 132 -19 806 710 ; +C 138 ; WX 667 ; N Scaron ; B 81 -19 718 936 ; +C -1 ; WX 667 ; N Scommaaccent ; B 81 -228 718 737 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 107 -19 908 936 ; +C 176 ; WX 400 ; N degree ; B 175 426 467 712 ; +C 242 ; WX 611 ; N ograve ; B 82 -14 643 750 ; +C -1 ; WX 722 ; N Ccaron ; B 107 -19 789 936 ; +C 249 ; WX 611 ; N ugrave ; B 98 -14 658 750 ; +C -1 ; WX 549 ; N radical ; B 112 -46 689 850 ; +C -1 ; WX 722 ; N Dcaron ; B 76 0 777 936 ; +C -1 ; WX 389 ; N rcommaaccent ; B 26 -228 489 546 ; +C 209 ; WX 722 ; N Ntilde ; B 69 0 807 923 ; +C 245 ; WX 611 ; N otilde ; B 82 -14 646 737 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 778 718 ; +C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 611 718 ; +C 195 ; WX 722 ; N Atilde ; B 20 0 741 923 ; +C -1 ; WX 722 ; N Aogonek ; B 20 -224 702 718 ; +C 197 ; WX 722 ; N Aring ; B 20 0 702 962 ; +C 213 ; WX 778 ; N Otilde ; B 107 -19 823 923 ; +C -1 ; WX 500 ; N zdotaccent ; B 20 0 583 729 ; +C -1 ; WX 667 ; N Ecaron ; B 76 0 757 936 ; +C -1 ; WX 278 ; N Iogonek ; B -41 -228 367 718 ; +C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 670 718 ; +C -1 ; WX 584 ; N minus ; B 82 197 610 309 ; +C 206 ; WX 278 ; N Icircumflex ; B 64 0 484 936 ; +C -1 ; WX 611 ; N ncaron ; B 65 0 641 750 ; +C -1 ; WX 333 ; N tcommaaccent ; B 58 -228 422 676 ; +C 172 ; WX 584 ; N logicalnot ; B 105 108 633 419 ; +C 246 ; WX 611 ; N odieresis ; B 82 -14 643 729 ; +C 252 ; WX 611 ; N udieresis ; B 98 -14 658 729 ; +C -1 ; WX 549 ; N notequal ; B 32 -49 630 570 ; +C -1 ; WX 611 ; N gcommaaccent ; B 38 -217 666 850 ; +C 240 ; WX 611 ; N eth ; B 82 -14 670 737 ; +C 158 ; WX 500 ; N zcaron ; B 20 0 586 750 ; +C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 629 546 ; +C 185 ; WX 333 ; N onesuperior ; B 148 283 388 710 ; +C -1 ; WX 278 ; N imacron ; B 69 0 429 678 ; +C 128 ; WX 556 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2481 +KPX A C -40 +KPX A Cacute -40 +KPX A Ccaron -40 +KPX A Ccedilla -40 +KPX A G -50 +KPX A Gbreve -50 +KPX A Gcommaaccent -50 +KPX A O -40 +KPX A Oacute -40 +KPX A Ocircumflex -40 +KPX A Odieresis -40 +KPX A Ograve -40 +KPX A Ohungarumlaut -40 +KPX A Omacron -40 +KPX A Oslash -40 +KPX A Otilde -40 +KPX A Q -40 +KPX A T -90 +KPX A Tcaron -90 +KPX A Tcommaaccent -90 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -80 +KPX A W -60 +KPX A Y -110 +KPX A Yacute -110 +KPX A Ydieresis -110 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -40 +KPX A w -30 +KPX A y -30 +KPX A yacute -30 +KPX A ydieresis -30 +KPX Aacute C -40 +KPX Aacute Cacute -40 +KPX Aacute Ccaron -40 +KPX Aacute Ccedilla -40 +KPX Aacute G -50 +KPX Aacute Gbreve -50 +KPX Aacute Gcommaaccent -50 +KPX Aacute O -40 +KPX Aacute Oacute -40 +KPX Aacute Ocircumflex -40 +KPX Aacute Odieresis -40 +KPX Aacute Ograve -40 +KPX Aacute Ohungarumlaut -40 +KPX Aacute Omacron -40 +KPX Aacute Oslash -40 +KPX Aacute Otilde -40 +KPX Aacute Q -40 +KPX Aacute T -90 +KPX Aacute Tcaron -90 +KPX Aacute Tcommaaccent -90 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -80 +KPX Aacute W -60 +KPX Aacute Y -110 +KPX Aacute Yacute -110 +KPX Aacute Ydieresis -110 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -40 +KPX Aacute w -30 +KPX Aacute y -30 +KPX Aacute yacute -30 +KPX Aacute ydieresis -30 +KPX Abreve C -40 +KPX Abreve Cacute -40 +KPX Abreve Ccaron -40 +KPX Abreve Ccedilla -40 +KPX Abreve G -50 +KPX Abreve Gbreve -50 +KPX Abreve Gcommaaccent -50 +KPX Abreve O -40 +KPX Abreve Oacute -40 +KPX Abreve Ocircumflex -40 +KPX Abreve Odieresis -40 +KPX Abreve Ograve -40 +KPX Abreve Ohungarumlaut -40 +KPX Abreve Omacron -40 +KPX Abreve Oslash -40 +KPX Abreve Otilde -40 +KPX Abreve Q -40 +KPX Abreve T -90 +KPX Abreve Tcaron -90 +KPX Abreve Tcommaaccent -90 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -80 +KPX Abreve W -60 +KPX Abreve Y -110 +KPX Abreve Yacute -110 +KPX Abreve Ydieresis -110 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -40 +KPX Abreve w -30 +KPX Abreve y -30 +KPX Abreve yacute -30 +KPX Abreve ydieresis -30 +KPX Acircumflex C -40 +KPX Acircumflex Cacute -40 +KPX Acircumflex Ccaron -40 +KPX Acircumflex Ccedilla -40 +KPX Acircumflex G -50 +KPX Acircumflex Gbreve -50 +KPX Acircumflex Gcommaaccent -50 +KPX Acircumflex O -40 +KPX Acircumflex Oacute -40 +KPX Acircumflex Ocircumflex -40 +KPX Acircumflex Odieresis -40 +KPX Acircumflex Ograve -40 +KPX Acircumflex Ohungarumlaut -40 +KPX Acircumflex Omacron -40 +KPX Acircumflex Oslash -40 +KPX Acircumflex Otilde -40 +KPX Acircumflex Q -40 +KPX Acircumflex T -90 +KPX Acircumflex Tcaron -90 +KPX Acircumflex Tcommaaccent -90 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -80 +KPX Acircumflex W -60 +KPX Acircumflex Y -110 +KPX Acircumflex Yacute -110 +KPX Acircumflex Ydieresis -110 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -40 +KPX Acircumflex w -30 +KPX Acircumflex y -30 +KPX Acircumflex yacute -30 +KPX Acircumflex ydieresis -30 +KPX Adieresis C -40 +KPX Adieresis Cacute -40 +KPX Adieresis Ccaron -40 +KPX Adieresis Ccedilla -40 +KPX Adieresis G -50 +KPX Adieresis Gbreve -50 +KPX Adieresis Gcommaaccent -50 +KPX Adieresis O -40 +KPX Adieresis Oacute -40 +KPX Adieresis Ocircumflex -40 +KPX Adieresis Odieresis -40 +KPX Adieresis Ograve -40 +KPX Adieresis Ohungarumlaut -40 +KPX Adieresis Omacron -40 +KPX Adieresis Oslash -40 +KPX Adieresis Otilde -40 +KPX Adieresis Q -40 +KPX Adieresis T -90 +KPX Adieresis Tcaron -90 +KPX Adieresis Tcommaaccent -90 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -80 +KPX Adieresis W -60 +KPX Adieresis Y -110 +KPX Adieresis Yacute -110 +KPX Adieresis Ydieresis -110 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -40 +KPX Adieresis w -30 +KPX Adieresis y -30 +KPX Adieresis yacute -30 +KPX Adieresis ydieresis -30 +KPX Agrave C -40 +KPX Agrave Cacute -40 +KPX Agrave Ccaron -40 +KPX Agrave Ccedilla -40 +KPX Agrave G -50 +KPX Agrave Gbreve -50 +KPX Agrave Gcommaaccent -50 +KPX Agrave O -40 +KPX Agrave Oacute -40 +KPX Agrave Ocircumflex -40 +KPX Agrave Odieresis -40 +KPX Agrave Ograve -40 +KPX Agrave Ohungarumlaut -40 +KPX Agrave Omacron -40 +KPX Agrave Oslash -40 +KPX Agrave Otilde -40 +KPX Agrave Q -40 +KPX Agrave T -90 +KPX Agrave Tcaron -90 +KPX Agrave Tcommaaccent -90 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -80 +KPX Agrave W -60 +KPX Agrave Y -110 +KPX Agrave Yacute -110 +KPX Agrave Ydieresis -110 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -40 +KPX Agrave w -30 +KPX Agrave y -30 +KPX Agrave yacute -30 +KPX Agrave ydieresis -30 +KPX Amacron C -40 +KPX Amacron Cacute -40 +KPX Amacron Ccaron -40 +KPX Amacron Ccedilla -40 +KPX Amacron G -50 +KPX Amacron Gbreve -50 +KPX Amacron Gcommaaccent -50 +KPX Amacron O -40 +KPX Amacron Oacute -40 +KPX Amacron Ocircumflex -40 +KPX Amacron Odieresis -40 +KPX Amacron Ograve -40 +KPX Amacron Ohungarumlaut -40 +KPX Amacron Omacron -40 +KPX Amacron Oslash -40 +KPX Amacron Otilde -40 +KPX Amacron Q -40 +KPX Amacron T -90 +KPX Amacron Tcaron -90 +KPX Amacron Tcommaaccent -90 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -80 +KPX Amacron W -60 +KPX Amacron Y -110 +KPX Amacron Yacute -110 +KPX Amacron Ydieresis -110 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -40 +KPX Amacron w -30 +KPX Amacron y -30 +KPX Amacron yacute -30 +KPX Amacron ydieresis -30 +KPX Aogonek C -40 +KPX Aogonek Cacute -40 +KPX Aogonek Ccaron -40 +KPX Aogonek Ccedilla -40 +KPX Aogonek G -50 +KPX Aogonek Gbreve -50 +KPX Aogonek Gcommaaccent -50 +KPX Aogonek O -40 +KPX Aogonek Oacute -40 +KPX Aogonek Ocircumflex -40 +KPX Aogonek Odieresis -40 +KPX Aogonek Ograve -40 +KPX Aogonek Ohungarumlaut -40 +KPX Aogonek Omacron -40 +KPX Aogonek Oslash -40 +KPX Aogonek Otilde -40 +KPX Aogonek Q -40 +KPX Aogonek T -90 +KPX Aogonek Tcaron -90 +KPX Aogonek Tcommaaccent -90 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -80 +KPX Aogonek W -60 +KPX Aogonek Y -110 +KPX Aogonek Yacute -110 +KPX Aogonek Ydieresis -110 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -40 +KPX Aogonek w -30 +KPX Aogonek y -30 +KPX Aogonek yacute -30 +KPX Aogonek ydieresis -30 +KPX Aring C -40 +KPX Aring Cacute -40 +KPX Aring Ccaron -40 +KPX Aring Ccedilla -40 +KPX Aring G -50 +KPX Aring Gbreve -50 +KPX Aring Gcommaaccent -50 +KPX Aring O -40 +KPX Aring Oacute -40 +KPX Aring Ocircumflex -40 +KPX Aring Odieresis -40 +KPX Aring Ograve -40 +KPX Aring Ohungarumlaut -40 +KPX Aring Omacron -40 +KPX Aring Oslash -40 +KPX Aring Otilde -40 +KPX Aring Q -40 +KPX Aring T -90 +KPX Aring Tcaron -90 +KPX Aring Tcommaaccent -90 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -80 +KPX Aring W -60 +KPX Aring Y -110 +KPX Aring Yacute -110 +KPX Aring Ydieresis -110 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -40 +KPX Aring w -30 +KPX Aring y -30 +KPX Aring yacute -30 +KPX Aring ydieresis -30 +KPX Atilde C -40 +KPX Atilde Cacute -40 +KPX Atilde Ccaron -40 +KPX Atilde Ccedilla -40 +KPX Atilde G -50 +KPX Atilde Gbreve -50 +KPX Atilde Gcommaaccent -50 +KPX Atilde O -40 +KPX Atilde Oacute -40 +KPX Atilde Ocircumflex -40 +KPX Atilde Odieresis -40 +KPX Atilde Ograve -40 +KPX Atilde Ohungarumlaut -40 +KPX Atilde Omacron -40 +KPX Atilde Oslash -40 +KPX Atilde Otilde -40 +KPX Atilde Q -40 +KPX Atilde T -90 +KPX Atilde Tcaron -90 +KPX Atilde Tcommaaccent -90 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -80 +KPX Atilde W -60 +KPX Atilde Y -110 +KPX Atilde Yacute -110 +KPX Atilde Ydieresis -110 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -40 +KPX Atilde w -30 +KPX Atilde y -30 +KPX Atilde yacute -30 +KPX Atilde ydieresis -30 +KPX B A -30 +KPX B Aacute -30 +KPX B Abreve -30 +KPX B Acircumflex -30 +KPX B Adieresis -30 +KPX B Agrave -30 +KPX B Amacron -30 +KPX B Aogonek -30 +KPX B Aring -30 +KPX B Atilde -30 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -40 +KPX D W -40 +KPX D Y -70 +KPX D Yacute -70 +KPX D Ydieresis -70 +KPX D comma -30 +KPX D period -30 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -40 +KPX Dcaron W -40 +KPX Dcaron Y -70 +KPX Dcaron Yacute -70 +KPX Dcaron Ydieresis -70 +KPX Dcaron comma -30 +KPX Dcaron period -30 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -40 +KPX Dcroat W -40 +KPX Dcroat Y -70 +KPX Dcroat Yacute -70 +KPX Dcroat Ydieresis -70 +KPX Dcroat comma -30 +KPX Dcroat period -30 +KPX F A -80 +KPX F Aacute -80 +KPX F Abreve -80 +KPX F Acircumflex -80 +KPX F Adieresis -80 +KPX F Agrave -80 +KPX F Amacron -80 +KPX F Aogonek -80 +KPX F Aring -80 +KPX F Atilde -80 +KPX F a -20 +KPX F aacute -20 +KPX F abreve -20 +KPX F acircumflex -20 +KPX F adieresis -20 +KPX F agrave -20 +KPX F amacron -20 +KPX F aogonek -20 +KPX F aring -20 +KPX F atilde -20 +KPX F comma -100 +KPX F period -100 +KPX J A -20 +KPX J Aacute -20 +KPX J Abreve -20 +KPX J Acircumflex -20 +KPX J Adieresis -20 +KPX J Agrave -20 +KPX J Amacron -20 +KPX J Aogonek -20 +KPX J Aring -20 +KPX J Atilde -20 +KPX J comma -20 +KPX J period -20 +KPX J u -20 +KPX J uacute -20 +KPX J ucircumflex -20 +KPX J udieresis -20 +KPX J ugrave -20 +KPX J uhungarumlaut -20 +KPX J umacron -20 +KPX J uogonek -20 +KPX J uring -20 +KPX K O -30 +KPX K Oacute -30 +KPX K Ocircumflex -30 +KPX K Odieresis -30 +KPX K Ograve -30 +KPX K Ohungarumlaut -30 +KPX K Omacron -30 +KPX K Oslash -30 +KPX K Otilde -30 +KPX K e -15 +KPX K eacute -15 +KPX K ecaron -15 +KPX K ecircumflex -15 +KPX K edieresis -15 +KPX K edotaccent -15 +KPX K egrave -15 +KPX K emacron -15 +KPX K eogonek -15 +KPX K o -35 +KPX K oacute -35 +KPX K ocircumflex -35 +KPX K odieresis -35 +KPX K ograve -35 +KPX K ohungarumlaut -35 +KPX K omacron -35 +KPX K oslash -35 +KPX K otilde -35 +KPX K u -30 +KPX K uacute -30 +KPX K ucircumflex -30 +KPX K udieresis -30 +KPX K ugrave -30 +KPX K uhungarumlaut -30 +KPX K umacron -30 +KPX K uogonek -30 +KPX K uring -30 +KPX K y -40 +KPX K yacute -40 +KPX K ydieresis -40 +KPX Kcommaaccent O -30 +KPX Kcommaaccent Oacute -30 +KPX Kcommaaccent Ocircumflex -30 +KPX Kcommaaccent Odieresis -30 +KPX Kcommaaccent Ograve -30 +KPX Kcommaaccent Ohungarumlaut -30 +KPX Kcommaaccent Omacron -30 +KPX Kcommaaccent Oslash -30 +KPX Kcommaaccent Otilde -30 +KPX Kcommaaccent e -15 +KPX Kcommaaccent eacute -15 +KPX Kcommaaccent ecaron -15 +KPX Kcommaaccent ecircumflex -15 +KPX Kcommaaccent edieresis -15 +KPX Kcommaaccent edotaccent -15 +KPX Kcommaaccent egrave -15 +KPX Kcommaaccent emacron -15 +KPX Kcommaaccent eogonek -15 +KPX Kcommaaccent o -35 +KPX Kcommaaccent oacute -35 +KPX Kcommaaccent ocircumflex -35 +KPX Kcommaaccent odieresis -35 +KPX Kcommaaccent ograve -35 +KPX Kcommaaccent ohungarumlaut -35 +KPX Kcommaaccent omacron -35 +KPX Kcommaaccent oslash -35 +KPX Kcommaaccent otilde -35 +KPX Kcommaaccent u -30 +KPX Kcommaaccent uacute -30 +KPX Kcommaaccent ucircumflex -30 +KPX Kcommaaccent udieresis -30 +KPX Kcommaaccent ugrave -30 +KPX Kcommaaccent uhungarumlaut -30 +KPX Kcommaaccent umacron -30 +KPX Kcommaaccent uogonek -30 +KPX Kcommaaccent uring -30 +KPX Kcommaaccent y -40 +KPX Kcommaaccent yacute -40 +KPX Kcommaaccent ydieresis -40 +KPX L T -90 +KPX L Tcaron -90 +KPX L Tcommaaccent -90 +KPX L V -110 +KPX L W -80 +KPX L Y -120 +KPX L Yacute -120 +KPX L Ydieresis -120 +KPX L quotedblright -140 +KPX L quoteright -140 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -90 +KPX Lacute Tcaron -90 +KPX Lacute Tcommaaccent -90 +KPX Lacute V -110 +KPX Lacute W -80 +KPX Lacute Y -120 +KPX Lacute Yacute -120 +KPX Lacute Ydieresis -120 +KPX Lacute quotedblright -140 +KPX Lacute quoteright -140 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcommaaccent T -90 +KPX Lcommaaccent Tcaron -90 +KPX Lcommaaccent Tcommaaccent -90 +KPX Lcommaaccent V -110 +KPX Lcommaaccent W -80 +KPX Lcommaaccent Y -120 +KPX Lcommaaccent Yacute -120 +KPX Lcommaaccent Ydieresis -120 +KPX Lcommaaccent quotedblright -140 +KPX Lcommaaccent quoteright -140 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -90 +KPX Lslash Tcaron -90 +KPX Lslash Tcommaaccent -90 +KPX Lslash V -110 +KPX Lslash W -80 +KPX Lslash Y -120 +KPX Lslash Yacute -120 +KPX Lslash Ydieresis -120 +KPX Lslash quotedblright -140 +KPX Lslash quoteright -140 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX O A -50 +KPX O Aacute -50 +KPX O Abreve -50 +KPX O Acircumflex -50 +KPX O Adieresis -50 +KPX O Agrave -50 +KPX O Amacron -50 +KPX O Aogonek -50 +KPX O Aring -50 +KPX O Atilde -50 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -50 +KPX O X -50 +KPX O Y -70 +KPX O Yacute -70 +KPX O Ydieresis -70 +KPX O comma -40 +KPX O period -40 +KPX Oacute A -50 +KPX Oacute Aacute -50 +KPX Oacute Abreve -50 +KPX Oacute Acircumflex -50 +KPX Oacute Adieresis -50 +KPX Oacute Agrave -50 +KPX Oacute Amacron -50 +KPX Oacute Aogonek -50 +KPX Oacute Aring -50 +KPX Oacute Atilde -50 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -50 +KPX Oacute X -50 +KPX Oacute Y -70 +KPX Oacute Yacute -70 +KPX Oacute Ydieresis -70 +KPX Oacute comma -40 +KPX Oacute period -40 +KPX Ocircumflex A -50 +KPX Ocircumflex Aacute -50 +KPX Ocircumflex Abreve -50 +KPX Ocircumflex Acircumflex -50 +KPX Ocircumflex Adieresis -50 +KPX Ocircumflex Agrave -50 +KPX Ocircumflex Amacron -50 +KPX Ocircumflex Aogonek -50 +KPX Ocircumflex Aring -50 +KPX Ocircumflex Atilde -50 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -50 +KPX Ocircumflex X -50 +KPX Ocircumflex Y -70 +KPX Ocircumflex Yacute -70 +KPX Ocircumflex Ydieresis -70 +KPX Ocircumflex comma -40 +KPX Ocircumflex period -40 +KPX Odieresis A -50 +KPX Odieresis Aacute -50 +KPX Odieresis Abreve -50 +KPX Odieresis Acircumflex -50 +KPX Odieresis Adieresis -50 +KPX Odieresis Agrave -50 +KPX Odieresis Amacron -50 +KPX Odieresis Aogonek -50 +KPX Odieresis Aring -50 +KPX Odieresis Atilde -50 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -50 +KPX Odieresis X -50 +KPX Odieresis Y -70 +KPX Odieresis Yacute -70 +KPX Odieresis Ydieresis -70 +KPX Odieresis comma -40 +KPX Odieresis period -40 +KPX Ograve A -50 +KPX Ograve Aacute -50 +KPX Ograve Abreve -50 +KPX Ograve Acircumflex -50 +KPX Ograve Adieresis -50 +KPX Ograve Agrave -50 +KPX Ograve Amacron -50 +KPX Ograve Aogonek -50 +KPX Ograve Aring -50 +KPX Ograve Atilde -50 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -50 +KPX Ograve X -50 +KPX Ograve Y -70 +KPX Ograve Yacute -70 +KPX Ograve Ydieresis -70 +KPX Ograve comma -40 +KPX Ograve period -40 +KPX Ohungarumlaut A -50 +KPX Ohungarumlaut Aacute -50 +KPX Ohungarumlaut Abreve -50 +KPX Ohungarumlaut Acircumflex -50 +KPX Ohungarumlaut Adieresis -50 +KPX Ohungarumlaut Agrave -50 +KPX Ohungarumlaut Amacron -50 +KPX Ohungarumlaut Aogonek -50 +KPX Ohungarumlaut Aring -50 +KPX Ohungarumlaut Atilde -50 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -50 +KPX Ohungarumlaut X -50 +KPX Ohungarumlaut Y -70 +KPX Ohungarumlaut Yacute -70 +KPX Ohungarumlaut Ydieresis -70 +KPX Ohungarumlaut comma -40 +KPX Ohungarumlaut period -40 +KPX Omacron A -50 +KPX Omacron Aacute -50 +KPX Omacron Abreve -50 +KPX Omacron Acircumflex -50 +KPX Omacron Adieresis -50 +KPX Omacron Agrave -50 +KPX Omacron Amacron -50 +KPX Omacron Aogonek -50 +KPX Omacron Aring -50 +KPX Omacron Atilde -50 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -50 +KPX Omacron X -50 +KPX Omacron Y -70 +KPX Omacron Yacute -70 +KPX Omacron Ydieresis -70 +KPX Omacron comma -40 +KPX Omacron period -40 +KPX Oslash A -50 +KPX Oslash Aacute -50 +KPX Oslash Abreve -50 +KPX Oslash Acircumflex -50 +KPX Oslash Adieresis -50 +KPX Oslash Agrave -50 +KPX Oslash Amacron -50 +KPX Oslash Aogonek -50 +KPX Oslash Aring -50 +KPX Oslash Atilde -50 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -50 +KPX Oslash X -50 +KPX Oslash Y -70 +KPX Oslash Yacute -70 +KPX Oslash Ydieresis -70 +KPX Oslash comma -40 +KPX Oslash period -40 +KPX Otilde A -50 +KPX Otilde Aacute -50 +KPX Otilde Abreve -50 +KPX Otilde Acircumflex -50 +KPX Otilde Adieresis -50 +KPX Otilde Agrave -50 +KPX Otilde Amacron -50 +KPX Otilde Aogonek -50 +KPX Otilde Aring -50 +KPX Otilde Atilde -50 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -50 +KPX Otilde X -50 +KPX Otilde Y -70 +KPX Otilde Yacute -70 +KPX Otilde Ydieresis -70 +KPX Otilde comma -40 +KPX Otilde period -40 +KPX P A -100 +KPX P Aacute -100 +KPX P Abreve -100 +KPX P Acircumflex -100 +KPX P Adieresis -100 +KPX P Agrave -100 +KPX P Amacron -100 +KPX P Aogonek -100 +KPX P Aring -100 +KPX P Atilde -100 +KPX P a -30 +KPX P aacute -30 +KPX P abreve -30 +KPX P acircumflex -30 +KPX P adieresis -30 +KPX P agrave -30 +KPX P amacron -30 +KPX P aogonek -30 +KPX P aring -30 +KPX P atilde -30 +KPX P comma -120 +KPX P e -30 +KPX P eacute -30 +KPX P ecaron -30 +KPX P ecircumflex -30 +KPX P edieresis -30 +KPX P edotaccent -30 +KPX P egrave -30 +KPX P emacron -30 +KPX P eogonek -30 +KPX P o -40 +KPX P oacute -40 +KPX P ocircumflex -40 +KPX P odieresis -40 +KPX P ograve -40 +KPX P ohungarumlaut -40 +KPX P omacron -40 +KPX P oslash -40 +KPX P otilde -40 +KPX P period -120 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX Q comma 20 +KPX Q period 20 +KPX R O -20 +KPX R Oacute -20 +KPX R Ocircumflex -20 +KPX R Odieresis -20 +KPX R Ograve -20 +KPX R Ohungarumlaut -20 +KPX R Omacron -20 +KPX R Oslash -20 +KPX R Otilde -20 +KPX R T -20 +KPX R Tcaron -20 +KPX R Tcommaaccent -20 +KPX R U -20 +KPX R Uacute -20 +KPX R Ucircumflex -20 +KPX R Udieresis -20 +KPX R Ugrave -20 +KPX R Uhungarumlaut -20 +KPX R Umacron -20 +KPX R Uogonek -20 +KPX R Uring -20 +KPX R V -50 +KPX R W -40 +KPX R Y -50 +KPX R Yacute -50 +KPX R Ydieresis -50 +KPX Racute O -20 +KPX Racute Oacute -20 +KPX Racute Ocircumflex -20 +KPX Racute Odieresis -20 +KPX Racute Ograve -20 +KPX Racute Ohungarumlaut -20 +KPX Racute Omacron -20 +KPX Racute Oslash -20 +KPX Racute Otilde -20 +KPX Racute T -20 +KPX Racute Tcaron -20 +KPX Racute Tcommaaccent -20 +KPX Racute U -20 +KPX Racute Uacute -20 +KPX Racute Ucircumflex -20 +KPX Racute Udieresis -20 +KPX Racute Ugrave -20 +KPX Racute Uhungarumlaut -20 +KPX Racute Umacron -20 +KPX Racute Uogonek -20 +KPX Racute Uring -20 +KPX Racute V -50 +KPX Racute W -40 +KPX Racute Y -50 +KPX Racute Yacute -50 +KPX Racute Ydieresis -50 +KPX Rcaron O -20 +KPX Rcaron Oacute -20 +KPX Rcaron Ocircumflex -20 +KPX Rcaron Odieresis -20 +KPX Rcaron Ograve -20 +KPX Rcaron Ohungarumlaut -20 +KPX Rcaron Omacron -20 +KPX Rcaron Oslash -20 +KPX Rcaron Otilde -20 +KPX Rcaron T -20 +KPX Rcaron Tcaron -20 +KPX Rcaron Tcommaaccent -20 +KPX Rcaron U -20 +KPX Rcaron Uacute -20 +KPX Rcaron Ucircumflex -20 +KPX Rcaron Udieresis -20 +KPX Rcaron Ugrave -20 +KPX Rcaron Uhungarumlaut -20 +KPX Rcaron Umacron -20 +KPX Rcaron Uogonek -20 +KPX Rcaron Uring -20 +KPX Rcaron V -50 +KPX Rcaron W -40 +KPX Rcaron Y -50 +KPX Rcaron Yacute -50 +KPX Rcaron Ydieresis -50 +KPX Rcommaaccent O -20 +KPX Rcommaaccent Oacute -20 +KPX Rcommaaccent Ocircumflex -20 +KPX Rcommaaccent Odieresis -20 +KPX Rcommaaccent Ograve -20 +KPX Rcommaaccent Ohungarumlaut -20 +KPX Rcommaaccent Omacron -20 +KPX Rcommaaccent Oslash -20 +KPX Rcommaaccent Otilde -20 +KPX Rcommaaccent T -20 +KPX Rcommaaccent Tcaron -20 +KPX Rcommaaccent Tcommaaccent -20 +KPX Rcommaaccent U -20 +KPX Rcommaaccent Uacute -20 +KPX Rcommaaccent Ucircumflex -20 +KPX Rcommaaccent Udieresis -20 +KPX Rcommaaccent Ugrave -20 +KPX Rcommaaccent Uhungarumlaut -20 +KPX Rcommaaccent Umacron -20 +KPX Rcommaaccent Uogonek -20 +KPX Rcommaaccent Uring -20 +KPX Rcommaaccent V -50 +KPX Rcommaaccent W -40 +KPX Rcommaaccent Y -50 +KPX Rcommaaccent Yacute -50 +KPX Rcommaaccent Ydieresis -50 +KPX T A -90 +KPX T Aacute -90 +KPX T Abreve -90 +KPX T Acircumflex -90 +KPX T Adieresis -90 +KPX T Agrave -90 +KPX T Amacron -90 +KPX T Aogonek -90 +KPX T Aring -90 +KPX T Atilde -90 +KPX T O -40 +KPX T Oacute -40 +KPX T Ocircumflex -40 +KPX T Odieresis -40 +KPX T Ograve -40 +KPX T Ohungarumlaut -40 +KPX T Omacron -40 +KPX T Oslash -40 +KPX T Otilde -40 +KPX T a -80 +KPX T aacute -80 +KPX T abreve -80 +KPX T acircumflex -80 +KPX T adieresis -80 +KPX T agrave -80 +KPX T amacron -80 +KPX T aogonek -80 +KPX T aring -80 +KPX T atilde -80 +KPX T colon -40 +KPX T comma -80 +KPX T e -60 +KPX T eacute -60 +KPX T ecaron -60 +KPX T ecircumflex -60 +KPX T edieresis -60 +KPX T edotaccent -60 +KPX T egrave -60 +KPX T emacron -60 +KPX T eogonek -60 +KPX T hyphen -120 +KPX T o -80 +KPX T oacute -80 +KPX T ocircumflex -80 +KPX T odieresis -80 +KPX T ograve -80 +KPX T ohungarumlaut -80 +KPX T omacron -80 +KPX T oslash -80 +KPX T otilde -80 +KPX T period -80 +KPX T r -80 +KPX T racute -80 +KPX T rcommaaccent -80 +KPX T semicolon -40 +KPX T u -90 +KPX T uacute -90 +KPX T ucircumflex -90 +KPX T udieresis -90 +KPX T ugrave -90 +KPX T uhungarumlaut -90 +KPX T umacron -90 +KPX T uogonek -90 +KPX T uring -90 +KPX T w -60 +KPX T y -60 +KPX T yacute -60 +KPX T ydieresis -60 +KPX Tcaron A -90 +KPX Tcaron Aacute -90 +KPX Tcaron Abreve -90 +KPX Tcaron Acircumflex -90 +KPX Tcaron Adieresis -90 +KPX Tcaron Agrave -90 +KPX Tcaron Amacron -90 +KPX Tcaron Aogonek -90 +KPX Tcaron Aring -90 +KPX Tcaron Atilde -90 +KPX Tcaron O -40 +KPX Tcaron Oacute -40 +KPX Tcaron Ocircumflex -40 +KPX Tcaron Odieresis -40 +KPX Tcaron Ograve -40 +KPX Tcaron Ohungarumlaut -40 +KPX Tcaron Omacron -40 +KPX Tcaron Oslash -40 +KPX Tcaron Otilde -40 +KPX Tcaron a -80 +KPX Tcaron aacute -80 +KPX Tcaron abreve -80 +KPX Tcaron acircumflex -80 +KPX Tcaron adieresis -80 +KPX Tcaron agrave -80 +KPX Tcaron amacron -80 +KPX Tcaron aogonek -80 +KPX Tcaron aring -80 +KPX Tcaron atilde -80 +KPX Tcaron colon -40 +KPX Tcaron comma -80 +KPX Tcaron e -60 +KPX Tcaron eacute -60 +KPX Tcaron ecaron -60 +KPX Tcaron ecircumflex -60 +KPX Tcaron edieresis -60 +KPX Tcaron edotaccent -60 +KPX Tcaron egrave -60 +KPX Tcaron emacron -60 +KPX Tcaron eogonek -60 +KPX Tcaron hyphen -120 +KPX Tcaron o -80 +KPX Tcaron oacute -80 +KPX Tcaron ocircumflex -80 +KPX Tcaron odieresis -80 +KPX Tcaron ograve -80 +KPX Tcaron ohungarumlaut -80 +KPX Tcaron omacron -80 +KPX Tcaron oslash -80 +KPX Tcaron otilde -80 +KPX Tcaron period -80 +KPX Tcaron r -80 +KPX Tcaron racute -80 +KPX Tcaron rcommaaccent -80 +KPX Tcaron semicolon -40 +KPX Tcaron u -90 +KPX Tcaron uacute -90 +KPX Tcaron ucircumflex -90 +KPX Tcaron udieresis -90 +KPX Tcaron ugrave -90 +KPX Tcaron uhungarumlaut -90 +KPX Tcaron umacron -90 +KPX Tcaron uogonek -90 +KPX Tcaron uring -90 +KPX Tcaron w -60 +KPX Tcaron y -60 +KPX Tcaron yacute -60 +KPX Tcaron ydieresis -60 +KPX Tcommaaccent A -90 +KPX Tcommaaccent Aacute -90 +KPX Tcommaaccent Abreve -90 +KPX Tcommaaccent Acircumflex -90 +KPX Tcommaaccent Adieresis -90 +KPX Tcommaaccent Agrave -90 +KPX Tcommaaccent Amacron -90 +KPX Tcommaaccent Aogonek -90 +KPX Tcommaaccent Aring -90 +KPX Tcommaaccent Atilde -90 +KPX Tcommaaccent O -40 +KPX Tcommaaccent Oacute -40 +KPX Tcommaaccent Ocircumflex -40 +KPX Tcommaaccent Odieresis -40 +KPX Tcommaaccent Ograve -40 +KPX Tcommaaccent Ohungarumlaut -40 +KPX Tcommaaccent Omacron -40 +KPX Tcommaaccent Oslash -40 +KPX Tcommaaccent Otilde -40 +KPX Tcommaaccent a -80 +KPX Tcommaaccent aacute -80 +KPX Tcommaaccent abreve -80 +KPX Tcommaaccent acircumflex -80 +KPX Tcommaaccent adieresis -80 +KPX Tcommaaccent agrave -80 +KPX Tcommaaccent amacron -80 +KPX Tcommaaccent aogonek -80 +KPX Tcommaaccent aring -80 +KPX Tcommaaccent atilde -80 +KPX Tcommaaccent colon -40 +KPX Tcommaaccent comma -80 +KPX Tcommaaccent e -60 +KPX Tcommaaccent eacute -60 +KPX Tcommaaccent ecaron -60 +KPX Tcommaaccent ecircumflex -60 +KPX Tcommaaccent edieresis -60 +KPX Tcommaaccent edotaccent -60 +KPX Tcommaaccent egrave -60 +KPX Tcommaaccent emacron -60 +KPX Tcommaaccent eogonek -60 +KPX Tcommaaccent hyphen -120 +KPX Tcommaaccent o -80 +KPX Tcommaaccent oacute -80 +KPX Tcommaaccent ocircumflex -80 +KPX Tcommaaccent odieresis -80 +KPX Tcommaaccent ograve -80 +KPX Tcommaaccent ohungarumlaut -80 +KPX Tcommaaccent omacron -80 +KPX Tcommaaccent oslash -80 +KPX Tcommaaccent otilde -80 +KPX Tcommaaccent period -80 +KPX Tcommaaccent r -80 +KPX Tcommaaccent racute -80 +KPX Tcommaaccent rcommaaccent -80 +KPX Tcommaaccent semicolon -40 +KPX Tcommaaccent u -90 +KPX Tcommaaccent uacute -90 +KPX Tcommaaccent ucircumflex -90 +KPX Tcommaaccent udieresis -90 +KPX Tcommaaccent ugrave -90 +KPX Tcommaaccent uhungarumlaut -90 +KPX Tcommaaccent umacron -90 +KPX Tcommaaccent uogonek -90 +KPX Tcommaaccent uring -90 +KPX Tcommaaccent w -60 +KPX Tcommaaccent y -60 +KPX Tcommaaccent yacute -60 +KPX Tcommaaccent ydieresis -60 +KPX U A -50 +KPX U Aacute -50 +KPX U Abreve -50 +KPX U Acircumflex -50 +KPX U Adieresis -50 +KPX U Agrave -50 +KPX U Amacron -50 +KPX U Aogonek -50 +KPX U Aring -50 +KPX U Atilde -50 +KPX U comma -30 +KPX U period -30 +KPX Uacute A -50 +KPX Uacute Aacute -50 +KPX Uacute Abreve -50 +KPX Uacute Acircumflex -50 +KPX Uacute Adieresis -50 +KPX Uacute Agrave -50 +KPX Uacute Amacron -50 +KPX Uacute Aogonek -50 +KPX Uacute Aring -50 +KPX Uacute Atilde -50 +KPX Uacute comma -30 +KPX Uacute period -30 +KPX Ucircumflex A -50 +KPX Ucircumflex Aacute -50 +KPX Ucircumflex Abreve -50 +KPX Ucircumflex Acircumflex -50 +KPX Ucircumflex Adieresis -50 +KPX Ucircumflex Agrave -50 +KPX Ucircumflex Amacron -50 +KPX Ucircumflex Aogonek -50 +KPX Ucircumflex Aring -50 +KPX Ucircumflex Atilde -50 +KPX Ucircumflex comma -30 +KPX Ucircumflex period -30 +KPX Udieresis A -50 +KPX Udieresis Aacute -50 +KPX Udieresis Abreve -50 +KPX Udieresis Acircumflex -50 +KPX Udieresis Adieresis -50 +KPX Udieresis Agrave -50 +KPX Udieresis Amacron -50 +KPX Udieresis Aogonek -50 +KPX Udieresis Aring -50 +KPX Udieresis Atilde -50 +KPX Udieresis comma -30 +KPX Udieresis period -30 +KPX Ugrave A -50 +KPX Ugrave Aacute -50 +KPX Ugrave Abreve -50 +KPX Ugrave Acircumflex -50 +KPX Ugrave Adieresis -50 +KPX Ugrave Agrave -50 +KPX Ugrave Amacron -50 +KPX Ugrave Aogonek -50 +KPX Ugrave Aring -50 +KPX Ugrave Atilde -50 +KPX Ugrave comma -30 +KPX Ugrave period -30 +KPX Uhungarumlaut A -50 +KPX Uhungarumlaut Aacute -50 +KPX Uhungarumlaut Abreve -50 +KPX Uhungarumlaut Acircumflex -50 +KPX Uhungarumlaut Adieresis -50 +KPX Uhungarumlaut Agrave -50 +KPX Uhungarumlaut Amacron -50 +KPX Uhungarumlaut Aogonek -50 +KPX Uhungarumlaut Aring -50 +KPX Uhungarumlaut Atilde -50 +KPX Uhungarumlaut comma -30 +KPX Uhungarumlaut period -30 +KPX Umacron A -50 +KPX Umacron Aacute -50 +KPX Umacron Abreve -50 +KPX Umacron Acircumflex -50 +KPX Umacron Adieresis -50 +KPX Umacron Agrave -50 +KPX Umacron Amacron -50 +KPX Umacron Aogonek -50 +KPX Umacron Aring -50 +KPX Umacron Atilde -50 +KPX Umacron comma -30 +KPX Umacron period -30 +KPX Uogonek A -50 +KPX Uogonek Aacute -50 +KPX Uogonek Abreve -50 +KPX Uogonek Acircumflex -50 +KPX Uogonek Adieresis -50 +KPX Uogonek Agrave -50 +KPX Uogonek Amacron -50 +KPX Uogonek Aogonek -50 +KPX Uogonek Aring -50 +KPX Uogonek Atilde -50 +KPX Uogonek comma -30 +KPX Uogonek period -30 +KPX Uring A -50 +KPX Uring Aacute -50 +KPX Uring Abreve -50 +KPX Uring Acircumflex -50 +KPX Uring Adieresis -50 +KPX Uring Agrave -50 +KPX Uring Amacron -50 +KPX Uring Aogonek -50 +KPX Uring Aring -50 +KPX Uring Atilde -50 +KPX Uring comma -30 +KPX Uring period -30 +KPX V A -80 +KPX V Aacute -80 +KPX V Abreve -80 +KPX V Acircumflex -80 +KPX V Adieresis -80 +KPX V Agrave -80 +KPX V Amacron -80 +KPX V Aogonek -80 +KPX V Aring -80 +KPX V Atilde -80 +KPX V G -50 +KPX V Gbreve -50 +KPX V Gcommaaccent -50 +KPX V O -50 +KPX V Oacute -50 +KPX V Ocircumflex -50 +KPX V Odieresis -50 +KPX V Ograve -50 +KPX V Ohungarumlaut -50 +KPX V Omacron -50 +KPX V Oslash -50 +KPX V Otilde -50 +KPX V a -60 +KPX V aacute -60 +KPX V abreve -60 +KPX V acircumflex -60 +KPX V adieresis -60 +KPX V agrave -60 +KPX V amacron -60 +KPX V aogonek -60 +KPX V aring -60 +KPX V atilde -60 +KPX V colon -40 +KPX V comma -120 +KPX V e -50 +KPX V eacute -50 +KPX V ecaron -50 +KPX V ecircumflex -50 +KPX V edieresis -50 +KPX V edotaccent -50 +KPX V egrave -50 +KPX V emacron -50 +KPX V eogonek -50 +KPX V hyphen -80 +KPX V o -90 +KPX V oacute -90 +KPX V ocircumflex -90 +KPX V odieresis -90 +KPX V ograve -90 +KPX V ohungarumlaut -90 +KPX V omacron -90 +KPX V oslash -90 +KPX V otilde -90 +KPX V period -120 +KPX V semicolon -40 +KPX V u -60 +KPX V uacute -60 +KPX V ucircumflex -60 +KPX V udieresis -60 +KPX V ugrave -60 +KPX V uhungarumlaut -60 +KPX V umacron -60 +KPX V uogonek -60 +KPX V uring -60 +KPX W A -60 +KPX W Aacute -60 +KPX W Abreve -60 +KPX W Acircumflex -60 +KPX W Adieresis -60 +KPX W Agrave -60 +KPX W Amacron -60 +KPX W Aogonek -60 +KPX W Aring -60 +KPX W Atilde -60 +KPX W O -20 +KPX W Oacute -20 +KPX W Ocircumflex -20 +KPX W Odieresis -20 +KPX W Ograve -20 +KPX W Ohungarumlaut -20 +KPX W Omacron -20 +KPX W Oslash -20 +KPX W Otilde -20 +KPX W a -40 +KPX W aacute -40 +KPX W abreve -40 +KPX W acircumflex -40 +KPX W adieresis -40 +KPX W agrave -40 +KPX W amacron -40 +KPX W aogonek -40 +KPX W aring -40 +KPX W atilde -40 +KPX W colon -10 +KPX W comma -80 +KPX W e -35 +KPX W eacute -35 +KPX W ecaron -35 +KPX W ecircumflex -35 +KPX W edieresis -35 +KPX W edotaccent -35 +KPX W egrave -35 +KPX W emacron -35 +KPX W eogonek -35 +KPX W hyphen -40 +KPX W o -60 +KPX W oacute -60 +KPX W ocircumflex -60 +KPX W odieresis -60 +KPX W ograve -60 +KPX W ohungarumlaut -60 +KPX W omacron -60 +KPX W oslash -60 +KPX W otilde -60 +KPX W period -80 +KPX W semicolon -10 +KPX W u -45 +KPX W uacute -45 +KPX W ucircumflex -45 +KPX W udieresis -45 +KPX W ugrave -45 +KPX W uhungarumlaut -45 +KPX W umacron -45 +KPX W uogonek -45 +KPX W uring -45 +KPX W y -20 +KPX W yacute -20 +KPX W ydieresis -20 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -70 +KPX Y Oacute -70 +KPX Y Ocircumflex -70 +KPX Y Odieresis -70 +KPX Y Ograve -70 +KPX Y Ohungarumlaut -70 +KPX Y Omacron -70 +KPX Y Oslash -70 +KPX Y Otilde -70 +KPX Y a -90 +KPX Y aacute -90 +KPX Y abreve -90 +KPX Y acircumflex -90 +KPX Y adieresis -90 +KPX Y agrave -90 +KPX Y amacron -90 +KPX Y aogonek -90 +KPX Y aring -90 +KPX Y atilde -90 +KPX Y colon -50 +KPX Y comma -100 +KPX Y e -80 +KPX Y eacute -80 +KPX Y ecaron -80 +KPX Y ecircumflex -80 +KPX Y edieresis -80 +KPX Y edotaccent -80 +KPX Y egrave -80 +KPX Y emacron -80 +KPX Y eogonek -80 +KPX Y o -100 +KPX Y oacute -100 +KPX Y ocircumflex -100 +KPX Y odieresis -100 +KPX Y ograve -100 +KPX Y ohungarumlaut -100 +KPX Y omacron -100 +KPX Y oslash -100 +KPX Y otilde -100 +KPX Y period -100 +KPX Y semicolon -50 +KPX Y u -100 +KPX Y uacute -100 +KPX Y ucircumflex -100 +KPX Y udieresis -100 +KPX Y ugrave -100 +KPX Y uhungarumlaut -100 +KPX Y umacron -100 +KPX Y uogonek -100 +KPX Y uring -100 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -70 +KPX Yacute Oacute -70 +KPX Yacute Ocircumflex -70 +KPX Yacute Odieresis -70 +KPX Yacute Ograve -70 +KPX Yacute Ohungarumlaut -70 +KPX Yacute Omacron -70 +KPX Yacute Oslash -70 +KPX Yacute Otilde -70 +KPX Yacute a -90 +KPX Yacute aacute -90 +KPX Yacute abreve -90 +KPX Yacute acircumflex -90 +KPX Yacute adieresis -90 +KPX Yacute agrave -90 +KPX Yacute amacron -90 +KPX Yacute aogonek -90 +KPX Yacute aring -90 +KPX Yacute atilde -90 +KPX Yacute colon -50 +KPX Yacute comma -100 +KPX Yacute e -80 +KPX Yacute eacute -80 +KPX Yacute ecaron -80 +KPX Yacute ecircumflex -80 +KPX Yacute edieresis -80 +KPX Yacute edotaccent -80 +KPX Yacute egrave -80 +KPX Yacute emacron -80 +KPX Yacute eogonek -80 +KPX Yacute o -100 +KPX Yacute oacute -100 +KPX Yacute ocircumflex -100 +KPX Yacute odieresis -100 +KPX Yacute ograve -100 +KPX Yacute ohungarumlaut -100 +KPX Yacute omacron -100 +KPX Yacute oslash -100 +KPX Yacute otilde -100 +KPX Yacute period -100 +KPX Yacute semicolon -50 +KPX Yacute u -100 +KPX Yacute uacute -100 +KPX Yacute ucircumflex -100 +KPX Yacute udieresis -100 +KPX Yacute ugrave -100 +KPX Yacute uhungarumlaut -100 +KPX Yacute umacron -100 +KPX Yacute uogonek -100 +KPX Yacute uring -100 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -70 +KPX Ydieresis Oacute -70 +KPX Ydieresis Ocircumflex -70 +KPX Ydieresis Odieresis -70 +KPX Ydieresis Ograve -70 +KPX Ydieresis Ohungarumlaut -70 +KPX Ydieresis Omacron -70 +KPX Ydieresis Oslash -70 +KPX Ydieresis Otilde -70 +KPX Ydieresis a -90 +KPX Ydieresis aacute -90 +KPX Ydieresis abreve -90 +KPX Ydieresis acircumflex -90 +KPX Ydieresis adieresis -90 +KPX Ydieresis agrave -90 +KPX Ydieresis amacron -90 +KPX Ydieresis aogonek -90 +KPX Ydieresis aring -90 +KPX Ydieresis atilde -90 +KPX Ydieresis colon -50 +KPX Ydieresis comma -100 +KPX Ydieresis e -80 +KPX Ydieresis eacute -80 +KPX Ydieresis ecaron -80 +KPX Ydieresis ecircumflex -80 +KPX Ydieresis edieresis -80 +KPX Ydieresis edotaccent -80 +KPX Ydieresis egrave -80 +KPX Ydieresis emacron -80 +KPX Ydieresis eogonek -80 +KPX Ydieresis o -100 +KPX Ydieresis oacute -100 +KPX Ydieresis ocircumflex -100 +KPX Ydieresis odieresis -100 +KPX Ydieresis ograve -100 +KPX Ydieresis ohungarumlaut -100 +KPX Ydieresis omacron -100 +KPX Ydieresis oslash -100 +KPX Ydieresis otilde -100 +KPX Ydieresis period -100 +KPX Ydieresis semicolon -50 +KPX Ydieresis u -100 +KPX Ydieresis uacute -100 +KPX Ydieresis ucircumflex -100 +KPX Ydieresis udieresis -100 +KPX Ydieresis ugrave -100 +KPX Ydieresis uhungarumlaut -100 +KPX Ydieresis umacron -100 +KPX Ydieresis uogonek -100 +KPX Ydieresis uring -100 +KPX a g -10 +KPX a gbreve -10 +KPX a gcommaaccent -10 +KPX a v -15 +KPX a w -15 +KPX a y -20 +KPX a yacute -20 +KPX a ydieresis -20 +KPX aacute g -10 +KPX aacute gbreve -10 +KPX aacute gcommaaccent -10 +KPX aacute v -15 +KPX aacute w -15 +KPX aacute y -20 +KPX aacute yacute -20 +KPX aacute ydieresis -20 +KPX abreve g -10 +KPX abreve gbreve -10 +KPX abreve gcommaaccent -10 +KPX abreve v -15 +KPX abreve w -15 +KPX abreve y -20 +KPX abreve yacute -20 +KPX abreve ydieresis -20 +KPX acircumflex g -10 +KPX acircumflex gbreve -10 +KPX acircumflex gcommaaccent -10 +KPX acircumflex v -15 +KPX acircumflex w -15 +KPX acircumflex y -20 +KPX acircumflex yacute -20 +KPX acircumflex ydieresis -20 +KPX adieresis g -10 +KPX adieresis gbreve -10 +KPX adieresis gcommaaccent -10 +KPX adieresis v -15 +KPX adieresis w -15 +KPX adieresis y -20 +KPX adieresis yacute -20 +KPX adieresis ydieresis -20 +KPX agrave g -10 +KPX agrave gbreve -10 +KPX agrave gcommaaccent -10 +KPX agrave v -15 +KPX agrave w -15 +KPX agrave y -20 +KPX agrave yacute -20 +KPX agrave ydieresis -20 +KPX amacron g -10 +KPX amacron gbreve -10 +KPX amacron gcommaaccent -10 +KPX amacron v -15 +KPX amacron w -15 +KPX amacron y -20 +KPX amacron yacute -20 +KPX amacron ydieresis -20 +KPX aogonek g -10 +KPX aogonek gbreve -10 +KPX aogonek gcommaaccent -10 +KPX aogonek v -15 +KPX aogonek w -15 +KPX aogonek y -20 +KPX aogonek yacute -20 +KPX aogonek ydieresis -20 +KPX aring g -10 +KPX aring gbreve -10 +KPX aring gcommaaccent -10 +KPX aring v -15 +KPX aring w -15 +KPX aring y -20 +KPX aring yacute -20 +KPX aring ydieresis -20 +KPX atilde g -10 +KPX atilde gbreve -10 +KPX atilde gcommaaccent -10 +KPX atilde v -15 +KPX atilde w -15 +KPX atilde y -20 +KPX atilde yacute -20 +KPX atilde ydieresis -20 +KPX b l -10 +KPX b lacute -10 +KPX b lcommaaccent -10 +KPX b lslash -10 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -20 +KPX b y -20 +KPX b yacute -20 +KPX b ydieresis -20 +KPX c h -10 +KPX c k -20 +KPX c kcommaaccent -20 +KPX c l -20 +KPX c lacute -20 +KPX c lcommaaccent -20 +KPX c lslash -20 +KPX c y -10 +KPX c yacute -10 +KPX c ydieresis -10 +KPX cacute h -10 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX cacute l -20 +KPX cacute lacute -20 +KPX cacute lcommaaccent -20 +KPX cacute lslash -20 +KPX cacute y -10 +KPX cacute yacute -10 +KPX cacute ydieresis -10 +KPX ccaron h -10 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccaron l -20 +KPX ccaron lacute -20 +KPX ccaron lcommaaccent -20 +KPX ccaron lslash -20 +KPX ccaron y -10 +KPX ccaron yacute -10 +KPX ccaron ydieresis -10 +KPX ccedilla h -10 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX ccedilla l -20 +KPX ccedilla lacute -20 +KPX ccedilla lcommaaccent -20 +KPX ccedilla lslash -20 +KPX ccedilla y -10 +KPX ccedilla yacute -10 +KPX ccedilla ydieresis -10 +KPX colon space -40 +KPX comma quotedblright -120 +KPX comma quoteright -120 +KPX comma space -40 +KPX d d -10 +KPX d dcroat -10 +KPX d v -15 +KPX d w -15 +KPX d y -15 +KPX d yacute -15 +KPX d ydieresis -15 +KPX dcroat d -10 +KPX dcroat dcroat -10 +KPX dcroat v -15 +KPX dcroat w -15 +KPX dcroat y -15 +KPX dcroat yacute -15 +KPX dcroat ydieresis -15 +KPX e comma 10 +KPX e period 20 +KPX e v -15 +KPX e w -15 +KPX e x -15 +KPX e y -15 +KPX e yacute -15 +KPX e ydieresis -15 +KPX eacute comma 10 +KPX eacute period 20 +KPX eacute v -15 +KPX eacute w -15 +KPX eacute x -15 +KPX eacute y -15 +KPX eacute yacute -15 +KPX eacute ydieresis -15 +KPX ecaron comma 10 +KPX ecaron period 20 +KPX ecaron v -15 +KPX ecaron w -15 +KPX ecaron x -15 +KPX ecaron y -15 +KPX ecaron yacute -15 +KPX ecaron ydieresis -15 +KPX ecircumflex comma 10 +KPX ecircumflex period 20 +KPX ecircumflex v -15 +KPX ecircumflex w -15 +KPX ecircumflex x -15 +KPX ecircumflex y -15 +KPX ecircumflex yacute -15 +KPX ecircumflex ydieresis -15 +KPX edieresis comma 10 +KPX edieresis period 20 +KPX edieresis v -15 +KPX edieresis w -15 +KPX edieresis x -15 +KPX edieresis y -15 +KPX edieresis yacute -15 +KPX edieresis ydieresis -15 +KPX edotaccent comma 10 +KPX edotaccent period 20 +KPX edotaccent v -15 +KPX edotaccent w -15 +KPX edotaccent x -15 +KPX edotaccent y -15 +KPX edotaccent yacute -15 +KPX edotaccent ydieresis -15 +KPX egrave comma 10 +KPX egrave period 20 +KPX egrave v -15 +KPX egrave w -15 +KPX egrave x -15 +KPX egrave y -15 +KPX egrave yacute -15 +KPX egrave ydieresis -15 +KPX emacron comma 10 +KPX emacron period 20 +KPX emacron v -15 +KPX emacron w -15 +KPX emacron x -15 +KPX emacron y -15 +KPX emacron yacute -15 +KPX emacron ydieresis -15 +KPX eogonek comma 10 +KPX eogonek period 20 +KPX eogonek v -15 +KPX eogonek w -15 +KPX eogonek x -15 +KPX eogonek y -15 +KPX eogonek yacute -15 +KPX eogonek ydieresis -15 +KPX f comma -10 +KPX f e -10 +KPX f eacute -10 +KPX f ecaron -10 +KPX f ecircumflex -10 +KPX f edieresis -10 +KPX f edotaccent -10 +KPX f egrave -10 +KPX f emacron -10 +KPX f eogonek -10 +KPX f o -20 +KPX f oacute -20 +KPX f ocircumflex -20 +KPX f odieresis -20 +KPX f ograve -20 +KPX f ohungarumlaut -20 +KPX f omacron -20 +KPX f oslash -20 +KPX f otilde -20 +KPX f period -10 +KPX f quotedblright 30 +KPX f quoteright 30 +KPX g e 10 +KPX g eacute 10 +KPX g ecaron 10 +KPX g ecircumflex 10 +KPX g edieresis 10 +KPX g edotaccent 10 +KPX g egrave 10 +KPX g emacron 10 +KPX g eogonek 10 +KPX g g -10 +KPX g gbreve -10 +KPX g gcommaaccent -10 +KPX gbreve e 10 +KPX gbreve eacute 10 +KPX gbreve ecaron 10 +KPX gbreve ecircumflex 10 +KPX gbreve edieresis 10 +KPX gbreve edotaccent 10 +KPX gbreve egrave 10 +KPX gbreve emacron 10 +KPX gbreve eogonek 10 +KPX gbreve g -10 +KPX gbreve gbreve -10 +KPX gbreve gcommaaccent -10 +KPX gcommaaccent e 10 +KPX gcommaaccent eacute 10 +KPX gcommaaccent ecaron 10 +KPX gcommaaccent ecircumflex 10 +KPX gcommaaccent edieresis 10 +KPX gcommaaccent edotaccent 10 +KPX gcommaaccent egrave 10 +KPX gcommaaccent emacron 10 +KPX gcommaaccent eogonek 10 +KPX gcommaaccent g -10 +KPX gcommaaccent gbreve -10 +KPX gcommaaccent gcommaaccent -10 +KPX h y -20 +KPX h yacute -20 +KPX h ydieresis -20 +KPX k o -15 +KPX k oacute -15 +KPX k ocircumflex -15 +KPX k odieresis -15 +KPX k ograve -15 +KPX k ohungarumlaut -15 +KPX k omacron -15 +KPX k oslash -15 +KPX k otilde -15 +KPX kcommaaccent o -15 +KPX kcommaaccent oacute -15 +KPX kcommaaccent ocircumflex -15 +KPX kcommaaccent odieresis -15 +KPX kcommaaccent ograve -15 +KPX kcommaaccent ohungarumlaut -15 +KPX kcommaaccent omacron -15 +KPX kcommaaccent oslash -15 +KPX kcommaaccent otilde -15 +KPX l w -15 +KPX l y -15 +KPX l yacute -15 +KPX l ydieresis -15 +KPX lacute w -15 +KPX lacute y -15 +KPX lacute yacute -15 +KPX lacute ydieresis -15 +KPX lcommaaccent w -15 +KPX lcommaaccent y -15 +KPX lcommaaccent yacute -15 +KPX lcommaaccent ydieresis -15 +KPX lslash w -15 +KPX lslash y -15 +KPX lslash yacute -15 +KPX lslash ydieresis -15 +KPX m u -20 +KPX m uacute -20 +KPX m ucircumflex -20 +KPX m udieresis -20 +KPX m ugrave -20 +KPX m uhungarumlaut -20 +KPX m umacron -20 +KPX m uogonek -20 +KPX m uring -20 +KPX m y -30 +KPX m yacute -30 +KPX m ydieresis -30 +KPX n u -10 +KPX n uacute -10 +KPX n ucircumflex -10 +KPX n udieresis -10 +KPX n ugrave -10 +KPX n uhungarumlaut -10 +KPX n umacron -10 +KPX n uogonek -10 +KPX n uring -10 +KPX n v -40 +KPX n y -20 +KPX n yacute -20 +KPX n ydieresis -20 +KPX nacute u -10 +KPX nacute uacute -10 +KPX nacute ucircumflex -10 +KPX nacute udieresis -10 +KPX nacute ugrave -10 +KPX nacute uhungarumlaut -10 +KPX nacute umacron -10 +KPX nacute uogonek -10 +KPX nacute uring -10 +KPX nacute v -40 +KPX nacute y -20 +KPX nacute yacute -20 +KPX nacute ydieresis -20 +KPX ncaron u -10 +KPX ncaron uacute -10 +KPX ncaron ucircumflex -10 +KPX ncaron udieresis -10 +KPX ncaron ugrave -10 +KPX ncaron uhungarumlaut -10 +KPX ncaron umacron -10 +KPX ncaron uogonek -10 +KPX ncaron uring -10 +KPX ncaron v -40 +KPX ncaron y -20 +KPX ncaron yacute -20 +KPX ncaron ydieresis -20 +KPX ncommaaccent u -10 +KPX ncommaaccent uacute -10 +KPX ncommaaccent ucircumflex -10 +KPX ncommaaccent udieresis -10 +KPX ncommaaccent ugrave -10 +KPX ncommaaccent uhungarumlaut -10 +KPX ncommaaccent umacron -10 +KPX ncommaaccent uogonek -10 +KPX ncommaaccent uring -10 +KPX ncommaaccent v -40 +KPX ncommaaccent y -20 +KPX ncommaaccent yacute -20 +KPX ncommaaccent ydieresis -20 +KPX ntilde u -10 +KPX ntilde uacute -10 +KPX ntilde ucircumflex -10 +KPX ntilde udieresis -10 +KPX ntilde ugrave -10 +KPX ntilde uhungarumlaut -10 +KPX ntilde umacron -10 +KPX ntilde uogonek -10 +KPX ntilde uring -10 +KPX ntilde v -40 +KPX ntilde y -20 +KPX ntilde yacute -20 +KPX ntilde ydieresis -20 +KPX o v -20 +KPX o w -15 +KPX o x -30 +KPX o y -20 +KPX o yacute -20 +KPX o ydieresis -20 +KPX oacute v -20 +KPX oacute w -15 +KPX oacute x -30 +KPX oacute y -20 +KPX oacute yacute -20 +KPX oacute ydieresis -20 +KPX ocircumflex v -20 +KPX ocircumflex w -15 +KPX ocircumflex x -30 +KPX ocircumflex y -20 +KPX ocircumflex yacute -20 +KPX ocircumflex ydieresis -20 +KPX odieresis v -20 +KPX odieresis w -15 +KPX odieresis x -30 +KPX odieresis y -20 +KPX odieresis yacute -20 +KPX odieresis ydieresis -20 +KPX ograve v -20 +KPX ograve w -15 +KPX ograve x -30 +KPX ograve y -20 +KPX ograve yacute -20 +KPX ograve ydieresis -20 +KPX ohungarumlaut v -20 +KPX ohungarumlaut w -15 +KPX ohungarumlaut x -30 +KPX ohungarumlaut y -20 +KPX ohungarumlaut yacute -20 +KPX ohungarumlaut ydieresis -20 +KPX omacron v -20 +KPX omacron w -15 +KPX omacron x -30 +KPX omacron y -20 +KPX omacron yacute -20 +KPX omacron ydieresis -20 +KPX oslash v -20 +KPX oslash w -15 +KPX oslash x -30 +KPX oslash y -20 +KPX oslash yacute -20 +KPX oslash ydieresis -20 +KPX otilde v -20 +KPX otilde w -15 +KPX otilde x -30 +KPX otilde y -20 +KPX otilde yacute -20 +KPX otilde ydieresis -20 +KPX p y -15 +KPX p yacute -15 +KPX p ydieresis -15 +KPX period quotedblright -120 +KPX period quoteright -120 +KPX period space -40 +KPX quotedblright space -80 +KPX quoteleft quoteleft -46 +KPX quoteright d -80 +KPX quoteright dcroat -80 +KPX quoteright l -20 +KPX quoteright lacute -20 +KPX quoteright lcommaaccent -20 +KPX quoteright lslash -20 +KPX quoteright quoteright -46 +KPX quoteright r -40 +KPX quoteright racute -40 +KPX quoteright rcaron -40 +KPX quoteright rcommaaccent -40 +KPX quoteright s -60 +KPX quoteright sacute -60 +KPX quoteright scaron -60 +KPX quoteright scedilla -60 +KPX quoteright scommaaccent -60 +KPX quoteright space -80 +KPX quoteright v -20 +KPX r c -20 +KPX r cacute -20 +KPX r ccaron -20 +KPX r ccedilla -20 +KPX r comma -60 +KPX r d -20 +KPX r dcroat -20 +KPX r g -15 +KPX r gbreve -15 +KPX r gcommaaccent -15 +KPX r hyphen -20 +KPX r o -20 +KPX r oacute -20 +KPX r ocircumflex -20 +KPX r odieresis -20 +KPX r ograve -20 +KPX r ohungarumlaut -20 +KPX r omacron -20 +KPX r oslash -20 +KPX r otilde -20 +KPX r period -60 +KPX r q -20 +KPX r s -15 +KPX r sacute -15 +KPX r scaron -15 +KPX r scedilla -15 +KPX r scommaaccent -15 +KPX r t 20 +KPX r tcommaaccent 20 +KPX r v 10 +KPX r y 10 +KPX r yacute 10 +KPX r ydieresis 10 +KPX racute c -20 +KPX racute cacute -20 +KPX racute ccaron -20 +KPX racute ccedilla -20 +KPX racute comma -60 +KPX racute d -20 +KPX racute dcroat -20 +KPX racute g -15 +KPX racute gbreve -15 +KPX racute gcommaaccent -15 +KPX racute hyphen -20 +KPX racute o -20 +KPX racute oacute -20 +KPX racute ocircumflex -20 +KPX racute odieresis -20 +KPX racute ograve -20 +KPX racute ohungarumlaut -20 +KPX racute omacron -20 +KPX racute oslash -20 +KPX racute otilde -20 +KPX racute period -60 +KPX racute q -20 +KPX racute s -15 +KPX racute sacute -15 +KPX racute scaron -15 +KPX racute scedilla -15 +KPX racute scommaaccent -15 +KPX racute t 20 +KPX racute tcommaaccent 20 +KPX racute v 10 +KPX racute y 10 +KPX racute yacute 10 +KPX racute ydieresis 10 +KPX rcaron c -20 +KPX rcaron cacute -20 +KPX rcaron ccaron -20 +KPX rcaron ccedilla -20 +KPX rcaron comma -60 +KPX rcaron d -20 +KPX rcaron dcroat -20 +KPX rcaron g -15 +KPX rcaron gbreve -15 +KPX rcaron gcommaaccent -15 +KPX rcaron hyphen -20 +KPX rcaron o -20 +KPX rcaron oacute -20 +KPX rcaron ocircumflex -20 +KPX rcaron odieresis -20 +KPX rcaron ograve -20 +KPX rcaron ohungarumlaut -20 +KPX rcaron omacron -20 +KPX rcaron oslash -20 +KPX rcaron otilde -20 +KPX rcaron period -60 +KPX rcaron q -20 +KPX rcaron s -15 +KPX rcaron sacute -15 +KPX rcaron scaron -15 +KPX rcaron scedilla -15 +KPX rcaron scommaaccent -15 +KPX rcaron t 20 +KPX rcaron tcommaaccent 20 +KPX rcaron v 10 +KPX rcaron y 10 +KPX rcaron yacute 10 +KPX rcaron ydieresis 10 +KPX rcommaaccent c -20 +KPX rcommaaccent cacute -20 +KPX rcommaaccent ccaron -20 +KPX rcommaaccent ccedilla -20 +KPX rcommaaccent comma -60 +KPX rcommaaccent d -20 +KPX rcommaaccent dcroat -20 +KPX rcommaaccent g -15 +KPX rcommaaccent gbreve -15 +KPX rcommaaccent gcommaaccent -15 +KPX rcommaaccent hyphen -20 +KPX rcommaaccent o -20 +KPX rcommaaccent oacute -20 +KPX rcommaaccent ocircumflex -20 +KPX rcommaaccent odieresis -20 +KPX rcommaaccent ograve -20 +KPX rcommaaccent ohungarumlaut -20 +KPX rcommaaccent omacron -20 +KPX rcommaaccent oslash -20 +KPX rcommaaccent otilde -20 +KPX rcommaaccent period -60 +KPX rcommaaccent q -20 +KPX rcommaaccent s -15 +KPX rcommaaccent sacute -15 +KPX rcommaaccent scaron -15 +KPX rcommaaccent scedilla -15 +KPX rcommaaccent scommaaccent -15 +KPX rcommaaccent t 20 +KPX rcommaaccent tcommaaccent 20 +KPX rcommaaccent v 10 +KPX rcommaaccent y 10 +KPX rcommaaccent yacute 10 +KPX rcommaaccent ydieresis 10 +KPX s w -15 +KPX sacute w -15 +KPX scaron w -15 +KPX scedilla w -15 +KPX scommaaccent w -15 +KPX semicolon space -40 +KPX space T -100 +KPX space Tcaron -100 +KPX space Tcommaaccent -100 +KPX space V -80 +KPX space W -80 +KPX space Y -120 +KPX space Yacute -120 +KPX space Ydieresis -120 +KPX space quotedblleft -80 +KPX space quoteleft -60 +KPX v a -20 +KPX v aacute -20 +KPX v abreve -20 +KPX v acircumflex -20 +KPX v adieresis -20 +KPX v agrave -20 +KPX v amacron -20 +KPX v aogonek -20 +KPX v aring -20 +KPX v atilde -20 +KPX v comma -80 +KPX v o -30 +KPX v oacute -30 +KPX v ocircumflex -30 +KPX v odieresis -30 +KPX v ograve -30 +KPX v ohungarumlaut -30 +KPX v omacron -30 +KPX v oslash -30 +KPX v otilde -30 +KPX v period -80 +KPX w comma -40 +KPX w o -20 +KPX w oacute -20 +KPX w ocircumflex -20 +KPX w odieresis -20 +KPX w ograve -20 +KPX w ohungarumlaut -20 +KPX w omacron -20 +KPX w oslash -20 +KPX w otilde -20 +KPX w period -40 +KPX x e -10 +KPX x eacute -10 +KPX x ecaron -10 +KPX x ecircumflex -10 +KPX x edieresis -10 +KPX x edotaccent -10 +KPX x egrave -10 +KPX x emacron -10 +KPX x eogonek -10 +KPX y a -30 +KPX y aacute -30 +KPX y abreve -30 +KPX y acircumflex -30 +KPX y adieresis -30 +KPX y agrave -30 +KPX y amacron -30 +KPX y aogonek -30 +KPX y aring -30 +KPX y atilde -30 +KPX y comma -80 +KPX y e -10 +KPX y eacute -10 +KPX y ecaron -10 +KPX y ecircumflex -10 +KPX y edieresis -10 +KPX y edotaccent -10 +KPX y egrave -10 +KPX y emacron -10 +KPX y eogonek -10 +KPX y o -25 +KPX y oacute -25 +KPX y ocircumflex -25 +KPX y odieresis -25 +KPX y ograve -25 +KPX y ohungarumlaut -25 +KPX y omacron -25 +KPX y oslash -25 +KPX y otilde -25 +KPX y period -80 +KPX yacute a -30 +KPX yacute aacute -30 +KPX yacute abreve -30 +KPX yacute acircumflex -30 +KPX yacute adieresis -30 +KPX yacute agrave -30 +KPX yacute amacron -30 +KPX yacute aogonek -30 +KPX yacute aring -30 +KPX yacute atilde -30 +KPX yacute comma -80 +KPX yacute e -10 +KPX yacute eacute -10 +KPX yacute ecaron -10 +KPX yacute ecircumflex -10 +KPX yacute edieresis -10 +KPX yacute edotaccent -10 +KPX yacute egrave -10 +KPX yacute emacron -10 +KPX yacute eogonek -10 +KPX yacute o -25 +KPX yacute oacute -25 +KPX yacute ocircumflex -25 +KPX yacute odieresis -25 +KPX yacute ograve -25 +KPX yacute ohungarumlaut -25 +KPX yacute omacron -25 +KPX yacute oslash -25 +KPX yacute otilde -25 +KPX yacute period -80 +KPX ydieresis a -30 +KPX ydieresis aacute -30 +KPX ydieresis abreve -30 +KPX ydieresis acircumflex -30 +KPX ydieresis adieresis -30 +KPX ydieresis agrave -30 +KPX ydieresis amacron -30 +KPX ydieresis aogonek -30 +KPX ydieresis aring -30 +KPX ydieresis atilde -30 +KPX ydieresis comma -80 +KPX ydieresis e -10 +KPX ydieresis eacute -10 +KPX ydieresis ecaron -10 +KPX ydieresis ecircumflex -10 +KPX ydieresis edieresis -10 +KPX ydieresis edotaccent -10 +KPX ydieresis egrave -10 +KPX ydieresis emacron -10 +KPX ydieresis eogonek -10 +KPX ydieresis o -25 +KPX ydieresis oacute -25 +KPX ydieresis ocircumflex -25 +KPX ydieresis odieresis -25 +KPX ydieresis ograve -25 +KPX ydieresis ohungarumlaut -25 +KPX ydieresis omacron -25 +KPX ydieresis oslash -25 +KPX ydieresis otilde -25 +KPX ydieresis period -80 +KPX z e 10 +KPX z eacute 10 +KPX z ecaron 10 +KPX z ecircumflex 10 +KPX z edieresis 10 +KPX z edotaccent 10 +KPX z egrave 10 +KPX z emacron 10 +KPX z eogonek 10 +KPX zacute e 10 +KPX zacute eacute 10 +KPX zacute ecaron 10 +KPX zacute ecircumflex 10 +KPX zacute edieresis 10 +KPX zacute edotaccent 10 +KPX zacute egrave 10 +KPX zacute emacron 10 +KPX zacute eogonek 10 +KPX zcaron e 10 +KPX zcaron eacute 10 +KPX zcaron ecaron 10 +KPX zcaron ecircumflex 10 +KPX zcaron edieresis 10 +KPX zcaron edotaccent 10 +KPX zcaron egrave 10 +KPX zcaron emacron 10 +KPX zcaron eogonek 10 +KPX zdotaccent e 10 +KPX zdotaccent eacute 10 +KPX zdotaccent ecaron 10 +KPX zdotaccent ecircumflex 10 +KPX zdotaccent edieresis 10 +KPX zdotaccent edotaccent 10 +KPX zdotaccent egrave 10 +KPX zdotaccent emacron 10 +KPX zdotaccent eogonek 10 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Helvetica-Oblique.afm b/application/third_party/dompdf/lib/fonts/Helvetica-Oblique.afm new file mode 100755 index 00000000..60f76ad3 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Helvetica-Oblique.afm @@ -0,0 +1,3053 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:44:31 1997 +Comment UniqueID 43055 +Comment VMusage 14960 69346 +FontName Helvetica-Oblique +FullName Helvetica Oblique +FamilyName Helvetica +Weight Medium +ItalicAngle -12 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -170 -225 1116 931 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 718 +XHeight 523 +Ascender 718 +Descender -207 +StdHW 76 +StdVW 88 +StartCharMetrics 317 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 160 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 278 ; N exclam ; B 90 0 340 718 ; +C 34 ; WX 355 ; N quotedbl ; B 168 463 438 718 ; +C 35 ; WX 556 ; N numbersign ; B 73 0 631 688 ; +C 36 ; WX 556 ; N dollar ; B 69 -115 617 775 ; +C 37 ; WX 889 ; N percent ; B 147 -19 889 703 ; +C 38 ; WX 667 ; N ampersand ; B 77 -15 647 718 ; +C 146 ; WX 222 ; N quoteright ; B 151 463 310 718 ; +C 40 ; WX 333 ; N parenleft ; B 108 -207 454 733 ; +C 41 ; WX 333 ; N parenright ; B -9 -207 337 733 ; +C 42 ; WX 389 ; N asterisk ; B 165 431 475 718 ; +C 43 ; WX 584 ; N plus ; B 85 0 606 505 ; +C 44 ; WX 278 ; N comma ; B 56 -147 214 106 ; +C 45 ; WX 333 ; N hyphen ; B 93 232 357 322 ; +C 173 ; WX 333 ; N hyphen ; B 44 232 289 322 ; +C 46 ; WX 278 ; N period ; B 87 0 214 106 ; +C 47 ; WX 278 ; N slash ; B -21 -19 452 737 ; +C 48 ; WX 556 ; N zero ; B 93 -19 608 703 ; +C 49 ; WX 556 ; N one ; B 207 0 508 703 ; +C 50 ; WX 556 ; N two ; B 26 0 617 703 ; +C 51 ; WX 556 ; N three ; B 75 -19 610 703 ; +C 52 ; WX 556 ; N four ; B 61 0 576 703 ; +C 53 ; WX 556 ; N five ; B 68 -19 621 688 ; +C 54 ; WX 556 ; N six ; B 91 -19 615 703 ; +C 55 ; WX 556 ; N seven ; B 137 0 669 688 ; +C 56 ; WX 556 ; N eight ; B 74 -19 607 703 ; +C 57 ; WX 556 ; N nine ; B 82 -19 609 703 ; +C 58 ; WX 278 ; N colon ; B 87 0 301 516 ; +C 59 ; WX 278 ; N semicolon ; B 56 -147 301 516 ; +C 60 ; WX 584 ; N less ; B 94 11 641 495 ; +C 61 ; WX 584 ; N equal ; B 63 115 628 390 ; +C 62 ; WX 584 ; N greater ; B 50 11 597 495 ; +C 63 ; WX 556 ; N question ; B 161 0 610 727 ; +C 64 ; WX 1015 ; N at ; B 215 -19 965 737 ; +C 65 ; WX 667 ; N A ; B 14 0 654 718 ; +C 66 ; WX 667 ; N B ; B 74 0 712 718 ; +C 67 ; WX 722 ; N C ; B 108 -19 782 737 ; +C 68 ; WX 722 ; N D ; B 81 0 764 718 ; +C 69 ; WX 667 ; N E ; B 86 0 762 718 ; +C 70 ; WX 611 ; N F ; B 86 0 736 718 ; +C 71 ; WX 778 ; N G ; B 111 -19 799 737 ; +C 72 ; WX 722 ; N H ; B 77 0 799 718 ; +C 73 ; WX 278 ; N I ; B 91 0 341 718 ; +C 74 ; WX 500 ; N J ; B 47 -19 581 718 ; +C 75 ; WX 667 ; N K ; B 76 0 808 718 ; +C 76 ; WX 556 ; N L ; B 76 0 555 718 ; +C 77 ; WX 833 ; N M ; B 73 0 914 718 ; +C 78 ; WX 722 ; N N ; B 76 0 799 718 ; +C 79 ; WX 778 ; N O ; B 105 -19 826 737 ; +C 80 ; WX 667 ; N P ; B 86 0 737 718 ; +C 81 ; WX 778 ; N Q ; B 105 -56 826 737 ; +C 82 ; WX 722 ; N R ; B 88 0 773 718 ; +C 83 ; WX 667 ; N S ; B 90 -19 713 737 ; +C 84 ; WX 611 ; N T ; B 148 0 750 718 ; +C 85 ; WX 722 ; N U ; B 123 -19 797 718 ; +C 86 ; WX 667 ; N V ; B 173 0 800 718 ; +C 87 ; WX 944 ; N W ; B 169 0 1081 718 ; +C 88 ; WX 667 ; N X ; B 19 0 790 718 ; +C 89 ; WX 667 ; N Y ; B 167 0 806 718 ; +C 90 ; WX 611 ; N Z ; B 23 0 741 718 ; +C 91 ; WX 278 ; N bracketleft ; B 21 -196 403 722 ; +C 92 ; WX 278 ; N backslash ; B 140 -19 291 737 ; +C 93 ; WX 278 ; N bracketright ; B -14 -196 368 722 ; +C 94 ; WX 469 ; N asciicircum ; B 42 264 539 688 ; +C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ; +C 145 ; WX 222 ; N quoteleft ; B 165 470 323 725 ; +C 97 ; WX 556 ; N a ; B 61 -15 559 538 ; +C 98 ; WX 556 ; N b ; B 58 -15 584 718 ; +C 99 ; WX 500 ; N c ; B 74 -15 553 538 ; +C 100 ; WX 556 ; N d ; B 84 -15 652 718 ; +C 101 ; WX 556 ; N e ; B 84 -15 578 538 ; +C 102 ; WX 278 ; N f ; B 86 0 416 728 ; L i fi ; L l fl ; +C 103 ; WX 556 ; N g ; B 42 -220 610 538 ; +C 104 ; WX 556 ; N h ; B 65 0 573 718 ; +C 105 ; WX 222 ; N i ; B 67 0 308 718 ; +C 106 ; WX 222 ; N j ; B -60 -210 308 718 ; +C 107 ; WX 500 ; N k ; B 67 0 600 718 ; +C 108 ; WX 222 ; N l ; B 67 0 308 718 ; +C 109 ; WX 833 ; N m ; B 65 0 852 538 ; +C 110 ; WX 556 ; N n ; B 65 0 573 538 ; +C 111 ; WX 556 ; N o ; B 83 -14 585 538 ; +C 112 ; WX 556 ; N p ; B 14 -207 584 538 ; +C 113 ; WX 556 ; N q ; B 84 -207 605 538 ; +C 114 ; WX 333 ; N r ; B 77 0 446 538 ; +C 115 ; WX 500 ; N s ; B 63 -15 529 538 ; +C 116 ; WX 278 ; N t ; B 102 -7 368 669 ; +C 117 ; WX 556 ; N u ; B 94 -15 600 523 ; +C 118 ; WX 500 ; N v ; B 119 0 603 523 ; +C 119 ; WX 722 ; N w ; B 125 0 820 523 ; +C 120 ; WX 500 ; N x ; B 11 0 594 523 ; +C 121 ; WX 500 ; N y ; B 15 -214 600 523 ; +C 122 ; WX 500 ; N z ; B 31 0 571 523 ; +C 123 ; WX 334 ; N braceleft ; B 92 -196 445 722 ; +C 124 ; WX 260 ; N bar ; B 46 -225 332 775 ; +C 125 ; WX 334 ; N braceright ; B 0 -196 354 722 ; +C 126 ; WX 584 ; N asciitilde ; B 111 180 580 326 ; +C 161 ; WX 333 ; N exclamdown ; B 77 -195 326 523 ; +C 162 ; WX 556 ; N cent ; B 95 -115 584 623 ; +C 163 ; WX 556 ; N sterling ; B 49 -16 634 718 ; +C -1 ; WX 167 ; N fraction ; B -170 -19 482 703 ; +C 165 ; WX 556 ; N yen ; B 81 0 699 688 ; +C 131 ; WX 556 ; N florin ; B -52 -207 654 737 ; +C 167 ; WX 556 ; N section ; B 76 -191 584 737 ; +C 164 ; WX 556 ; N currency ; B 60 99 646 603 ; +C 39 ; WX 191 ; N quotesingle ; B 157 463 285 718 ; +C 147 ; WX 333 ; N quotedblleft ; B 138 470 461 725 ; +C 170 ; WX 556 ; N guillemotleft ; B 146 108 554 446 ; +C 139 ; WX 333 ; N guilsinglleft ; B 137 108 340 446 ; +C 155 ; WX 333 ; N guilsinglright ; B 111 108 314 446 ; +C -1 ; WX 500 ; N fi ; B 86 0 587 728 ; +C -1 ; WX 500 ; N fl ; B 86 0 585 728 ; +C 150 ; WX 556 ; N endash ; B 51 240 623 313 ; +C 134 ; WX 556 ; N dagger ; B 135 -159 622 718 ; +C 135 ; WX 556 ; N daggerdbl ; B 52 -159 623 718 ; +C 183 ; WX 278 ; N periodcentered ; B 129 190 257 315 ; +C 182 ; WX 537 ; N paragraph ; B 126 -173 650 718 ; +C 149 ; WX 350 ; N bullet ; B 91 202 413 517 ; +C 130 ; WX 222 ; N quotesinglbase ; B 21 -149 180 106 ; +C 132 ; WX 333 ; N quotedblbase ; B -6 -149 318 106 ; +C 148 ; WX 333 ; N quotedblright ; B 124 463 448 718 ; +C 187 ; WX 556 ; N guillemotright ; B 120 108 528 446 ; +C 133 ; WX 1000 ; N ellipsis ; B 115 0 908 106 ; +C 137 ; WX 1000 ; N perthousand ; B 88 -19 1029 703 ; +C 191 ; WX 611 ; N questiondown ; B 85 -201 534 525 ; +C 96 ; WX 333 ; N grave ; B 170 593 337 734 ; +C 180 ; WX 333 ; N acute ; B 248 593 475 734 ; +C 136 ; WX 333 ; N circumflex ; B 147 593 438 734 ; +C 152 ; WX 333 ; N tilde ; B 125 606 490 722 ; +C 175 ; WX 333 ; N macron ; B 143 627 468 684 ; +C -1 ; WX 333 ; N breve ; B 167 595 476 731 ; +C -1 ; WX 333 ; N dotaccent ; B 249 604 362 706 ; +C 168 ; WX 333 ; N dieresis ; B 168 604 443 706 ; +C -1 ; WX 333 ; N ring ; B 214 572 402 756 ; +C 184 ; WX 333 ; N cedilla ; B 2 -225 232 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B 157 593 565 734 ; +C -1 ; WX 333 ; N ogonek ; B 43 -225 249 0 ; +C -1 ; WX 333 ; N caron ; B 177 593 468 734 ; +C 151 ; WX 1000 ; N emdash ; B 51 240 1067 313 ; +C 198 ; WX 1000 ; N AE ; B 8 0 1097 718 ; +C 170 ; WX 370 ; N ordfeminine ; B 127 405 449 737 ; +C -1 ; WX 556 ; N Lslash ; B 41 0 555 718 ; +C 216 ; WX 778 ; N Oslash ; B 43 -19 890 737 ; +C 140 ; WX 1000 ; N OE ; B 98 -19 1116 737 ; +C 186 ; WX 365 ; N ordmasculine ; B 141 405 468 737 ; +C 230 ; WX 889 ; N ae ; B 61 -15 909 538 ; +C -1 ; WX 278 ; N dotlessi ; B 95 0 294 523 ; +C -1 ; WX 222 ; N lslash ; B 41 0 347 718 ; +C 248 ; WX 611 ; N oslash ; B 29 -22 647 545 ; +C 156 ; WX 944 ; N oe ; B 83 -15 964 538 ; +C 223 ; WX 611 ; N germandbls ; B 67 -15 658 728 ; +C 207 ; WX 278 ; N Idieresis ; B 91 0 458 901 ; +C 233 ; WX 556 ; N eacute ; B 84 -15 587 734 ; +C -1 ; WX 556 ; N abreve ; B 61 -15 578 731 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 94 -15 677 734 ; +C -1 ; WX 556 ; N ecaron ; B 84 -15 580 734 ; +C 159 ; WX 667 ; N Ydieresis ; B 167 0 806 901 ; +C 247 ; WX 584 ; N divide ; B 85 -19 606 524 ; +C 221 ; WX 667 ; N Yacute ; B 167 0 806 929 ; +C 194 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ; +C 225 ; WX 556 ; N aacute ; B 61 -15 587 734 ; +C 219 ; WX 722 ; N Ucircumflex ; B 123 -19 797 929 ; +C 253 ; WX 500 ; N yacute ; B 15 -214 600 734 ; +C -1 ; WX 500 ; N scommaaccent ; B 63 -225 529 538 ; +C 234 ; WX 556 ; N ecircumflex ; B 84 -15 578 734 ; +C -1 ; WX 722 ; N Uring ; B 123 -19 797 931 ; +C 220 ; WX 722 ; N Udieresis ; B 123 -19 797 901 ; +C -1 ; WX 556 ; N aogonek ; B 61 -220 559 538 ; +C 218 ; WX 722 ; N Uacute ; B 123 -19 797 929 ; +C -1 ; WX 556 ; N uogonek ; B 94 -225 600 523 ; +C 203 ; WX 667 ; N Edieresis ; B 86 0 762 901 ; +C -1 ; WX 722 ; N Dcroat ; B 69 0 764 718 ; +C -1 ; WX 250 ; N commaaccent ; B 39 -225 172 -40 ; +C 169 ; WX 737 ; N copyright ; B 54 -19 837 737 ; +C -1 ; WX 667 ; N Emacron ; B 86 0 762 879 ; +C -1 ; WX 500 ; N ccaron ; B 74 -15 553 734 ; +C 229 ; WX 556 ; N aring ; B 61 -15 559 756 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 799 718 ; +C -1 ; WX 222 ; N lacute ; B 67 0 461 929 ; +C 224 ; WX 556 ; N agrave ; B 61 -15 559 734 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 148 -225 750 718 ; +C -1 ; WX 722 ; N Cacute ; B 108 -19 782 929 ; +C 227 ; WX 556 ; N atilde ; B 61 -15 592 722 ; +C -1 ; WX 667 ; N Edotaccent ; B 86 0 762 901 ; +C 154 ; WX 500 ; N scaron ; B 63 -15 552 734 ; +C -1 ; WX 500 ; N scedilla ; B 63 -225 529 538 ; +C 237 ; WX 278 ; N iacute ; B 95 0 448 734 ; +C -1 ; WX 471 ; N lozenge ; B 88 0 540 728 ; +C -1 ; WX 722 ; N Rcaron ; B 88 0 773 929 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 111 -225 799 737 ; +C 251 ; WX 556 ; N ucircumflex ; B 94 -15 600 734 ; +C 226 ; WX 556 ; N acircumflex ; B 61 -15 559 734 ; +C -1 ; WX 667 ; N Amacron ; B 14 0 677 879 ; +C -1 ; WX 333 ; N rcaron ; B 77 0 508 734 ; +C 231 ; WX 500 ; N ccedilla ; B 74 -225 553 538 ; +C -1 ; WX 611 ; N Zdotaccent ; B 23 0 741 901 ; +C 222 ; WX 667 ; N Thorn ; B 86 0 712 718 ; +C -1 ; WX 778 ; N Omacron ; B 105 -19 826 879 ; +C -1 ; WX 722 ; N Racute ; B 88 0 773 929 ; +C -1 ; WX 667 ; N Sacute ; B 90 -19 713 929 ; +C -1 ; WX 643 ; N dcaron ; B 84 -15 808 718 ; +C -1 ; WX 722 ; N Umacron ; B 123 -19 797 879 ; +C -1 ; WX 556 ; N uring ; B 94 -15 600 756 ; +C 179 ; WX 333 ; N threesuperior ; B 90 270 436 703 ; +C 210 ; WX 778 ; N Ograve ; B 105 -19 826 929 ; +C 192 ; WX 667 ; N Agrave ; B 14 0 654 929 ; +C -1 ; WX 667 ; N Abreve ; B 14 0 685 926 ; +C 215 ; WX 584 ; N multiply ; B 50 0 642 506 ; +C 250 ; WX 556 ; N uacute ; B 94 -15 600 734 ; +C -1 ; WX 611 ; N Tcaron ; B 148 0 750 929 ; +C -1 ; WX 476 ; N partialdiff ; B 41 -38 550 714 ; +C 255 ; WX 500 ; N ydieresis ; B 15 -214 600 706 ; +C -1 ; WX 722 ; N Nacute ; B 76 0 799 929 ; +C 238 ; WX 278 ; N icircumflex ; B 95 0 411 734 ; +C 202 ; WX 667 ; N Ecircumflex ; B 86 0 762 929 ; +C 228 ; WX 556 ; N adieresis ; B 61 -15 559 706 ; +C 235 ; WX 556 ; N edieresis ; B 84 -15 578 706 ; +C -1 ; WX 500 ; N cacute ; B 74 -15 559 734 ; +C -1 ; WX 556 ; N nacute ; B 65 0 587 734 ; +C -1 ; WX 556 ; N umacron ; B 94 -15 600 684 ; +C -1 ; WX 722 ; N Ncaron ; B 76 0 799 929 ; +C 205 ; WX 278 ; N Iacute ; B 91 0 489 929 ; +C 177 ; WX 584 ; N plusminus ; B 39 0 618 506 ; +C 166 ; WX 260 ; N brokenbar ; B 62 -150 316 700 ; +C 174 ; WX 737 ; N registered ; B 54 -19 837 737 ; +C -1 ; WX 778 ; N Gbreve ; B 111 -19 799 926 ; +C -1 ; WX 278 ; N Idotaccent ; B 91 0 377 901 ; +C -1 ; WX 600 ; N summation ; B 15 -10 671 706 ; +C 200 ; WX 667 ; N Egrave ; B 86 0 762 929 ; +C -1 ; WX 333 ; N racute ; B 77 0 475 734 ; +C -1 ; WX 556 ; N omacron ; B 83 -14 585 684 ; +C -1 ; WX 611 ; N Zacute ; B 23 0 741 929 ; +C 142 ; WX 611 ; N Zcaron ; B 23 0 741 929 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 620 674 ; +C 208 ; WX 722 ; N Eth ; B 69 0 764 718 ; +C 199 ; WX 722 ; N Ccedilla ; B 108 -225 782 737 ; +C -1 ; WX 222 ; N lcommaaccent ; B 25 -225 308 718 ; +C -1 ; WX 317 ; N tcaron ; B 102 -7 501 808 ; +C -1 ; WX 556 ; N eogonek ; B 84 -225 578 538 ; +C -1 ; WX 722 ; N Uogonek ; B 123 -225 797 718 ; +C 193 ; WX 667 ; N Aacute ; B 14 0 683 929 ; +C 196 ; WX 667 ; N Adieresis ; B 14 0 654 901 ; +C 232 ; WX 556 ; N egrave ; B 84 -15 578 734 ; +C -1 ; WX 500 ; N zacute ; B 31 0 571 734 ; +C -1 ; WX 222 ; N iogonek ; B -61 -225 308 718 ; +C 211 ; WX 778 ; N Oacute ; B 105 -19 826 929 ; +C 243 ; WX 556 ; N oacute ; B 83 -14 587 734 ; +C -1 ; WX 556 ; N amacron ; B 61 -15 580 684 ; +C -1 ; WX 500 ; N sacute ; B 63 -15 559 734 ; +C 239 ; WX 278 ; N idieresis ; B 95 0 416 706 ; +C 212 ; WX 778 ; N Ocircumflex ; B 105 -19 826 929 ; +C 217 ; WX 722 ; N Ugrave ; B 123 -19 797 929 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 556 ; N thorn ; B 14 -207 584 718 ; +C 178 ; WX 333 ; N twosuperior ; B 64 281 449 703 ; +C 214 ; WX 778 ; N Odieresis ; B 105 -19 826 901 ; +C 181 ; WX 556 ; N mu ; B 24 -207 600 523 ; +C 236 ; WX 278 ; N igrave ; B 95 0 310 734 ; +C -1 ; WX 556 ; N ohungarumlaut ; B 83 -14 677 734 ; +C -1 ; WX 667 ; N Eogonek ; B 86 -220 762 718 ; +C -1 ; WX 556 ; N dcroat ; B 84 -15 689 718 ; +C 190 ; WX 834 ; N threequarters ; B 130 -19 861 703 ; +C -1 ; WX 667 ; N Scedilla ; B 90 -225 713 737 ; +C -1 ; WX 299 ; N lcaron ; B 67 0 464 718 ; +C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 808 718 ; +C -1 ; WX 556 ; N Lacute ; B 76 0 555 929 ; +C 153 ; WX 1000 ; N trademark ; B 186 306 1056 718 ; +C -1 ; WX 556 ; N edotaccent ; B 84 -15 578 706 ; +C 204 ; WX 278 ; N Igrave ; B 91 0 351 929 ; +C -1 ; WX 278 ; N Imacron ; B 91 0 483 879 ; +C -1 ; WX 556 ; N Lcaron ; B 76 0 570 718 ; +C 189 ; WX 834 ; N onehalf ; B 114 -19 839 703 ; +C -1 ; WX 549 ; N lessequal ; B 26 0 666 674 ; +C 244 ; WX 556 ; N ocircumflex ; B 83 -14 585 734 ; +C 241 ; WX 556 ; N ntilde ; B 65 0 592 722 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 123 -19 801 929 ; +C 201 ; WX 667 ; N Eacute ; B 86 0 762 929 ; +C -1 ; WX 556 ; N emacron ; B 84 -15 580 684 ; +C -1 ; WX 556 ; N gbreve ; B 42 -220 610 731 ; +C 188 ; WX 834 ; N onequarter ; B 150 -19 802 703 ; +C 138 ; WX 667 ; N Scaron ; B 90 -19 713 929 ; +C -1 ; WX 667 ; N Scommaaccent ; B 90 -225 713 737 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 105 -19 829 929 ; +C 176 ; WX 400 ; N degree ; B 169 411 468 703 ; +C 242 ; WX 556 ; N ograve ; B 83 -14 585 734 ; +C -1 ; WX 722 ; N Ccaron ; B 108 -19 782 929 ; +C 249 ; WX 556 ; N ugrave ; B 94 -15 600 734 ; +C -1 ; WX 453 ; N radical ; B 79 -80 617 762 ; +C -1 ; WX 722 ; N Dcaron ; B 81 0 764 929 ; +C -1 ; WX 333 ; N rcommaaccent ; B 30 -225 446 538 ; +C 209 ; WX 722 ; N Ntilde ; B 76 0 799 917 ; +C 245 ; WX 556 ; N otilde ; B 83 -14 602 722 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 773 718 ; +C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 555 718 ; +C 195 ; WX 667 ; N Atilde ; B 14 0 699 917 ; +C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ; +C 197 ; WX 667 ; N Aring ; B 14 0 654 931 ; +C 213 ; WX 778 ; N Otilde ; B 105 -19 826 917 ; +C -1 ; WX 500 ; N zdotaccent ; B 31 0 571 706 ; +C -1 ; WX 667 ; N Ecaron ; B 86 0 762 929 ; +C -1 ; WX 278 ; N Iogonek ; B -33 -225 341 718 ; +C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 600 718 ; +C -1 ; WX 584 ; N minus ; B 85 216 606 289 ; +C 206 ; WX 278 ; N Icircumflex ; B 91 0 452 929 ; +C -1 ; WX 556 ; N ncaron ; B 65 0 580 734 ; +C -1 ; WX 278 ; N tcommaaccent ; B 63 -225 368 669 ; +C 172 ; WX 584 ; N logicalnot ; B 106 108 628 390 ; +C 246 ; WX 556 ; N odieresis ; B 83 -14 585 706 ; +C 252 ; WX 556 ; N udieresis ; B 94 -15 600 706 ; +C -1 ; WX 549 ; N notequal ; B 34 -35 623 551 ; +C -1 ; WX 556 ; N gcommaaccent ; B 42 -220 610 822 ; +C 240 ; WX 556 ; N eth ; B 81 -15 617 737 ; +C 158 ; WX 500 ; N zcaron ; B 31 0 571 734 ; +C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 573 538 ; +C 185 ; WX 333 ; N onesuperior ; B 166 281 371 703 ; +C -1 ; WX 278 ; N imacron ; B 95 0 417 684 ; +C 128 ; WX 556 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2705 +KPX A C -30 +KPX A Cacute -30 +KPX A Ccaron -30 +KPX A Ccedilla -30 +KPX A G -30 +KPX A Gbreve -30 +KPX A Gcommaaccent -30 +KPX A O -30 +KPX A Oacute -30 +KPX A Ocircumflex -30 +KPX A Odieresis -30 +KPX A Ograve -30 +KPX A Ohungarumlaut -30 +KPX A Omacron -30 +KPX A Oslash -30 +KPX A Otilde -30 +KPX A Q -30 +KPX A T -120 +KPX A Tcaron -120 +KPX A Tcommaaccent -120 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -70 +KPX A W -50 +KPX A Y -100 +KPX A Yacute -100 +KPX A Ydieresis -100 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -40 +KPX A w -40 +KPX A y -40 +KPX A yacute -40 +KPX A ydieresis -40 +KPX Aacute C -30 +KPX Aacute Cacute -30 +KPX Aacute Ccaron -30 +KPX Aacute Ccedilla -30 +KPX Aacute G -30 +KPX Aacute Gbreve -30 +KPX Aacute Gcommaaccent -30 +KPX Aacute O -30 +KPX Aacute Oacute -30 +KPX Aacute Ocircumflex -30 +KPX Aacute Odieresis -30 +KPX Aacute Ograve -30 +KPX Aacute Ohungarumlaut -30 +KPX Aacute Omacron -30 +KPX Aacute Oslash -30 +KPX Aacute Otilde -30 +KPX Aacute Q -30 +KPX Aacute T -120 +KPX Aacute Tcaron -120 +KPX Aacute Tcommaaccent -120 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -70 +KPX Aacute W -50 +KPX Aacute Y -100 +KPX Aacute Yacute -100 +KPX Aacute Ydieresis -100 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -40 +KPX Aacute w -40 +KPX Aacute y -40 +KPX Aacute yacute -40 +KPX Aacute ydieresis -40 +KPX Abreve C -30 +KPX Abreve Cacute -30 +KPX Abreve Ccaron -30 +KPX Abreve Ccedilla -30 +KPX Abreve G -30 +KPX Abreve Gbreve -30 +KPX Abreve Gcommaaccent -30 +KPX Abreve O -30 +KPX Abreve Oacute -30 +KPX Abreve Ocircumflex -30 +KPX Abreve Odieresis -30 +KPX Abreve Ograve -30 +KPX Abreve Ohungarumlaut -30 +KPX Abreve Omacron -30 +KPX Abreve Oslash -30 +KPX Abreve Otilde -30 +KPX Abreve Q -30 +KPX Abreve T -120 +KPX Abreve Tcaron -120 +KPX Abreve Tcommaaccent -120 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -70 +KPX Abreve W -50 +KPX Abreve Y -100 +KPX Abreve Yacute -100 +KPX Abreve Ydieresis -100 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -40 +KPX Abreve w -40 +KPX Abreve y -40 +KPX Abreve yacute -40 +KPX Abreve ydieresis -40 +KPX Acircumflex C -30 +KPX Acircumflex Cacute -30 +KPX Acircumflex Ccaron -30 +KPX Acircumflex Ccedilla -30 +KPX Acircumflex G -30 +KPX Acircumflex Gbreve -30 +KPX Acircumflex Gcommaaccent -30 +KPX Acircumflex O -30 +KPX Acircumflex Oacute -30 +KPX Acircumflex Ocircumflex -30 +KPX Acircumflex Odieresis -30 +KPX Acircumflex Ograve -30 +KPX Acircumflex Ohungarumlaut -30 +KPX Acircumflex Omacron -30 +KPX Acircumflex Oslash -30 +KPX Acircumflex Otilde -30 +KPX Acircumflex Q -30 +KPX Acircumflex T -120 +KPX Acircumflex Tcaron -120 +KPX Acircumflex Tcommaaccent -120 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -70 +KPX Acircumflex W -50 +KPX Acircumflex Y -100 +KPX Acircumflex Yacute -100 +KPX Acircumflex Ydieresis -100 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -40 +KPX Acircumflex w -40 +KPX Acircumflex y -40 +KPX Acircumflex yacute -40 +KPX Acircumflex ydieresis -40 +KPX Adieresis C -30 +KPX Adieresis Cacute -30 +KPX Adieresis Ccaron -30 +KPX Adieresis Ccedilla -30 +KPX Adieresis G -30 +KPX Adieresis Gbreve -30 +KPX Adieresis Gcommaaccent -30 +KPX Adieresis O -30 +KPX Adieresis Oacute -30 +KPX Adieresis Ocircumflex -30 +KPX Adieresis Odieresis -30 +KPX Adieresis Ograve -30 +KPX Adieresis Ohungarumlaut -30 +KPX Adieresis Omacron -30 +KPX Adieresis Oslash -30 +KPX Adieresis Otilde -30 +KPX Adieresis Q -30 +KPX Adieresis T -120 +KPX Adieresis Tcaron -120 +KPX Adieresis Tcommaaccent -120 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -70 +KPX Adieresis W -50 +KPX Adieresis Y -100 +KPX Adieresis Yacute -100 +KPX Adieresis Ydieresis -100 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -40 +KPX Adieresis w -40 +KPX Adieresis y -40 +KPX Adieresis yacute -40 +KPX Adieresis ydieresis -40 +KPX Agrave C -30 +KPX Agrave Cacute -30 +KPX Agrave Ccaron -30 +KPX Agrave Ccedilla -30 +KPX Agrave G -30 +KPX Agrave Gbreve -30 +KPX Agrave Gcommaaccent -30 +KPX Agrave O -30 +KPX Agrave Oacute -30 +KPX Agrave Ocircumflex -30 +KPX Agrave Odieresis -30 +KPX Agrave Ograve -30 +KPX Agrave Ohungarumlaut -30 +KPX Agrave Omacron -30 +KPX Agrave Oslash -30 +KPX Agrave Otilde -30 +KPX Agrave Q -30 +KPX Agrave T -120 +KPX Agrave Tcaron -120 +KPX Agrave Tcommaaccent -120 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -70 +KPX Agrave W -50 +KPX Agrave Y -100 +KPX Agrave Yacute -100 +KPX Agrave Ydieresis -100 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -40 +KPX Agrave w -40 +KPX Agrave y -40 +KPX Agrave yacute -40 +KPX Agrave ydieresis -40 +KPX Amacron C -30 +KPX Amacron Cacute -30 +KPX Amacron Ccaron -30 +KPX Amacron Ccedilla -30 +KPX Amacron G -30 +KPX Amacron Gbreve -30 +KPX Amacron Gcommaaccent -30 +KPX Amacron O -30 +KPX Amacron Oacute -30 +KPX Amacron Ocircumflex -30 +KPX Amacron Odieresis -30 +KPX Amacron Ograve -30 +KPX Amacron Ohungarumlaut -30 +KPX Amacron Omacron -30 +KPX Amacron Oslash -30 +KPX Amacron Otilde -30 +KPX Amacron Q -30 +KPX Amacron T -120 +KPX Amacron Tcaron -120 +KPX Amacron Tcommaaccent -120 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -70 +KPX Amacron W -50 +KPX Amacron Y -100 +KPX Amacron Yacute -100 +KPX Amacron Ydieresis -100 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -40 +KPX Amacron w -40 +KPX Amacron y -40 +KPX Amacron yacute -40 +KPX Amacron ydieresis -40 +KPX Aogonek C -30 +KPX Aogonek Cacute -30 +KPX Aogonek Ccaron -30 +KPX Aogonek Ccedilla -30 +KPX Aogonek G -30 +KPX Aogonek Gbreve -30 +KPX Aogonek Gcommaaccent -30 +KPX Aogonek O -30 +KPX Aogonek Oacute -30 +KPX Aogonek Ocircumflex -30 +KPX Aogonek Odieresis -30 +KPX Aogonek Ograve -30 +KPX Aogonek Ohungarumlaut -30 +KPX Aogonek Omacron -30 +KPX Aogonek Oslash -30 +KPX Aogonek Otilde -30 +KPX Aogonek Q -30 +KPX Aogonek T -120 +KPX Aogonek Tcaron -120 +KPX Aogonek Tcommaaccent -120 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -70 +KPX Aogonek W -50 +KPX Aogonek Y -100 +KPX Aogonek Yacute -100 +KPX Aogonek Ydieresis -100 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -40 +KPX Aogonek w -40 +KPX Aogonek y -40 +KPX Aogonek yacute -40 +KPX Aogonek ydieresis -40 +KPX Aring C -30 +KPX Aring Cacute -30 +KPX Aring Ccaron -30 +KPX Aring Ccedilla -30 +KPX Aring G -30 +KPX Aring Gbreve -30 +KPX Aring Gcommaaccent -30 +KPX Aring O -30 +KPX Aring Oacute -30 +KPX Aring Ocircumflex -30 +KPX Aring Odieresis -30 +KPX Aring Ograve -30 +KPX Aring Ohungarumlaut -30 +KPX Aring Omacron -30 +KPX Aring Oslash -30 +KPX Aring Otilde -30 +KPX Aring Q -30 +KPX Aring T -120 +KPX Aring Tcaron -120 +KPX Aring Tcommaaccent -120 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -70 +KPX Aring W -50 +KPX Aring Y -100 +KPX Aring Yacute -100 +KPX Aring Ydieresis -100 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -40 +KPX Aring w -40 +KPX Aring y -40 +KPX Aring yacute -40 +KPX Aring ydieresis -40 +KPX Atilde C -30 +KPX Atilde Cacute -30 +KPX Atilde Ccaron -30 +KPX Atilde Ccedilla -30 +KPX Atilde G -30 +KPX Atilde Gbreve -30 +KPX Atilde Gcommaaccent -30 +KPX Atilde O -30 +KPX Atilde Oacute -30 +KPX Atilde Ocircumflex -30 +KPX Atilde Odieresis -30 +KPX Atilde Ograve -30 +KPX Atilde Ohungarumlaut -30 +KPX Atilde Omacron -30 +KPX Atilde Oslash -30 +KPX Atilde Otilde -30 +KPX Atilde Q -30 +KPX Atilde T -120 +KPX Atilde Tcaron -120 +KPX Atilde Tcommaaccent -120 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -70 +KPX Atilde W -50 +KPX Atilde Y -100 +KPX Atilde Yacute -100 +KPX Atilde Ydieresis -100 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -40 +KPX Atilde w -40 +KPX Atilde y -40 +KPX Atilde yacute -40 +KPX Atilde ydieresis -40 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX B comma -20 +KPX B period -20 +KPX C comma -30 +KPX C period -30 +KPX Cacute comma -30 +KPX Cacute period -30 +KPX Ccaron comma -30 +KPX Ccaron period -30 +KPX Ccedilla comma -30 +KPX Ccedilla period -30 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -70 +KPX D W -40 +KPX D Y -90 +KPX D Yacute -90 +KPX D Ydieresis -90 +KPX D comma -70 +KPX D period -70 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -70 +KPX Dcaron W -40 +KPX Dcaron Y -90 +KPX Dcaron Yacute -90 +KPX Dcaron Ydieresis -90 +KPX Dcaron comma -70 +KPX Dcaron period -70 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -70 +KPX Dcroat W -40 +KPX Dcroat Y -90 +KPX Dcroat Yacute -90 +KPX Dcroat Ydieresis -90 +KPX Dcroat comma -70 +KPX Dcroat period -70 +KPX F A -80 +KPX F Aacute -80 +KPX F Abreve -80 +KPX F Acircumflex -80 +KPX F Adieresis -80 +KPX F Agrave -80 +KPX F Amacron -80 +KPX F Aogonek -80 +KPX F Aring -80 +KPX F Atilde -80 +KPX F a -50 +KPX F aacute -50 +KPX F abreve -50 +KPX F acircumflex -50 +KPX F adieresis -50 +KPX F agrave -50 +KPX F amacron -50 +KPX F aogonek -50 +KPX F aring -50 +KPX F atilde -50 +KPX F comma -150 +KPX F e -30 +KPX F eacute -30 +KPX F ecaron -30 +KPX F ecircumflex -30 +KPX F edieresis -30 +KPX F edotaccent -30 +KPX F egrave -30 +KPX F emacron -30 +KPX F eogonek -30 +KPX F o -30 +KPX F oacute -30 +KPX F ocircumflex -30 +KPX F odieresis -30 +KPX F ograve -30 +KPX F ohungarumlaut -30 +KPX F omacron -30 +KPX F oslash -30 +KPX F otilde -30 +KPX F period -150 +KPX F r -45 +KPX F racute -45 +KPX F rcaron -45 +KPX F rcommaaccent -45 +KPX J A -20 +KPX J Aacute -20 +KPX J Abreve -20 +KPX J Acircumflex -20 +KPX J Adieresis -20 +KPX J Agrave -20 +KPX J Amacron -20 +KPX J Aogonek -20 +KPX J Aring -20 +KPX J Atilde -20 +KPX J a -20 +KPX J aacute -20 +KPX J abreve -20 +KPX J acircumflex -20 +KPX J adieresis -20 +KPX J agrave -20 +KPX J amacron -20 +KPX J aogonek -20 +KPX J aring -20 +KPX J atilde -20 +KPX J comma -30 +KPX J period -30 +KPX J u -20 +KPX J uacute -20 +KPX J ucircumflex -20 +KPX J udieresis -20 +KPX J ugrave -20 +KPX J uhungarumlaut -20 +KPX J umacron -20 +KPX J uogonek -20 +KPX J uring -20 +KPX K O -50 +KPX K Oacute -50 +KPX K Ocircumflex -50 +KPX K Odieresis -50 +KPX K Ograve -50 +KPX K Ohungarumlaut -50 +KPX K Omacron -50 +KPX K Oslash -50 +KPX K Otilde -50 +KPX K e -40 +KPX K eacute -40 +KPX K ecaron -40 +KPX K ecircumflex -40 +KPX K edieresis -40 +KPX K edotaccent -40 +KPX K egrave -40 +KPX K emacron -40 +KPX K eogonek -40 +KPX K o -40 +KPX K oacute -40 +KPX K ocircumflex -40 +KPX K odieresis -40 +KPX K ograve -40 +KPX K ohungarumlaut -40 +KPX K omacron -40 +KPX K oslash -40 +KPX K otilde -40 +KPX K u -30 +KPX K uacute -30 +KPX K ucircumflex -30 +KPX K udieresis -30 +KPX K ugrave -30 +KPX K uhungarumlaut -30 +KPX K umacron -30 +KPX K uogonek -30 +KPX K uring -30 +KPX K y -50 +KPX K yacute -50 +KPX K ydieresis -50 +KPX Kcommaaccent O -50 +KPX Kcommaaccent Oacute -50 +KPX Kcommaaccent Ocircumflex -50 +KPX Kcommaaccent Odieresis -50 +KPX Kcommaaccent Ograve -50 +KPX Kcommaaccent Ohungarumlaut -50 +KPX Kcommaaccent Omacron -50 +KPX Kcommaaccent Oslash -50 +KPX Kcommaaccent Otilde -50 +KPX Kcommaaccent e -40 +KPX Kcommaaccent eacute -40 +KPX Kcommaaccent ecaron -40 +KPX Kcommaaccent ecircumflex -40 +KPX Kcommaaccent edieresis -40 +KPX Kcommaaccent edotaccent -40 +KPX Kcommaaccent egrave -40 +KPX Kcommaaccent emacron -40 +KPX Kcommaaccent eogonek -40 +KPX Kcommaaccent o -40 +KPX Kcommaaccent oacute -40 +KPX Kcommaaccent ocircumflex -40 +KPX Kcommaaccent odieresis -40 +KPX Kcommaaccent ograve -40 +KPX Kcommaaccent ohungarumlaut -40 +KPX Kcommaaccent omacron -40 +KPX Kcommaaccent oslash -40 +KPX Kcommaaccent otilde -40 +KPX Kcommaaccent u -30 +KPX Kcommaaccent uacute -30 +KPX Kcommaaccent ucircumflex -30 +KPX Kcommaaccent udieresis -30 +KPX Kcommaaccent ugrave -30 +KPX Kcommaaccent uhungarumlaut -30 +KPX Kcommaaccent umacron -30 +KPX Kcommaaccent uogonek -30 +KPX Kcommaaccent uring -30 +KPX Kcommaaccent y -50 +KPX Kcommaaccent yacute -50 +KPX Kcommaaccent ydieresis -50 +KPX L T -110 +KPX L Tcaron -110 +KPX L Tcommaaccent -110 +KPX L V -110 +KPX L W -70 +KPX L Y -140 +KPX L Yacute -140 +KPX L Ydieresis -140 +KPX L quotedblright -140 +KPX L quoteright -160 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -110 +KPX Lacute Tcaron -110 +KPX Lacute Tcommaaccent -110 +KPX Lacute V -110 +KPX Lacute W -70 +KPX Lacute Y -140 +KPX Lacute Yacute -140 +KPX Lacute Ydieresis -140 +KPX Lacute quotedblright -140 +KPX Lacute quoteright -160 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcaron T -110 +KPX Lcaron Tcaron -110 +KPX Lcaron Tcommaaccent -110 +KPX Lcaron V -110 +KPX Lcaron W -70 +KPX Lcaron Y -140 +KPX Lcaron Yacute -140 +KPX Lcaron Ydieresis -140 +KPX Lcaron quotedblright -140 +KPX Lcaron quoteright -160 +KPX Lcaron y -30 +KPX Lcaron yacute -30 +KPX Lcaron ydieresis -30 +KPX Lcommaaccent T -110 +KPX Lcommaaccent Tcaron -110 +KPX Lcommaaccent Tcommaaccent -110 +KPX Lcommaaccent V -110 +KPX Lcommaaccent W -70 +KPX Lcommaaccent Y -140 +KPX Lcommaaccent Yacute -140 +KPX Lcommaaccent Ydieresis -140 +KPX Lcommaaccent quotedblright -140 +KPX Lcommaaccent quoteright -160 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -110 +KPX Lslash Tcaron -110 +KPX Lslash Tcommaaccent -110 +KPX Lslash V -110 +KPX Lslash W -70 +KPX Lslash Y -140 +KPX Lslash Yacute -140 +KPX Lslash Ydieresis -140 +KPX Lslash quotedblright -140 +KPX Lslash quoteright -160 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX O A -20 +KPX O Aacute -20 +KPX O Abreve -20 +KPX O Acircumflex -20 +KPX O Adieresis -20 +KPX O Agrave -20 +KPX O Amacron -20 +KPX O Aogonek -20 +KPX O Aring -20 +KPX O Atilde -20 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -30 +KPX O X -60 +KPX O Y -70 +KPX O Yacute -70 +KPX O Ydieresis -70 +KPX O comma -40 +KPX O period -40 +KPX Oacute A -20 +KPX Oacute Aacute -20 +KPX Oacute Abreve -20 +KPX Oacute Acircumflex -20 +KPX Oacute Adieresis -20 +KPX Oacute Agrave -20 +KPX Oacute Amacron -20 +KPX Oacute Aogonek -20 +KPX Oacute Aring -20 +KPX Oacute Atilde -20 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -30 +KPX Oacute X -60 +KPX Oacute Y -70 +KPX Oacute Yacute -70 +KPX Oacute Ydieresis -70 +KPX Oacute comma -40 +KPX Oacute period -40 +KPX Ocircumflex A -20 +KPX Ocircumflex Aacute -20 +KPX Ocircumflex Abreve -20 +KPX Ocircumflex Acircumflex -20 +KPX Ocircumflex Adieresis -20 +KPX Ocircumflex Agrave -20 +KPX Ocircumflex Amacron -20 +KPX Ocircumflex Aogonek -20 +KPX Ocircumflex Aring -20 +KPX Ocircumflex Atilde -20 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -30 +KPX Ocircumflex X -60 +KPX Ocircumflex Y -70 +KPX Ocircumflex Yacute -70 +KPX Ocircumflex Ydieresis -70 +KPX Ocircumflex comma -40 +KPX Ocircumflex period -40 +KPX Odieresis A -20 +KPX Odieresis Aacute -20 +KPX Odieresis Abreve -20 +KPX Odieresis Acircumflex -20 +KPX Odieresis Adieresis -20 +KPX Odieresis Agrave -20 +KPX Odieresis Amacron -20 +KPX Odieresis Aogonek -20 +KPX Odieresis Aring -20 +KPX Odieresis Atilde -20 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -30 +KPX Odieresis X -60 +KPX Odieresis Y -70 +KPX Odieresis Yacute -70 +KPX Odieresis Ydieresis -70 +KPX Odieresis comma -40 +KPX Odieresis period -40 +KPX Ograve A -20 +KPX Ograve Aacute -20 +KPX Ograve Abreve -20 +KPX Ograve Acircumflex -20 +KPX Ograve Adieresis -20 +KPX Ograve Agrave -20 +KPX Ograve Amacron -20 +KPX Ograve Aogonek -20 +KPX Ograve Aring -20 +KPX Ograve Atilde -20 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -30 +KPX Ograve X -60 +KPX Ograve Y -70 +KPX Ograve Yacute -70 +KPX Ograve Ydieresis -70 +KPX Ograve comma -40 +KPX Ograve period -40 +KPX Ohungarumlaut A -20 +KPX Ohungarumlaut Aacute -20 +KPX Ohungarumlaut Abreve -20 +KPX Ohungarumlaut Acircumflex -20 +KPX Ohungarumlaut Adieresis -20 +KPX Ohungarumlaut Agrave -20 +KPX Ohungarumlaut Amacron -20 +KPX Ohungarumlaut Aogonek -20 +KPX Ohungarumlaut Aring -20 +KPX Ohungarumlaut Atilde -20 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -30 +KPX Ohungarumlaut X -60 +KPX Ohungarumlaut Y -70 +KPX Ohungarumlaut Yacute -70 +KPX Ohungarumlaut Ydieresis -70 +KPX Ohungarumlaut comma -40 +KPX Ohungarumlaut period -40 +KPX Omacron A -20 +KPX Omacron Aacute -20 +KPX Omacron Abreve -20 +KPX Omacron Acircumflex -20 +KPX Omacron Adieresis -20 +KPX Omacron Agrave -20 +KPX Omacron Amacron -20 +KPX Omacron Aogonek -20 +KPX Omacron Aring -20 +KPX Omacron Atilde -20 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -30 +KPX Omacron X -60 +KPX Omacron Y -70 +KPX Omacron Yacute -70 +KPX Omacron Ydieresis -70 +KPX Omacron comma -40 +KPX Omacron period -40 +KPX Oslash A -20 +KPX Oslash Aacute -20 +KPX Oslash Abreve -20 +KPX Oslash Acircumflex -20 +KPX Oslash Adieresis -20 +KPX Oslash Agrave -20 +KPX Oslash Amacron -20 +KPX Oslash Aogonek -20 +KPX Oslash Aring -20 +KPX Oslash Atilde -20 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -30 +KPX Oslash X -60 +KPX Oslash Y -70 +KPX Oslash Yacute -70 +KPX Oslash Ydieresis -70 +KPX Oslash comma -40 +KPX Oslash period -40 +KPX Otilde A -20 +KPX Otilde Aacute -20 +KPX Otilde Abreve -20 +KPX Otilde Acircumflex -20 +KPX Otilde Adieresis -20 +KPX Otilde Agrave -20 +KPX Otilde Amacron -20 +KPX Otilde Aogonek -20 +KPX Otilde Aring -20 +KPX Otilde Atilde -20 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -30 +KPX Otilde X -60 +KPX Otilde Y -70 +KPX Otilde Yacute -70 +KPX Otilde Ydieresis -70 +KPX Otilde comma -40 +KPX Otilde period -40 +KPX P A -120 +KPX P Aacute -120 +KPX P Abreve -120 +KPX P Acircumflex -120 +KPX P Adieresis -120 +KPX P Agrave -120 +KPX P Amacron -120 +KPX P Aogonek -120 +KPX P Aring -120 +KPX P Atilde -120 +KPX P a -40 +KPX P aacute -40 +KPX P abreve -40 +KPX P acircumflex -40 +KPX P adieresis -40 +KPX P agrave -40 +KPX P amacron -40 +KPX P aogonek -40 +KPX P aring -40 +KPX P atilde -40 +KPX P comma -180 +KPX P e -50 +KPX P eacute -50 +KPX P ecaron -50 +KPX P ecircumflex -50 +KPX P edieresis -50 +KPX P edotaccent -50 +KPX P egrave -50 +KPX P emacron -50 +KPX P eogonek -50 +KPX P o -50 +KPX P oacute -50 +KPX P ocircumflex -50 +KPX P odieresis -50 +KPX P ograve -50 +KPX P ohungarumlaut -50 +KPX P omacron -50 +KPX P oslash -50 +KPX P otilde -50 +KPX P period -180 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX R O -20 +KPX R Oacute -20 +KPX R Ocircumflex -20 +KPX R Odieresis -20 +KPX R Ograve -20 +KPX R Ohungarumlaut -20 +KPX R Omacron -20 +KPX R Oslash -20 +KPX R Otilde -20 +KPX R T -30 +KPX R Tcaron -30 +KPX R Tcommaaccent -30 +KPX R U -40 +KPX R Uacute -40 +KPX R Ucircumflex -40 +KPX R Udieresis -40 +KPX R Ugrave -40 +KPX R Uhungarumlaut -40 +KPX R Umacron -40 +KPX R Uogonek -40 +KPX R Uring -40 +KPX R V -50 +KPX R W -30 +KPX R Y -50 +KPX R Yacute -50 +KPX R Ydieresis -50 +KPX Racute O -20 +KPX Racute Oacute -20 +KPX Racute Ocircumflex -20 +KPX Racute Odieresis -20 +KPX Racute Ograve -20 +KPX Racute Ohungarumlaut -20 +KPX Racute Omacron -20 +KPX Racute Oslash -20 +KPX Racute Otilde -20 +KPX Racute T -30 +KPX Racute Tcaron -30 +KPX Racute Tcommaaccent -30 +KPX Racute U -40 +KPX Racute Uacute -40 +KPX Racute Ucircumflex -40 +KPX Racute Udieresis -40 +KPX Racute Ugrave -40 +KPX Racute Uhungarumlaut -40 +KPX Racute Umacron -40 +KPX Racute Uogonek -40 +KPX Racute Uring -40 +KPX Racute V -50 +KPX Racute W -30 +KPX Racute Y -50 +KPX Racute Yacute -50 +KPX Racute Ydieresis -50 +KPX Rcaron O -20 +KPX Rcaron Oacute -20 +KPX Rcaron Ocircumflex -20 +KPX Rcaron Odieresis -20 +KPX Rcaron Ograve -20 +KPX Rcaron Ohungarumlaut -20 +KPX Rcaron Omacron -20 +KPX Rcaron Oslash -20 +KPX Rcaron Otilde -20 +KPX Rcaron T -30 +KPX Rcaron Tcaron -30 +KPX Rcaron Tcommaaccent -30 +KPX Rcaron U -40 +KPX Rcaron Uacute -40 +KPX Rcaron Ucircumflex -40 +KPX Rcaron Udieresis -40 +KPX Rcaron Ugrave -40 +KPX Rcaron Uhungarumlaut -40 +KPX Rcaron Umacron -40 +KPX Rcaron Uogonek -40 +KPX Rcaron Uring -40 +KPX Rcaron V -50 +KPX Rcaron W -30 +KPX Rcaron Y -50 +KPX Rcaron Yacute -50 +KPX Rcaron Ydieresis -50 +KPX Rcommaaccent O -20 +KPX Rcommaaccent Oacute -20 +KPX Rcommaaccent Ocircumflex -20 +KPX Rcommaaccent Odieresis -20 +KPX Rcommaaccent Ograve -20 +KPX Rcommaaccent Ohungarumlaut -20 +KPX Rcommaaccent Omacron -20 +KPX Rcommaaccent Oslash -20 +KPX Rcommaaccent Otilde -20 +KPX Rcommaaccent T -30 +KPX Rcommaaccent Tcaron -30 +KPX Rcommaaccent Tcommaaccent -30 +KPX Rcommaaccent U -40 +KPX Rcommaaccent Uacute -40 +KPX Rcommaaccent Ucircumflex -40 +KPX Rcommaaccent Udieresis -40 +KPX Rcommaaccent Ugrave -40 +KPX Rcommaaccent Uhungarumlaut -40 +KPX Rcommaaccent Umacron -40 +KPX Rcommaaccent Uogonek -40 +KPX Rcommaaccent Uring -40 +KPX Rcommaaccent V -50 +KPX Rcommaaccent W -30 +KPX Rcommaaccent Y -50 +KPX Rcommaaccent Yacute -50 +KPX Rcommaaccent Ydieresis -50 +KPX S comma -20 +KPX S period -20 +KPX Sacute comma -20 +KPX Sacute period -20 +KPX Scaron comma -20 +KPX Scaron period -20 +KPX Scedilla comma -20 +KPX Scedilla period -20 +KPX Scommaaccent comma -20 +KPX Scommaaccent period -20 +KPX T A -120 +KPX T Aacute -120 +KPX T Abreve -120 +KPX T Acircumflex -120 +KPX T Adieresis -120 +KPX T Agrave -120 +KPX T Amacron -120 +KPX T Aogonek -120 +KPX T Aring -120 +KPX T Atilde -120 +KPX T O -40 +KPX T Oacute -40 +KPX T Ocircumflex -40 +KPX T Odieresis -40 +KPX T Ograve -40 +KPX T Ohungarumlaut -40 +KPX T Omacron -40 +KPX T Oslash -40 +KPX T Otilde -40 +KPX T a -120 +KPX T aacute -120 +KPX T abreve -60 +KPX T acircumflex -120 +KPX T adieresis -120 +KPX T agrave -120 +KPX T amacron -60 +KPX T aogonek -120 +KPX T aring -120 +KPX T atilde -60 +KPX T colon -20 +KPX T comma -120 +KPX T e -120 +KPX T eacute -120 +KPX T ecaron -120 +KPX T ecircumflex -120 +KPX T edieresis -120 +KPX T edotaccent -120 +KPX T egrave -60 +KPX T emacron -60 +KPX T eogonek -120 +KPX T hyphen -140 +KPX T o -120 +KPX T oacute -120 +KPX T ocircumflex -120 +KPX T odieresis -120 +KPX T ograve -120 +KPX T ohungarumlaut -120 +KPX T omacron -60 +KPX T oslash -120 +KPX T otilde -60 +KPX T period -120 +KPX T r -120 +KPX T racute -120 +KPX T rcaron -120 +KPX T rcommaaccent -120 +KPX T semicolon -20 +KPX T u -120 +KPX T uacute -120 +KPX T ucircumflex -120 +KPX T udieresis -120 +KPX T ugrave -120 +KPX T uhungarumlaut -120 +KPX T umacron -60 +KPX T uogonek -120 +KPX T uring -120 +KPX T w -120 +KPX T y -120 +KPX T yacute -120 +KPX T ydieresis -60 +KPX Tcaron A -120 +KPX Tcaron Aacute -120 +KPX Tcaron Abreve -120 +KPX Tcaron Acircumflex -120 +KPX Tcaron Adieresis -120 +KPX Tcaron Agrave -120 +KPX Tcaron Amacron -120 +KPX Tcaron Aogonek -120 +KPX Tcaron Aring -120 +KPX Tcaron Atilde -120 +KPX Tcaron O -40 +KPX Tcaron Oacute -40 +KPX Tcaron Ocircumflex -40 +KPX Tcaron Odieresis -40 +KPX Tcaron Ograve -40 +KPX Tcaron Ohungarumlaut -40 +KPX Tcaron Omacron -40 +KPX Tcaron Oslash -40 +KPX Tcaron Otilde -40 +KPX Tcaron a -120 +KPX Tcaron aacute -120 +KPX Tcaron abreve -60 +KPX Tcaron acircumflex -120 +KPX Tcaron adieresis -120 +KPX Tcaron agrave -120 +KPX Tcaron amacron -60 +KPX Tcaron aogonek -120 +KPX Tcaron aring -120 +KPX Tcaron atilde -60 +KPX Tcaron colon -20 +KPX Tcaron comma -120 +KPX Tcaron e -120 +KPX Tcaron eacute -120 +KPX Tcaron ecaron -120 +KPX Tcaron ecircumflex -120 +KPX Tcaron edieresis -120 +KPX Tcaron edotaccent -120 +KPX Tcaron egrave -60 +KPX Tcaron emacron -60 +KPX Tcaron eogonek -120 +KPX Tcaron hyphen -140 +KPX Tcaron o -120 +KPX Tcaron oacute -120 +KPX Tcaron ocircumflex -120 +KPX Tcaron odieresis -120 +KPX Tcaron ograve -120 +KPX Tcaron ohungarumlaut -120 +KPX Tcaron omacron -60 +KPX Tcaron oslash -120 +KPX Tcaron otilde -60 +KPX Tcaron period -120 +KPX Tcaron r -120 +KPX Tcaron racute -120 +KPX Tcaron rcaron -120 +KPX Tcaron rcommaaccent -120 +KPX Tcaron semicolon -20 +KPX Tcaron u -120 +KPX Tcaron uacute -120 +KPX Tcaron ucircumflex -120 +KPX Tcaron udieresis -120 +KPX Tcaron ugrave -120 +KPX Tcaron uhungarumlaut -120 +KPX Tcaron umacron -60 +KPX Tcaron uogonek -120 +KPX Tcaron uring -120 +KPX Tcaron w -120 +KPX Tcaron y -120 +KPX Tcaron yacute -120 +KPX Tcaron ydieresis -60 +KPX Tcommaaccent A -120 +KPX Tcommaaccent Aacute -120 +KPX Tcommaaccent Abreve -120 +KPX Tcommaaccent Acircumflex -120 +KPX Tcommaaccent Adieresis -120 +KPX Tcommaaccent Agrave -120 +KPX Tcommaaccent Amacron -120 +KPX Tcommaaccent Aogonek -120 +KPX Tcommaaccent Aring -120 +KPX Tcommaaccent Atilde -120 +KPX Tcommaaccent O -40 +KPX Tcommaaccent Oacute -40 +KPX Tcommaaccent Ocircumflex -40 +KPX Tcommaaccent Odieresis -40 +KPX Tcommaaccent Ograve -40 +KPX Tcommaaccent Ohungarumlaut -40 +KPX Tcommaaccent Omacron -40 +KPX Tcommaaccent Oslash -40 +KPX Tcommaaccent Otilde -40 +KPX Tcommaaccent a -120 +KPX Tcommaaccent aacute -120 +KPX Tcommaaccent abreve -60 +KPX Tcommaaccent acircumflex -120 +KPX Tcommaaccent adieresis -120 +KPX Tcommaaccent agrave -120 +KPX Tcommaaccent amacron -60 +KPX Tcommaaccent aogonek -120 +KPX Tcommaaccent aring -120 +KPX Tcommaaccent atilde -60 +KPX Tcommaaccent colon -20 +KPX Tcommaaccent comma -120 +KPX Tcommaaccent e -120 +KPX Tcommaaccent eacute -120 +KPX Tcommaaccent ecaron -120 +KPX Tcommaaccent ecircumflex -120 +KPX Tcommaaccent edieresis -120 +KPX Tcommaaccent edotaccent -120 +KPX Tcommaaccent egrave -60 +KPX Tcommaaccent emacron -60 +KPX Tcommaaccent eogonek -120 +KPX Tcommaaccent hyphen -140 +KPX Tcommaaccent o -120 +KPX Tcommaaccent oacute -120 +KPX Tcommaaccent ocircumflex -120 +KPX Tcommaaccent odieresis -120 +KPX Tcommaaccent ograve -120 +KPX Tcommaaccent ohungarumlaut -120 +KPX Tcommaaccent omacron -60 +KPX Tcommaaccent oslash -120 +KPX Tcommaaccent otilde -60 +KPX Tcommaaccent period -120 +KPX Tcommaaccent r -120 +KPX Tcommaaccent racute -120 +KPX Tcommaaccent rcaron -120 +KPX Tcommaaccent rcommaaccent -120 +KPX Tcommaaccent semicolon -20 +KPX Tcommaaccent u -120 +KPX Tcommaaccent uacute -120 +KPX Tcommaaccent ucircumflex -120 +KPX Tcommaaccent udieresis -120 +KPX Tcommaaccent ugrave -120 +KPX Tcommaaccent uhungarumlaut -120 +KPX Tcommaaccent umacron -60 +KPX Tcommaaccent uogonek -120 +KPX Tcommaaccent uring -120 +KPX Tcommaaccent w -120 +KPX Tcommaaccent y -120 +KPX Tcommaaccent yacute -120 +KPX Tcommaaccent ydieresis -60 +KPX U A -40 +KPX U Aacute -40 +KPX U Abreve -40 +KPX U Acircumflex -40 +KPX U Adieresis -40 +KPX U Agrave -40 +KPX U Amacron -40 +KPX U Aogonek -40 +KPX U Aring -40 +KPX U Atilde -40 +KPX U comma -40 +KPX U period -40 +KPX Uacute A -40 +KPX Uacute Aacute -40 +KPX Uacute Abreve -40 +KPX Uacute Acircumflex -40 +KPX Uacute Adieresis -40 +KPX Uacute Agrave -40 +KPX Uacute Amacron -40 +KPX Uacute Aogonek -40 +KPX Uacute Aring -40 +KPX Uacute Atilde -40 +KPX Uacute comma -40 +KPX Uacute period -40 +KPX Ucircumflex A -40 +KPX Ucircumflex Aacute -40 +KPX Ucircumflex Abreve -40 +KPX Ucircumflex Acircumflex -40 +KPX Ucircumflex Adieresis -40 +KPX Ucircumflex Agrave -40 +KPX Ucircumflex Amacron -40 +KPX Ucircumflex Aogonek -40 +KPX Ucircumflex Aring -40 +KPX Ucircumflex Atilde -40 +KPX Ucircumflex comma -40 +KPX Ucircumflex period -40 +KPX Udieresis A -40 +KPX Udieresis Aacute -40 +KPX Udieresis Abreve -40 +KPX Udieresis Acircumflex -40 +KPX Udieresis Adieresis -40 +KPX Udieresis Agrave -40 +KPX Udieresis Amacron -40 +KPX Udieresis Aogonek -40 +KPX Udieresis Aring -40 +KPX Udieresis Atilde -40 +KPX Udieresis comma -40 +KPX Udieresis period -40 +KPX Ugrave A -40 +KPX Ugrave Aacute -40 +KPX Ugrave Abreve -40 +KPX Ugrave Acircumflex -40 +KPX Ugrave Adieresis -40 +KPX Ugrave Agrave -40 +KPX Ugrave Amacron -40 +KPX Ugrave Aogonek -40 +KPX Ugrave Aring -40 +KPX Ugrave Atilde -40 +KPX Ugrave comma -40 +KPX Ugrave period -40 +KPX Uhungarumlaut A -40 +KPX Uhungarumlaut Aacute -40 +KPX Uhungarumlaut Abreve -40 +KPX Uhungarumlaut Acircumflex -40 +KPX Uhungarumlaut Adieresis -40 +KPX Uhungarumlaut Agrave -40 +KPX Uhungarumlaut Amacron -40 +KPX Uhungarumlaut Aogonek -40 +KPX Uhungarumlaut Aring -40 +KPX Uhungarumlaut Atilde -40 +KPX Uhungarumlaut comma -40 +KPX Uhungarumlaut period -40 +KPX Umacron A -40 +KPX Umacron Aacute -40 +KPX Umacron Abreve -40 +KPX Umacron Acircumflex -40 +KPX Umacron Adieresis -40 +KPX Umacron Agrave -40 +KPX Umacron Amacron -40 +KPX Umacron Aogonek -40 +KPX Umacron Aring -40 +KPX Umacron Atilde -40 +KPX Umacron comma -40 +KPX Umacron period -40 +KPX Uogonek A -40 +KPX Uogonek Aacute -40 +KPX Uogonek Abreve -40 +KPX Uogonek Acircumflex -40 +KPX Uogonek Adieresis -40 +KPX Uogonek Agrave -40 +KPX Uogonek Amacron -40 +KPX Uogonek Aogonek -40 +KPX Uogonek Aring -40 +KPX Uogonek Atilde -40 +KPX Uogonek comma -40 +KPX Uogonek period -40 +KPX Uring A -40 +KPX Uring Aacute -40 +KPX Uring Abreve -40 +KPX Uring Acircumflex -40 +KPX Uring Adieresis -40 +KPX Uring Agrave -40 +KPX Uring Amacron -40 +KPX Uring Aogonek -40 +KPX Uring Aring -40 +KPX Uring Atilde -40 +KPX Uring comma -40 +KPX Uring period -40 +KPX V A -80 +KPX V Aacute -80 +KPX V Abreve -80 +KPX V Acircumflex -80 +KPX V Adieresis -80 +KPX V Agrave -80 +KPX V Amacron -80 +KPX V Aogonek -80 +KPX V Aring -80 +KPX V Atilde -80 +KPX V G -40 +KPX V Gbreve -40 +KPX V Gcommaaccent -40 +KPX V O -40 +KPX V Oacute -40 +KPX V Ocircumflex -40 +KPX V Odieresis -40 +KPX V Ograve -40 +KPX V Ohungarumlaut -40 +KPX V Omacron -40 +KPX V Oslash -40 +KPX V Otilde -40 +KPX V a -70 +KPX V aacute -70 +KPX V abreve -70 +KPX V acircumflex -70 +KPX V adieresis -70 +KPX V agrave -70 +KPX V amacron -70 +KPX V aogonek -70 +KPX V aring -70 +KPX V atilde -70 +KPX V colon -40 +KPX V comma -125 +KPX V e -80 +KPX V eacute -80 +KPX V ecaron -80 +KPX V ecircumflex -80 +KPX V edieresis -80 +KPX V edotaccent -80 +KPX V egrave -80 +KPX V emacron -80 +KPX V eogonek -80 +KPX V hyphen -80 +KPX V o -80 +KPX V oacute -80 +KPX V ocircumflex -80 +KPX V odieresis -80 +KPX V ograve -80 +KPX V ohungarumlaut -80 +KPX V omacron -80 +KPX V oslash -80 +KPX V otilde -80 +KPX V period -125 +KPX V semicolon -40 +KPX V u -70 +KPX V uacute -70 +KPX V ucircumflex -70 +KPX V udieresis -70 +KPX V ugrave -70 +KPX V uhungarumlaut -70 +KPX V umacron -70 +KPX V uogonek -70 +KPX V uring -70 +KPX W A -50 +KPX W Aacute -50 +KPX W Abreve -50 +KPX W Acircumflex -50 +KPX W Adieresis -50 +KPX W Agrave -50 +KPX W Amacron -50 +KPX W Aogonek -50 +KPX W Aring -50 +KPX W Atilde -50 +KPX W O -20 +KPX W Oacute -20 +KPX W Ocircumflex -20 +KPX W Odieresis -20 +KPX W Ograve -20 +KPX W Ohungarumlaut -20 +KPX W Omacron -20 +KPX W Oslash -20 +KPX W Otilde -20 +KPX W a -40 +KPX W aacute -40 +KPX W abreve -40 +KPX W acircumflex -40 +KPX W adieresis -40 +KPX W agrave -40 +KPX W amacron -40 +KPX W aogonek -40 +KPX W aring -40 +KPX W atilde -40 +KPX W comma -80 +KPX W e -30 +KPX W eacute -30 +KPX W ecaron -30 +KPX W ecircumflex -30 +KPX W edieresis -30 +KPX W edotaccent -30 +KPX W egrave -30 +KPX W emacron -30 +KPX W eogonek -30 +KPX W hyphen -40 +KPX W o -30 +KPX W oacute -30 +KPX W ocircumflex -30 +KPX W odieresis -30 +KPX W ograve -30 +KPX W ohungarumlaut -30 +KPX W omacron -30 +KPX W oslash -30 +KPX W otilde -30 +KPX W period -80 +KPX W u -30 +KPX W uacute -30 +KPX W ucircumflex -30 +KPX W udieresis -30 +KPX W ugrave -30 +KPX W uhungarumlaut -30 +KPX W umacron -30 +KPX W uogonek -30 +KPX W uring -30 +KPX W y -20 +KPX W yacute -20 +KPX W ydieresis -20 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -85 +KPX Y Oacute -85 +KPX Y Ocircumflex -85 +KPX Y Odieresis -85 +KPX Y Ograve -85 +KPX Y Ohungarumlaut -85 +KPX Y Omacron -85 +KPX Y Oslash -85 +KPX Y Otilde -85 +KPX Y a -140 +KPX Y aacute -140 +KPX Y abreve -70 +KPX Y acircumflex -140 +KPX Y adieresis -140 +KPX Y agrave -140 +KPX Y amacron -70 +KPX Y aogonek -140 +KPX Y aring -140 +KPX Y atilde -140 +KPX Y colon -60 +KPX Y comma -140 +KPX Y e -140 +KPX Y eacute -140 +KPX Y ecaron -140 +KPX Y ecircumflex -140 +KPX Y edieresis -140 +KPX Y edotaccent -140 +KPX Y egrave -140 +KPX Y emacron -70 +KPX Y eogonek -140 +KPX Y hyphen -140 +KPX Y i -20 +KPX Y iacute -20 +KPX Y iogonek -20 +KPX Y o -140 +KPX Y oacute -140 +KPX Y ocircumflex -140 +KPX Y odieresis -140 +KPX Y ograve -140 +KPX Y ohungarumlaut -140 +KPX Y omacron -140 +KPX Y oslash -140 +KPX Y otilde -140 +KPX Y period -140 +KPX Y semicolon -60 +KPX Y u -110 +KPX Y uacute -110 +KPX Y ucircumflex -110 +KPX Y udieresis -110 +KPX Y ugrave -110 +KPX Y uhungarumlaut -110 +KPX Y umacron -110 +KPX Y uogonek -110 +KPX Y uring -110 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -85 +KPX Yacute Oacute -85 +KPX Yacute Ocircumflex -85 +KPX Yacute Odieresis -85 +KPX Yacute Ograve -85 +KPX Yacute Ohungarumlaut -85 +KPX Yacute Omacron -85 +KPX Yacute Oslash -85 +KPX Yacute Otilde -85 +KPX Yacute a -140 +KPX Yacute aacute -140 +KPX Yacute abreve -70 +KPX Yacute acircumflex -140 +KPX Yacute adieresis -140 +KPX Yacute agrave -140 +KPX Yacute amacron -70 +KPX Yacute aogonek -140 +KPX Yacute aring -140 +KPX Yacute atilde -70 +KPX Yacute colon -60 +KPX Yacute comma -140 +KPX Yacute e -140 +KPX Yacute eacute -140 +KPX Yacute ecaron -140 +KPX Yacute ecircumflex -140 +KPX Yacute edieresis -140 +KPX Yacute edotaccent -140 +KPX Yacute egrave -140 +KPX Yacute emacron -70 +KPX Yacute eogonek -140 +KPX Yacute hyphen -140 +KPX Yacute i -20 +KPX Yacute iacute -20 +KPX Yacute iogonek -20 +KPX Yacute o -140 +KPX Yacute oacute -140 +KPX Yacute ocircumflex -140 +KPX Yacute odieresis -140 +KPX Yacute ograve -140 +KPX Yacute ohungarumlaut -140 +KPX Yacute omacron -70 +KPX Yacute oslash -140 +KPX Yacute otilde -140 +KPX Yacute period -140 +KPX Yacute semicolon -60 +KPX Yacute u -110 +KPX Yacute uacute -110 +KPX Yacute ucircumflex -110 +KPX Yacute udieresis -110 +KPX Yacute ugrave -110 +KPX Yacute uhungarumlaut -110 +KPX Yacute umacron -110 +KPX Yacute uogonek -110 +KPX Yacute uring -110 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -85 +KPX Ydieresis Oacute -85 +KPX Ydieresis Ocircumflex -85 +KPX Ydieresis Odieresis -85 +KPX Ydieresis Ograve -85 +KPX Ydieresis Ohungarumlaut -85 +KPX Ydieresis Omacron -85 +KPX Ydieresis Oslash -85 +KPX Ydieresis Otilde -85 +KPX Ydieresis a -140 +KPX Ydieresis aacute -140 +KPX Ydieresis abreve -70 +KPX Ydieresis acircumflex -140 +KPX Ydieresis adieresis -140 +KPX Ydieresis agrave -140 +KPX Ydieresis amacron -70 +KPX Ydieresis aogonek -140 +KPX Ydieresis aring -140 +KPX Ydieresis atilde -70 +KPX Ydieresis colon -60 +KPX Ydieresis comma -140 +KPX Ydieresis e -140 +KPX Ydieresis eacute -140 +KPX Ydieresis ecaron -140 +KPX Ydieresis ecircumflex -140 +KPX Ydieresis edieresis -140 +KPX Ydieresis edotaccent -140 +KPX Ydieresis egrave -140 +KPX Ydieresis emacron -70 +KPX Ydieresis eogonek -140 +KPX Ydieresis hyphen -140 +KPX Ydieresis i -20 +KPX Ydieresis iacute -20 +KPX Ydieresis iogonek -20 +KPX Ydieresis o -140 +KPX Ydieresis oacute -140 +KPX Ydieresis ocircumflex -140 +KPX Ydieresis odieresis -140 +KPX Ydieresis ograve -140 +KPX Ydieresis ohungarumlaut -140 +KPX Ydieresis omacron -140 +KPX Ydieresis oslash -140 +KPX Ydieresis otilde -140 +KPX Ydieresis period -140 +KPX Ydieresis semicolon -60 +KPX Ydieresis u -110 +KPX Ydieresis uacute -110 +KPX Ydieresis ucircumflex -110 +KPX Ydieresis udieresis -110 +KPX Ydieresis ugrave -110 +KPX Ydieresis uhungarumlaut -110 +KPX Ydieresis umacron -110 +KPX Ydieresis uogonek -110 +KPX Ydieresis uring -110 +KPX a v -20 +KPX a w -20 +KPX a y -30 +KPX a yacute -30 +KPX a ydieresis -30 +KPX aacute v -20 +KPX aacute w -20 +KPX aacute y -30 +KPX aacute yacute -30 +KPX aacute ydieresis -30 +KPX abreve v -20 +KPX abreve w -20 +KPX abreve y -30 +KPX abreve yacute -30 +KPX abreve ydieresis -30 +KPX acircumflex v -20 +KPX acircumflex w -20 +KPX acircumflex y -30 +KPX acircumflex yacute -30 +KPX acircumflex ydieresis -30 +KPX adieresis v -20 +KPX adieresis w -20 +KPX adieresis y -30 +KPX adieresis yacute -30 +KPX adieresis ydieresis -30 +KPX agrave v -20 +KPX agrave w -20 +KPX agrave y -30 +KPX agrave yacute -30 +KPX agrave ydieresis -30 +KPX amacron v -20 +KPX amacron w -20 +KPX amacron y -30 +KPX amacron yacute -30 +KPX amacron ydieresis -30 +KPX aogonek v -20 +KPX aogonek w -20 +KPX aogonek y -30 +KPX aogonek yacute -30 +KPX aogonek ydieresis -30 +KPX aring v -20 +KPX aring w -20 +KPX aring y -30 +KPX aring yacute -30 +KPX aring ydieresis -30 +KPX atilde v -20 +KPX atilde w -20 +KPX atilde y -30 +KPX atilde yacute -30 +KPX atilde ydieresis -30 +KPX b b -10 +KPX b comma -40 +KPX b l -20 +KPX b lacute -20 +KPX b lcommaaccent -20 +KPX b lslash -20 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -20 +KPX b y -20 +KPX b yacute -20 +KPX b ydieresis -20 +KPX c comma -15 +KPX c k -20 +KPX c kcommaaccent -20 +KPX cacute comma -15 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX ccaron comma -15 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccedilla comma -15 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX colon space -50 +KPX comma quotedblright -100 +KPX comma quoteright -100 +KPX e comma -15 +KPX e period -15 +KPX e v -30 +KPX e w -20 +KPX e x -30 +KPX e y -20 +KPX e yacute -20 +KPX e ydieresis -20 +KPX eacute comma -15 +KPX eacute period -15 +KPX eacute v -30 +KPX eacute w -20 +KPX eacute x -30 +KPX eacute y -20 +KPX eacute yacute -20 +KPX eacute ydieresis -20 +KPX ecaron comma -15 +KPX ecaron period -15 +KPX ecaron v -30 +KPX ecaron w -20 +KPX ecaron x -30 +KPX ecaron y -20 +KPX ecaron yacute -20 +KPX ecaron ydieresis -20 +KPX ecircumflex comma -15 +KPX ecircumflex period -15 +KPX ecircumflex v -30 +KPX ecircumflex w -20 +KPX ecircumflex x -30 +KPX ecircumflex y -20 +KPX ecircumflex yacute -20 +KPX ecircumflex ydieresis -20 +KPX edieresis comma -15 +KPX edieresis period -15 +KPX edieresis v -30 +KPX edieresis w -20 +KPX edieresis x -30 +KPX edieresis y -20 +KPX edieresis yacute -20 +KPX edieresis ydieresis -20 +KPX edotaccent comma -15 +KPX edotaccent period -15 +KPX edotaccent v -30 +KPX edotaccent w -20 +KPX edotaccent x -30 +KPX edotaccent y -20 +KPX edotaccent yacute -20 +KPX edotaccent ydieresis -20 +KPX egrave comma -15 +KPX egrave period -15 +KPX egrave v -30 +KPX egrave w -20 +KPX egrave x -30 +KPX egrave y -20 +KPX egrave yacute -20 +KPX egrave ydieresis -20 +KPX emacron comma -15 +KPX emacron period -15 +KPX emacron v -30 +KPX emacron w -20 +KPX emacron x -30 +KPX emacron y -20 +KPX emacron yacute -20 +KPX emacron ydieresis -20 +KPX eogonek comma -15 +KPX eogonek period -15 +KPX eogonek v -30 +KPX eogonek w -20 +KPX eogonek x -30 +KPX eogonek y -20 +KPX eogonek yacute -20 +KPX eogonek ydieresis -20 +KPX f a -30 +KPX f aacute -30 +KPX f abreve -30 +KPX f acircumflex -30 +KPX f adieresis -30 +KPX f agrave -30 +KPX f amacron -30 +KPX f aogonek -30 +KPX f aring -30 +KPX f atilde -30 +KPX f comma -30 +KPX f dotlessi -28 +KPX f e -30 +KPX f eacute -30 +KPX f ecaron -30 +KPX f ecircumflex -30 +KPX f edieresis -30 +KPX f edotaccent -30 +KPX f egrave -30 +KPX f emacron -30 +KPX f eogonek -30 +KPX f o -30 +KPX f oacute -30 +KPX f ocircumflex -30 +KPX f odieresis -30 +KPX f ograve -30 +KPX f ohungarumlaut -30 +KPX f omacron -30 +KPX f oslash -30 +KPX f otilde -30 +KPX f period -30 +KPX f quotedblright 60 +KPX f quoteright 50 +KPX g r -10 +KPX g racute -10 +KPX g rcaron -10 +KPX g rcommaaccent -10 +KPX gbreve r -10 +KPX gbreve racute -10 +KPX gbreve rcaron -10 +KPX gbreve rcommaaccent -10 +KPX gcommaaccent r -10 +KPX gcommaaccent racute -10 +KPX gcommaaccent rcaron -10 +KPX gcommaaccent rcommaaccent -10 +KPX h y -30 +KPX h yacute -30 +KPX h ydieresis -30 +KPX k e -20 +KPX k eacute -20 +KPX k ecaron -20 +KPX k ecircumflex -20 +KPX k edieresis -20 +KPX k edotaccent -20 +KPX k egrave -20 +KPX k emacron -20 +KPX k eogonek -20 +KPX k o -20 +KPX k oacute -20 +KPX k ocircumflex -20 +KPX k odieresis -20 +KPX k ograve -20 +KPX k ohungarumlaut -20 +KPX k omacron -20 +KPX k oslash -20 +KPX k otilde -20 +KPX kcommaaccent e -20 +KPX kcommaaccent eacute -20 +KPX kcommaaccent ecaron -20 +KPX kcommaaccent ecircumflex -20 +KPX kcommaaccent edieresis -20 +KPX kcommaaccent edotaccent -20 +KPX kcommaaccent egrave -20 +KPX kcommaaccent emacron -20 +KPX kcommaaccent eogonek -20 +KPX kcommaaccent o -20 +KPX kcommaaccent oacute -20 +KPX kcommaaccent ocircumflex -20 +KPX kcommaaccent odieresis -20 +KPX kcommaaccent ograve -20 +KPX kcommaaccent ohungarumlaut -20 +KPX kcommaaccent omacron -20 +KPX kcommaaccent oslash -20 +KPX kcommaaccent otilde -20 +KPX m u -10 +KPX m uacute -10 +KPX m ucircumflex -10 +KPX m udieresis -10 +KPX m ugrave -10 +KPX m uhungarumlaut -10 +KPX m umacron -10 +KPX m uogonek -10 +KPX m uring -10 +KPX m y -15 +KPX m yacute -15 +KPX m ydieresis -15 +KPX n u -10 +KPX n uacute -10 +KPX n ucircumflex -10 +KPX n udieresis -10 +KPX n ugrave -10 +KPX n uhungarumlaut -10 +KPX n umacron -10 +KPX n uogonek -10 +KPX n uring -10 +KPX n v -20 +KPX n y -15 +KPX n yacute -15 +KPX n ydieresis -15 +KPX nacute u -10 +KPX nacute uacute -10 +KPX nacute ucircumflex -10 +KPX nacute udieresis -10 +KPX nacute ugrave -10 +KPX nacute uhungarumlaut -10 +KPX nacute umacron -10 +KPX nacute uogonek -10 +KPX nacute uring -10 +KPX nacute v -20 +KPX nacute y -15 +KPX nacute yacute -15 +KPX nacute ydieresis -15 +KPX ncaron u -10 +KPX ncaron uacute -10 +KPX ncaron ucircumflex -10 +KPX ncaron udieresis -10 +KPX ncaron ugrave -10 +KPX ncaron uhungarumlaut -10 +KPX ncaron umacron -10 +KPX ncaron uogonek -10 +KPX ncaron uring -10 +KPX ncaron v -20 +KPX ncaron y -15 +KPX ncaron yacute -15 +KPX ncaron ydieresis -15 +KPX ncommaaccent u -10 +KPX ncommaaccent uacute -10 +KPX ncommaaccent ucircumflex -10 +KPX ncommaaccent udieresis -10 +KPX ncommaaccent ugrave -10 +KPX ncommaaccent uhungarumlaut -10 +KPX ncommaaccent umacron -10 +KPX ncommaaccent uogonek -10 +KPX ncommaaccent uring -10 +KPX ncommaaccent v -20 +KPX ncommaaccent y -15 +KPX ncommaaccent yacute -15 +KPX ncommaaccent ydieresis -15 +KPX ntilde u -10 +KPX ntilde uacute -10 +KPX ntilde ucircumflex -10 +KPX ntilde udieresis -10 +KPX ntilde ugrave -10 +KPX ntilde uhungarumlaut -10 +KPX ntilde umacron -10 +KPX ntilde uogonek -10 +KPX ntilde uring -10 +KPX ntilde v -20 +KPX ntilde y -15 +KPX ntilde yacute -15 +KPX ntilde ydieresis -15 +KPX o comma -40 +KPX o period -40 +KPX o v -15 +KPX o w -15 +KPX o x -30 +KPX o y -30 +KPX o yacute -30 +KPX o ydieresis -30 +KPX oacute comma -40 +KPX oacute period -40 +KPX oacute v -15 +KPX oacute w -15 +KPX oacute x -30 +KPX oacute y -30 +KPX oacute yacute -30 +KPX oacute ydieresis -30 +KPX ocircumflex comma -40 +KPX ocircumflex period -40 +KPX ocircumflex v -15 +KPX ocircumflex w -15 +KPX ocircumflex x -30 +KPX ocircumflex y -30 +KPX ocircumflex yacute -30 +KPX ocircumflex ydieresis -30 +KPX odieresis comma -40 +KPX odieresis period -40 +KPX odieresis v -15 +KPX odieresis w -15 +KPX odieresis x -30 +KPX odieresis y -30 +KPX odieresis yacute -30 +KPX odieresis ydieresis -30 +KPX ograve comma -40 +KPX ograve period -40 +KPX ograve v -15 +KPX ograve w -15 +KPX ograve x -30 +KPX ograve y -30 +KPX ograve yacute -30 +KPX ograve ydieresis -30 +KPX ohungarumlaut comma -40 +KPX ohungarumlaut period -40 +KPX ohungarumlaut v -15 +KPX ohungarumlaut w -15 +KPX ohungarumlaut x -30 +KPX ohungarumlaut y -30 +KPX ohungarumlaut yacute -30 +KPX ohungarumlaut ydieresis -30 +KPX omacron comma -40 +KPX omacron period -40 +KPX omacron v -15 +KPX omacron w -15 +KPX omacron x -30 +KPX omacron y -30 +KPX omacron yacute -30 +KPX omacron ydieresis -30 +KPX oslash a -55 +KPX oslash aacute -55 +KPX oslash abreve -55 +KPX oslash acircumflex -55 +KPX oslash adieresis -55 +KPX oslash agrave -55 +KPX oslash amacron -55 +KPX oslash aogonek -55 +KPX oslash aring -55 +KPX oslash atilde -55 +KPX oslash b -55 +KPX oslash c -55 +KPX oslash cacute -55 +KPX oslash ccaron -55 +KPX oslash ccedilla -55 +KPX oslash comma -95 +KPX oslash d -55 +KPX oslash dcroat -55 +KPX oslash e -55 +KPX oslash eacute -55 +KPX oslash ecaron -55 +KPX oslash ecircumflex -55 +KPX oslash edieresis -55 +KPX oslash edotaccent -55 +KPX oslash egrave -55 +KPX oslash emacron -55 +KPX oslash eogonek -55 +KPX oslash f -55 +KPX oslash g -55 +KPX oslash gbreve -55 +KPX oslash gcommaaccent -55 +KPX oslash h -55 +KPX oslash i -55 +KPX oslash iacute -55 +KPX oslash icircumflex -55 +KPX oslash idieresis -55 +KPX oslash igrave -55 +KPX oslash imacron -55 +KPX oslash iogonek -55 +KPX oslash j -55 +KPX oslash k -55 +KPX oslash kcommaaccent -55 +KPX oslash l -55 +KPX oslash lacute -55 +KPX oslash lcommaaccent -55 +KPX oslash lslash -55 +KPX oslash m -55 +KPX oslash n -55 +KPX oslash nacute -55 +KPX oslash ncaron -55 +KPX oslash ncommaaccent -55 +KPX oslash ntilde -55 +KPX oslash o -55 +KPX oslash oacute -55 +KPX oslash ocircumflex -55 +KPX oslash odieresis -55 +KPX oslash ograve -55 +KPX oslash ohungarumlaut -55 +KPX oslash omacron -55 +KPX oslash oslash -55 +KPX oslash otilde -55 +KPX oslash p -55 +KPX oslash period -95 +KPX oslash q -55 +KPX oslash r -55 +KPX oslash racute -55 +KPX oslash rcaron -55 +KPX oslash rcommaaccent -55 +KPX oslash s -55 +KPX oslash sacute -55 +KPX oslash scaron -55 +KPX oslash scedilla -55 +KPX oslash scommaaccent -55 +KPX oslash t -55 +KPX oslash tcommaaccent -55 +KPX oslash u -55 +KPX oslash uacute -55 +KPX oslash ucircumflex -55 +KPX oslash udieresis -55 +KPX oslash ugrave -55 +KPX oslash uhungarumlaut -55 +KPX oslash umacron -55 +KPX oslash uogonek -55 +KPX oslash uring -55 +KPX oslash v -70 +KPX oslash w -70 +KPX oslash x -85 +KPX oslash y -70 +KPX oslash yacute -70 +KPX oslash ydieresis -70 +KPX oslash z -55 +KPX oslash zacute -55 +KPX oslash zcaron -55 +KPX oslash zdotaccent -55 +KPX otilde comma -40 +KPX otilde period -40 +KPX otilde v -15 +KPX otilde w -15 +KPX otilde x -30 +KPX otilde y -30 +KPX otilde yacute -30 +KPX otilde ydieresis -30 +KPX p comma -35 +KPX p period -35 +KPX p y -30 +KPX p yacute -30 +KPX p ydieresis -30 +KPX period quotedblright -100 +KPX period quoteright -100 +KPX period space -60 +KPX quotedblright space -40 +KPX quoteleft quoteleft -57 +KPX quoteright d -50 +KPX quoteright dcroat -50 +KPX quoteright quoteright -57 +KPX quoteright r -50 +KPX quoteright racute -50 +KPX quoteright rcaron -50 +KPX quoteright rcommaaccent -50 +KPX quoteright s -50 +KPX quoteright sacute -50 +KPX quoteright scaron -50 +KPX quoteright scedilla -50 +KPX quoteright scommaaccent -50 +KPX quoteright space -70 +KPX r a -10 +KPX r aacute -10 +KPX r abreve -10 +KPX r acircumflex -10 +KPX r adieresis -10 +KPX r agrave -10 +KPX r amacron -10 +KPX r aogonek -10 +KPX r aring -10 +KPX r atilde -10 +KPX r colon 30 +KPX r comma -50 +KPX r i 15 +KPX r iacute 15 +KPX r icircumflex 15 +KPX r idieresis 15 +KPX r igrave 15 +KPX r imacron 15 +KPX r iogonek 15 +KPX r k 15 +KPX r kcommaaccent 15 +KPX r l 15 +KPX r lacute 15 +KPX r lcommaaccent 15 +KPX r lslash 15 +KPX r m 25 +KPX r n 25 +KPX r nacute 25 +KPX r ncaron 25 +KPX r ncommaaccent 25 +KPX r ntilde 25 +KPX r p 30 +KPX r period -50 +KPX r semicolon 30 +KPX r t 40 +KPX r tcommaaccent 40 +KPX r u 15 +KPX r uacute 15 +KPX r ucircumflex 15 +KPX r udieresis 15 +KPX r ugrave 15 +KPX r uhungarumlaut 15 +KPX r umacron 15 +KPX r uogonek 15 +KPX r uring 15 +KPX r v 30 +KPX r y 30 +KPX r yacute 30 +KPX r ydieresis 30 +KPX racute a -10 +KPX racute aacute -10 +KPX racute abreve -10 +KPX racute acircumflex -10 +KPX racute adieresis -10 +KPX racute agrave -10 +KPX racute amacron -10 +KPX racute aogonek -10 +KPX racute aring -10 +KPX racute atilde -10 +KPX racute colon 30 +KPX racute comma -50 +KPX racute i 15 +KPX racute iacute 15 +KPX racute icircumflex 15 +KPX racute idieresis 15 +KPX racute igrave 15 +KPX racute imacron 15 +KPX racute iogonek 15 +KPX racute k 15 +KPX racute kcommaaccent 15 +KPX racute l 15 +KPX racute lacute 15 +KPX racute lcommaaccent 15 +KPX racute lslash 15 +KPX racute m 25 +KPX racute n 25 +KPX racute nacute 25 +KPX racute ncaron 25 +KPX racute ncommaaccent 25 +KPX racute ntilde 25 +KPX racute p 30 +KPX racute period -50 +KPX racute semicolon 30 +KPX racute t 40 +KPX racute tcommaaccent 40 +KPX racute u 15 +KPX racute uacute 15 +KPX racute ucircumflex 15 +KPX racute udieresis 15 +KPX racute ugrave 15 +KPX racute uhungarumlaut 15 +KPX racute umacron 15 +KPX racute uogonek 15 +KPX racute uring 15 +KPX racute v 30 +KPX racute y 30 +KPX racute yacute 30 +KPX racute ydieresis 30 +KPX rcaron a -10 +KPX rcaron aacute -10 +KPX rcaron abreve -10 +KPX rcaron acircumflex -10 +KPX rcaron adieresis -10 +KPX rcaron agrave -10 +KPX rcaron amacron -10 +KPX rcaron aogonek -10 +KPX rcaron aring -10 +KPX rcaron atilde -10 +KPX rcaron colon 30 +KPX rcaron comma -50 +KPX rcaron i 15 +KPX rcaron iacute 15 +KPX rcaron icircumflex 15 +KPX rcaron idieresis 15 +KPX rcaron igrave 15 +KPX rcaron imacron 15 +KPX rcaron iogonek 15 +KPX rcaron k 15 +KPX rcaron kcommaaccent 15 +KPX rcaron l 15 +KPX rcaron lacute 15 +KPX rcaron lcommaaccent 15 +KPX rcaron lslash 15 +KPX rcaron m 25 +KPX rcaron n 25 +KPX rcaron nacute 25 +KPX rcaron ncaron 25 +KPX rcaron ncommaaccent 25 +KPX rcaron ntilde 25 +KPX rcaron p 30 +KPX rcaron period -50 +KPX rcaron semicolon 30 +KPX rcaron t 40 +KPX rcaron tcommaaccent 40 +KPX rcaron u 15 +KPX rcaron uacute 15 +KPX rcaron ucircumflex 15 +KPX rcaron udieresis 15 +KPX rcaron ugrave 15 +KPX rcaron uhungarumlaut 15 +KPX rcaron umacron 15 +KPX rcaron uogonek 15 +KPX rcaron uring 15 +KPX rcaron v 30 +KPX rcaron y 30 +KPX rcaron yacute 30 +KPX rcaron ydieresis 30 +KPX rcommaaccent a -10 +KPX rcommaaccent aacute -10 +KPX rcommaaccent abreve -10 +KPX rcommaaccent acircumflex -10 +KPX rcommaaccent adieresis -10 +KPX rcommaaccent agrave -10 +KPX rcommaaccent amacron -10 +KPX rcommaaccent aogonek -10 +KPX rcommaaccent aring -10 +KPX rcommaaccent atilde -10 +KPX rcommaaccent colon 30 +KPX rcommaaccent comma -50 +KPX rcommaaccent i 15 +KPX rcommaaccent iacute 15 +KPX rcommaaccent icircumflex 15 +KPX rcommaaccent idieresis 15 +KPX rcommaaccent igrave 15 +KPX rcommaaccent imacron 15 +KPX rcommaaccent iogonek 15 +KPX rcommaaccent k 15 +KPX rcommaaccent kcommaaccent 15 +KPX rcommaaccent l 15 +KPX rcommaaccent lacute 15 +KPX rcommaaccent lcommaaccent 15 +KPX rcommaaccent lslash 15 +KPX rcommaaccent m 25 +KPX rcommaaccent n 25 +KPX rcommaaccent nacute 25 +KPX rcommaaccent ncaron 25 +KPX rcommaaccent ncommaaccent 25 +KPX rcommaaccent ntilde 25 +KPX rcommaaccent p 30 +KPX rcommaaccent period -50 +KPX rcommaaccent semicolon 30 +KPX rcommaaccent t 40 +KPX rcommaaccent tcommaaccent 40 +KPX rcommaaccent u 15 +KPX rcommaaccent uacute 15 +KPX rcommaaccent ucircumflex 15 +KPX rcommaaccent udieresis 15 +KPX rcommaaccent ugrave 15 +KPX rcommaaccent uhungarumlaut 15 +KPX rcommaaccent umacron 15 +KPX rcommaaccent uogonek 15 +KPX rcommaaccent uring 15 +KPX rcommaaccent v 30 +KPX rcommaaccent y 30 +KPX rcommaaccent yacute 30 +KPX rcommaaccent ydieresis 30 +KPX s comma -15 +KPX s period -15 +KPX s w -30 +KPX sacute comma -15 +KPX sacute period -15 +KPX sacute w -30 +KPX scaron comma -15 +KPX scaron period -15 +KPX scaron w -30 +KPX scedilla comma -15 +KPX scedilla period -15 +KPX scedilla w -30 +KPX scommaaccent comma -15 +KPX scommaaccent period -15 +KPX scommaaccent w -30 +KPX semicolon space -50 +KPX space T -50 +KPX space Tcaron -50 +KPX space Tcommaaccent -50 +KPX space V -50 +KPX space W -40 +KPX space Y -90 +KPX space Yacute -90 +KPX space Ydieresis -90 +KPX space quotedblleft -30 +KPX space quoteleft -60 +KPX v a -25 +KPX v aacute -25 +KPX v abreve -25 +KPX v acircumflex -25 +KPX v adieresis -25 +KPX v agrave -25 +KPX v amacron -25 +KPX v aogonek -25 +KPX v aring -25 +KPX v atilde -25 +KPX v comma -80 +KPX v e -25 +KPX v eacute -25 +KPX v ecaron -25 +KPX v ecircumflex -25 +KPX v edieresis -25 +KPX v edotaccent -25 +KPX v egrave -25 +KPX v emacron -25 +KPX v eogonek -25 +KPX v o -25 +KPX v oacute -25 +KPX v ocircumflex -25 +KPX v odieresis -25 +KPX v ograve -25 +KPX v ohungarumlaut -25 +KPX v omacron -25 +KPX v oslash -25 +KPX v otilde -25 +KPX v period -80 +KPX w a -15 +KPX w aacute -15 +KPX w abreve -15 +KPX w acircumflex -15 +KPX w adieresis -15 +KPX w agrave -15 +KPX w amacron -15 +KPX w aogonek -15 +KPX w aring -15 +KPX w atilde -15 +KPX w comma -60 +KPX w e -10 +KPX w eacute -10 +KPX w ecaron -10 +KPX w ecircumflex -10 +KPX w edieresis -10 +KPX w edotaccent -10 +KPX w egrave -10 +KPX w emacron -10 +KPX w eogonek -10 +KPX w o -10 +KPX w oacute -10 +KPX w ocircumflex -10 +KPX w odieresis -10 +KPX w ograve -10 +KPX w ohungarumlaut -10 +KPX w omacron -10 +KPX w oslash -10 +KPX w otilde -10 +KPX w period -60 +KPX x e -30 +KPX x eacute -30 +KPX x ecaron -30 +KPX x ecircumflex -30 +KPX x edieresis -30 +KPX x edotaccent -30 +KPX x egrave -30 +KPX x emacron -30 +KPX x eogonek -30 +KPX y a -20 +KPX y aacute -20 +KPX y abreve -20 +KPX y acircumflex -20 +KPX y adieresis -20 +KPX y agrave -20 +KPX y amacron -20 +KPX y aogonek -20 +KPX y aring -20 +KPX y atilde -20 +KPX y comma -100 +KPX y e -20 +KPX y eacute -20 +KPX y ecaron -20 +KPX y ecircumflex -20 +KPX y edieresis -20 +KPX y edotaccent -20 +KPX y egrave -20 +KPX y emacron -20 +KPX y eogonek -20 +KPX y o -20 +KPX y oacute -20 +KPX y ocircumflex -20 +KPX y odieresis -20 +KPX y ograve -20 +KPX y ohungarumlaut -20 +KPX y omacron -20 +KPX y oslash -20 +KPX y otilde -20 +KPX y period -100 +KPX yacute a -20 +KPX yacute aacute -20 +KPX yacute abreve -20 +KPX yacute acircumflex -20 +KPX yacute adieresis -20 +KPX yacute agrave -20 +KPX yacute amacron -20 +KPX yacute aogonek -20 +KPX yacute aring -20 +KPX yacute atilde -20 +KPX yacute comma -100 +KPX yacute e -20 +KPX yacute eacute -20 +KPX yacute ecaron -20 +KPX yacute ecircumflex -20 +KPX yacute edieresis -20 +KPX yacute edotaccent -20 +KPX yacute egrave -20 +KPX yacute emacron -20 +KPX yacute eogonek -20 +KPX yacute o -20 +KPX yacute oacute -20 +KPX yacute ocircumflex -20 +KPX yacute odieresis -20 +KPX yacute ograve -20 +KPX yacute ohungarumlaut -20 +KPX yacute omacron -20 +KPX yacute oslash -20 +KPX yacute otilde -20 +KPX yacute period -100 +KPX ydieresis a -20 +KPX ydieresis aacute -20 +KPX ydieresis abreve -20 +KPX ydieresis acircumflex -20 +KPX ydieresis adieresis -20 +KPX ydieresis agrave -20 +KPX ydieresis amacron -20 +KPX ydieresis aogonek -20 +KPX ydieresis aring -20 +KPX ydieresis atilde -20 +KPX ydieresis comma -100 +KPX ydieresis e -20 +KPX ydieresis eacute -20 +KPX ydieresis ecaron -20 +KPX ydieresis ecircumflex -20 +KPX ydieresis edieresis -20 +KPX ydieresis edotaccent -20 +KPX ydieresis egrave -20 +KPX ydieresis emacron -20 +KPX ydieresis eogonek -20 +KPX ydieresis o -20 +KPX ydieresis oacute -20 +KPX ydieresis ocircumflex -20 +KPX ydieresis odieresis -20 +KPX ydieresis ograve -20 +KPX ydieresis ohungarumlaut -20 +KPX ydieresis omacron -20 +KPX ydieresis oslash -20 +KPX ydieresis otilde -20 +KPX ydieresis period -100 +KPX z e -15 +KPX z eacute -15 +KPX z ecaron -15 +KPX z ecircumflex -15 +KPX z edieresis -15 +KPX z edotaccent -15 +KPX z egrave -15 +KPX z emacron -15 +KPX z eogonek -15 +KPX z o -15 +KPX z oacute -15 +KPX z ocircumflex -15 +KPX z odieresis -15 +KPX z ograve -15 +KPX z ohungarumlaut -15 +KPX z omacron -15 +KPX z oslash -15 +KPX z otilde -15 +KPX zacute e -15 +KPX zacute eacute -15 +KPX zacute ecaron -15 +KPX zacute ecircumflex -15 +KPX zacute edieresis -15 +KPX zacute edotaccent -15 +KPX zacute egrave -15 +KPX zacute emacron -15 +KPX zacute eogonek -15 +KPX zacute o -15 +KPX zacute oacute -15 +KPX zacute ocircumflex -15 +KPX zacute odieresis -15 +KPX zacute ograve -15 +KPX zacute ohungarumlaut -15 +KPX zacute omacron -15 +KPX zacute oslash -15 +KPX zacute otilde -15 +KPX zcaron e -15 +KPX zcaron eacute -15 +KPX zcaron ecaron -15 +KPX zcaron ecircumflex -15 +KPX zcaron edieresis -15 +KPX zcaron edotaccent -15 +KPX zcaron egrave -15 +KPX zcaron emacron -15 +KPX zcaron eogonek -15 +KPX zcaron o -15 +KPX zcaron oacute -15 +KPX zcaron ocircumflex -15 +KPX zcaron odieresis -15 +KPX zcaron ograve -15 +KPX zcaron ohungarumlaut -15 +KPX zcaron omacron -15 +KPX zcaron oslash -15 +KPX zcaron otilde -15 +KPX zdotaccent e -15 +KPX zdotaccent eacute -15 +KPX zdotaccent ecaron -15 +KPX zdotaccent ecircumflex -15 +KPX zdotaccent edieresis -15 +KPX zdotaccent edotaccent -15 +KPX zdotaccent egrave -15 +KPX zdotaccent emacron -15 +KPX zdotaccent eogonek -15 +KPX zdotaccent o -15 +KPX zdotaccent oacute -15 +KPX zdotaccent ocircumflex -15 +KPX zdotaccent odieresis -15 +KPX zdotaccent ograve -15 +KPX zdotaccent ohungarumlaut -15 +KPX zdotaccent omacron -15 +KPX zdotaccent oslash -15 +KPX zdotaccent otilde -15 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Helvetica.afm b/application/third_party/dompdf/lib/fonts/Helvetica.afm new file mode 100755 index 00000000..01379de1 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Helvetica.afm @@ -0,0 +1,3053 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:38:23 1997 +Comment UniqueID 43054 +Comment VMusage 37069 48094 +FontName Helvetica +FullName Helvetica +FamilyName Helvetica +Weight Medium +ItalicAngle 0 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -166 -225 1000 931 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 718 +XHeight 523 +Ascender 718 +Descender -207 +StdHW 76 +StdVW 88 +StartCharMetrics 317 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 160 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 278 ; N exclam ; B 90 0 187 718 ; +C 34 ; WX 355 ; N quotedbl ; B 70 463 285 718 ; +C 35 ; WX 556 ; N numbersign ; B 28 0 529 688 ; +C 36 ; WX 556 ; N dollar ; B 32 -115 520 775 ; +C 37 ; WX 889 ; N percent ; B 39 -19 850 703 ; +C 38 ; WX 667 ; N ampersand ; B 44 -15 645 718 ; +C 146 ; WX 222 ; N quoteright ; B 53 463 157 718 ; +C 40 ; WX 333 ; N parenleft ; B 68 -207 299 733 ; +C 41 ; WX 333 ; N parenright ; B 34 -207 265 733 ; +C 42 ; WX 389 ; N asterisk ; B 39 431 349 718 ; +C 43 ; WX 584 ; N plus ; B 39 0 545 505 ; +C 44 ; WX 278 ; N comma ; B 87 -147 191 106 ; +C 45 ; WX 333 ; N hyphen ; B 44 232 289 322 ; +C 173 ; WX 333 ; N hyphen ; B 44 232 289 322 ; +C 46 ; WX 278 ; N period ; B 87 0 191 106 ; +C 47 ; WX 278 ; N slash ; B -17 -19 295 737 ; +C 48 ; WX 556 ; N zero ; B 37 -19 519 703 ; +C 49 ; WX 556 ; N one ; B 101 0 359 703 ; +C 50 ; WX 556 ; N two ; B 26 0 507 703 ; +C 51 ; WX 556 ; N three ; B 34 -19 522 703 ; +C 52 ; WX 556 ; N four ; B 25 0 523 703 ; +C 53 ; WX 556 ; N five ; B 32 -19 514 688 ; +C 54 ; WX 556 ; N six ; B 38 -19 518 703 ; +C 55 ; WX 556 ; N seven ; B 37 0 523 688 ; +C 56 ; WX 556 ; N eight ; B 38 -19 517 703 ; +C 57 ; WX 556 ; N nine ; B 42 -19 514 703 ; +C 58 ; WX 278 ; N colon ; B 87 0 191 516 ; +C 59 ; WX 278 ; N semicolon ; B 87 -147 191 516 ; +C 60 ; WX 584 ; N less ; B 48 11 536 495 ; +C 61 ; WX 584 ; N equal ; B 39 115 545 390 ; +C 62 ; WX 584 ; N greater ; B 48 11 536 495 ; +C 63 ; WX 556 ; N question ; B 56 0 492 727 ; +C 64 ; WX 1015 ; N at ; B 147 -19 868 737 ; +C 65 ; WX 667 ; N A ; B 14 0 654 718 ; +C 66 ; WX 667 ; N B ; B 74 0 627 718 ; +C 67 ; WX 722 ; N C ; B 44 -19 681 737 ; +C 68 ; WX 722 ; N D ; B 81 0 674 718 ; +C 69 ; WX 667 ; N E ; B 86 0 616 718 ; +C 70 ; WX 611 ; N F ; B 86 0 583 718 ; +C 71 ; WX 778 ; N G ; B 48 -19 704 737 ; +C 72 ; WX 722 ; N H ; B 77 0 646 718 ; +C 73 ; WX 278 ; N I ; B 91 0 188 718 ; +C 74 ; WX 500 ; N J ; B 17 -19 428 718 ; +C 75 ; WX 667 ; N K ; B 76 0 663 718 ; +C 76 ; WX 556 ; N L ; B 76 0 537 718 ; +C 77 ; WX 833 ; N M ; B 73 0 761 718 ; +C 78 ; WX 722 ; N N ; B 76 0 646 718 ; +C 79 ; WX 778 ; N O ; B 39 -19 739 737 ; +C 80 ; WX 667 ; N P ; B 86 0 622 718 ; +C 81 ; WX 778 ; N Q ; B 39 -56 739 737 ; +C 82 ; WX 722 ; N R ; B 88 0 684 718 ; +C 83 ; WX 667 ; N S ; B 49 -19 620 737 ; +C 84 ; WX 611 ; N T ; B 14 0 597 718 ; +C 85 ; WX 722 ; N U ; B 79 -19 644 718 ; +C 86 ; WX 667 ; N V ; B 20 0 647 718 ; +C 87 ; WX 944 ; N W ; B 16 0 928 718 ; +C 88 ; WX 667 ; N X ; B 19 0 648 718 ; +C 89 ; WX 667 ; N Y ; B 14 0 653 718 ; +C 90 ; WX 611 ; N Z ; B 23 0 588 718 ; +C 91 ; WX 278 ; N bracketleft ; B 63 -196 250 722 ; +C 92 ; WX 278 ; N backslash ; B -17 -19 295 737 ; +C 93 ; WX 278 ; N bracketright ; B 28 -196 215 722 ; +C 94 ; WX 469 ; N asciicircum ; B -14 264 483 688 ; +C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ; +C 145 ; WX 222 ; N quoteleft ; B 65 470 169 725 ; +C 97 ; WX 556 ; N a ; B 36 -15 530 538 ; +C 98 ; WX 556 ; N b ; B 58 -15 517 718 ; +C 99 ; WX 500 ; N c ; B 30 -15 477 538 ; +C 100 ; WX 556 ; N d ; B 35 -15 499 718 ; +C 101 ; WX 556 ; N e ; B 40 -15 516 538 ; +C 102 ; WX 278 ; N f ; B 14 0 262 728 ; L i fi ; L l fl ; +C 103 ; WX 556 ; N g ; B 40 -220 499 538 ; +C 104 ; WX 556 ; N h ; B 65 0 491 718 ; +C 105 ; WX 222 ; N i ; B 67 0 155 718 ; +C 106 ; WX 222 ; N j ; B -16 -210 155 718 ; +C 107 ; WX 500 ; N k ; B 67 0 501 718 ; +C 108 ; WX 222 ; N l ; B 67 0 155 718 ; +C 109 ; WX 833 ; N m ; B 65 0 769 538 ; +C 110 ; WX 556 ; N n ; B 65 0 491 538 ; +C 111 ; WX 556 ; N o ; B 35 -14 521 538 ; +C 112 ; WX 556 ; N p ; B 58 -207 517 538 ; +C 113 ; WX 556 ; N q ; B 35 -207 494 538 ; +C 114 ; WX 333 ; N r ; B 77 0 332 538 ; +C 115 ; WX 500 ; N s ; B 32 -15 464 538 ; +C 116 ; WX 278 ; N t ; B 14 -7 257 669 ; +C 117 ; WX 556 ; N u ; B 68 -15 489 523 ; +C 118 ; WX 500 ; N v ; B 8 0 492 523 ; +C 119 ; WX 722 ; N w ; B 14 0 709 523 ; +C 120 ; WX 500 ; N x ; B 11 0 490 523 ; +C 121 ; WX 500 ; N y ; B 11 -214 489 523 ; +C 122 ; WX 500 ; N z ; B 31 0 469 523 ; +C 123 ; WX 334 ; N braceleft ; B 42 -196 292 722 ; +C 124 ; WX 260 ; N bar ; B 94 -225 167 775 ; +C 125 ; WX 334 ; N braceright ; B 42 -196 292 722 ; +C 126 ; WX 584 ; N asciitilde ; B 61 180 523 326 ; +C 161 ; WX 333 ; N exclamdown ; B 118 -195 215 523 ; +C 162 ; WX 556 ; N cent ; B 51 -115 513 623 ; +C 163 ; WX 556 ; N sterling ; B 33 -16 539 718 ; +C -1 ; WX 167 ; N fraction ; B -166 -19 333 703 ; +C 165 ; WX 556 ; N yen ; B 3 0 553 688 ; +C 131 ; WX 556 ; N florin ; B -11 -207 501 737 ; +C 167 ; WX 556 ; N section ; B 43 -191 512 737 ; +C 164 ; WX 556 ; N currency ; B 28 99 528 603 ; +C 39 ; WX 191 ; N quotesingle ; B 59 463 132 718 ; +C 147 ; WX 333 ; N quotedblleft ; B 38 470 307 725 ; +C 170 ; WX 556 ; N guillemotleft ; B 97 108 459 446 ; +C 139 ; WX 333 ; N guilsinglleft ; B 88 108 245 446 ; +C 155 ; WX 333 ; N guilsinglright ; B 88 108 245 446 ; +C -1 ; WX 500 ; N fi ; B 14 0 434 728 ; +C -1 ; WX 500 ; N fl ; B 14 0 432 728 ; +C 150 ; WX 556 ; N endash ; B 0 240 556 313 ; +C 134 ; WX 556 ; N dagger ; B 43 -159 514 718 ; +C 135 ; WX 556 ; N daggerdbl ; B 43 -159 514 718 ; +C 183 ; WX 278 ; N periodcentered ; B 77 190 202 315 ; +C 182 ; WX 537 ; N paragraph ; B 18 -173 497 718 ; +C 149 ; WX 350 ; N bullet ; B 18 202 333 517 ; +C 130 ; WX 222 ; N quotesinglbase ; B 53 -149 157 106 ; +C 132 ; WX 333 ; N quotedblbase ; B 26 -149 295 106 ; +C 148 ; WX 333 ; N quotedblright ; B 26 463 295 718 ; +C 187 ; WX 556 ; N guillemotright ; B 97 108 459 446 ; +C 133 ; WX 1000 ; N ellipsis ; B 115 0 885 106 ; +C 137 ; WX 1000 ; N perthousand ; B 7 -19 994 703 ; +C 191 ; WX 611 ; N questiondown ; B 91 -201 527 525 ; +C 96 ; WX 333 ; N grave ; B 14 593 211 734 ; +C 180 ; WX 333 ; N acute ; B 122 593 319 734 ; +C 136 ; WX 333 ; N circumflex ; B 21 593 312 734 ; +C 152 ; WX 333 ; N tilde ; B -4 606 337 722 ; +C 175 ; WX 333 ; N macron ; B 10 627 323 684 ; +C -1 ; WX 333 ; N breve ; B 13 595 321 731 ; +C -1 ; WX 333 ; N dotaccent ; B 121 604 212 706 ; +C 168 ; WX 333 ; N dieresis ; B 40 604 293 706 ; +C -1 ; WX 333 ; N ring ; B 75 572 259 756 ; +C 184 ; WX 333 ; N cedilla ; B 45 -225 259 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B 31 593 409 734 ; +C -1 ; WX 333 ; N ogonek ; B 73 -225 287 0 ; +C -1 ; WX 333 ; N caron ; B 21 593 312 734 ; +C 151 ; WX 1000 ; N emdash ; B 0 240 1000 313 ; +C 198 ; WX 1000 ; N AE ; B 8 0 951 718 ; +C 170 ; WX 370 ; N ordfeminine ; B 24 405 346 737 ; +C -1 ; WX 556 ; N Lslash ; B -20 0 537 718 ; +C 216 ; WX 778 ; N Oslash ; B 39 -19 740 737 ; +C 140 ; WX 1000 ; N OE ; B 36 -19 965 737 ; +C 186 ; WX 365 ; N ordmasculine ; B 25 405 341 737 ; +C 230 ; WX 889 ; N ae ; B 36 -15 847 538 ; +C -1 ; WX 278 ; N dotlessi ; B 95 0 183 523 ; +C -1 ; WX 222 ; N lslash ; B -20 0 242 718 ; +C 248 ; WX 611 ; N oslash ; B 28 -22 537 545 ; +C 156 ; WX 944 ; N oe ; B 35 -15 902 538 ; +C 223 ; WX 611 ; N germandbls ; B 67 -15 571 728 ; +C 207 ; WX 278 ; N Idieresis ; B 13 0 266 901 ; +C 233 ; WX 556 ; N eacute ; B 40 -15 516 734 ; +C -1 ; WX 556 ; N abreve ; B 36 -15 530 731 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 68 -15 521 734 ; +C -1 ; WX 556 ; N ecaron ; B 40 -15 516 734 ; +C 159 ; WX 667 ; N Ydieresis ; B 14 0 653 901 ; +C 247 ; WX 584 ; N divide ; B 39 -19 545 524 ; +C 221 ; WX 667 ; N Yacute ; B 14 0 653 929 ; +C 194 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ; +C 225 ; WX 556 ; N aacute ; B 36 -15 530 734 ; +C 219 ; WX 722 ; N Ucircumflex ; B 79 -19 644 929 ; +C 253 ; WX 500 ; N yacute ; B 11 -214 489 734 ; +C -1 ; WX 500 ; N scommaaccent ; B 32 -225 464 538 ; +C 234 ; WX 556 ; N ecircumflex ; B 40 -15 516 734 ; +C -1 ; WX 722 ; N Uring ; B 79 -19 644 931 ; +C 220 ; WX 722 ; N Udieresis ; B 79 -19 644 901 ; +C -1 ; WX 556 ; N aogonek ; B 36 -220 547 538 ; +C 218 ; WX 722 ; N Uacute ; B 79 -19 644 929 ; +C -1 ; WX 556 ; N uogonek ; B 68 -225 519 523 ; +C 203 ; WX 667 ; N Edieresis ; B 86 0 616 901 ; +C -1 ; WX 722 ; N Dcroat ; B 0 0 674 718 ; +C -1 ; WX 250 ; N commaaccent ; B 87 -225 181 -40 ; +C 169 ; WX 737 ; N copyright ; B -14 -19 752 737 ; +C -1 ; WX 667 ; N Emacron ; B 86 0 616 879 ; +C -1 ; WX 500 ; N ccaron ; B 30 -15 477 734 ; +C 229 ; WX 556 ; N aring ; B 36 -15 530 756 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 646 718 ; +C -1 ; WX 222 ; N lacute ; B 67 0 264 929 ; +C 224 ; WX 556 ; N agrave ; B 36 -15 530 734 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 14 -225 597 718 ; +C -1 ; WX 722 ; N Cacute ; B 44 -19 681 929 ; +C 227 ; WX 556 ; N atilde ; B 36 -15 530 722 ; +C -1 ; WX 667 ; N Edotaccent ; B 86 0 616 901 ; +C 154 ; WX 500 ; N scaron ; B 32 -15 464 734 ; +C -1 ; WX 500 ; N scedilla ; B 32 -225 464 538 ; +C 237 ; WX 278 ; N iacute ; B 95 0 292 734 ; +C -1 ; WX 471 ; N lozenge ; B 10 0 462 728 ; +C -1 ; WX 722 ; N Rcaron ; B 88 0 684 929 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 48 -225 704 737 ; +C 251 ; WX 556 ; N ucircumflex ; B 68 -15 489 734 ; +C 226 ; WX 556 ; N acircumflex ; B 36 -15 530 734 ; +C -1 ; WX 667 ; N Amacron ; B 14 0 654 879 ; +C -1 ; WX 333 ; N rcaron ; B 61 0 352 734 ; +C 231 ; WX 500 ; N ccedilla ; B 30 -225 477 538 ; +C -1 ; WX 611 ; N Zdotaccent ; B 23 0 588 901 ; +C 222 ; WX 667 ; N Thorn ; B 86 0 622 718 ; +C -1 ; WX 778 ; N Omacron ; B 39 -19 739 879 ; +C -1 ; WX 722 ; N Racute ; B 88 0 684 929 ; +C -1 ; WX 667 ; N Sacute ; B 49 -19 620 929 ; +C -1 ; WX 643 ; N dcaron ; B 35 -15 655 718 ; +C -1 ; WX 722 ; N Umacron ; B 79 -19 644 879 ; +C -1 ; WX 556 ; N uring ; B 68 -15 489 756 ; +C 179 ; WX 333 ; N threesuperior ; B 5 270 325 703 ; +C 210 ; WX 778 ; N Ograve ; B 39 -19 739 929 ; +C 192 ; WX 667 ; N Agrave ; B 14 0 654 929 ; +C -1 ; WX 667 ; N Abreve ; B 14 0 654 926 ; +C 215 ; WX 584 ; N multiply ; B 39 0 545 506 ; +C 250 ; WX 556 ; N uacute ; B 68 -15 489 734 ; +C -1 ; WX 611 ; N Tcaron ; B 14 0 597 929 ; +C -1 ; WX 476 ; N partialdiff ; B 13 -38 463 714 ; +C 255 ; WX 500 ; N ydieresis ; B 11 -214 489 706 ; +C -1 ; WX 722 ; N Nacute ; B 76 0 646 929 ; +C 238 ; WX 278 ; N icircumflex ; B -6 0 285 734 ; +C 202 ; WX 667 ; N Ecircumflex ; B 86 0 616 929 ; +C 228 ; WX 556 ; N adieresis ; B 36 -15 530 706 ; +C 235 ; WX 556 ; N edieresis ; B 40 -15 516 706 ; +C -1 ; WX 500 ; N cacute ; B 30 -15 477 734 ; +C -1 ; WX 556 ; N nacute ; B 65 0 491 734 ; +C -1 ; WX 556 ; N umacron ; B 68 -15 489 684 ; +C -1 ; WX 722 ; N Ncaron ; B 76 0 646 929 ; +C 205 ; WX 278 ; N Iacute ; B 91 0 292 929 ; +C 177 ; WX 584 ; N plusminus ; B 39 0 545 506 ; +C 166 ; WX 260 ; N brokenbar ; B 94 -150 167 700 ; +C 174 ; WX 737 ; N registered ; B -14 -19 752 737 ; +C -1 ; WX 778 ; N Gbreve ; B 48 -19 704 926 ; +C -1 ; WX 278 ; N Idotaccent ; B 91 0 188 901 ; +C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ; +C 200 ; WX 667 ; N Egrave ; B 86 0 616 929 ; +C -1 ; WX 333 ; N racute ; B 77 0 332 734 ; +C -1 ; WX 556 ; N omacron ; B 35 -14 521 684 ; +C -1 ; WX 611 ; N Zacute ; B 23 0 588 929 ; +C 142 ; WX 611 ; N Zcaron ; B 23 0 588 929 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 674 ; +C 208 ; WX 722 ; N Eth ; B 0 0 674 718 ; +C 199 ; WX 722 ; N Ccedilla ; B 44 -225 681 737 ; +C -1 ; WX 222 ; N lcommaaccent ; B 67 -225 167 718 ; +C -1 ; WX 317 ; N tcaron ; B 14 -7 329 808 ; +C -1 ; WX 556 ; N eogonek ; B 40 -225 516 538 ; +C -1 ; WX 722 ; N Uogonek ; B 79 -225 644 718 ; +C 193 ; WX 667 ; N Aacute ; B 14 0 654 929 ; +C 196 ; WX 667 ; N Adieresis ; B 14 0 654 901 ; +C 232 ; WX 556 ; N egrave ; B 40 -15 516 734 ; +C -1 ; WX 500 ; N zacute ; B 31 0 469 734 ; +C -1 ; WX 222 ; N iogonek ; B -31 -225 183 718 ; +C 211 ; WX 778 ; N Oacute ; B 39 -19 739 929 ; +C 243 ; WX 556 ; N oacute ; B 35 -14 521 734 ; +C -1 ; WX 556 ; N amacron ; B 36 -15 530 684 ; +C -1 ; WX 500 ; N sacute ; B 32 -15 464 734 ; +C 239 ; WX 278 ; N idieresis ; B 13 0 266 706 ; +C 212 ; WX 778 ; N Ocircumflex ; B 39 -19 739 929 ; +C 217 ; WX 722 ; N Ugrave ; B 79 -19 644 929 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 556 ; N thorn ; B 58 -207 517 718 ; +C 178 ; WX 333 ; N twosuperior ; B 4 281 323 703 ; +C 214 ; WX 778 ; N Odieresis ; B 39 -19 739 901 ; +C 181 ; WX 556 ; N mu ; B 68 -207 489 523 ; +C 236 ; WX 278 ; N igrave ; B -13 0 184 734 ; +C -1 ; WX 556 ; N ohungarumlaut ; B 35 -14 521 734 ; +C -1 ; WX 667 ; N Eogonek ; B 86 -220 633 718 ; +C -1 ; WX 556 ; N dcroat ; B 35 -15 550 718 ; +C 190 ; WX 834 ; N threequarters ; B 45 -19 810 703 ; +C -1 ; WX 667 ; N Scedilla ; B 49 -225 620 737 ; +C -1 ; WX 299 ; N lcaron ; B 67 0 311 718 ; +C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 663 718 ; +C -1 ; WX 556 ; N Lacute ; B 76 0 537 929 ; +C 153 ; WX 1000 ; N trademark ; B 46 306 903 718 ; +C -1 ; WX 556 ; N edotaccent ; B 40 -15 516 706 ; +C 204 ; WX 278 ; N Igrave ; B -13 0 188 929 ; +C -1 ; WX 278 ; N Imacron ; B -17 0 296 879 ; +C -1 ; WX 556 ; N Lcaron ; B 76 0 537 718 ; +C 189 ; WX 834 ; N onehalf ; B 43 -19 773 703 ; +C -1 ; WX 549 ; N lessequal ; B 26 0 523 674 ; +C 244 ; WX 556 ; N ocircumflex ; B 35 -14 521 734 ; +C 241 ; WX 556 ; N ntilde ; B 65 0 491 722 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 79 -19 644 929 ; +C 201 ; WX 667 ; N Eacute ; B 86 0 616 929 ; +C -1 ; WX 556 ; N emacron ; B 40 -15 516 684 ; +C -1 ; WX 556 ; N gbreve ; B 40 -220 499 731 ; +C 188 ; WX 834 ; N onequarter ; B 73 -19 756 703 ; +C 138 ; WX 667 ; N Scaron ; B 49 -19 620 929 ; +C -1 ; WX 667 ; N Scommaaccent ; B 49 -225 620 737 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 39 -19 739 929 ; +C 176 ; WX 400 ; N degree ; B 54 411 346 703 ; +C 242 ; WX 556 ; N ograve ; B 35 -14 521 734 ; +C -1 ; WX 722 ; N Ccaron ; B 44 -19 681 929 ; +C 249 ; WX 556 ; N ugrave ; B 68 -15 489 734 ; +C -1 ; WX 453 ; N radical ; B -4 -80 458 762 ; +C -1 ; WX 722 ; N Dcaron ; B 81 0 674 929 ; +C -1 ; WX 333 ; N rcommaaccent ; B 77 -225 332 538 ; +C 209 ; WX 722 ; N Ntilde ; B 76 0 646 917 ; +C 245 ; WX 556 ; N otilde ; B 35 -14 521 722 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 684 718 ; +C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 537 718 ; +C 195 ; WX 667 ; N Atilde ; B 14 0 654 917 ; +C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ; +C 197 ; WX 667 ; N Aring ; B 14 0 654 931 ; +C 213 ; WX 778 ; N Otilde ; B 39 -19 739 917 ; +C -1 ; WX 500 ; N zdotaccent ; B 31 0 469 706 ; +C -1 ; WX 667 ; N Ecaron ; B 86 0 616 929 ; +C -1 ; WX 278 ; N Iogonek ; B -3 -225 211 718 ; +C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 501 718 ; +C -1 ; WX 584 ; N minus ; B 39 216 545 289 ; +C 206 ; WX 278 ; N Icircumflex ; B -6 0 285 929 ; +C -1 ; WX 556 ; N ncaron ; B 65 0 491 734 ; +C -1 ; WX 278 ; N tcommaaccent ; B 14 -225 257 669 ; +C 172 ; WX 584 ; N logicalnot ; B 39 108 545 390 ; +C 246 ; WX 556 ; N odieresis ; B 35 -14 521 706 ; +C 252 ; WX 556 ; N udieresis ; B 68 -15 489 706 ; +C -1 ; WX 549 ; N notequal ; B 12 -35 537 551 ; +C -1 ; WX 556 ; N gcommaaccent ; B 40 -220 499 822 ; +C 240 ; WX 556 ; N eth ; B 35 -15 522 737 ; +C 158 ; WX 500 ; N zcaron ; B 31 0 469 734 ; +C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 491 538 ; +C 185 ; WX 333 ; N onesuperior ; B 43 281 222 703 ; +C -1 ; WX 278 ; N imacron ; B 5 0 272 684 ; +C 128 ; WX 556 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2705 +KPX A C -30 +KPX A Cacute -30 +KPX A Ccaron -30 +KPX A Ccedilla -30 +KPX A G -30 +KPX A Gbreve -30 +KPX A Gcommaaccent -30 +KPX A O -30 +KPX A Oacute -30 +KPX A Ocircumflex -30 +KPX A Odieresis -30 +KPX A Ograve -30 +KPX A Ohungarumlaut -30 +KPX A Omacron -30 +KPX A Oslash -30 +KPX A Otilde -30 +KPX A Q -30 +KPX A T -120 +KPX A Tcaron -120 +KPX A Tcommaaccent -120 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -70 +KPX A W -50 +KPX A Y -100 +KPX A Yacute -100 +KPX A Ydieresis -100 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -40 +KPX A w -40 +KPX A y -40 +KPX A yacute -40 +KPX A ydieresis -40 +KPX Aacute C -30 +KPX Aacute Cacute -30 +KPX Aacute Ccaron -30 +KPX Aacute Ccedilla -30 +KPX Aacute G -30 +KPX Aacute Gbreve -30 +KPX Aacute Gcommaaccent -30 +KPX Aacute O -30 +KPX Aacute Oacute -30 +KPX Aacute Ocircumflex -30 +KPX Aacute Odieresis -30 +KPX Aacute Ograve -30 +KPX Aacute Ohungarumlaut -30 +KPX Aacute Omacron -30 +KPX Aacute Oslash -30 +KPX Aacute Otilde -30 +KPX Aacute Q -30 +KPX Aacute T -120 +KPX Aacute Tcaron -120 +KPX Aacute Tcommaaccent -120 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -70 +KPX Aacute W -50 +KPX Aacute Y -100 +KPX Aacute Yacute -100 +KPX Aacute Ydieresis -100 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -40 +KPX Aacute w -40 +KPX Aacute y -40 +KPX Aacute yacute -40 +KPX Aacute ydieresis -40 +KPX Abreve C -30 +KPX Abreve Cacute -30 +KPX Abreve Ccaron -30 +KPX Abreve Ccedilla -30 +KPX Abreve G -30 +KPX Abreve Gbreve -30 +KPX Abreve Gcommaaccent -30 +KPX Abreve O -30 +KPX Abreve Oacute -30 +KPX Abreve Ocircumflex -30 +KPX Abreve Odieresis -30 +KPX Abreve Ograve -30 +KPX Abreve Ohungarumlaut -30 +KPX Abreve Omacron -30 +KPX Abreve Oslash -30 +KPX Abreve Otilde -30 +KPX Abreve Q -30 +KPX Abreve T -120 +KPX Abreve Tcaron -120 +KPX Abreve Tcommaaccent -120 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -70 +KPX Abreve W -50 +KPX Abreve Y -100 +KPX Abreve Yacute -100 +KPX Abreve Ydieresis -100 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -40 +KPX Abreve w -40 +KPX Abreve y -40 +KPX Abreve yacute -40 +KPX Abreve ydieresis -40 +KPX Acircumflex C -30 +KPX Acircumflex Cacute -30 +KPX Acircumflex Ccaron -30 +KPX Acircumflex Ccedilla -30 +KPX Acircumflex G -30 +KPX Acircumflex Gbreve -30 +KPX Acircumflex Gcommaaccent -30 +KPX Acircumflex O -30 +KPX Acircumflex Oacute -30 +KPX Acircumflex Ocircumflex -30 +KPX Acircumflex Odieresis -30 +KPX Acircumflex Ograve -30 +KPX Acircumflex Ohungarumlaut -30 +KPX Acircumflex Omacron -30 +KPX Acircumflex Oslash -30 +KPX Acircumflex Otilde -30 +KPX Acircumflex Q -30 +KPX Acircumflex T -120 +KPX Acircumflex Tcaron -120 +KPX Acircumflex Tcommaaccent -120 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -70 +KPX Acircumflex W -50 +KPX Acircumflex Y -100 +KPX Acircumflex Yacute -100 +KPX Acircumflex Ydieresis -100 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -40 +KPX Acircumflex w -40 +KPX Acircumflex y -40 +KPX Acircumflex yacute -40 +KPX Acircumflex ydieresis -40 +KPX Adieresis C -30 +KPX Adieresis Cacute -30 +KPX Adieresis Ccaron -30 +KPX Adieresis Ccedilla -30 +KPX Adieresis G -30 +KPX Adieresis Gbreve -30 +KPX Adieresis Gcommaaccent -30 +KPX Adieresis O -30 +KPX Adieresis Oacute -30 +KPX Adieresis Ocircumflex -30 +KPX Adieresis Odieresis -30 +KPX Adieresis Ograve -30 +KPX Adieresis Ohungarumlaut -30 +KPX Adieresis Omacron -30 +KPX Adieresis Oslash -30 +KPX Adieresis Otilde -30 +KPX Adieresis Q -30 +KPX Adieresis T -120 +KPX Adieresis Tcaron -120 +KPX Adieresis Tcommaaccent -120 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -70 +KPX Adieresis W -50 +KPX Adieresis Y -100 +KPX Adieresis Yacute -100 +KPX Adieresis Ydieresis -100 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -40 +KPX Adieresis w -40 +KPX Adieresis y -40 +KPX Adieresis yacute -40 +KPX Adieresis ydieresis -40 +KPX Agrave C -30 +KPX Agrave Cacute -30 +KPX Agrave Ccaron -30 +KPX Agrave Ccedilla -30 +KPX Agrave G -30 +KPX Agrave Gbreve -30 +KPX Agrave Gcommaaccent -30 +KPX Agrave O -30 +KPX Agrave Oacute -30 +KPX Agrave Ocircumflex -30 +KPX Agrave Odieresis -30 +KPX Agrave Ograve -30 +KPX Agrave Ohungarumlaut -30 +KPX Agrave Omacron -30 +KPX Agrave Oslash -30 +KPX Agrave Otilde -30 +KPX Agrave Q -30 +KPX Agrave T -120 +KPX Agrave Tcaron -120 +KPX Agrave Tcommaaccent -120 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -70 +KPX Agrave W -50 +KPX Agrave Y -100 +KPX Agrave Yacute -100 +KPX Agrave Ydieresis -100 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -40 +KPX Agrave w -40 +KPX Agrave y -40 +KPX Agrave yacute -40 +KPX Agrave ydieresis -40 +KPX Amacron C -30 +KPX Amacron Cacute -30 +KPX Amacron Ccaron -30 +KPX Amacron Ccedilla -30 +KPX Amacron G -30 +KPX Amacron Gbreve -30 +KPX Amacron Gcommaaccent -30 +KPX Amacron O -30 +KPX Amacron Oacute -30 +KPX Amacron Ocircumflex -30 +KPX Amacron Odieresis -30 +KPX Amacron Ograve -30 +KPX Amacron Ohungarumlaut -30 +KPX Amacron Omacron -30 +KPX Amacron Oslash -30 +KPX Amacron Otilde -30 +KPX Amacron Q -30 +KPX Amacron T -120 +KPX Amacron Tcaron -120 +KPX Amacron Tcommaaccent -120 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -70 +KPX Amacron W -50 +KPX Amacron Y -100 +KPX Amacron Yacute -100 +KPX Amacron Ydieresis -100 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -40 +KPX Amacron w -40 +KPX Amacron y -40 +KPX Amacron yacute -40 +KPX Amacron ydieresis -40 +KPX Aogonek C -30 +KPX Aogonek Cacute -30 +KPX Aogonek Ccaron -30 +KPX Aogonek Ccedilla -30 +KPX Aogonek G -30 +KPX Aogonek Gbreve -30 +KPX Aogonek Gcommaaccent -30 +KPX Aogonek O -30 +KPX Aogonek Oacute -30 +KPX Aogonek Ocircumflex -30 +KPX Aogonek Odieresis -30 +KPX Aogonek Ograve -30 +KPX Aogonek Ohungarumlaut -30 +KPX Aogonek Omacron -30 +KPX Aogonek Oslash -30 +KPX Aogonek Otilde -30 +KPX Aogonek Q -30 +KPX Aogonek T -120 +KPX Aogonek Tcaron -120 +KPX Aogonek Tcommaaccent -120 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -70 +KPX Aogonek W -50 +KPX Aogonek Y -100 +KPX Aogonek Yacute -100 +KPX Aogonek Ydieresis -100 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -40 +KPX Aogonek w -40 +KPX Aogonek y -40 +KPX Aogonek yacute -40 +KPX Aogonek ydieresis -40 +KPX Aring C -30 +KPX Aring Cacute -30 +KPX Aring Ccaron -30 +KPX Aring Ccedilla -30 +KPX Aring G -30 +KPX Aring Gbreve -30 +KPX Aring Gcommaaccent -30 +KPX Aring O -30 +KPX Aring Oacute -30 +KPX Aring Ocircumflex -30 +KPX Aring Odieresis -30 +KPX Aring Ograve -30 +KPX Aring Ohungarumlaut -30 +KPX Aring Omacron -30 +KPX Aring Oslash -30 +KPX Aring Otilde -30 +KPX Aring Q -30 +KPX Aring T -120 +KPX Aring Tcaron -120 +KPX Aring Tcommaaccent -120 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -70 +KPX Aring W -50 +KPX Aring Y -100 +KPX Aring Yacute -100 +KPX Aring Ydieresis -100 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -40 +KPX Aring w -40 +KPX Aring y -40 +KPX Aring yacute -40 +KPX Aring ydieresis -40 +KPX Atilde C -30 +KPX Atilde Cacute -30 +KPX Atilde Ccaron -30 +KPX Atilde Ccedilla -30 +KPX Atilde G -30 +KPX Atilde Gbreve -30 +KPX Atilde Gcommaaccent -30 +KPX Atilde O -30 +KPX Atilde Oacute -30 +KPX Atilde Ocircumflex -30 +KPX Atilde Odieresis -30 +KPX Atilde Ograve -30 +KPX Atilde Ohungarumlaut -30 +KPX Atilde Omacron -30 +KPX Atilde Oslash -30 +KPX Atilde Otilde -30 +KPX Atilde Q -30 +KPX Atilde T -120 +KPX Atilde Tcaron -120 +KPX Atilde Tcommaaccent -120 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -70 +KPX Atilde W -50 +KPX Atilde Y -100 +KPX Atilde Yacute -100 +KPX Atilde Ydieresis -100 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -40 +KPX Atilde w -40 +KPX Atilde y -40 +KPX Atilde yacute -40 +KPX Atilde ydieresis -40 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX B comma -20 +KPX B period -20 +KPX C comma -30 +KPX C period -30 +KPX Cacute comma -30 +KPX Cacute period -30 +KPX Ccaron comma -30 +KPX Ccaron period -30 +KPX Ccedilla comma -30 +KPX Ccedilla period -30 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -70 +KPX D W -40 +KPX D Y -90 +KPX D Yacute -90 +KPX D Ydieresis -90 +KPX D comma -70 +KPX D period -70 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -70 +KPX Dcaron W -40 +KPX Dcaron Y -90 +KPX Dcaron Yacute -90 +KPX Dcaron Ydieresis -90 +KPX Dcaron comma -70 +KPX Dcaron period -70 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -70 +KPX Dcroat W -40 +KPX Dcroat Y -90 +KPX Dcroat Yacute -90 +KPX Dcroat Ydieresis -90 +KPX Dcroat comma -70 +KPX Dcroat period -70 +KPX F A -80 +KPX F Aacute -80 +KPX F Abreve -80 +KPX F Acircumflex -80 +KPX F Adieresis -80 +KPX F Agrave -80 +KPX F Amacron -80 +KPX F Aogonek -80 +KPX F Aring -80 +KPX F Atilde -80 +KPX F a -50 +KPX F aacute -50 +KPX F abreve -50 +KPX F acircumflex -50 +KPX F adieresis -50 +KPX F agrave -50 +KPX F amacron -50 +KPX F aogonek -50 +KPX F aring -50 +KPX F atilde -50 +KPX F comma -150 +KPX F e -30 +KPX F eacute -30 +KPX F ecaron -30 +KPX F ecircumflex -30 +KPX F edieresis -30 +KPX F edotaccent -30 +KPX F egrave -30 +KPX F emacron -30 +KPX F eogonek -30 +KPX F o -30 +KPX F oacute -30 +KPX F ocircumflex -30 +KPX F odieresis -30 +KPX F ograve -30 +KPX F ohungarumlaut -30 +KPX F omacron -30 +KPX F oslash -30 +KPX F otilde -30 +KPX F period -150 +KPX F r -45 +KPX F racute -45 +KPX F rcaron -45 +KPX F rcommaaccent -45 +KPX J A -20 +KPX J Aacute -20 +KPX J Abreve -20 +KPX J Acircumflex -20 +KPX J Adieresis -20 +KPX J Agrave -20 +KPX J Amacron -20 +KPX J Aogonek -20 +KPX J Aring -20 +KPX J Atilde -20 +KPX J a -20 +KPX J aacute -20 +KPX J abreve -20 +KPX J acircumflex -20 +KPX J adieresis -20 +KPX J agrave -20 +KPX J amacron -20 +KPX J aogonek -20 +KPX J aring -20 +KPX J atilde -20 +KPX J comma -30 +KPX J period -30 +KPX J u -20 +KPX J uacute -20 +KPX J ucircumflex -20 +KPX J udieresis -20 +KPX J ugrave -20 +KPX J uhungarumlaut -20 +KPX J umacron -20 +KPX J uogonek -20 +KPX J uring -20 +KPX K O -50 +KPX K Oacute -50 +KPX K Ocircumflex -50 +KPX K Odieresis -50 +KPX K Ograve -50 +KPX K Ohungarumlaut -50 +KPX K Omacron -50 +KPX K Oslash -50 +KPX K Otilde -50 +KPX K e -40 +KPX K eacute -40 +KPX K ecaron -40 +KPX K ecircumflex -40 +KPX K edieresis -40 +KPX K edotaccent -40 +KPX K egrave -40 +KPX K emacron -40 +KPX K eogonek -40 +KPX K o -40 +KPX K oacute -40 +KPX K ocircumflex -40 +KPX K odieresis -40 +KPX K ograve -40 +KPX K ohungarumlaut -40 +KPX K omacron -40 +KPX K oslash -40 +KPX K otilde -40 +KPX K u -30 +KPX K uacute -30 +KPX K ucircumflex -30 +KPX K udieresis -30 +KPX K ugrave -30 +KPX K uhungarumlaut -30 +KPX K umacron -30 +KPX K uogonek -30 +KPX K uring -30 +KPX K y -50 +KPX K yacute -50 +KPX K ydieresis -50 +KPX Kcommaaccent O -50 +KPX Kcommaaccent Oacute -50 +KPX Kcommaaccent Ocircumflex -50 +KPX Kcommaaccent Odieresis -50 +KPX Kcommaaccent Ograve -50 +KPX Kcommaaccent Ohungarumlaut -50 +KPX Kcommaaccent Omacron -50 +KPX Kcommaaccent Oslash -50 +KPX Kcommaaccent Otilde -50 +KPX Kcommaaccent e -40 +KPX Kcommaaccent eacute -40 +KPX Kcommaaccent ecaron -40 +KPX Kcommaaccent ecircumflex -40 +KPX Kcommaaccent edieresis -40 +KPX Kcommaaccent edotaccent -40 +KPX Kcommaaccent egrave -40 +KPX Kcommaaccent emacron -40 +KPX Kcommaaccent eogonek -40 +KPX Kcommaaccent o -40 +KPX Kcommaaccent oacute -40 +KPX Kcommaaccent ocircumflex -40 +KPX Kcommaaccent odieresis -40 +KPX Kcommaaccent ograve -40 +KPX Kcommaaccent ohungarumlaut -40 +KPX Kcommaaccent omacron -40 +KPX Kcommaaccent oslash -40 +KPX Kcommaaccent otilde -40 +KPX Kcommaaccent u -30 +KPX Kcommaaccent uacute -30 +KPX Kcommaaccent ucircumflex -30 +KPX Kcommaaccent udieresis -30 +KPX Kcommaaccent ugrave -30 +KPX Kcommaaccent uhungarumlaut -30 +KPX Kcommaaccent umacron -30 +KPX Kcommaaccent uogonek -30 +KPX Kcommaaccent uring -30 +KPX Kcommaaccent y -50 +KPX Kcommaaccent yacute -50 +KPX Kcommaaccent ydieresis -50 +KPX L T -110 +KPX L Tcaron -110 +KPX L Tcommaaccent -110 +KPX L V -110 +KPX L W -70 +KPX L Y -140 +KPX L Yacute -140 +KPX L Ydieresis -140 +KPX L quotedblright -140 +KPX L quoteright -160 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -110 +KPX Lacute Tcaron -110 +KPX Lacute Tcommaaccent -110 +KPX Lacute V -110 +KPX Lacute W -70 +KPX Lacute Y -140 +KPX Lacute Yacute -140 +KPX Lacute Ydieresis -140 +KPX Lacute quotedblright -140 +KPX Lacute quoteright -160 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcaron T -110 +KPX Lcaron Tcaron -110 +KPX Lcaron Tcommaaccent -110 +KPX Lcaron V -110 +KPX Lcaron W -70 +KPX Lcaron Y -140 +KPX Lcaron Yacute -140 +KPX Lcaron Ydieresis -140 +KPX Lcaron quotedblright -140 +KPX Lcaron quoteright -160 +KPX Lcaron y -30 +KPX Lcaron yacute -30 +KPX Lcaron ydieresis -30 +KPX Lcommaaccent T -110 +KPX Lcommaaccent Tcaron -110 +KPX Lcommaaccent Tcommaaccent -110 +KPX Lcommaaccent V -110 +KPX Lcommaaccent W -70 +KPX Lcommaaccent Y -140 +KPX Lcommaaccent Yacute -140 +KPX Lcommaaccent Ydieresis -140 +KPX Lcommaaccent quotedblright -140 +KPX Lcommaaccent quoteright -160 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -110 +KPX Lslash Tcaron -110 +KPX Lslash Tcommaaccent -110 +KPX Lslash V -110 +KPX Lslash W -70 +KPX Lslash Y -140 +KPX Lslash Yacute -140 +KPX Lslash Ydieresis -140 +KPX Lslash quotedblright -140 +KPX Lslash quoteright -160 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX O A -20 +KPX O Aacute -20 +KPX O Abreve -20 +KPX O Acircumflex -20 +KPX O Adieresis -20 +KPX O Agrave -20 +KPX O Amacron -20 +KPX O Aogonek -20 +KPX O Aring -20 +KPX O Atilde -20 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -30 +KPX O X -60 +KPX O Y -70 +KPX O Yacute -70 +KPX O Ydieresis -70 +KPX O comma -40 +KPX O period -40 +KPX Oacute A -20 +KPX Oacute Aacute -20 +KPX Oacute Abreve -20 +KPX Oacute Acircumflex -20 +KPX Oacute Adieresis -20 +KPX Oacute Agrave -20 +KPX Oacute Amacron -20 +KPX Oacute Aogonek -20 +KPX Oacute Aring -20 +KPX Oacute Atilde -20 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -30 +KPX Oacute X -60 +KPX Oacute Y -70 +KPX Oacute Yacute -70 +KPX Oacute Ydieresis -70 +KPX Oacute comma -40 +KPX Oacute period -40 +KPX Ocircumflex A -20 +KPX Ocircumflex Aacute -20 +KPX Ocircumflex Abreve -20 +KPX Ocircumflex Acircumflex -20 +KPX Ocircumflex Adieresis -20 +KPX Ocircumflex Agrave -20 +KPX Ocircumflex Amacron -20 +KPX Ocircumflex Aogonek -20 +KPX Ocircumflex Aring -20 +KPX Ocircumflex Atilde -20 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -30 +KPX Ocircumflex X -60 +KPX Ocircumflex Y -70 +KPX Ocircumflex Yacute -70 +KPX Ocircumflex Ydieresis -70 +KPX Ocircumflex comma -40 +KPX Ocircumflex period -40 +KPX Odieresis A -20 +KPX Odieresis Aacute -20 +KPX Odieresis Abreve -20 +KPX Odieresis Acircumflex -20 +KPX Odieresis Adieresis -20 +KPX Odieresis Agrave -20 +KPX Odieresis Amacron -20 +KPX Odieresis Aogonek -20 +KPX Odieresis Aring -20 +KPX Odieresis Atilde -20 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -30 +KPX Odieresis X -60 +KPX Odieresis Y -70 +KPX Odieresis Yacute -70 +KPX Odieresis Ydieresis -70 +KPX Odieresis comma -40 +KPX Odieresis period -40 +KPX Ograve A -20 +KPX Ograve Aacute -20 +KPX Ograve Abreve -20 +KPX Ograve Acircumflex -20 +KPX Ograve Adieresis -20 +KPX Ograve Agrave -20 +KPX Ograve Amacron -20 +KPX Ograve Aogonek -20 +KPX Ograve Aring -20 +KPX Ograve Atilde -20 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -30 +KPX Ograve X -60 +KPX Ograve Y -70 +KPX Ograve Yacute -70 +KPX Ograve Ydieresis -70 +KPX Ograve comma -40 +KPX Ograve period -40 +KPX Ohungarumlaut A -20 +KPX Ohungarumlaut Aacute -20 +KPX Ohungarumlaut Abreve -20 +KPX Ohungarumlaut Acircumflex -20 +KPX Ohungarumlaut Adieresis -20 +KPX Ohungarumlaut Agrave -20 +KPX Ohungarumlaut Amacron -20 +KPX Ohungarumlaut Aogonek -20 +KPX Ohungarumlaut Aring -20 +KPX Ohungarumlaut Atilde -20 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -30 +KPX Ohungarumlaut X -60 +KPX Ohungarumlaut Y -70 +KPX Ohungarumlaut Yacute -70 +KPX Ohungarumlaut Ydieresis -70 +KPX Ohungarumlaut comma -40 +KPX Ohungarumlaut period -40 +KPX Omacron A -20 +KPX Omacron Aacute -20 +KPX Omacron Abreve -20 +KPX Omacron Acircumflex -20 +KPX Omacron Adieresis -20 +KPX Omacron Agrave -20 +KPX Omacron Amacron -20 +KPX Omacron Aogonek -20 +KPX Omacron Aring -20 +KPX Omacron Atilde -20 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -30 +KPX Omacron X -60 +KPX Omacron Y -70 +KPX Omacron Yacute -70 +KPX Omacron Ydieresis -70 +KPX Omacron comma -40 +KPX Omacron period -40 +KPX Oslash A -20 +KPX Oslash Aacute -20 +KPX Oslash Abreve -20 +KPX Oslash Acircumflex -20 +KPX Oslash Adieresis -20 +KPX Oslash Agrave -20 +KPX Oslash Amacron -20 +KPX Oslash Aogonek -20 +KPX Oslash Aring -20 +KPX Oslash Atilde -20 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -30 +KPX Oslash X -60 +KPX Oslash Y -70 +KPX Oslash Yacute -70 +KPX Oslash Ydieresis -70 +KPX Oslash comma -40 +KPX Oslash period -40 +KPX Otilde A -20 +KPX Otilde Aacute -20 +KPX Otilde Abreve -20 +KPX Otilde Acircumflex -20 +KPX Otilde Adieresis -20 +KPX Otilde Agrave -20 +KPX Otilde Amacron -20 +KPX Otilde Aogonek -20 +KPX Otilde Aring -20 +KPX Otilde Atilde -20 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -30 +KPX Otilde X -60 +KPX Otilde Y -70 +KPX Otilde Yacute -70 +KPX Otilde Ydieresis -70 +KPX Otilde comma -40 +KPX Otilde period -40 +KPX P A -120 +KPX P Aacute -120 +KPX P Abreve -120 +KPX P Acircumflex -120 +KPX P Adieresis -120 +KPX P Agrave -120 +KPX P Amacron -120 +KPX P Aogonek -120 +KPX P Aring -120 +KPX P Atilde -120 +KPX P a -40 +KPX P aacute -40 +KPX P abreve -40 +KPX P acircumflex -40 +KPX P adieresis -40 +KPX P agrave -40 +KPX P amacron -40 +KPX P aogonek -40 +KPX P aring -40 +KPX P atilde -40 +KPX P comma -180 +KPX P e -50 +KPX P eacute -50 +KPX P ecaron -50 +KPX P ecircumflex -50 +KPX P edieresis -50 +KPX P edotaccent -50 +KPX P egrave -50 +KPX P emacron -50 +KPX P eogonek -50 +KPX P o -50 +KPX P oacute -50 +KPX P ocircumflex -50 +KPX P odieresis -50 +KPX P ograve -50 +KPX P ohungarumlaut -50 +KPX P omacron -50 +KPX P oslash -50 +KPX P otilde -50 +KPX P period -180 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX R O -20 +KPX R Oacute -20 +KPX R Ocircumflex -20 +KPX R Odieresis -20 +KPX R Ograve -20 +KPX R Ohungarumlaut -20 +KPX R Omacron -20 +KPX R Oslash -20 +KPX R Otilde -20 +KPX R T -30 +KPX R Tcaron -30 +KPX R Tcommaaccent -30 +KPX R U -40 +KPX R Uacute -40 +KPX R Ucircumflex -40 +KPX R Udieresis -40 +KPX R Ugrave -40 +KPX R Uhungarumlaut -40 +KPX R Umacron -40 +KPX R Uogonek -40 +KPX R Uring -40 +KPX R V -50 +KPX R W -30 +KPX R Y -50 +KPX R Yacute -50 +KPX R Ydieresis -50 +KPX Racute O -20 +KPX Racute Oacute -20 +KPX Racute Ocircumflex -20 +KPX Racute Odieresis -20 +KPX Racute Ograve -20 +KPX Racute Ohungarumlaut -20 +KPX Racute Omacron -20 +KPX Racute Oslash -20 +KPX Racute Otilde -20 +KPX Racute T -30 +KPX Racute Tcaron -30 +KPX Racute Tcommaaccent -30 +KPX Racute U -40 +KPX Racute Uacute -40 +KPX Racute Ucircumflex -40 +KPX Racute Udieresis -40 +KPX Racute Ugrave -40 +KPX Racute Uhungarumlaut -40 +KPX Racute Umacron -40 +KPX Racute Uogonek -40 +KPX Racute Uring -40 +KPX Racute V -50 +KPX Racute W -30 +KPX Racute Y -50 +KPX Racute Yacute -50 +KPX Racute Ydieresis -50 +KPX Rcaron O -20 +KPX Rcaron Oacute -20 +KPX Rcaron Ocircumflex -20 +KPX Rcaron Odieresis -20 +KPX Rcaron Ograve -20 +KPX Rcaron Ohungarumlaut -20 +KPX Rcaron Omacron -20 +KPX Rcaron Oslash -20 +KPX Rcaron Otilde -20 +KPX Rcaron T -30 +KPX Rcaron Tcaron -30 +KPX Rcaron Tcommaaccent -30 +KPX Rcaron U -40 +KPX Rcaron Uacute -40 +KPX Rcaron Ucircumflex -40 +KPX Rcaron Udieresis -40 +KPX Rcaron Ugrave -40 +KPX Rcaron Uhungarumlaut -40 +KPX Rcaron Umacron -40 +KPX Rcaron Uogonek -40 +KPX Rcaron Uring -40 +KPX Rcaron V -50 +KPX Rcaron W -30 +KPX Rcaron Y -50 +KPX Rcaron Yacute -50 +KPX Rcaron Ydieresis -50 +KPX Rcommaaccent O -20 +KPX Rcommaaccent Oacute -20 +KPX Rcommaaccent Ocircumflex -20 +KPX Rcommaaccent Odieresis -20 +KPX Rcommaaccent Ograve -20 +KPX Rcommaaccent Ohungarumlaut -20 +KPX Rcommaaccent Omacron -20 +KPX Rcommaaccent Oslash -20 +KPX Rcommaaccent Otilde -20 +KPX Rcommaaccent T -30 +KPX Rcommaaccent Tcaron -30 +KPX Rcommaaccent Tcommaaccent -30 +KPX Rcommaaccent U -40 +KPX Rcommaaccent Uacute -40 +KPX Rcommaaccent Ucircumflex -40 +KPX Rcommaaccent Udieresis -40 +KPX Rcommaaccent Ugrave -40 +KPX Rcommaaccent Uhungarumlaut -40 +KPX Rcommaaccent Umacron -40 +KPX Rcommaaccent Uogonek -40 +KPX Rcommaaccent Uring -40 +KPX Rcommaaccent V -50 +KPX Rcommaaccent W -30 +KPX Rcommaaccent Y -50 +KPX Rcommaaccent Yacute -50 +KPX Rcommaaccent Ydieresis -50 +KPX S comma -20 +KPX S period -20 +KPX Sacute comma -20 +KPX Sacute period -20 +KPX Scaron comma -20 +KPX Scaron period -20 +KPX Scedilla comma -20 +KPX Scedilla period -20 +KPX Scommaaccent comma -20 +KPX Scommaaccent period -20 +KPX T A -120 +KPX T Aacute -120 +KPX T Abreve -120 +KPX T Acircumflex -120 +KPX T Adieresis -120 +KPX T Agrave -120 +KPX T Amacron -120 +KPX T Aogonek -120 +KPX T Aring -120 +KPX T Atilde -120 +KPX T O -40 +KPX T Oacute -40 +KPX T Ocircumflex -40 +KPX T Odieresis -40 +KPX T Ograve -40 +KPX T Ohungarumlaut -40 +KPX T Omacron -40 +KPX T Oslash -40 +KPX T Otilde -40 +KPX T a -120 +KPX T aacute -120 +KPX T abreve -60 +KPX T acircumflex -120 +KPX T adieresis -120 +KPX T agrave -120 +KPX T amacron -60 +KPX T aogonek -120 +KPX T aring -120 +KPX T atilde -60 +KPX T colon -20 +KPX T comma -120 +KPX T e -120 +KPX T eacute -120 +KPX T ecaron -120 +KPX T ecircumflex -120 +KPX T edieresis -120 +KPX T edotaccent -120 +KPX T egrave -60 +KPX T emacron -60 +KPX T eogonek -120 +KPX T hyphen -140 +KPX T o -120 +KPX T oacute -120 +KPX T ocircumflex -120 +KPX T odieresis -120 +KPX T ograve -120 +KPX T ohungarumlaut -120 +KPX T omacron -60 +KPX T oslash -120 +KPX T otilde -60 +KPX T period -120 +KPX T r -120 +KPX T racute -120 +KPX T rcaron -120 +KPX T rcommaaccent -120 +KPX T semicolon -20 +KPX T u -120 +KPX T uacute -120 +KPX T ucircumflex -120 +KPX T udieresis -120 +KPX T ugrave -120 +KPX T uhungarumlaut -120 +KPX T umacron -60 +KPX T uogonek -120 +KPX T uring -120 +KPX T w -120 +KPX T y -120 +KPX T yacute -120 +KPX T ydieresis -60 +KPX Tcaron A -120 +KPX Tcaron Aacute -120 +KPX Tcaron Abreve -120 +KPX Tcaron Acircumflex -120 +KPX Tcaron Adieresis -120 +KPX Tcaron Agrave -120 +KPX Tcaron Amacron -120 +KPX Tcaron Aogonek -120 +KPX Tcaron Aring -120 +KPX Tcaron Atilde -120 +KPX Tcaron O -40 +KPX Tcaron Oacute -40 +KPX Tcaron Ocircumflex -40 +KPX Tcaron Odieresis -40 +KPX Tcaron Ograve -40 +KPX Tcaron Ohungarumlaut -40 +KPX Tcaron Omacron -40 +KPX Tcaron Oslash -40 +KPX Tcaron Otilde -40 +KPX Tcaron a -120 +KPX Tcaron aacute -120 +KPX Tcaron abreve -60 +KPX Tcaron acircumflex -120 +KPX Tcaron adieresis -120 +KPX Tcaron agrave -120 +KPX Tcaron amacron -60 +KPX Tcaron aogonek -120 +KPX Tcaron aring -120 +KPX Tcaron atilde -60 +KPX Tcaron colon -20 +KPX Tcaron comma -120 +KPX Tcaron e -120 +KPX Tcaron eacute -120 +KPX Tcaron ecaron -120 +KPX Tcaron ecircumflex -120 +KPX Tcaron edieresis -120 +KPX Tcaron edotaccent -120 +KPX Tcaron egrave -60 +KPX Tcaron emacron -60 +KPX Tcaron eogonek -120 +KPX Tcaron hyphen -140 +KPX Tcaron o -120 +KPX Tcaron oacute -120 +KPX Tcaron ocircumflex -120 +KPX Tcaron odieresis -120 +KPX Tcaron ograve -120 +KPX Tcaron ohungarumlaut -120 +KPX Tcaron omacron -60 +KPX Tcaron oslash -120 +KPX Tcaron otilde -60 +KPX Tcaron period -120 +KPX Tcaron r -120 +KPX Tcaron racute -120 +KPX Tcaron rcaron -120 +KPX Tcaron rcommaaccent -120 +KPX Tcaron semicolon -20 +KPX Tcaron u -120 +KPX Tcaron uacute -120 +KPX Tcaron ucircumflex -120 +KPX Tcaron udieresis -120 +KPX Tcaron ugrave -120 +KPX Tcaron uhungarumlaut -120 +KPX Tcaron umacron -60 +KPX Tcaron uogonek -120 +KPX Tcaron uring -120 +KPX Tcaron w -120 +KPX Tcaron y -120 +KPX Tcaron yacute -120 +KPX Tcaron ydieresis -60 +KPX Tcommaaccent A -120 +KPX Tcommaaccent Aacute -120 +KPX Tcommaaccent Abreve -120 +KPX Tcommaaccent Acircumflex -120 +KPX Tcommaaccent Adieresis -120 +KPX Tcommaaccent Agrave -120 +KPX Tcommaaccent Amacron -120 +KPX Tcommaaccent Aogonek -120 +KPX Tcommaaccent Aring -120 +KPX Tcommaaccent Atilde -120 +KPX Tcommaaccent O -40 +KPX Tcommaaccent Oacute -40 +KPX Tcommaaccent Ocircumflex -40 +KPX Tcommaaccent Odieresis -40 +KPX Tcommaaccent Ograve -40 +KPX Tcommaaccent Ohungarumlaut -40 +KPX Tcommaaccent Omacron -40 +KPX Tcommaaccent Oslash -40 +KPX Tcommaaccent Otilde -40 +KPX Tcommaaccent a -120 +KPX Tcommaaccent aacute -120 +KPX Tcommaaccent abreve -60 +KPX Tcommaaccent acircumflex -120 +KPX Tcommaaccent adieresis -120 +KPX Tcommaaccent agrave -120 +KPX Tcommaaccent amacron -60 +KPX Tcommaaccent aogonek -120 +KPX Tcommaaccent aring -120 +KPX Tcommaaccent atilde -60 +KPX Tcommaaccent colon -20 +KPX Tcommaaccent comma -120 +KPX Tcommaaccent e -120 +KPX Tcommaaccent eacute -120 +KPX Tcommaaccent ecaron -120 +KPX Tcommaaccent ecircumflex -120 +KPX Tcommaaccent edieresis -120 +KPX Tcommaaccent edotaccent -120 +KPX Tcommaaccent egrave -60 +KPX Tcommaaccent emacron -60 +KPX Tcommaaccent eogonek -120 +KPX Tcommaaccent hyphen -140 +KPX Tcommaaccent o -120 +KPX Tcommaaccent oacute -120 +KPX Tcommaaccent ocircumflex -120 +KPX Tcommaaccent odieresis -120 +KPX Tcommaaccent ograve -120 +KPX Tcommaaccent ohungarumlaut -120 +KPX Tcommaaccent omacron -60 +KPX Tcommaaccent oslash -120 +KPX Tcommaaccent otilde -60 +KPX Tcommaaccent period -120 +KPX Tcommaaccent r -120 +KPX Tcommaaccent racute -120 +KPX Tcommaaccent rcaron -120 +KPX Tcommaaccent rcommaaccent -120 +KPX Tcommaaccent semicolon -20 +KPX Tcommaaccent u -120 +KPX Tcommaaccent uacute -120 +KPX Tcommaaccent ucircumflex -120 +KPX Tcommaaccent udieresis -120 +KPX Tcommaaccent ugrave -120 +KPX Tcommaaccent uhungarumlaut -120 +KPX Tcommaaccent umacron -60 +KPX Tcommaaccent uogonek -120 +KPX Tcommaaccent uring -120 +KPX Tcommaaccent w -120 +KPX Tcommaaccent y -120 +KPX Tcommaaccent yacute -120 +KPX Tcommaaccent ydieresis -60 +KPX U A -40 +KPX U Aacute -40 +KPX U Abreve -40 +KPX U Acircumflex -40 +KPX U Adieresis -40 +KPX U Agrave -40 +KPX U Amacron -40 +KPX U Aogonek -40 +KPX U Aring -40 +KPX U Atilde -40 +KPX U comma -40 +KPX U period -40 +KPX Uacute A -40 +KPX Uacute Aacute -40 +KPX Uacute Abreve -40 +KPX Uacute Acircumflex -40 +KPX Uacute Adieresis -40 +KPX Uacute Agrave -40 +KPX Uacute Amacron -40 +KPX Uacute Aogonek -40 +KPX Uacute Aring -40 +KPX Uacute Atilde -40 +KPX Uacute comma -40 +KPX Uacute period -40 +KPX Ucircumflex A -40 +KPX Ucircumflex Aacute -40 +KPX Ucircumflex Abreve -40 +KPX Ucircumflex Acircumflex -40 +KPX Ucircumflex Adieresis -40 +KPX Ucircumflex Agrave -40 +KPX Ucircumflex Amacron -40 +KPX Ucircumflex Aogonek -40 +KPX Ucircumflex Aring -40 +KPX Ucircumflex Atilde -40 +KPX Ucircumflex comma -40 +KPX Ucircumflex period -40 +KPX Udieresis A -40 +KPX Udieresis Aacute -40 +KPX Udieresis Abreve -40 +KPX Udieresis Acircumflex -40 +KPX Udieresis Adieresis -40 +KPX Udieresis Agrave -40 +KPX Udieresis Amacron -40 +KPX Udieresis Aogonek -40 +KPX Udieresis Aring -40 +KPX Udieresis Atilde -40 +KPX Udieresis comma -40 +KPX Udieresis period -40 +KPX Ugrave A -40 +KPX Ugrave Aacute -40 +KPX Ugrave Abreve -40 +KPX Ugrave Acircumflex -40 +KPX Ugrave Adieresis -40 +KPX Ugrave Agrave -40 +KPX Ugrave Amacron -40 +KPX Ugrave Aogonek -40 +KPX Ugrave Aring -40 +KPX Ugrave Atilde -40 +KPX Ugrave comma -40 +KPX Ugrave period -40 +KPX Uhungarumlaut A -40 +KPX Uhungarumlaut Aacute -40 +KPX Uhungarumlaut Abreve -40 +KPX Uhungarumlaut Acircumflex -40 +KPX Uhungarumlaut Adieresis -40 +KPX Uhungarumlaut Agrave -40 +KPX Uhungarumlaut Amacron -40 +KPX Uhungarumlaut Aogonek -40 +KPX Uhungarumlaut Aring -40 +KPX Uhungarumlaut Atilde -40 +KPX Uhungarumlaut comma -40 +KPX Uhungarumlaut period -40 +KPX Umacron A -40 +KPX Umacron Aacute -40 +KPX Umacron Abreve -40 +KPX Umacron Acircumflex -40 +KPX Umacron Adieresis -40 +KPX Umacron Agrave -40 +KPX Umacron Amacron -40 +KPX Umacron Aogonek -40 +KPX Umacron Aring -40 +KPX Umacron Atilde -40 +KPX Umacron comma -40 +KPX Umacron period -40 +KPX Uogonek A -40 +KPX Uogonek Aacute -40 +KPX Uogonek Abreve -40 +KPX Uogonek Acircumflex -40 +KPX Uogonek Adieresis -40 +KPX Uogonek Agrave -40 +KPX Uogonek Amacron -40 +KPX Uogonek Aogonek -40 +KPX Uogonek Aring -40 +KPX Uogonek Atilde -40 +KPX Uogonek comma -40 +KPX Uogonek period -40 +KPX Uring A -40 +KPX Uring Aacute -40 +KPX Uring Abreve -40 +KPX Uring Acircumflex -40 +KPX Uring Adieresis -40 +KPX Uring Agrave -40 +KPX Uring Amacron -40 +KPX Uring Aogonek -40 +KPX Uring Aring -40 +KPX Uring Atilde -40 +KPX Uring comma -40 +KPX Uring period -40 +KPX V A -80 +KPX V Aacute -80 +KPX V Abreve -80 +KPX V Acircumflex -80 +KPX V Adieresis -80 +KPX V Agrave -80 +KPX V Amacron -80 +KPX V Aogonek -80 +KPX V Aring -80 +KPX V Atilde -80 +KPX V G -40 +KPX V Gbreve -40 +KPX V Gcommaaccent -40 +KPX V O -40 +KPX V Oacute -40 +KPX V Ocircumflex -40 +KPX V Odieresis -40 +KPX V Ograve -40 +KPX V Ohungarumlaut -40 +KPX V Omacron -40 +KPX V Oslash -40 +KPX V Otilde -40 +KPX V a -70 +KPX V aacute -70 +KPX V abreve -70 +KPX V acircumflex -70 +KPX V adieresis -70 +KPX V agrave -70 +KPX V amacron -70 +KPX V aogonek -70 +KPX V aring -70 +KPX V atilde -70 +KPX V colon -40 +KPX V comma -125 +KPX V e -80 +KPX V eacute -80 +KPX V ecaron -80 +KPX V ecircumflex -80 +KPX V edieresis -80 +KPX V edotaccent -80 +KPX V egrave -80 +KPX V emacron -80 +KPX V eogonek -80 +KPX V hyphen -80 +KPX V o -80 +KPX V oacute -80 +KPX V ocircumflex -80 +KPX V odieresis -80 +KPX V ograve -80 +KPX V ohungarumlaut -80 +KPX V omacron -80 +KPX V oslash -80 +KPX V otilde -80 +KPX V period -125 +KPX V semicolon -40 +KPX V u -70 +KPX V uacute -70 +KPX V ucircumflex -70 +KPX V udieresis -70 +KPX V ugrave -70 +KPX V uhungarumlaut -70 +KPX V umacron -70 +KPX V uogonek -70 +KPX V uring -70 +KPX W A -50 +KPX W Aacute -50 +KPX W Abreve -50 +KPX W Acircumflex -50 +KPX W Adieresis -50 +KPX W Agrave -50 +KPX W Amacron -50 +KPX W Aogonek -50 +KPX W Aring -50 +KPX W Atilde -50 +KPX W O -20 +KPX W Oacute -20 +KPX W Ocircumflex -20 +KPX W Odieresis -20 +KPX W Ograve -20 +KPX W Ohungarumlaut -20 +KPX W Omacron -20 +KPX W Oslash -20 +KPX W Otilde -20 +KPX W a -40 +KPX W aacute -40 +KPX W abreve -40 +KPX W acircumflex -40 +KPX W adieresis -40 +KPX W agrave -40 +KPX W amacron -40 +KPX W aogonek -40 +KPX W aring -40 +KPX W atilde -40 +KPX W comma -80 +KPX W e -30 +KPX W eacute -30 +KPX W ecaron -30 +KPX W ecircumflex -30 +KPX W edieresis -30 +KPX W edotaccent -30 +KPX W egrave -30 +KPX W emacron -30 +KPX W eogonek -30 +KPX W hyphen -40 +KPX W o -30 +KPX W oacute -30 +KPX W ocircumflex -30 +KPX W odieresis -30 +KPX W ograve -30 +KPX W ohungarumlaut -30 +KPX W omacron -30 +KPX W oslash -30 +KPX W otilde -30 +KPX W period -80 +KPX W u -30 +KPX W uacute -30 +KPX W ucircumflex -30 +KPX W udieresis -30 +KPX W ugrave -30 +KPX W uhungarumlaut -30 +KPX W umacron -30 +KPX W uogonek -30 +KPX W uring -30 +KPX W y -20 +KPX W yacute -20 +KPX W ydieresis -20 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -85 +KPX Y Oacute -85 +KPX Y Ocircumflex -85 +KPX Y Odieresis -85 +KPX Y Ograve -85 +KPX Y Ohungarumlaut -85 +KPX Y Omacron -85 +KPX Y Oslash -85 +KPX Y Otilde -85 +KPX Y a -140 +KPX Y aacute -140 +KPX Y abreve -70 +KPX Y acircumflex -140 +KPX Y adieresis -140 +KPX Y agrave -140 +KPX Y amacron -70 +KPX Y aogonek -140 +KPX Y aring -140 +KPX Y atilde -140 +KPX Y colon -60 +KPX Y comma -140 +KPX Y e -140 +KPX Y eacute -140 +KPX Y ecaron -140 +KPX Y ecircumflex -140 +KPX Y edieresis -140 +KPX Y edotaccent -140 +KPX Y egrave -140 +KPX Y emacron -70 +KPX Y eogonek -140 +KPX Y hyphen -140 +KPX Y i -20 +KPX Y iacute -20 +KPX Y iogonek -20 +KPX Y o -140 +KPX Y oacute -140 +KPX Y ocircumflex -140 +KPX Y odieresis -140 +KPX Y ograve -140 +KPX Y ohungarumlaut -140 +KPX Y omacron -140 +KPX Y oslash -140 +KPX Y otilde -140 +KPX Y period -140 +KPX Y semicolon -60 +KPX Y u -110 +KPX Y uacute -110 +KPX Y ucircumflex -110 +KPX Y udieresis -110 +KPX Y ugrave -110 +KPX Y uhungarumlaut -110 +KPX Y umacron -110 +KPX Y uogonek -110 +KPX Y uring -110 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -85 +KPX Yacute Oacute -85 +KPX Yacute Ocircumflex -85 +KPX Yacute Odieresis -85 +KPX Yacute Ograve -85 +KPX Yacute Ohungarumlaut -85 +KPX Yacute Omacron -85 +KPX Yacute Oslash -85 +KPX Yacute Otilde -85 +KPX Yacute a -140 +KPX Yacute aacute -140 +KPX Yacute abreve -70 +KPX Yacute acircumflex -140 +KPX Yacute adieresis -140 +KPX Yacute agrave -140 +KPX Yacute amacron -70 +KPX Yacute aogonek -140 +KPX Yacute aring -140 +KPX Yacute atilde -70 +KPX Yacute colon -60 +KPX Yacute comma -140 +KPX Yacute e -140 +KPX Yacute eacute -140 +KPX Yacute ecaron -140 +KPX Yacute ecircumflex -140 +KPX Yacute edieresis -140 +KPX Yacute edotaccent -140 +KPX Yacute egrave -140 +KPX Yacute emacron -70 +KPX Yacute eogonek -140 +KPX Yacute hyphen -140 +KPX Yacute i -20 +KPX Yacute iacute -20 +KPX Yacute iogonek -20 +KPX Yacute o -140 +KPX Yacute oacute -140 +KPX Yacute ocircumflex -140 +KPX Yacute odieresis -140 +KPX Yacute ograve -140 +KPX Yacute ohungarumlaut -140 +KPX Yacute omacron -70 +KPX Yacute oslash -140 +KPX Yacute otilde -140 +KPX Yacute period -140 +KPX Yacute semicolon -60 +KPX Yacute u -110 +KPX Yacute uacute -110 +KPX Yacute ucircumflex -110 +KPX Yacute udieresis -110 +KPX Yacute ugrave -110 +KPX Yacute uhungarumlaut -110 +KPX Yacute umacron -110 +KPX Yacute uogonek -110 +KPX Yacute uring -110 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -85 +KPX Ydieresis Oacute -85 +KPX Ydieresis Ocircumflex -85 +KPX Ydieresis Odieresis -85 +KPX Ydieresis Ograve -85 +KPX Ydieresis Ohungarumlaut -85 +KPX Ydieresis Omacron -85 +KPX Ydieresis Oslash -85 +KPX Ydieresis Otilde -85 +KPX Ydieresis a -140 +KPX Ydieresis aacute -140 +KPX Ydieresis abreve -70 +KPX Ydieresis acircumflex -140 +KPX Ydieresis adieresis -140 +KPX Ydieresis agrave -140 +KPX Ydieresis amacron -70 +KPX Ydieresis aogonek -140 +KPX Ydieresis aring -140 +KPX Ydieresis atilde -70 +KPX Ydieresis colon -60 +KPX Ydieresis comma -140 +KPX Ydieresis e -140 +KPX Ydieresis eacute -140 +KPX Ydieresis ecaron -140 +KPX Ydieresis ecircumflex -140 +KPX Ydieresis edieresis -140 +KPX Ydieresis edotaccent -140 +KPX Ydieresis egrave -140 +KPX Ydieresis emacron -70 +KPX Ydieresis eogonek -140 +KPX Ydieresis hyphen -140 +KPX Ydieresis i -20 +KPX Ydieresis iacute -20 +KPX Ydieresis iogonek -20 +KPX Ydieresis o -140 +KPX Ydieresis oacute -140 +KPX Ydieresis ocircumflex -140 +KPX Ydieresis odieresis -140 +KPX Ydieresis ograve -140 +KPX Ydieresis ohungarumlaut -140 +KPX Ydieresis omacron -140 +KPX Ydieresis oslash -140 +KPX Ydieresis otilde -140 +KPX Ydieresis period -140 +KPX Ydieresis semicolon -60 +KPX Ydieresis u -110 +KPX Ydieresis uacute -110 +KPX Ydieresis ucircumflex -110 +KPX Ydieresis udieresis -110 +KPX Ydieresis ugrave -110 +KPX Ydieresis uhungarumlaut -110 +KPX Ydieresis umacron -110 +KPX Ydieresis uogonek -110 +KPX Ydieresis uring -110 +KPX a v -20 +KPX a w -20 +KPX a y -30 +KPX a yacute -30 +KPX a ydieresis -30 +KPX aacute v -20 +KPX aacute w -20 +KPX aacute y -30 +KPX aacute yacute -30 +KPX aacute ydieresis -30 +KPX abreve v -20 +KPX abreve w -20 +KPX abreve y -30 +KPX abreve yacute -30 +KPX abreve ydieresis -30 +KPX acircumflex v -20 +KPX acircumflex w -20 +KPX acircumflex y -30 +KPX acircumflex yacute -30 +KPX acircumflex ydieresis -30 +KPX adieresis v -20 +KPX adieresis w -20 +KPX adieresis y -30 +KPX adieresis yacute -30 +KPX adieresis ydieresis -30 +KPX agrave v -20 +KPX agrave w -20 +KPX agrave y -30 +KPX agrave yacute -30 +KPX agrave ydieresis -30 +KPX amacron v -20 +KPX amacron w -20 +KPX amacron y -30 +KPX amacron yacute -30 +KPX amacron ydieresis -30 +KPX aogonek v -20 +KPX aogonek w -20 +KPX aogonek y -30 +KPX aogonek yacute -30 +KPX aogonek ydieresis -30 +KPX aring v -20 +KPX aring w -20 +KPX aring y -30 +KPX aring yacute -30 +KPX aring ydieresis -30 +KPX atilde v -20 +KPX atilde w -20 +KPX atilde y -30 +KPX atilde yacute -30 +KPX atilde ydieresis -30 +KPX b b -10 +KPX b comma -40 +KPX b l -20 +KPX b lacute -20 +KPX b lcommaaccent -20 +KPX b lslash -20 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -20 +KPX b y -20 +KPX b yacute -20 +KPX b ydieresis -20 +KPX c comma -15 +KPX c k -20 +KPX c kcommaaccent -20 +KPX cacute comma -15 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX ccaron comma -15 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccedilla comma -15 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX colon space -50 +KPX comma quotedblright -100 +KPX comma quoteright -100 +KPX e comma -15 +KPX e period -15 +KPX e v -30 +KPX e w -20 +KPX e x -30 +KPX e y -20 +KPX e yacute -20 +KPX e ydieresis -20 +KPX eacute comma -15 +KPX eacute period -15 +KPX eacute v -30 +KPX eacute w -20 +KPX eacute x -30 +KPX eacute y -20 +KPX eacute yacute -20 +KPX eacute ydieresis -20 +KPX ecaron comma -15 +KPX ecaron period -15 +KPX ecaron v -30 +KPX ecaron w -20 +KPX ecaron x -30 +KPX ecaron y -20 +KPX ecaron yacute -20 +KPX ecaron ydieresis -20 +KPX ecircumflex comma -15 +KPX ecircumflex period -15 +KPX ecircumflex v -30 +KPX ecircumflex w -20 +KPX ecircumflex x -30 +KPX ecircumflex y -20 +KPX ecircumflex yacute -20 +KPX ecircumflex ydieresis -20 +KPX edieresis comma -15 +KPX edieresis period -15 +KPX edieresis v -30 +KPX edieresis w -20 +KPX edieresis x -30 +KPX edieresis y -20 +KPX edieresis yacute -20 +KPX edieresis ydieresis -20 +KPX edotaccent comma -15 +KPX edotaccent period -15 +KPX edotaccent v -30 +KPX edotaccent w -20 +KPX edotaccent x -30 +KPX edotaccent y -20 +KPX edotaccent yacute -20 +KPX edotaccent ydieresis -20 +KPX egrave comma -15 +KPX egrave period -15 +KPX egrave v -30 +KPX egrave w -20 +KPX egrave x -30 +KPX egrave y -20 +KPX egrave yacute -20 +KPX egrave ydieresis -20 +KPX emacron comma -15 +KPX emacron period -15 +KPX emacron v -30 +KPX emacron w -20 +KPX emacron x -30 +KPX emacron y -20 +KPX emacron yacute -20 +KPX emacron ydieresis -20 +KPX eogonek comma -15 +KPX eogonek period -15 +KPX eogonek v -30 +KPX eogonek w -20 +KPX eogonek x -30 +KPX eogonek y -20 +KPX eogonek yacute -20 +KPX eogonek ydieresis -20 +KPX f a -30 +KPX f aacute -30 +KPX f abreve -30 +KPX f acircumflex -30 +KPX f adieresis -30 +KPX f agrave -30 +KPX f amacron -30 +KPX f aogonek -30 +KPX f aring -30 +KPX f atilde -30 +KPX f comma -30 +KPX f dotlessi -28 +KPX f e -30 +KPX f eacute -30 +KPX f ecaron -30 +KPX f ecircumflex -30 +KPX f edieresis -30 +KPX f edotaccent -30 +KPX f egrave -30 +KPX f emacron -30 +KPX f eogonek -30 +KPX f o -30 +KPX f oacute -30 +KPX f ocircumflex -30 +KPX f odieresis -30 +KPX f ograve -30 +KPX f ohungarumlaut -30 +KPX f omacron -30 +KPX f oslash -30 +KPX f otilde -30 +KPX f period -30 +KPX f quotedblright 60 +KPX f quoteright 50 +KPX g r -10 +KPX g racute -10 +KPX g rcaron -10 +KPX g rcommaaccent -10 +KPX gbreve r -10 +KPX gbreve racute -10 +KPX gbreve rcaron -10 +KPX gbreve rcommaaccent -10 +KPX gcommaaccent r -10 +KPX gcommaaccent racute -10 +KPX gcommaaccent rcaron -10 +KPX gcommaaccent rcommaaccent -10 +KPX h y -30 +KPX h yacute -30 +KPX h ydieresis -30 +KPX k e -20 +KPX k eacute -20 +KPX k ecaron -20 +KPX k ecircumflex -20 +KPX k edieresis -20 +KPX k edotaccent -20 +KPX k egrave -20 +KPX k emacron -20 +KPX k eogonek -20 +KPX k o -20 +KPX k oacute -20 +KPX k ocircumflex -20 +KPX k odieresis -20 +KPX k ograve -20 +KPX k ohungarumlaut -20 +KPX k omacron -20 +KPX k oslash -20 +KPX k otilde -20 +KPX kcommaaccent e -20 +KPX kcommaaccent eacute -20 +KPX kcommaaccent ecaron -20 +KPX kcommaaccent ecircumflex -20 +KPX kcommaaccent edieresis -20 +KPX kcommaaccent edotaccent -20 +KPX kcommaaccent egrave -20 +KPX kcommaaccent emacron -20 +KPX kcommaaccent eogonek -20 +KPX kcommaaccent o -20 +KPX kcommaaccent oacute -20 +KPX kcommaaccent ocircumflex -20 +KPX kcommaaccent odieresis -20 +KPX kcommaaccent ograve -20 +KPX kcommaaccent ohungarumlaut -20 +KPX kcommaaccent omacron -20 +KPX kcommaaccent oslash -20 +KPX kcommaaccent otilde -20 +KPX m u -10 +KPX m uacute -10 +KPX m ucircumflex -10 +KPX m udieresis -10 +KPX m ugrave -10 +KPX m uhungarumlaut -10 +KPX m umacron -10 +KPX m uogonek -10 +KPX m uring -10 +KPX m y -15 +KPX m yacute -15 +KPX m ydieresis -15 +KPX n u -10 +KPX n uacute -10 +KPX n ucircumflex -10 +KPX n udieresis -10 +KPX n ugrave -10 +KPX n uhungarumlaut -10 +KPX n umacron -10 +KPX n uogonek -10 +KPX n uring -10 +KPX n v -20 +KPX n y -15 +KPX n yacute -15 +KPX n ydieresis -15 +KPX nacute u -10 +KPX nacute uacute -10 +KPX nacute ucircumflex -10 +KPX nacute udieresis -10 +KPX nacute ugrave -10 +KPX nacute uhungarumlaut -10 +KPX nacute umacron -10 +KPX nacute uogonek -10 +KPX nacute uring -10 +KPX nacute v -20 +KPX nacute y -15 +KPX nacute yacute -15 +KPX nacute ydieresis -15 +KPX ncaron u -10 +KPX ncaron uacute -10 +KPX ncaron ucircumflex -10 +KPX ncaron udieresis -10 +KPX ncaron ugrave -10 +KPX ncaron uhungarumlaut -10 +KPX ncaron umacron -10 +KPX ncaron uogonek -10 +KPX ncaron uring -10 +KPX ncaron v -20 +KPX ncaron y -15 +KPX ncaron yacute -15 +KPX ncaron ydieresis -15 +KPX ncommaaccent u -10 +KPX ncommaaccent uacute -10 +KPX ncommaaccent ucircumflex -10 +KPX ncommaaccent udieresis -10 +KPX ncommaaccent ugrave -10 +KPX ncommaaccent uhungarumlaut -10 +KPX ncommaaccent umacron -10 +KPX ncommaaccent uogonek -10 +KPX ncommaaccent uring -10 +KPX ncommaaccent v -20 +KPX ncommaaccent y -15 +KPX ncommaaccent yacute -15 +KPX ncommaaccent ydieresis -15 +KPX ntilde u -10 +KPX ntilde uacute -10 +KPX ntilde ucircumflex -10 +KPX ntilde udieresis -10 +KPX ntilde ugrave -10 +KPX ntilde uhungarumlaut -10 +KPX ntilde umacron -10 +KPX ntilde uogonek -10 +KPX ntilde uring -10 +KPX ntilde v -20 +KPX ntilde y -15 +KPX ntilde yacute -15 +KPX ntilde ydieresis -15 +KPX o comma -40 +KPX o period -40 +KPX o v -15 +KPX o w -15 +KPX o x -30 +KPX o y -30 +KPX o yacute -30 +KPX o ydieresis -30 +KPX oacute comma -40 +KPX oacute period -40 +KPX oacute v -15 +KPX oacute w -15 +KPX oacute x -30 +KPX oacute y -30 +KPX oacute yacute -30 +KPX oacute ydieresis -30 +KPX ocircumflex comma -40 +KPX ocircumflex period -40 +KPX ocircumflex v -15 +KPX ocircumflex w -15 +KPX ocircumflex x -30 +KPX ocircumflex y -30 +KPX ocircumflex yacute -30 +KPX ocircumflex ydieresis -30 +KPX odieresis comma -40 +KPX odieresis period -40 +KPX odieresis v -15 +KPX odieresis w -15 +KPX odieresis x -30 +KPX odieresis y -30 +KPX odieresis yacute -30 +KPX odieresis ydieresis -30 +KPX ograve comma -40 +KPX ograve period -40 +KPX ograve v -15 +KPX ograve w -15 +KPX ograve x -30 +KPX ograve y -30 +KPX ograve yacute -30 +KPX ograve ydieresis -30 +KPX ohungarumlaut comma -40 +KPX ohungarumlaut period -40 +KPX ohungarumlaut v -15 +KPX ohungarumlaut w -15 +KPX ohungarumlaut x -30 +KPX ohungarumlaut y -30 +KPX ohungarumlaut yacute -30 +KPX ohungarumlaut ydieresis -30 +KPX omacron comma -40 +KPX omacron period -40 +KPX omacron v -15 +KPX omacron w -15 +KPX omacron x -30 +KPX omacron y -30 +KPX omacron yacute -30 +KPX omacron ydieresis -30 +KPX oslash a -55 +KPX oslash aacute -55 +KPX oslash abreve -55 +KPX oslash acircumflex -55 +KPX oslash adieresis -55 +KPX oslash agrave -55 +KPX oslash amacron -55 +KPX oslash aogonek -55 +KPX oslash aring -55 +KPX oslash atilde -55 +KPX oslash b -55 +KPX oslash c -55 +KPX oslash cacute -55 +KPX oslash ccaron -55 +KPX oslash ccedilla -55 +KPX oslash comma -95 +KPX oslash d -55 +KPX oslash dcroat -55 +KPX oslash e -55 +KPX oslash eacute -55 +KPX oslash ecaron -55 +KPX oslash ecircumflex -55 +KPX oslash edieresis -55 +KPX oslash edotaccent -55 +KPX oslash egrave -55 +KPX oslash emacron -55 +KPX oslash eogonek -55 +KPX oslash f -55 +KPX oslash g -55 +KPX oslash gbreve -55 +KPX oslash gcommaaccent -55 +KPX oslash h -55 +KPX oslash i -55 +KPX oslash iacute -55 +KPX oslash icircumflex -55 +KPX oslash idieresis -55 +KPX oslash igrave -55 +KPX oslash imacron -55 +KPX oslash iogonek -55 +KPX oslash j -55 +KPX oslash k -55 +KPX oslash kcommaaccent -55 +KPX oslash l -55 +KPX oslash lacute -55 +KPX oslash lcommaaccent -55 +KPX oslash lslash -55 +KPX oslash m -55 +KPX oslash n -55 +KPX oslash nacute -55 +KPX oslash ncaron -55 +KPX oslash ncommaaccent -55 +KPX oslash ntilde -55 +KPX oslash o -55 +KPX oslash oacute -55 +KPX oslash ocircumflex -55 +KPX oslash odieresis -55 +KPX oslash ograve -55 +KPX oslash ohungarumlaut -55 +KPX oslash omacron -55 +KPX oslash oslash -55 +KPX oslash otilde -55 +KPX oslash p -55 +KPX oslash period -95 +KPX oslash q -55 +KPX oslash r -55 +KPX oslash racute -55 +KPX oslash rcaron -55 +KPX oslash rcommaaccent -55 +KPX oslash s -55 +KPX oslash sacute -55 +KPX oslash scaron -55 +KPX oslash scedilla -55 +KPX oslash scommaaccent -55 +KPX oslash t -55 +KPX oslash tcommaaccent -55 +KPX oslash u -55 +KPX oslash uacute -55 +KPX oslash ucircumflex -55 +KPX oslash udieresis -55 +KPX oslash ugrave -55 +KPX oslash uhungarumlaut -55 +KPX oslash umacron -55 +KPX oslash uogonek -55 +KPX oslash uring -55 +KPX oslash v -70 +KPX oslash w -70 +KPX oslash x -85 +KPX oslash y -70 +KPX oslash yacute -70 +KPX oslash ydieresis -70 +KPX oslash z -55 +KPX oslash zacute -55 +KPX oslash zcaron -55 +KPX oslash zdotaccent -55 +KPX otilde comma -40 +KPX otilde period -40 +KPX otilde v -15 +KPX otilde w -15 +KPX otilde x -30 +KPX otilde y -30 +KPX otilde yacute -30 +KPX otilde ydieresis -30 +KPX p comma -35 +KPX p period -35 +KPX p y -30 +KPX p yacute -30 +KPX p ydieresis -30 +KPX period quotedblright -100 +KPX period quoteright -100 +KPX period space -60 +KPX quotedblright space -40 +KPX quoteleft quoteleft -57 +KPX quoteright d -50 +KPX quoteright dcroat -50 +KPX quoteright quoteright -57 +KPX quoteright r -50 +KPX quoteright racute -50 +KPX quoteright rcaron -50 +KPX quoteright rcommaaccent -50 +KPX quoteright s -50 +KPX quoteright sacute -50 +KPX quoteright scaron -50 +KPX quoteright scedilla -50 +KPX quoteright scommaaccent -50 +KPX quoteright space -70 +KPX r a -10 +KPX r aacute -10 +KPX r abreve -10 +KPX r acircumflex -10 +KPX r adieresis -10 +KPX r agrave -10 +KPX r amacron -10 +KPX r aogonek -10 +KPX r aring -10 +KPX r atilde -10 +KPX r colon 30 +KPX r comma -50 +KPX r i 15 +KPX r iacute 15 +KPX r icircumflex 15 +KPX r idieresis 15 +KPX r igrave 15 +KPX r imacron 15 +KPX r iogonek 15 +KPX r k 15 +KPX r kcommaaccent 15 +KPX r l 15 +KPX r lacute 15 +KPX r lcommaaccent 15 +KPX r lslash 15 +KPX r m 25 +KPX r n 25 +KPX r nacute 25 +KPX r ncaron 25 +KPX r ncommaaccent 25 +KPX r ntilde 25 +KPX r p 30 +KPX r period -50 +KPX r semicolon 30 +KPX r t 40 +KPX r tcommaaccent 40 +KPX r u 15 +KPX r uacute 15 +KPX r ucircumflex 15 +KPX r udieresis 15 +KPX r ugrave 15 +KPX r uhungarumlaut 15 +KPX r umacron 15 +KPX r uogonek 15 +KPX r uring 15 +KPX r v 30 +KPX r y 30 +KPX r yacute 30 +KPX r ydieresis 30 +KPX racute a -10 +KPX racute aacute -10 +KPX racute abreve -10 +KPX racute acircumflex -10 +KPX racute adieresis -10 +KPX racute agrave -10 +KPX racute amacron -10 +KPX racute aogonek -10 +KPX racute aring -10 +KPX racute atilde -10 +KPX racute colon 30 +KPX racute comma -50 +KPX racute i 15 +KPX racute iacute 15 +KPX racute icircumflex 15 +KPX racute idieresis 15 +KPX racute igrave 15 +KPX racute imacron 15 +KPX racute iogonek 15 +KPX racute k 15 +KPX racute kcommaaccent 15 +KPX racute l 15 +KPX racute lacute 15 +KPX racute lcommaaccent 15 +KPX racute lslash 15 +KPX racute m 25 +KPX racute n 25 +KPX racute nacute 25 +KPX racute ncaron 25 +KPX racute ncommaaccent 25 +KPX racute ntilde 25 +KPX racute p 30 +KPX racute period -50 +KPX racute semicolon 30 +KPX racute t 40 +KPX racute tcommaaccent 40 +KPX racute u 15 +KPX racute uacute 15 +KPX racute ucircumflex 15 +KPX racute udieresis 15 +KPX racute ugrave 15 +KPX racute uhungarumlaut 15 +KPX racute umacron 15 +KPX racute uogonek 15 +KPX racute uring 15 +KPX racute v 30 +KPX racute y 30 +KPX racute yacute 30 +KPX racute ydieresis 30 +KPX rcaron a -10 +KPX rcaron aacute -10 +KPX rcaron abreve -10 +KPX rcaron acircumflex -10 +KPX rcaron adieresis -10 +KPX rcaron agrave -10 +KPX rcaron amacron -10 +KPX rcaron aogonek -10 +KPX rcaron aring -10 +KPX rcaron atilde -10 +KPX rcaron colon 30 +KPX rcaron comma -50 +KPX rcaron i 15 +KPX rcaron iacute 15 +KPX rcaron icircumflex 15 +KPX rcaron idieresis 15 +KPX rcaron igrave 15 +KPX rcaron imacron 15 +KPX rcaron iogonek 15 +KPX rcaron k 15 +KPX rcaron kcommaaccent 15 +KPX rcaron l 15 +KPX rcaron lacute 15 +KPX rcaron lcommaaccent 15 +KPX rcaron lslash 15 +KPX rcaron m 25 +KPX rcaron n 25 +KPX rcaron nacute 25 +KPX rcaron ncaron 25 +KPX rcaron ncommaaccent 25 +KPX rcaron ntilde 25 +KPX rcaron p 30 +KPX rcaron period -50 +KPX rcaron semicolon 30 +KPX rcaron t 40 +KPX rcaron tcommaaccent 40 +KPX rcaron u 15 +KPX rcaron uacute 15 +KPX rcaron ucircumflex 15 +KPX rcaron udieresis 15 +KPX rcaron ugrave 15 +KPX rcaron uhungarumlaut 15 +KPX rcaron umacron 15 +KPX rcaron uogonek 15 +KPX rcaron uring 15 +KPX rcaron v 30 +KPX rcaron y 30 +KPX rcaron yacute 30 +KPX rcaron ydieresis 30 +KPX rcommaaccent a -10 +KPX rcommaaccent aacute -10 +KPX rcommaaccent abreve -10 +KPX rcommaaccent acircumflex -10 +KPX rcommaaccent adieresis -10 +KPX rcommaaccent agrave -10 +KPX rcommaaccent amacron -10 +KPX rcommaaccent aogonek -10 +KPX rcommaaccent aring -10 +KPX rcommaaccent atilde -10 +KPX rcommaaccent colon 30 +KPX rcommaaccent comma -50 +KPX rcommaaccent i 15 +KPX rcommaaccent iacute 15 +KPX rcommaaccent icircumflex 15 +KPX rcommaaccent idieresis 15 +KPX rcommaaccent igrave 15 +KPX rcommaaccent imacron 15 +KPX rcommaaccent iogonek 15 +KPX rcommaaccent k 15 +KPX rcommaaccent kcommaaccent 15 +KPX rcommaaccent l 15 +KPX rcommaaccent lacute 15 +KPX rcommaaccent lcommaaccent 15 +KPX rcommaaccent lslash 15 +KPX rcommaaccent m 25 +KPX rcommaaccent n 25 +KPX rcommaaccent nacute 25 +KPX rcommaaccent ncaron 25 +KPX rcommaaccent ncommaaccent 25 +KPX rcommaaccent ntilde 25 +KPX rcommaaccent p 30 +KPX rcommaaccent period -50 +KPX rcommaaccent semicolon 30 +KPX rcommaaccent t 40 +KPX rcommaaccent tcommaaccent 40 +KPX rcommaaccent u 15 +KPX rcommaaccent uacute 15 +KPX rcommaaccent ucircumflex 15 +KPX rcommaaccent udieresis 15 +KPX rcommaaccent ugrave 15 +KPX rcommaaccent uhungarumlaut 15 +KPX rcommaaccent umacron 15 +KPX rcommaaccent uogonek 15 +KPX rcommaaccent uring 15 +KPX rcommaaccent v 30 +KPX rcommaaccent y 30 +KPX rcommaaccent yacute 30 +KPX rcommaaccent ydieresis 30 +KPX s comma -15 +KPX s period -15 +KPX s w -30 +KPX sacute comma -15 +KPX sacute period -15 +KPX sacute w -30 +KPX scaron comma -15 +KPX scaron period -15 +KPX scaron w -30 +KPX scedilla comma -15 +KPX scedilla period -15 +KPX scedilla w -30 +KPX scommaaccent comma -15 +KPX scommaaccent period -15 +KPX scommaaccent w -30 +KPX semicolon space -50 +KPX space T -50 +KPX space Tcaron -50 +KPX space Tcommaaccent -50 +KPX space V -50 +KPX space W -40 +KPX space Y -90 +KPX space Yacute -90 +KPX space Ydieresis -90 +KPX space quotedblleft -30 +KPX space quoteleft -60 +KPX v a -25 +KPX v aacute -25 +KPX v abreve -25 +KPX v acircumflex -25 +KPX v adieresis -25 +KPX v agrave -25 +KPX v amacron -25 +KPX v aogonek -25 +KPX v aring -25 +KPX v atilde -25 +KPX v comma -80 +KPX v e -25 +KPX v eacute -25 +KPX v ecaron -25 +KPX v ecircumflex -25 +KPX v edieresis -25 +KPX v edotaccent -25 +KPX v egrave -25 +KPX v emacron -25 +KPX v eogonek -25 +KPX v o -25 +KPX v oacute -25 +KPX v ocircumflex -25 +KPX v odieresis -25 +KPX v ograve -25 +KPX v ohungarumlaut -25 +KPX v omacron -25 +KPX v oslash -25 +KPX v otilde -25 +KPX v period -80 +KPX w a -15 +KPX w aacute -15 +KPX w abreve -15 +KPX w acircumflex -15 +KPX w adieresis -15 +KPX w agrave -15 +KPX w amacron -15 +KPX w aogonek -15 +KPX w aring -15 +KPX w atilde -15 +KPX w comma -60 +KPX w e -10 +KPX w eacute -10 +KPX w ecaron -10 +KPX w ecircumflex -10 +KPX w edieresis -10 +KPX w edotaccent -10 +KPX w egrave -10 +KPX w emacron -10 +KPX w eogonek -10 +KPX w o -10 +KPX w oacute -10 +KPX w ocircumflex -10 +KPX w odieresis -10 +KPX w ograve -10 +KPX w ohungarumlaut -10 +KPX w omacron -10 +KPX w oslash -10 +KPX w otilde -10 +KPX w period -60 +KPX x e -30 +KPX x eacute -30 +KPX x ecaron -30 +KPX x ecircumflex -30 +KPX x edieresis -30 +KPX x edotaccent -30 +KPX x egrave -30 +KPX x emacron -30 +KPX x eogonek -30 +KPX y a -20 +KPX y aacute -20 +KPX y abreve -20 +KPX y acircumflex -20 +KPX y adieresis -20 +KPX y agrave -20 +KPX y amacron -20 +KPX y aogonek -20 +KPX y aring -20 +KPX y atilde -20 +KPX y comma -100 +KPX y e -20 +KPX y eacute -20 +KPX y ecaron -20 +KPX y ecircumflex -20 +KPX y edieresis -20 +KPX y edotaccent -20 +KPX y egrave -20 +KPX y emacron -20 +KPX y eogonek -20 +KPX y o -20 +KPX y oacute -20 +KPX y ocircumflex -20 +KPX y odieresis -20 +KPX y ograve -20 +KPX y ohungarumlaut -20 +KPX y omacron -20 +KPX y oslash -20 +KPX y otilde -20 +KPX y period -100 +KPX yacute a -20 +KPX yacute aacute -20 +KPX yacute abreve -20 +KPX yacute acircumflex -20 +KPX yacute adieresis -20 +KPX yacute agrave -20 +KPX yacute amacron -20 +KPX yacute aogonek -20 +KPX yacute aring -20 +KPX yacute atilde -20 +KPX yacute comma -100 +KPX yacute e -20 +KPX yacute eacute -20 +KPX yacute ecaron -20 +KPX yacute ecircumflex -20 +KPX yacute edieresis -20 +KPX yacute edotaccent -20 +KPX yacute egrave -20 +KPX yacute emacron -20 +KPX yacute eogonek -20 +KPX yacute o -20 +KPX yacute oacute -20 +KPX yacute ocircumflex -20 +KPX yacute odieresis -20 +KPX yacute ograve -20 +KPX yacute ohungarumlaut -20 +KPX yacute omacron -20 +KPX yacute oslash -20 +KPX yacute otilde -20 +KPX yacute period -100 +KPX ydieresis a -20 +KPX ydieresis aacute -20 +KPX ydieresis abreve -20 +KPX ydieresis acircumflex -20 +KPX ydieresis adieresis -20 +KPX ydieresis agrave -20 +KPX ydieresis amacron -20 +KPX ydieresis aogonek -20 +KPX ydieresis aring -20 +KPX ydieresis atilde -20 +KPX ydieresis comma -100 +KPX ydieresis e -20 +KPX ydieresis eacute -20 +KPX ydieresis ecaron -20 +KPX ydieresis ecircumflex -20 +KPX ydieresis edieresis -20 +KPX ydieresis edotaccent -20 +KPX ydieresis egrave -20 +KPX ydieresis emacron -20 +KPX ydieresis eogonek -20 +KPX ydieresis o -20 +KPX ydieresis oacute -20 +KPX ydieresis ocircumflex -20 +KPX ydieresis odieresis -20 +KPX ydieresis ograve -20 +KPX ydieresis ohungarumlaut -20 +KPX ydieresis omacron -20 +KPX ydieresis oslash -20 +KPX ydieresis otilde -20 +KPX ydieresis period -100 +KPX z e -15 +KPX z eacute -15 +KPX z ecaron -15 +KPX z ecircumflex -15 +KPX z edieresis -15 +KPX z edotaccent -15 +KPX z egrave -15 +KPX z emacron -15 +KPX z eogonek -15 +KPX z o -15 +KPX z oacute -15 +KPX z ocircumflex -15 +KPX z odieresis -15 +KPX z ograve -15 +KPX z ohungarumlaut -15 +KPX z omacron -15 +KPX z oslash -15 +KPX z otilde -15 +KPX zacute e -15 +KPX zacute eacute -15 +KPX zacute ecaron -15 +KPX zacute ecircumflex -15 +KPX zacute edieresis -15 +KPX zacute edotaccent -15 +KPX zacute egrave -15 +KPX zacute emacron -15 +KPX zacute eogonek -15 +KPX zacute o -15 +KPX zacute oacute -15 +KPX zacute ocircumflex -15 +KPX zacute odieresis -15 +KPX zacute ograve -15 +KPX zacute ohungarumlaut -15 +KPX zacute omacron -15 +KPX zacute oslash -15 +KPX zacute otilde -15 +KPX zcaron e -15 +KPX zcaron eacute -15 +KPX zcaron ecaron -15 +KPX zcaron ecircumflex -15 +KPX zcaron edieresis -15 +KPX zcaron edotaccent -15 +KPX zcaron egrave -15 +KPX zcaron emacron -15 +KPX zcaron eogonek -15 +KPX zcaron o -15 +KPX zcaron oacute -15 +KPX zcaron ocircumflex -15 +KPX zcaron odieresis -15 +KPX zcaron ograve -15 +KPX zcaron ohungarumlaut -15 +KPX zcaron omacron -15 +KPX zcaron oslash -15 +KPX zcaron otilde -15 +KPX zdotaccent e -15 +KPX zdotaccent eacute -15 +KPX zdotaccent ecaron -15 +KPX zdotaccent ecircumflex -15 +KPX zdotaccent edieresis -15 +KPX zdotaccent edotaccent -15 +KPX zdotaccent egrave -15 +KPX zdotaccent emacron -15 +KPX zdotaccent eogonek -15 +KPX zdotaccent o -15 +KPX zdotaccent oacute -15 +KPX zdotaccent ocircumflex -15 +KPX zdotaccent odieresis -15 +KPX zdotaccent ograve -15 +KPX zdotaccent ohungarumlaut -15 +KPX zdotaccent omacron -15 +KPX zdotaccent oslash -15 +KPX zdotaccent otilde -15 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Helvetica.afm.php b/application/third_party/dompdf/lib/fonts/Helvetica.afm.php new file mode 100755 index 00000000..f58cc543 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Helvetica.afm.php @@ -0,0 +1,570 @@ + + array ( + 32 => 'space', + 160 => 'space', + 33 => 'exclam', + 34 => 'quotedbl', + 35 => 'numbersign', + 36 => 'dollar', + 37 => 'percent', + 38 => 'ampersand', + 146 => 'quoteright', + 40 => 'parenleft', + 41 => 'parenright', + 42 => 'asterisk', + 43 => 'plus', + 44 => 'comma', + 45 => 'hyphen', + 173 => 'hyphen', + 46 => 'period', + 47 => 'slash', + 48 => 'zero', + 49 => 'one', + 50 => 'two', + 51 => 'three', + 52 => 'four', + 53 => 'five', + 54 => 'six', + 55 => 'seven', + 56 => 'eight', + 57 => 'nine', + 58 => 'colon', + 59 => 'semicolon', + 60 => 'less', + 61 => 'equal', + 62 => 'greater', + 63 => 'question', + 64 => 'at', + 65 => 'A', + 66 => 'B', + 67 => 'C', + 68 => 'D', + 69 => 'E', + 70 => 'F', + 71 => 'G', + 72 => 'H', + 73 => 'I', + 74 => 'J', + 75 => 'K', + 76 => 'L', + 77 => 'M', + 78 => 'N', + 79 => 'O', + 80 => 'P', + 81 => 'Q', + 82 => 'R', + 83 => 'S', + 84 => 'T', + 85 => 'U', + 86 => 'V', + 87 => 'W', + 88 => 'X', + 89 => 'Y', + 90 => 'Z', + 91 => 'bracketleft', + 92 => 'backslash', + 93 => 'bracketright', + 94 => 'asciicircum', + 95 => 'underscore', + 145 => 'quoteleft', + 97 => 'a', + 98 => 'b', + 99 => 'c', + 100 => 'd', + 101 => 'e', + 102 => 'f', + 103 => 'g', + 104 => 'h', + 105 => 'i', + 106 => 'j', + 107 => 'k', + 108 => 'l', + 109 => 'm', + 110 => 'n', + 111 => 'o', + 112 => 'p', + 113 => 'q', + 114 => 'r', + 115 => 's', + 116 => 't', + 117 => 'u', + 118 => 'v', + 119 => 'w', + 120 => 'x', + 121 => 'y', + 122 => 'z', + 123 => 'braceleft', + 124 => 'bar', + 125 => 'braceright', + 126 => 'asciitilde', + 161 => 'exclamdown', + 162 => 'cent', + 163 => 'sterling', + 165 => 'yen', + 131 => 'florin', + 167 => 'section', + 164 => 'currency', + 39 => 'quotesingle', + 147 => 'quotedblleft', + 170 => 'ordfeminine', + 139 => 'guilsinglleft', + 155 => 'guilsinglright', + 150 => 'endash', + 134 => 'dagger', + 135 => 'daggerdbl', + 183 => 'periodcentered', + 182 => 'paragraph', + 149 => 'bullet', + 130 => 'quotesinglbase', + 132 => 'quotedblbase', + 148 => 'quotedblright', + 187 => 'guillemotright', + 133 => 'ellipsis', + 137 => 'perthousand', + 191 => 'questiondown', + 96 => 'grave', + 180 => 'acute', + 136 => 'circumflex', + 152 => 'tilde', + 175 => 'macron', + 168 => 'dieresis', + 184 => 'cedilla', + 151 => 'emdash', + 198 => 'AE', + 216 => 'Oslash', + 140 => 'OE', + 186 => 'ordmasculine', + 230 => 'ae', + 248 => 'oslash', + 156 => 'oe', + 223 => 'germandbls', + 207 => 'Idieresis', + 233 => 'eacute', + 159 => 'Ydieresis', + 247 => 'divide', + 221 => 'Yacute', + 194 => 'Acircumflex', + 225 => 'aacute', + 219 => 'Ucircumflex', + 253 => 'yacute', + 234 => 'ecircumflex', + 220 => 'Udieresis', + 218 => 'Uacute', + 203 => 'Edieresis', + 169 => 'copyright', + 229 => 'aring', + 224 => 'agrave', + 227 => 'atilde', + 154 => 'scaron', + 237 => 'iacute', + 251 => 'ucircumflex', + 226 => 'acircumflex', + 231 => 'ccedilla', + 222 => 'Thorn', + 179 => 'threesuperior', + 210 => 'Ograve', + 192 => 'Agrave', + 215 => 'multiply', + 250 => 'uacute', + 255 => 'ydieresis', + 238 => 'icircumflex', + 202 => 'Ecircumflex', + 228 => 'adieresis', + 235 => 'edieresis', + 205 => 'Iacute', + 177 => 'plusminus', + 166 => 'brokenbar', + 174 => 'registered', + 200 => 'Egrave', + 142 => 'Zcaron', + 208 => 'Eth', + 199 => 'Ccedilla', + 193 => 'Aacute', + 196 => 'Adieresis', + 232 => 'egrave', + 211 => 'Oacute', + 243 => 'oacute', + 239 => 'idieresis', + 212 => 'Ocircumflex', + 217 => 'Ugrave', + 254 => 'thorn', + 178 => 'twosuperior', + 214 => 'Odieresis', + 181 => 'mu', + 236 => 'igrave', + 190 => 'threequarters', + 153 => 'trademark', + 204 => 'Igrave', + 189 => 'onehalf', + 244 => 'ocircumflex', + 241 => 'ntilde', + 201 => 'Eacute', + 188 => 'onequarter', + 138 => 'Scaron', + 176 => 'degree', + 242 => 'ograve', + 249 => 'ugrave', + 209 => 'Ntilde', + 245 => 'otilde', + 195 => 'Atilde', + 197 => 'Aring', + 213 => 'Otilde', + 206 => 'Icircumflex', + 172 => 'logicalnot', + 246 => 'odieresis', + 252 => 'udieresis', + 240 => 'eth', + 158 => 'zcaron', + 185 => 'onesuperior', + 128 => 'Euro', + ), + 'isUnicode' => false, + 'FontName' => 'Helvetica', + 'FullName' => 'Helvetica', + 'FamilyName' => 'Helvetica', + 'Weight' => 'Medium', + 'ItalicAngle' => '0', + 'IsFixedPitch' => 'false', + 'CharacterSet' => 'ExtendedRoman', + 'FontBBox' => + array ( + 0 => '-166', + 1 => '-225', + 2 => '1000', + 3 => '931', + ), + 'UnderlinePosition' => '-100', + 'UnderlineThickness' => '50', + 'Version' => '002.000', + 'EncodingScheme' => 'WinAnsiEncoding', + 'CapHeight' => '718', + 'XHeight' => '523', + 'Ascender' => '718', + 'Descender' => '-207', + 'StdHW' => '76', + 'StdVW' => '88', + 'StartCharMetrics' => '317', + 'C' => + array ( + 32 => 278.0, + 160 => 278.0, + 33 => 278.0, + 34 => 355.0, + 35 => 556.0, + 36 => 556.0, + 37 => 889.0, + 38 => 667.0, + 146 => 222.0, + 40 => 333.0, + 41 => 333.0, + 42 => 389.0, + 43 => 584.0, + 44 => 278.0, + 45 => 333.0, + 173 => 333.0, + 46 => 278.0, + 47 => 278.0, + 48 => 556.0, + 49 => 556.0, + 50 => 556.0, + 51 => 556.0, + 52 => 556.0, + 53 => 556.0, + 54 => 556.0, + 55 => 556.0, + 56 => 556.0, + 57 => 556.0, + 58 => 278.0, + 59 => 278.0, + 60 => 584.0, + 61 => 584.0, + 62 => 584.0, + 63 => 556.0, + 64 => 1015.0, + 65 => 667.0, + 66 => 667.0, + 67 => 722.0, + 68 => 722.0, + 69 => 667.0, + 70 => 611.0, + 71 => 778.0, + 72 => 722.0, + 73 => 278.0, + 74 => 500.0, + 75 => 667.0, + 76 => 556.0, + 77 => 833.0, + 78 => 722.0, + 79 => 778.0, + 80 => 667.0, + 81 => 778.0, + 82 => 722.0, + 83 => 667.0, + 84 => 611.0, + 85 => 722.0, + 86 => 667.0, + 87 => 944.0, + 88 => 667.0, + 89 => 667.0, + 90 => 611.0, + 91 => 278.0, + 92 => 278.0, + 93 => 278.0, + 94 => 469.0, + 95 => 556.0, + 145 => 222.0, + 97 => 556.0, + 98 => 556.0, + 99 => 500.0, + 100 => 556.0, + 101 => 556.0, + 102 => 278.0, + 103 => 556.0, + 104 => 556.0, + 105 => 222.0, + 106 => 222.0, + 107 => 500.0, + 108 => 222.0, + 109 => 833.0, + 110 => 556.0, + 111 => 556.0, + 112 => 556.0, + 113 => 556.0, + 114 => 333.0, + 115 => 500.0, + 116 => 278.0, + 117 => 556.0, + 118 => 500.0, + 119 => 722.0, + 120 => 500.0, + 121 => 500.0, + 122 => 500.0, + 123 => 334.0, + 124 => 260.0, + 125 => 334.0, + 126 => 584.0, + 161 => 333.0, + 162 => 556.0, + 163 => 556.0, + 'fraction' => 167.0, + 165 => 556.0, + 131 => 556.0, + 167 => 556.0, + 164 => 556.0, + 39 => 191.0, + 147 => 333.0, + 170 => 370.0, + 139 => 333.0, + 155 => 333.0, + 'fi' => 500.0, + 'fl' => 500.0, + 150 => 556.0, + 134 => 556.0, + 135 => 556.0, + 183 => 278.0, + 182 => 537.0, + 149 => 350.0, + 130 => 222.0, + 132 => 333.0, + 148 => 333.0, + 187 => 556.0, + 133 => 1000.0, + 137 => 1000.0, + 191 => 611.0, + 96 => 333.0, + 180 => 333.0, + 136 => 333.0, + 152 => 333.0, + 175 => 333.0, + 'breve' => 333.0, + 'dotaccent' => 333.0, + 168 => 333.0, + 'ring' => 333.0, + 184 => 333.0, + 'hungarumlaut' => 333.0, + 'ogonek' => 333.0, + 'caron' => 333.0, + 151 => 1000.0, + 198 => 1000.0, + 'Lslash' => 556.0, + 216 => 778.0, + 140 => 1000.0, + 186 => 365.0, + 230 => 889.0, + 'dotlessi' => 278.0, + 'lslash' => 222.0, + 248 => 611.0, + 156 => 944.0, + 223 => 611.0, + 207 => 278.0, + 233 => 556.0, + 'abreve' => 556.0, + 'uhungarumlaut' => 556.0, + 'ecaron' => 556.0, + 159 => 667.0, + 247 => 584.0, + 221 => 667.0, + 194 => 667.0, + 225 => 556.0, + 219 => 722.0, + 253 => 500.0, + 'scommaaccent' => 500.0, + 234 => 556.0, + 'Uring' => 722.0, + 220 => 722.0, + 'aogonek' => 556.0, + 218 => 722.0, + 'uogonek' => 556.0, + 203 => 667.0, + 'Dcroat' => 722.0, + 'commaaccent' => 250.0, + 169 => 737.0, + 'Emacron' => 667.0, + 'ccaron' => 500.0, + 229 => 556.0, + 'Ncommaaccent' => 722.0, + 'lacute' => 222.0, + 224 => 556.0, + 'Tcommaaccent' => 611.0, + 'Cacute' => 722.0, + 227 => 556.0, + 'Edotaccent' => 667.0, + 154 => 500.0, + 'scedilla' => 500.0, + 237 => 278.0, + 'lozenge' => 471.0, + 'Rcaron' => 722.0, + 'Gcommaaccent' => 778.0, + 251 => 556.0, + 226 => 556.0, + 'Amacron' => 667.0, + 'rcaron' => 333.0, + 231 => 500.0, + 'Zdotaccent' => 611.0, + 222 => 667.0, + 'Omacron' => 778.0, + 'Racute' => 722.0, + 'Sacute' => 667.0, + 'dcaron' => 643.0, + 'Umacron' => 722.0, + 'uring' => 556.0, + 179 => 333.0, + 210 => 778.0, + 192 => 667.0, + 'Abreve' => 667.0, + 215 => 584.0, + 250 => 556.0, + 'Tcaron' => 611.0, + 'partialdiff' => 476.0, + 255 => 500.0, + 'Nacute' => 722.0, + 238 => 278.0, + 202 => 667.0, + 228 => 556.0, + 235 => 556.0, + 'cacute' => 500.0, + 'nacute' => 556.0, + 'umacron' => 556.0, + 'Ncaron' => 722.0, + 205 => 278.0, + 177 => 584.0, + 166 => 260.0, + 174 => 737.0, + 'Gbreve' => 778.0, + 'Idotaccent' => 278.0, + 'summation' => 600.0, + 200 => 667.0, + 'racute' => 333.0, + 'omacron' => 556.0, + 'Zacute' => 611.0, + 142 => 611.0, + 'greaterequal' => 549.0, + 208 => 722.0, + 199 => 722.0, + 'lcommaaccent' => 222.0, + 'tcaron' => 317.0, + 'eogonek' => 556.0, + 'Uogonek' => 722.0, + 193 => 667.0, + 196 => 667.0, + 232 => 556.0, + 'zacute' => 500.0, + 'iogonek' => 222.0, + 211 => 778.0, + 243 => 556.0, + 'amacron' => 556.0, + 'sacute' => 500.0, + 239 => 278.0, + 212 => 778.0, + 217 => 722.0, + 'Delta' => 612.0, + 254 => 556.0, + 178 => 333.0, + 214 => 778.0, + 181 => 556.0, + 236 => 278.0, + 'ohungarumlaut' => 556.0, + 'Eogonek' => 667.0, + 'dcroat' => 556.0, + 190 => 834.0, + 'Scedilla' => 667.0, + 'lcaron' => 299.0, + 'Kcommaaccent' => 667.0, + 'Lacute' => 556.0, + 153 => 1000.0, + 'edotaccent' => 556.0, + 204 => 278.0, + 'Imacron' => 278.0, + 'Lcaron' => 556.0, + 189 => 834.0, + 'lessequal' => 549.0, + 244 => 556.0, + 241 => 556.0, + 'Uhungarumlaut' => 722.0, + 201 => 667.0, + 'emacron' => 556.0, + 'gbreve' => 556.0, + 188 => 834.0, + 138 => 667.0, + 'Scommaaccent' => 667.0, + 'Ohungarumlaut' => 778.0, + 176 => 400.0, + 242 => 556.0, + 'Ccaron' => 722.0, + 249 => 556.0, + 'radical' => 453.0, + 'Dcaron' => 722.0, + 'rcommaaccent' => 333.0, + 209 => 722.0, + 245 => 556.0, + 'Rcommaaccent' => 722.0, + 'Lcommaaccent' => 556.0, + 195 => 667.0, + 'Aogonek' => 667.0, + 197 => 667.0, + 213 => 778.0, + 'zdotaccent' => 500.0, + 'Ecaron' => 667.0, + 'Iogonek' => 278.0, + 'kcommaaccent' => 500.0, + 'minus' => 584.0, + 206 => 278.0, + 'ncaron' => 556.0, + 'tcommaaccent' => 278.0, + 172 => 584.0, + 246 => 556.0, + 252 => 556.0, + 'notequal' => 549.0, + 'gcommaaccent' => 556.0, + 240 => 556.0, + 158 => 500.0, + 'ncommaaccent' => 556.0, + 185 => 333.0, + 'imacron' => 278.0, + 128 => 556.0, + ), + 'CIDtoGID_Compressed' => true, + 'CIDtoGID' => 'eJwDAAAAAAE=', + '_version_' => 4, +); \ No newline at end of file diff --git a/application/third_party/dompdf/lib/fonts/Symbol.afm b/application/third_party/dompdf/lib/fonts/Symbol.afm new file mode 100755 index 00000000..6a5386a9 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Symbol.afm @@ -0,0 +1,213 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved. +Comment Creation Date: Thu May 1 15:12:25 1997 +Comment UniqueID 43064 +Comment VMusage 30820 39997 +FontName Symbol +FullName Symbol +FamilyName Symbol +Weight Medium +ItalicAngle 0 +IsFixedPitch false +CharacterSet Special +FontBBox -180 -293 1090 1010 +UnderlinePosition -100 +UnderlineThickness 50 +Version 001.008 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved. +EncodingScheme FontSpecific +StdHW 92 +StdVW 85 +StartCharMetrics 190 +C 32 ; WX 250 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 128 -17 240 672 ; +C 34 ; WX 713 ; N universal ; B 31 0 681 705 ; +C 35 ; WX 500 ; N numbersign ; B 20 -16 481 673 ; +C 36 ; WX 549 ; N existential ; B 25 0 478 707 ; +C 37 ; WX 833 ; N percent ; B 63 -36 771 655 ; +C 38 ; WX 778 ; N ampersand ; B 41 -18 750 661 ; +C 39 ; WX 439 ; N suchthat ; B 48 -17 414 500 ; +C 40 ; WX 333 ; N parenleft ; B 53 -191 300 673 ; +C 41 ; WX 333 ; N parenright ; B 30 -191 277 673 ; +C 42 ; WX 500 ; N asteriskmath ; B 65 134 427 551 ; +C 43 ; WX 549 ; N plus ; B 10 0 539 533 ; +C 44 ; WX 250 ; N comma ; B 56 -152 194 104 ; +C 45 ; WX 549 ; N minus ; B 11 233 535 288 ; +C 46 ; WX 250 ; N period ; B 69 -17 181 95 ; +C 47 ; WX 278 ; N slash ; B 0 -18 254 646 ; +C 48 ; WX 500 ; N zero ; B 24 -14 476 685 ; +C 49 ; WX 500 ; N one ; B 117 0 390 673 ; +C 50 ; WX 500 ; N two ; B 25 0 475 685 ; +C 51 ; WX 500 ; N three ; B 43 -14 435 685 ; +C 52 ; WX 500 ; N four ; B 15 0 469 685 ; +C 53 ; WX 500 ; N five ; B 32 -14 445 690 ; +C 54 ; WX 500 ; N six ; B 34 -14 468 685 ; +C 55 ; WX 500 ; N seven ; B 24 -16 448 673 ; +C 56 ; WX 500 ; N eight ; B 56 -14 445 685 ; +C 57 ; WX 500 ; N nine ; B 30 -18 459 685 ; +C 58 ; WX 278 ; N colon ; B 81 -17 193 460 ; +C 59 ; WX 278 ; N semicolon ; B 83 -152 221 460 ; +C 60 ; WX 549 ; N less ; B 26 0 523 522 ; +C 61 ; WX 549 ; N equal ; B 11 141 537 390 ; +C 62 ; WX 549 ; N greater ; B 26 0 523 522 ; +C 63 ; WX 444 ; N question ; B 70 -17 412 686 ; +C 64 ; WX 549 ; N congruent ; B 11 0 537 475 ; +C 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ; +C 66 ; WX 667 ; N Beta ; B 29 0 592 673 ; +C 67 ; WX 722 ; N Chi ; B -9 0 704 673 ; +C 68 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ; +C 70 ; WX 763 ; N Phi ; B 26 0 741 673 ; +C 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ; +C 72 ; WX 722 ; N Eta ; B 39 0 729 673 ; +C 73 ; WX 333 ; N Iota ; B 32 0 316 673 ; +C 74 ; WX 631 ; N theta1 ; B 18 -18 623 689 ; +C 75 ; WX 722 ; N Kappa ; B 35 0 722 673 ; +C 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ; +C 77 ; WX 889 ; N Mu ; B 28 0 887 673 ; +C 78 ; WX 722 ; N Nu ; B 29 -8 720 673 ; +C 79 ; WX 722 ; N Omicron ; B 41 -17 715 685 ; +C 80 ; WX 768 ; N Pi ; B 25 0 745 673 ; +C 81 ; WX 741 ; N Theta ; B 41 -17 715 685 ; +C 82 ; WX 556 ; N Rho ; B 28 0 563 673 ; +C 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ; +C 84 ; WX 611 ; N Tau ; B 33 0 607 673 ; +C 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ; +C 86 ; WX 439 ; N sigma1 ; B 40 -233 436 500 ; +C 87 ; WX 768 ; N Omega ; B 34 0 736 688 ; +C 88 ; WX 645 ; N Xi ; B 40 0 599 673 ; +C 89 ; WX 795 ; N Psi ; B 15 0 781 684 ; +C 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ; +C 91 ; WX 333 ; N bracketleft ; B 86 -155 299 674 ; +C 92 ; WX 863 ; N therefore ; B 163 0 701 487 ; +C 93 ; WX 333 ; N bracketright ; B 33 -155 246 674 ; +C 94 ; WX 658 ; N perpendicular ; B 15 0 652 674 ; +C 95 ; WX 500 ; N underscore ; B -2 -125 502 -75 ; +C 96 ; WX 500 ; N radicalex ; B 480 881 1090 917 ; +C 97 ; WX 631 ; N alpha ; B 41 -18 622 500 ; +C 98 ; WX 549 ; N beta ; B 61 -223 515 741 ; +C 99 ; WX 549 ; N chi ; B 12 -231 522 499 ; +C 100 ; WX 494 ; N delta ; B 40 -19 481 740 ; +C 101 ; WX 439 ; N epsilon ; B 22 -19 427 502 ; +C 102 ; WX 521 ; N phi ; B 28 -224 492 673 ; +C 103 ; WX 411 ; N gamma ; B 5 -225 484 499 ; +C 104 ; WX 603 ; N eta ; B 0 -202 527 514 ; +C 105 ; WX 329 ; N iota ; B 0 -17 301 503 ; +C 106 ; WX 603 ; N phi1 ; B 36 -224 587 499 ; +C 107 ; WX 549 ; N kappa ; B 33 0 558 501 ; +C 108 ; WX 549 ; N lambda ; B 24 -17 548 739 ; +C 109 ; WX 576 ; N mu ; B 33 -223 567 500 ; +C 110 ; WX 521 ; N nu ; B -9 -16 475 507 ; +C 111 ; WX 549 ; N omicron ; B 35 -19 501 499 ; +C 112 ; WX 549 ; N pi ; B 10 -19 530 487 ; +C 113 ; WX 521 ; N theta ; B 43 -17 485 690 ; +C 114 ; WX 549 ; N rho ; B 50 -230 490 499 ; +C 115 ; WX 603 ; N sigma ; B 30 -21 588 500 ; +C 116 ; WX 439 ; N tau ; B 10 -19 418 500 ; +C 117 ; WX 576 ; N upsilon ; B 7 -18 535 507 ; +C 118 ; WX 713 ; N omega1 ; B 12 -18 671 583 ; +C 119 ; WX 686 ; N omega ; B 42 -17 684 500 ; +C 120 ; WX 493 ; N xi ; B 27 -224 469 766 ; +C 121 ; WX 686 ; N psi ; B 12 -228 701 500 ; +C 122 ; WX 494 ; N zeta ; B 60 -225 467 756 ; +C 123 ; WX 480 ; N braceleft ; B 58 -183 397 673 ; +C 124 ; WX 200 ; N bar ; B 65 -293 135 707 ; +C 125 ; WX 480 ; N braceright ; B 79 -183 418 673 ; +C 126 ; WX 549 ; N similar ; B 17 203 529 307 ; +C 160 ; WX 750 ; N Euro ; B 20 -12 714 685 ; +C 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 685 ; +C 162 ; WX 247 ; N minute ; B 27 459 228 735 ; +C 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ; +C 164 ; WX 167 ; N fraction ; B -180 -12 340 677 ; +C 165 ; WX 713 ; N infinity ; B 26 124 688 404 ; +C 166 ; WX 500 ; N florin ; B 2 -193 494 686 ; +C 167 ; WX 753 ; N club ; B 86 -26 660 533 ; +C 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ; +C 169 ; WX 753 ; N heart ; B 117 -33 631 532 ; +C 170 ; WX 753 ; N spade ; B 113 -36 629 548 ; +C 171 ; WX 1042 ; N arrowboth ; B 24 -15 1024 511 ; +C 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ; +C 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ; +C 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ; +C 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ; +C 176 ; WX 400 ; N degree ; B 50 385 350 685 ; +C 177 ; WX 549 ; N plusminus ; B 10 0 539 645 ; +C 178 ; WX 411 ; N second ; B 20 459 413 737 ; +C 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ; +C 180 ; WX 549 ; N multiply ; B 17 8 533 524 ; +C 181 ; WX 713 ; N proportional ; B 27 123 639 404 ; +C 182 ; WX 494 ; N partialdiff ; B 26 -20 462 746 ; +C 183 ; WX 460 ; N bullet ; B 50 113 410 473 ; +C 184 ; WX 549 ; N divide ; B 10 71 536 456 ; +C 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ; +C 186 ; WX 549 ; N equivalence ; B 14 82 538 443 ; +C 187 ; WX 549 ; N approxequal ; B 14 135 527 394 ; +C 188 ; WX 1000 ; N ellipsis ; B 111 -17 889 95 ; +C 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ; +C 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ; +C 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ; +C 192 ; WX 823 ; N aleph ; B 175 -18 661 658 ; +C 193 ; WX 686 ; N Ifraktur ; B 10 -53 578 740 ; +C 194 ; WX 795 ; N Rfraktur ; B 26 -15 759 734 ; +C 195 ; WX 987 ; N weierstrass ; B 159 -211 870 573 ; +C 196 ; WX 768 ; N circlemultiply ; B 43 -17 733 673 ; +C 197 ; WX 768 ; N circleplus ; B 43 -15 733 675 ; +C 198 ; WX 823 ; N emptyset ; B 39 -24 781 719 ; +C 199 ; WX 768 ; N intersection ; B 40 0 732 509 ; +C 200 ; WX 768 ; N union ; B 40 -17 732 492 ; +C 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ; +C 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ; +C 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ; +C 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ; +C 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ; +C 206 ; WX 713 ; N element ; B 45 0 505 468 ; +C 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ; +C 208 ; WX 768 ; N angle ; B 26 0 738 673 ; +C 209 ; WX 713 ; N gradient ; B 36 -19 681 718 ; +C 210 ; WX 790 ; N registerserif ; B 50 -17 740 673 ; +C 211 ; WX 790 ; N copyrightserif ; B 51 -15 741 675 ; +C 212 ; WX 890 ; N trademarkserif ; B 18 293 855 673 ; +C 213 ; WX 823 ; N product ; B 25 -101 803 751 ; +C 214 ; WX 549 ; N radical ; B 10 -38 515 917 ; +C 215 ; WX 250 ; N dotmath ; B 69 210 169 310 ; +C 216 ; WX 713 ; N logicalnot ; B 15 0 680 288 ; +C 217 ; WX 603 ; N logicaland ; B 23 0 583 454 ; +C 218 ; WX 603 ; N logicalor ; B 30 0 578 477 ; +C 219 ; WX 1042 ; N arrowdblboth ; B 27 -20 1023 510 ; +C 220 ; WX 987 ; N arrowdblleft ; B 30 -15 939 513 ; +C 221 ; WX 603 ; N arrowdblup ; B 39 2 567 911 ; +C 222 ; WX 987 ; N arrowdblright ; B 45 -20 954 508 ; +C 223 ; WX 603 ; N arrowdbldown ; B 44 -19 572 890 ; +C 224 ; WX 494 ; N lozenge ; B 18 0 466 745 ; +C 225 ; WX 329 ; N angleleft ; B 25 -198 306 746 ; +C 226 ; WX 790 ; N registersans ; B 50 -20 740 670 ; +C 227 ; WX 790 ; N copyrightsans ; B 49 -15 739 675 ; +C 228 ; WX 786 ; N trademarksans ; B 5 293 725 673 ; +C 229 ; WX 713 ; N summation ; B 14 -108 695 752 ; +C 230 ; WX 384 ; N parenlefttp ; B 24 -293 436 926 ; +C 231 ; WX 384 ; N parenleftex ; B 24 -85 108 925 ; +C 232 ; WX 384 ; N parenleftbt ; B 24 -293 436 926 ; +C 233 ; WX 384 ; N bracketlefttp ; B 0 -80 349 926 ; +C 234 ; WX 384 ; N bracketleftex ; B 0 -79 77 925 ; +C 235 ; WX 384 ; N bracketleftbt ; B 0 -80 349 926 ; +C 236 ; WX 494 ; N bracelefttp ; B 209 -85 445 925 ; +C 237 ; WX 494 ; N braceleftmid ; B 20 -85 284 935 ; +C 238 ; WX 494 ; N braceleftbt ; B 209 -75 445 935 ; +C 239 ; WX 494 ; N braceex ; B 209 -85 284 935 ; +C 241 ; WX 329 ; N angleright ; B 21 -198 302 746 ; +C 242 ; WX 274 ; N integral ; B 2 -107 291 916 ; +C 243 ; WX 686 ; N integraltp ; B 308 -88 675 920 ; +C 244 ; WX 686 ; N integralex ; B 308 -88 378 975 ; +C 245 ; WX 686 ; N integralbt ; B 11 -87 378 921 ; +C 246 ; WX 384 ; N parenrighttp ; B 54 -293 466 926 ; +C 247 ; WX 384 ; N parenrightex ; B 382 -85 466 925 ; +C 248 ; WX 384 ; N parenrightbt ; B 54 -293 466 926 ; +C 249 ; WX 384 ; N bracketrighttp ; B 22 -80 371 926 ; +C 250 ; WX 384 ; N bracketrightex ; B 294 -79 371 925 ; +C 251 ; WX 384 ; N bracketrightbt ; B 22 -80 371 926 ; +C 252 ; WX 494 ; N bracerighttp ; B 48 -85 284 925 ; +C 253 ; WX 494 ; N bracerightmid ; B 209 -85 473 935 ; +C 254 ; WX 494 ; N bracerightbt ; B 48 -75 284 935 ; +C -1 ; WX 790 ; N apple ; B 56 -3 733 808 ; +EndCharMetrics +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Times-Bold.afm b/application/third_party/dompdf/lib/fonts/Times-Bold.afm new file mode 100755 index 00000000..7adf4dab --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Times-Bold.afm @@ -0,0 +1,2590 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:52:56 1997 +Comment UniqueID 43065 +Comment VMusage 41636 52661 +FontName Times-Bold +FullName Times Bold +FamilyName Times +Weight Bold +ItalicAngle 0 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -168 -218 1000 935 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 676 +XHeight 461 +Ascender 683 +Descender -217 +StdHW 44 +StdVW 139 +StartCharMetrics 317 +C 32 ; WX 250 ; N space ; B 0 0 0 0 ; +C 160 ; WX 250 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 81 -13 251 691 ; +C 34 ; WX 555 ; N quotedbl ; B 83 404 472 691 ; +C 35 ; WX 500 ; N numbersign ; B 4 0 496 700 ; +C 36 ; WX 500 ; N dollar ; B 29 -99 472 750 ; +C 37 ; WX 1000 ; N percent ; B 124 -14 877 692 ; +C 38 ; WX 833 ; N ampersand ; B 62 -16 787 691 ; +C 146 ; WX 333 ; N quoteright ; B 79 356 263 691 ; +C 40 ; WX 333 ; N parenleft ; B 46 -168 306 694 ; +C 41 ; WX 333 ; N parenright ; B 27 -168 287 694 ; +C 42 ; WX 500 ; N asterisk ; B 56 255 447 691 ; +C 43 ; WX 570 ; N plus ; B 33 0 537 506 ; +C 44 ; WX 250 ; N comma ; B 39 -180 223 155 ; +C 45 ; WX 333 ; N hyphen ; B 44 171 287 287 ; +C 173 ; WX 333 ; N hyphen ; B 44 171 287 287 ; +C 46 ; WX 250 ; N period ; B 41 -13 210 156 ; +C 47 ; WX 278 ; N slash ; B -24 -19 302 691 ; +C 48 ; WX 500 ; N zero ; B 24 -13 476 688 ; +C 49 ; WX 500 ; N one ; B 65 0 442 688 ; +C 50 ; WX 500 ; N two ; B 17 0 478 688 ; +C 51 ; WX 500 ; N three ; B 16 -14 468 688 ; +C 52 ; WX 500 ; N four ; B 19 0 475 688 ; +C 53 ; WX 500 ; N five ; B 22 -8 470 676 ; +C 54 ; WX 500 ; N six ; B 28 -13 475 688 ; +C 55 ; WX 500 ; N seven ; B 17 0 477 676 ; +C 56 ; WX 500 ; N eight ; B 28 -13 472 688 ; +C 57 ; WX 500 ; N nine ; B 26 -13 473 688 ; +C 58 ; WX 333 ; N colon ; B 82 -13 251 472 ; +C 59 ; WX 333 ; N semicolon ; B 82 -180 266 472 ; +C 60 ; WX 570 ; N less ; B 31 -8 539 514 ; +C 61 ; WX 570 ; N equal ; B 33 107 537 399 ; +C 62 ; WX 570 ; N greater ; B 31 -8 539 514 ; +C 63 ; WX 500 ; N question ; B 57 -13 445 689 ; +C 64 ; WX 930 ; N at ; B 108 -19 822 691 ; +C 65 ; WX 722 ; N A ; B 9 0 689 690 ; +C 66 ; WX 667 ; N B ; B 16 0 619 676 ; +C 67 ; WX 722 ; N C ; B 49 -19 687 691 ; +C 68 ; WX 722 ; N D ; B 14 0 690 676 ; +C 69 ; WX 667 ; N E ; B 16 0 641 676 ; +C 70 ; WX 611 ; N F ; B 16 0 583 676 ; +C 71 ; WX 778 ; N G ; B 37 -19 755 691 ; +C 72 ; WX 778 ; N H ; B 21 0 759 676 ; +C 73 ; WX 389 ; N I ; B 20 0 370 676 ; +C 74 ; WX 500 ; N J ; B 3 -96 479 676 ; +C 75 ; WX 778 ; N K ; B 30 0 769 676 ; +C 76 ; WX 667 ; N L ; B 19 0 638 676 ; +C 77 ; WX 944 ; N M ; B 14 0 921 676 ; +C 78 ; WX 722 ; N N ; B 16 -18 701 676 ; +C 79 ; WX 778 ; N O ; B 35 -19 743 691 ; +C 80 ; WX 611 ; N P ; B 16 0 600 676 ; +C 81 ; WX 778 ; N Q ; B 35 -176 743 691 ; +C 82 ; WX 722 ; N R ; B 26 0 715 676 ; +C 83 ; WX 556 ; N S ; B 35 -19 513 692 ; +C 84 ; WX 667 ; N T ; B 31 0 636 676 ; +C 85 ; WX 722 ; N U ; B 16 -19 701 676 ; +C 86 ; WX 722 ; N V ; B 16 -18 701 676 ; +C 87 ; WX 1000 ; N W ; B 19 -15 981 676 ; +C 88 ; WX 722 ; N X ; B 16 0 699 676 ; +C 89 ; WX 722 ; N Y ; B 15 0 699 676 ; +C 90 ; WX 667 ; N Z ; B 28 0 634 676 ; +C 91 ; WX 333 ; N bracketleft ; B 67 -149 301 678 ; +C 92 ; WX 278 ; N backslash ; B -25 -19 303 691 ; +C 93 ; WX 333 ; N bracketright ; B 32 -149 266 678 ; +C 94 ; WX 581 ; N asciicircum ; B 73 311 509 676 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 145 ; WX 333 ; N quoteleft ; B 70 356 254 691 ; +C 97 ; WX 500 ; N a ; B 25 -14 488 473 ; +C 98 ; WX 556 ; N b ; B 17 -14 521 676 ; +C 99 ; WX 444 ; N c ; B 25 -14 430 473 ; +C 100 ; WX 556 ; N d ; B 25 -14 534 676 ; +C 101 ; WX 444 ; N e ; B 25 -14 426 473 ; +C 102 ; WX 333 ; N f ; B 14 0 389 691 ; L i fi ; L l fl ; +C 103 ; WX 500 ; N g ; B 28 -206 483 473 ; +C 104 ; WX 556 ; N h ; B 16 0 534 676 ; +C 105 ; WX 278 ; N i ; B 16 0 255 691 ; +C 106 ; WX 333 ; N j ; B -57 -203 263 691 ; +C 107 ; WX 556 ; N k ; B 22 0 543 676 ; +C 108 ; WX 278 ; N l ; B 16 0 255 676 ; +C 109 ; WX 833 ; N m ; B 16 0 814 473 ; +C 110 ; WX 556 ; N n ; B 21 0 539 473 ; +C 111 ; WX 500 ; N o ; B 25 -14 476 473 ; +C 112 ; WX 556 ; N p ; B 19 -205 524 473 ; +C 113 ; WX 556 ; N q ; B 34 -205 536 473 ; +C 114 ; WX 444 ; N r ; B 29 0 434 473 ; +C 115 ; WX 389 ; N s ; B 25 -14 361 473 ; +C 116 ; WX 333 ; N t ; B 20 -12 332 630 ; +C 117 ; WX 556 ; N u ; B 16 -14 537 461 ; +C 118 ; WX 500 ; N v ; B 21 -14 485 461 ; +C 119 ; WX 722 ; N w ; B 23 -14 707 461 ; +C 120 ; WX 500 ; N x ; B 12 0 484 461 ; +C 121 ; WX 500 ; N y ; B 16 -205 480 461 ; +C 122 ; WX 444 ; N z ; B 21 0 420 461 ; +C 123 ; WX 394 ; N braceleft ; B 22 -175 340 698 ; +C 124 ; WX 220 ; N bar ; B 66 -218 154 782 ; +C 125 ; WX 394 ; N braceright ; B 54 -175 372 698 ; +C 126 ; WX 520 ; N asciitilde ; B 29 173 491 333 ; +C 161 ; WX 333 ; N exclamdown ; B 82 -203 252 501 ; +C 162 ; WX 500 ; N cent ; B 53 -140 458 588 ; +C 163 ; WX 500 ; N sterling ; B 21 -14 477 684 ; +C -1 ; WX 167 ; N fraction ; B -168 -12 329 688 ; +C 165 ; WX 500 ; N yen ; B -64 0 547 676 ; +C 131 ; WX 500 ; N florin ; B 0 -155 498 706 ; +C 167 ; WX 500 ; N section ; B 57 -132 443 691 ; +C 164 ; WX 500 ; N currency ; B -26 61 526 613 ; +C 39 ; WX 278 ; N quotesingle ; B 75 404 204 691 ; +C 147 ; WX 500 ; N quotedblleft ; B 32 356 486 691 ; +C 170 ; WX 500 ; N guillemotleft ; B 23 36 473 415 ; +C 139 ; WX 333 ; N guilsinglleft ; B 51 36 305 415 ; +C 155 ; WX 333 ; N guilsinglright ; B 28 36 282 415 ; +C -1 ; WX 556 ; N fi ; B 14 0 536 691 ; +C -1 ; WX 556 ; N fl ; B 14 0 536 691 ; +C 150 ; WX 500 ; N endash ; B 0 181 500 271 ; +C 134 ; WX 500 ; N dagger ; B 47 -134 453 691 ; +C 135 ; WX 500 ; N daggerdbl ; B 45 -132 456 691 ; +C 183 ; WX 250 ; N periodcentered ; B 41 248 210 417 ; +C 182 ; WX 540 ; N paragraph ; B 0 -186 519 676 ; +C 149 ; WX 350 ; N bullet ; B 35 198 315 478 ; +C 130 ; WX 333 ; N quotesinglbase ; B 79 -180 263 155 ; +C 132 ; WX 500 ; N quotedblbase ; B 14 -180 468 155 ; +C 148 ; WX 500 ; N quotedblright ; B 14 356 468 691 ; +C 187 ; WX 500 ; N guillemotright ; B 27 36 477 415 ; +C 133 ; WX 1000 ; N ellipsis ; B 82 -13 917 156 ; +C 137 ; WX 1000 ; N perthousand ; B 7 -29 995 706 ; +C 191 ; WX 500 ; N questiondown ; B 55 -201 443 501 ; +C 96 ; WX 333 ; N grave ; B 8 528 246 713 ; +C 180 ; WX 333 ; N acute ; B 86 528 324 713 ; +C 136 ; WX 333 ; N circumflex ; B -2 528 335 704 ; +C 152 ; WX 333 ; N tilde ; B -16 547 349 674 ; +C 175 ; WX 333 ; N macron ; B 1 565 331 637 ; +C -1 ; WX 333 ; N breve ; B 15 528 318 691 ; +C -1 ; WX 333 ; N dotaccent ; B 103 536 258 691 ; +C 168 ; WX 333 ; N dieresis ; B -2 537 335 667 ; +C -1 ; WX 333 ; N ring ; B 60 527 273 740 ; +C 184 ; WX 333 ; N cedilla ; B 68 -218 294 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B -13 528 425 713 ; +C -1 ; WX 333 ; N ogonek ; B 90 -193 319 24 ; +C -1 ; WX 333 ; N caron ; B -2 528 335 704 ; +C 151 ; WX 1000 ; N emdash ; B 0 181 1000 271 ; +C 198 ; WX 1000 ; N AE ; B 4 0 951 676 ; +C 170 ; WX 300 ; N ordfeminine ; B -1 397 301 688 ; +C -1 ; WX 667 ; N Lslash ; B 19 0 638 676 ; +C 216 ; WX 778 ; N Oslash ; B 35 -74 743 737 ; +C 140 ; WX 1000 ; N OE ; B 22 -5 981 684 ; +C 186 ; WX 330 ; N ordmasculine ; B 18 397 312 688 ; +C 230 ; WX 722 ; N ae ; B 33 -14 693 473 ; +C -1 ; WX 278 ; N dotlessi ; B 16 0 255 461 ; +C -1 ; WX 278 ; N lslash ; B -22 0 303 676 ; +C 248 ; WX 500 ; N oslash ; B 25 -92 476 549 ; +C 156 ; WX 722 ; N oe ; B 22 -14 696 473 ; +C 223 ; WX 556 ; N germandbls ; B 19 -12 517 691 ; +C 207 ; WX 389 ; N Idieresis ; B 20 0 370 877 ; +C 233 ; WX 444 ; N eacute ; B 25 -14 426 713 ; +C -1 ; WX 500 ; N abreve ; B 25 -14 488 691 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 16 -14 557 713 ; +C -1 ; WX 444 ; N ecaron ; B 25 -14 426 704 ; +C 159 ; WX 722 ; N Ydieresis ; B 15 0 699 877 ; +C 247 ; WX 570 ; N divide ; B 33 -31 537 537 ; +C 221 ; WX 722 ; N Yacute ; B 15 0 699 923 ; +C 194 ; WX 722 ; N Acircumflex ; B 9 0 689 914 ; +C 225 ; WX 500 ; N aacute ; B 25 -14 488 713 ; +C 219 ; WX 722 ; N Ucircumflex ; B 16 -19 701 914 ; +C 253 ; WX 500 ; N yacute ; B 16 -205 480 713 ; +C -1 ; WX 389 ; N scommaaccent ; B 25 -218 361 473 ; +C 234 ; WX 444 ; N ecircumflex ; B 25 -14 426 704 ; +C -1 ; WX 722 ; N Uring ; B 16 -19 701 935 ; +C 220 ; WX 722 ; N Udieresis ; B 16 -19 701 877 ; +C -1 ; WX 500 ; N aogonek ; B 25 -193 504 473 ; +C 218 ; WX 722 ; N Uacute ; B 16 -19 701 923 ; +C -1 ; WX 556 ; N uogonek ; B 16 -193 539 461 ; +C 203 ; WX 667 ; N Edieresis ; B 16 0 641 877 ; +C -1 ; WX 722 ; N Dcroat ; B 6 0 690 676 ; +C -1 ; WX 250 ; N commaaccent ; B 47 -218 203 -50 ; +C 169 ; WX 747 ; N copyright ; B 26 -19 721 691 ; +C -1 ; WX 667 ; N Emacron ; B 16 0 641 847 ; +C -1 ; WX 444 ; N ccaron ; B 25 -14 430 704 ; +C 229 ; WX 500 ; N aring ; B 25 -14 488 740 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 16 -188 701 676 ; +C -1 ; WX 278 ; N lacute ; B 16 0 297 923 ; +C 224 ; WX 500 ; N agrave ; B 25 -14 488 713 ; +C -1 ; WX 667 ; N Tcommaaccent ; B 31 -218 636 676 ; +C -1 ; WX 722 ; N Cacute ; B 49 -19 687 923 ; +C 227 ; WX 500 ; N atilde ; B 25 -14 488 674 ; +C -1 ; WX 667 ; N Edotaccent ; B 16 0 641 901 ; +C 154 ; WX 389 ; N scaron ; B 25 -14 363 704 ; +C -1 ; WX 389 ; N scedilla ; B 25 -218 361 473 ; +C 237 ; WX 278 ; N iacute ; B 16 0 289 713 ; +C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; +C -1 ; WX 722 ; N Rcaron ; B 26 0 715 914 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 37 -218 755 691 ; +C 251 ; WX 556 ; N ucircumflex ; B 16 -14 537 704 ; +C 226 ; WX 500 ; N acircumflex ; B 25 -14 488 704 ; +C -1 ; WX 722 ; N Amacron ; B 9 0 689 847 ; +C -1 ; WX 444 ; N rcaron ; B 29 0 434 704 ; +C 231 ; WX 444 ; N ccedilla ; B 25 -218 430 473 ; +C -1 ; WX 667 ; N Zdotaccent ; B 28 0 634 901 ; +C 222 ; WX 611 ; N Thorn ; B 16 0 600 676 ; +C -1 ; WX 778 ; N Omacron ; B 35 -19 743 847 ; +C -1 ; WX 722 ; N Racute ; B 26 0 715 923 ; +C -1 ; WX 556 ; N Sacute ; B 35 -19 513 923 ; +C -1 ; WX 672 ; N dcaron ; B 25 -14 681 682 ; +C -1 ; WX 722 ; N Umacron ; B 16 -19 701 847 ; +C -1 ; WX 556 ; N uring ; B 16 -14 537 740 ; +C 179 ; WX 300 ; N threesuperior ; B 3 268 297 688 ; +C 210 ; WX 778 ; N Ograve ; B 35 -19 743 923 ; +C 192 ; WX 722 ; N Agrave ; B 9 0 689 923 ; +C -1 ; WX 722 ; N Abreve ; B 9 0 689 901 ; +C 215 ; WX 570 ; N multiply ; B 48 16 522 490 ; +C 250 ; WX 556 ; N uacute ; B 16 -14 537 713 ; +C -1 ; WX 667 ; N Tcaron ; B 31 0 636 914 ; +C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; +C 255 ; WX 500 ; N ydieresis ; B 16 -205 480 667 ; +C -1 ; WX 722 ; N Nacute ; B 16 -18 701 923 ; +C 238 ; WX 278 ; N icircumflex ; B -37 0 300 704 ; +C 202 ; WX 667 ; N Ecircumflex ; B 16 0 641 914 ; +C 228 ; WX 500 ; N adieresis ; B 25 -14 488 667 ; +C 235 ; WX 444 ; N edieresis ; B 25 -14 426 667 ; +C -1 ; WX 444 ; N cacute ; B 25 -14 430 713 ; +C -1 ; WX 556 ; N nacute ; B 21 0 539 713 ; +C -1 ; WX 556 ; N umacron ; B 16 -14 537 637 ; +C -1 ; WX 722 ; N Ncaron ; B 16 -18 701 914 ; +C 205 ; WX 389 ; N Iacute ; B 20 0 370 923 ; +C 177 ; WX 570 ; N plusminus ; B 33 0 537 506 ; +C 166 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ; +C 174 ; WX 747 ; N registered ; B 26 -19 721 691 ; +C -1 ; WX 778 ; N Gbreve ; B 37 -19 755 901 ; +C -1 ; WX 389 ; N Idotaccent ; B 20 0 370 901 ; +C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; +C 200 ; WX 667 ; N Egrave ; B 16 0 641 923 ; +C -1 ; WX 444 ; N racute ; B 29 0 434 713 ; +C -1 ; WX 500 ; N omacron ; B 25 -14 476 637 ; +C -1 ; WX 667 ; N Zacute ; B 28 0 634 923 ; +C 142 ; WX 667 ; N Zcaron ; B 28 0 634 914 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; +C 208 ; WX 722 ; N Eth ; B 6 0 690 676 ; +C 199 ; WX 722 ; N Ccedilla ; B 49 -218 687 691 ; +C -1 ; WX 278 ; N lcommaaccent ; B 16 -218 255 676 ; +C -1 ; WX 416 ; N tcaron ; B 20 -12 425 815 ; +C -1 ; WX 444 ; N eogonek ; B 25 -193 426 473 ; +C -1 ; WX 722 ; N Uogonek ; B 16 -193 701 676 ; +C 193 ; WX 722 ; N Aacute ; B 9 0 689 923 ; +C 196 ; WX 722 ; N Adieresis ; B 9 0 689 877 ; +C 232 ; WX 444 ; N egrave ; B 25 -14 426 713 ; +C -1 ; WX 444 ; N zacute ; B 21 0 420 713 ; +C -1 ; WX 278 ; N iogonek ; B 16 -193 274 691 ; +C 211 ; WX 778 ; N Oacute ; B 35 -19 743 923 ; +C 243 ; WX 500 ; N oacute ; B 25 -14 476 713 ; +C -1 ; WX 500 ; N amacron ; B 25 -14 488 637 ; +C -1 ; WX 389 ; N sacute ; B 25 -14 361 713 ; +C 239 ; WX 278 ; N idieresis ; B -37 0 300 667 ; +C 212 ; WX 778 ; N Ocircumflex ; B 35 -19 743 914 ; +C 217 ; WX 722 ; N Ugrave ; B 16 -19 701 923 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 556 ; N thorn ; B 19 -205 524 676 ; +C 178 ; WX 300 ; N twosuperior ; B 0 275 300 688 ; +C 214 ; WX 778 ; N Odieresis ; B 35 -19 743 877 ; +C 181 ; WX 556 ; N mu ; B 33 -206 536 461 ; +C 236 ; WX 278 ; N igrave ; B -27 0 255 713 ; +C -1 ; WX 500 ; N ohungarumlaut ; B 25 -14 529 713 ; +C -1 ; WX 667 ; N Eogonek ; B 16 -193 644 676 ; +C -1 ; WX 556 ; N dcroat ; B 25 -14 534 676 ; +C 190 ; WX 750 ; N threequarters ; B 23 -12 733 688 ; +C -1 ; WX 556 ; N Scedilla ; B 35 -218 513 692 ; +C -1 ; WX 394 ; N lcaron ; B 16 0 412 682 ; +C -1 ; WX 778 ; N Kcommaaccent ; B 30 -218 769 676 ; +C -1 ; WX 667 ; N Lacute ; B 19 0 638 923 ; +C 153 ; WX 1000 ; N trademark ; B 24 271 977 676 ; +C -1 ; WX 444 ; N edotaccent ; B 25 -14 426 691 ; +C 204 ; WX 389 ; N Igrave ; B 20 0 370 923 ; +C -1 ; WX 389 ; N Imacron ; B 20 0 370 847 ; +C -1 ; WX 667 ; N Lcaron ; B 19 0 652 682 ; +C 189 ; WX 750 ; N onehalf ; B -7 -12 775 688 ; +C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; +C 244 ; WX 500 ; N ocircumflex ; B 25 -14 476 704 ; +C 241 ; WX 556 ; N ntilde ; B 21 0 539 674 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 16 -19 701 923 ; +C 201 ; WX 667 ; N Eacute ; B 16 0 641 923 ; +C -1 ; WX 444 ; N emacron ; B 25 -14 426 637 ; +C -1 ; WX 500 ; N gbreve ; B 28 -206 483 691 ; +C 188 ; WX 750 ; N onequarter ; B 28 -12 743 688 ; +C 138 ; WX 556 ; N Scaron ; B 35 -19 513 914 ; +C -1 ; WX 556 ; N Scommaaccent ; B 35 -218 513 692 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 35 -19 743 923 ; +C 176 ; WX 400 ; N degree ; B 57 402 343 688 ; +C 242 ; WX 500 ; N ograve ; B 25 -14 476 713 ; +C -1 ; WX 722 ; N Ccaron ; B 49 -19 687 914 ; +C 249 ; WX 556 ; N ugrave ; B 16 -14 537 713 ; +C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; +C -1 ; WX 722 ; N Dcaron ; B 14 0 690 914 ; +C -1 ; WX 444 ; N rcommaaccent ; B 29 -218 434 473 ; +C 209 ; WX 722 ; N Ntilde ; B 16 -18 701 884 ; +C 245 ; WX 500 ; N otilde ; B 25 -14 476 674 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 26 -218 715 676 ; +C -1 ; WX 667 ; N Lcommaaccent ; B 19 -218 638 676 ; +C 195 ; WX 722 ; N Atilde ; B 9 0 689 884 ; +C -1 ; WX 722 ; N Aogonek ; B 9 -193 699 690 ; +C 197 ; WX 722 ; N Aring ; B 9 0 689 935 ; +C 213 ; WX 778 ; N Otilde ; B 35 -19 743 884 ; +C -1 ; WX 444 ; N zdotaccent ; B 21 0 420 691 ; +C -1 ; WX 667 ; N Ecaron ; B 16 0 641 914 ; +C -1 ; WX 389 ; N Iogonek ; B 20 -193 370 676 ; +C -1 ; WX 556 ; N kcommaaccent ; B 22 -218 543 676 ; +C -1 ; WX 570 ; N minus ; B 33 209 537 297 ; +C 206 ; WX 389 ; N Icircumflex ; B 20 0 370 914 ; +C -1 ; WX 556 ; N ncaron ; B 21 0 539 704 ; +C -1 ; WX 333 ; N tcommaaccent ; B 20 -218 332 630 ; +C 172 ; WX 570 ; N logicalnot ; B 33 108 537 399 ; +C 246 ; WX 500 ; N odieresis ; B 25 -14 476 667 ; +C 252 ; WX 556 ; N udieresis ; B 16 -14 537 667 ; +C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; +C -1 ; WX 500 ; N gcommaaccent ; B 28 -206 483 829 ; +C 240 ; WX 500 ; N eth ; B 25 -14 476 691 ; +C 158 ; WX 444 ; N zcaron ; B 21 0 420 704 ; +C -1 ; WX 556 ; N ncommaaccent ; B 21 -218 539 473 ; +C 185 ; WX 300 ; N onesuperior ; B 28 275 273 688 ; +C -1 ; WX 278 ; N imacron ; B -8 0 272 637 ; +C 128 ; WX 500 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2242 +KPX A C -55 +KPX A Cacute -55 +KPX A Ccaron -55 +KPX A Ccedilla -55 +KPX A G -55 +KPX A Gbreve -55 +KPX A Gcommaaccent -55 +KPX A O -45 +KPX A Oacute -45 +KPX A Ocircumflex -45 +KPX A Odieresis -45 +KPX A Ograve -45 +KPX A Ohungarumlaut -45 +KPX A Omacron -45 +KPX A Oslash -45 +KPX A Otilde -45 +KPX A Q -45 +KPX A T -95 +KPX A Tcaron -95 +KPX A Tcommaaccent -95 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -145 +KPX A W -130 +KPX A Y -100 +KPX A Yacute -100 +KPX A Ydieresis -100 +KPX A p -25 +KPX A quoteright -74 +KPX A u -50 +KPX A uacute -50 +KPX A ucircumflex -50 +KPX A udieresis -50 +KPX A ugrave -50 +KPX A uhungarumlaut -50 +KPX A umacron -50 +KPX A uogonek -50 +KPX A uring -50 +KPX A v -100 +KPX A w -90 +KPX A y -74 +KPX A yacute -74 +KPX A ydieresis -74 +KPX Aacute C -55 +KPX Aacute Cacute -55 +KPX Aacute Ccaron -55 +KPX Aacute Ccedilla -55 +KPX Aacute G -55 +KPX Aacute Gbreve -55 +KPX Aacute Gcommaaccent -55 +KPX Aacute O -45 +KPX Aacute Oacute -45 +KPX Aacute Ocircumflex -45 +KPX Aacute Odieresis -45 +KPX Aacute Ograve -45 +KPX Aacute Ohungarumlaut -45 +KPX Aacute Omacron -45 +KPX Aacute Oslash -45 +KPX Aacute Otilde -45 +KPX Aacute Q -45 +KPX Aacute T -95 +KPX Aacute Tcaron -95 +KPX Aacute Tcommaaccent -95 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -145 +KPX Aacute W -130 +KPX Aacute Y -100 +KPX Aacute Yacute -100 +KPX Aacute Ydieresis -100 +KPX Aacute p -25 +KPX Aacute quoteright -74 +KPX Aacute u -50 +KPX Aacute uacute -50 +KPX Aacute ucircumflex -50 +KPX Aacute udieresis -50 +KPX Aacute ugrave -50 +KPX Aacute uhungarumlaut -50 +KPX Aacute umacron -50 +KPX Aacute uogonek -50 +KPX Aacute uring -50 +KPX Aacute v -100 +KPX Aacute w -90 +KPX Aacute y -74 +KPX Aacute yacute -74 +KPX Aacute ydieresis -74 +KPX Abreve C -55 +KPX Abreve Cacute -55 +KPX Abreve Ccaron -55 +KPX Abreve Ccedilla -55 +KPX Abreve G -55 +KPX Abreve Gbreve -55 +KPX Abreve Gcommaaccent -55 +KPX Abreve O -45 +KPX Abreve Oacute -45 +KPX Abreve Ocircumflex -45 +KPX Abreve Odieresis -45 +KPX Abreve Ograve -45 +KPX Abreve Ohungarumlaut -45 +KPX Abreve Omacron -45 +KPX Abreve Oslash -45 +KPX Abreve Otilde -45 +KPX Abreve Q -45 +KPX Abreve T -95 +KPX Abreve Tcaron -95 +KPX Abreve Tcommaaccent -95 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -145 +KPX Abreve W -130 +KPX Abreve Y -100 +KPX Abreve Yacute -100 +KPX Abreve Ydieresis -100 +KPX Abreve p -25 +KPX Abreve quoteright -74 +KPX Abreve u -50 +KPX Abreve uacute -50 +KPX Abreve ucircumflex -50 +KPX Abreve udieresis -50 +KPX Abreve ugrave -50 +KPX Abreve uhungarumlaut -50 +KPX Abreve umacron -50 +KPX Abreve uogonek -50 +KPX Abreve uring -50 +KPX Abreve v -100 +KPX Abreve w -90 +KPX Abreve y -74 +KPX Abreve yacute -74 +KPX Abreve ydieresis -74 +KPX Acircumflex C -55 +KPX Acircumflex Cacute -55 +KPX Acircumflex Ccaron -55 +KPX Acircumflex Ccedilla -55 +KPX Acircumflex G -55 +KPX Acircumflex Gbreve -55 +KPX Acircumflex Gcommaaccent -55 +KPX Acircumflex O -45 +KPX Acircumflex Oacute -45 +KPX Acircumflex Ocircumflex -45 +KPX Acircumflex Odieresis -45 +KPX Acircumflex Ograve -45 +KPX Acircumflex Ohungarumlaut -45 +KPX Acircumflex Omacron -45 +KPX Acircumflex Oslash -45 +KPX Acircumflex Otilde -45 +KPX Acircumflex Q -45 +KPX Acircumflex T -95 +KPX Acircumflex Tcaron -95 +KPX Acircumflex Tcommaaccent -95 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -145 +KPX Acircumflex W -130 +KPX Acircumflex Y -100 +KPX Acircumflex Yacute -100 +KPX Acircumflex Ydieresis -100 +KPX Acircumflex p -25 +KPX Acircumflex quoteright -74 +KPX Acircumflex u -50 +KPX Acircumflex uacute -50 +KPX Acircumflex ucircumflex -50 +KPX Acircumflex udieresis -50 +KPX Acircumflex ugrave -50 +KPX Acircumflex uhungarumlaut -50 +KPX Acircumflex umacron -50 +KPX Acircumflex uogonek -50 +KPX Acircumflex uring -50 +KPX Acircumflex v -100 +KPX Acircumflex w -90 +KPX Acircumflex y -74 +KPX Acircumflex yacute -74 +KPX Acircumflex ydieresis -74 +KPX Adieresis C -55 +KPX Adieresis Cacute -55 +KPX Adieresis Ccaron -55 +KPX Adieresis Ccedilla -55 +KPX Adieresis G -55 +KPX Adieresis Gbreve -55 +KPX Adieresis Gcommaaccent -55 +KPX Adieresis O -45 +KPX Adieresis Oacute -45 +KPX Adieresis Ocircumflex -45 +KPX Adieresis Odieresis -45 +KPX Adieresis Ograve -45 +KPX Adieresis Ohungarumlaut -45 +KPX Adieresis Omacron -45 +KPX Adieresis Oslash -45 +KPX Adieresis Otilde -45 +KPX Adieresis Q -45 +KPX Adieresis T -95 +KPX Adieresis Tcaron -95 +KPX Adieresis Tcommaaccent -95 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -145 +KPX Adieresis W -130 +KPX Adieresis Y -100 +KPX Adieresis Yacute -100 +KPX Adieresis Ydieresis -100 +KPX Adieresis p -25 +KPX Adieresis quoteright -74 +KPX Adieresis u -50 +KPX Adieresis uacute -50 +KPX Adieresis ucircumflex -50 +KPX Adieresis udieresis -50 +KPX Adieresis ugrave -50 +KPX Adieresis uhungarumlaut -50 +KPX Adieresis umacron -50 +KPX Adieresis uogonek -50 +KPX Adieresis uring -50 +KPX Adieresis v -100 +KPX Adieresis w -90 +KPX Adieresis y -74 +KPX Adieresis yacute -74 +KPX Adieresis ydieresis -74 +KPX Agrave C -55 +KPX Agrave Cacute -55 +KPX Agrave Ccaron -55 +KPX Agrave Ccedilla -55 +KPX Agrave G -55 +KPX Agrave Gbreve -55 +KPX Agrave Gcommaaccent -55 +KPX Agrave O -45 +KPX Agrave Oacute -45 +KPX Agrave Ocircumflex -45 +KPX Agrave Odieresis -45 +KPX Agrave Ograve -45 +KPX Agrave Ohungarumlaut -45 +KPX Agrave Omacron -45 +KPX Agrave Oslash -45 +KPX Agrave Otilde -45 +KPX Agrave Q -45 +KPX Agrave T -95 +KPX Agrave Tcaron -95 +KPX Agrave Tcommaaccent -95 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -145 +KPX Agrave W -130 +KPX Agrave Y -100 +KPX Agrave Yacute -100 +KPX Agrave Ydieresis -100 +KPX Agrave p -25 +KPX Agrave quoteright -74 +KPX Agrave u -50 +KPX Agrave uacute -50 +KPX Agrave ucircumflex -50 +KPX Agrave udieresis -50 +KPX Agrave ugrave -50 +KPX Agrave uhungarumlaut -50 +KPX Agrave umacron -50 +KPX Agrave uogonek -50 +KPX Agrave uring -50 +KPX Agrave v -100 +KPX Agrave w -90 +KPX Agrave y -74 +KPX Agrave yacute -74 +KPX Agrave ydieresis -74 +KPX Amacron C -55 +KPX Amacron Cacute -55 +KPX Amacron Ccaron -55 +KPX Amacron Ccedilla -55 +KPX Amacron G -55 +KPX Amacron Gbreve -55 +KPX Amacron Gcommaaccent -55 +KPX Amacron O -45 +KPX Amacron Oacute -45 +KPX Amacron Ocircumflex -45 +KPX Amacron Odieresis -45 +KPX Amacron Ograve -45 +KPX Amacron Ohungarumlaut -45 +KPX Amacron Omacron -45 +KPX Amacron Oslash -45 +KPX Amacron Otilde -45 +KPX Amacron Q -45 +KPX Amacron T -95 +KPX Amacron Tcaron -95 +KPX Amacron Tcommaaccent -95 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -145 +KPX Amacron W -130 +KPX Amacron Y -100 +KPX Amacron Yacute -100 +KPX Amacron Ydieresis -100 +KPX Amacron p -25 +KPX Amacron quoteright -74 +KPX Amacron u -50 +KPX Amacron uacute -50 +KPX Amacron ucircumflex -50 +KPX Amacron udieresis -50 +KPX Amacron ugrave -50 +KPX Amacron uhungarumlaut -50 +KPX Amacron umacron -50 +KPX Amacron uogonek -50 +KPX Amacron uring -50 +KPX Amacron v -100 +KPX Amacron w -90 +KPX Amacron y -74 +KPX Amacron yacute -74 +KPX Amacron ydieresis -74 +KPX Aogonek C -55 +KPX Aogonek Cacute -55 +KPX Aogonek Ccaron -55 +KPX Aogonek Ccedilla -55 +KPX Aogonek G -55 +KPX Aogonek Gbreve -55 +KPX Aogonek Gcommaaccent -55 +KPX Aogonek O -45 +KPX Aogonek Oacute -45 +KPX Aogonek Ocircumflex -45 +KPX Aogonek Odieresis -45 +KPX Aogonek Ograve -45 +KPX Aogonek Ohungarumlaut -45 +KPX Aogonek Omacron -45 +KPX Aogonek Oslash -45 +KPX Aogonek Otilde -45 +KPX Aogonek Q -45 +KPX Aogonek T -95 +KPX Aogonek Tcaron -95 +KPX Aogonek Tcommaaccent -95 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -145 +KPX Aogonek W -130 +KPX Aogonek Y -100 +KPX Aogonek Yacute -100 +KPX Aogonek Ydieresis -100 +KPX Aogonek p -25 +KPX Aogonek quoteright -74 +KPX Aogonek u -50 +KPX Aogonek uacute -50 +KPX Aogonek ucircumflex -50 +KPX Aogonek udieresis -50 +KPX Aogonek ugrave -50 +KPX Aogonek uhungarumlaut -50 +KPX Aogonek umacron -50 +KPX Aogonek uogonek -50 +KPX Aogonek uring -50 +KPX Aogonek v -100 +KPX Aogonek w -90 +KPX Aogonek y -34 +KPX Aogonek yacute -34 +KPX Aogonek ydieresis -34 +KPX Aring C -55 +KPX Aring Cacute -55 +KPX Aring Ccaron -55 +KPX Aring Ccedilla -55 +KPX Aring G -55 +KPX Aring Gbreve -55 +KPX Aring Gcommaaccent -55 +KPX Aring O -45 +KPX Aring Oacute -45 +KPX Aring Ocircumflex -45 +KPX Aring Odieresis -45 +KPX Aring Ograve -45 +KPX Aring Ohungarumlaut -45 +KPX Aring Omacron -45 +KPX Aring Oslash -45 +KPX Aring Otilde -45 +KPX Aring Q -45 +KPX Aring T -95 +KPX Aring Tcaron -95 +KPX Aring Tcommaaccent -95 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -145 +KPX Aring W -130 +KPX Aring Y -100 +KPX Aring Yacute -100 +KPX Aring Ydieresis -100 +KPX Aring p -25 +KPX Aring quoteright -74 +KPX Aring u -50 +KPX Aring uacute -50 +KPX Aring ucircumflex -50 +KPX Aring udieresis -50 +KPX Aring ugrave -50 +KPX Aring uhungarumlaut -50 +KPX Aring umacron -50 +KPX Aring uogonek -50 +KPX Aring uring -50 +KPX Aring v -100 +KPX Aring w -90 +KPX Aring y -74 +KPX Aring yacute -74 +KPX Aring ydieresis -74 +KPX Atilde C -55 +KPX Atilde Cacute -55 +KPX Atilde Ccaron -55 +KPX Atilde Ccedilla -55 +KPX Atilde G -55 +KPX Atilde Gbreve -55 +KPX Atilde Gcommaaccent -55 +KPX Atilde O -45 +KPX Atilde Oacute -45 +KPX Atilde Ocircumflex -45 +KPX Atilde Odieresis -45 +KPX Atilde Ograve -45 +KPX Atilde Ohungarumlaut -45 +KPX Atilde Omacron -45 +KPX Atilde Oslash -45 +KPX Atilde Otilde -45 +KPX Atilde Q -45 +KPX Atilde T -95 +KPX Atilde Tcaron -95 +KPX Atilde Tcommaaccent -95 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -145 +KPX Atilde W -130 +KPX Atilde Y -100 +KPX Atilde Yacute -100 +KPX Atilde Ydieresis -100 +KPX Atilde p -25 +KPX Atilde quoteright -74 +KPX Atilde u -50 +KPX Atilde uacute -50 +KPX Atilde ucircumflex -50 +KPX Atilde udieresis -50 +KPX Atilde ugrave -50 +KPX Atilde uhungarumlaut -50 +KPX Atilde umacron -50 +KPX Atilde uogonek -50 +KPX Atilde uring -50 +KPX Atilde v -100 +KPX Atilde w -90 +KPX Atilde y -74 +KPX Atilde yacute -74 +KPX Atilde ydieresis -74 +KPX B A -30 +KPX B Aacute -30 +KPX B Abreve -30 +KPX B Acircumflex -30 +KPX B Adieresis -30 +KPX B Agrave -30 +KPX B Amacron -30 +KPX B Aogonek -30 +KPX B Aring -30 +KPX B Atilde -30 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -35 +KPX D Aacute -35 +KPX D Abreve -35 +KPX D Acircumflex -35 +KPX D Adieresis -35 +KPX D Agrave -35 +KPX D Amacron -35 +KPX D Aogonek -35 +KPX D Aring -35 +KPX D Atilde -35 +KPX D V -40 +KPX D W -40 +KPX D Y -40 +KPX D Yacute -40 +KPX D Ydieresis -40 +KPX D period -20 +KPX Dcaron A -35 +KPX Dcaron Aacute -35 +KPX Dcaron Abreve -35 +KPX Dcaron Acircumflex -35 +KPX Dcaron Adieresis -35 +KPX Dcaron Agrave -35 +KPX Dcaron Amacron -35 +KPX Dcaron Aogonek -35 +KPX Dcaron Aring -35 +KPX Dcaron Atilde -35 +KPX Dcaron V -40 +KPX Dcaron W -40 +KPX Dcaron Y -40 +KPX Dcaron Yacute -40 +KPX Dcaron Ydieresis -40 +KPX Dcaron period -20 +KPX Dcroat A -35 +KPX Dcroat Aacute -35 +KPX Dcroat Abreve -35 +KPX Dcroat Acircumflex -35 +KPX Dcroat Adieresis -35 +KPX Dcroat Agrave -35 +KPX Dcroat Amacron -35 +KPX Dcroat Aogonek -35 +KPX Dcroat Aring -35 +KPX Dcroat Atilde -35 +KPX Dcroat V -40 +KPX Dcroat W -40 +KPX Dcroat Y -40 +KPX Dcroat Yacute -40 +KPX Dcroat Ydieresis -40 +KPX Dcroat period -20 +KPX F A -90 +KPX F Aacute -90 +KPX F Abreve -90 +KPX F Acircumflex -90 +KPX F Adieresis -90 +KPX F Agrave -90 +KPX F Amacron -90 +KPX F Aogonek -90 +KPX F Aring -90 +KPX F Atilde -90 +KPX F a -25 +KPX F aacute -25 +KPX F abreve -25 +KPX F acircumflex -25 +KPX F adieresis -25 +KPX F agrave -25 +KPX F amacron -25 +KPX F aogonek -25 +KPX F aring -25 +KPX F atilde -25 +KPX F comma -92 +KPX F e -25 +KPX F eacute -25 +KPX F ecaron -25 +KPX F ecircumflex -25 +KPX F edieresis -25 +KPX F edotaccent -25 +KPX F egrave -25 +KPX F emacron -25 +KPX F eogonek -25 +KPX F o -25 +KPX F oacute -25 +KPX F ocircumflex -25 +KPX F odieresis -25 +KPX F ograve -25 +KPX F ohungarumlaut -25 +KPX F omacron -25 +KPX F oslash -25 +KPX F otilde -25 +KPX F period -110 +KPX J A -30 +KPX J Aacute -30 +KPX J Abreve -30 +KPX J Acircumflex -30 +KPX J Adieresis -30 +KPX J Agrave -30 +KPX J Amacron -30 +KPX J Aogonek -30 +KPX J Aring -30 +KPX J Atilde -30 +KPX J a -15 +KPX J aacute -15 +KPX J abreve -15 +KPX J acircumflex -15 +KPX J adieresis -15 +KPX J agrave -15 +KPX J amacron -15 +KPX J aogonek -15 +KPX J aring -15 +KPX J atilde -15 +KPX J e -15 +KPX J eacute -15 +KPX J ecaron -15 +KPX J ecircumflex -15 +KPX J edieresis -15 +KPX J edotaccent -15 +KPX J egrave -15 +KPX J emacron -15 +KPX J eogonek -15 +KPX J o -15 +KPX J oacute -15 +KPX J ocircumflex -15 +KPX J odieresis -15 +KPX J ograve -15 +KPX J ohungarumlaut -15 +KPX J omacron -15 +KPX J oslash -15 +KPX J otilde -15 +KPX J period -20 +KPX J u -15 +KPX J uacute -15 +KPX J ucircumflex -15 +KPX J udieresis -15 +KPX J ugrave -15 +KPX J uhungarumlaut -15 +KPX J umacron -15 +KPX J uogonek -15 +KPX J uring -15 +KPX K O -30 +KPX K Oacute -30 +KPX K Ocircumflex -30 +KPX K Odieresis -30 +KPX K Ograve -30 +KPX K Ohungarumlaut -30 +KPX K Omacron -30 +KPX K Oslash -30 +KPX K Otilde -30 +KPX K e -25 +KPX K eacute -25 +KPX K ecaron -25 +KPX K ecircumflex -25 +KPX K edieresis -25 +KPX K edotaccent -25 +KPX K egrave -25 +KPX K emacron -25 +KPX K eogonek -25 +KPX K o -25 +KPX K oacute -25 +KPX K ocircumflex -25 +KPX K odieresis -25 +KPX K ograve -25 +KPX K ohungarumlaut -25 +KPX K omacron -25 +KPX K oslash -25 +KPX K otilde -25 +KPX K u -15 +KPX K uacute -15 +KPX K ucircumflex -15 +KPX K udieresis -15 +KPX K ugrave -15 +KPX K uhungarumlaut -15 +KPX K umacron -15 +KPX K uogonek -15 +KPX K uring -15 +KPX K y -45 +KPX K yacute -45 +KPX K ydieresis -45 +KPX Kcommaaccent O -30 +KPX Kcommaaccent Oacute -30 +KPX Kcommaaccent Ocircumflex -30 +KPX Kcommaaccent Odieresis -30 +KPX Kcommaaccent Ograve -30 +KPX Kcommaaccent Ohungarumlaut -30 +KPX Kcommaaccent Omacron -30 +KPX Kcommaaccent Oslash -30 +KPX Kcommaaccent Otilde -30 +KPX Kcommaaccent e -25 +KPX Kcommaaccent eacute -25 +KPX Kcommaaccent ecaron -25 +KPX Kcommaaccent ecircumflex -25 +KPX Kcommaaccent edieresis -25 +KPX Kcommaaccent edotaccent -25 +KPX Kcommaaccent egrave -25 +KPX Kcommaaccent emacron -25 +KPX Kcommaaccent eogonek -25 +KPX Kcommaaccent o -25 +KPX Kcommaaccent oacute -25 +KPX Kcommaaccent ocircumflex -25 +KPX Kcommaaccent odieresis -25 +KPX Kcommaaccent ograve -25 +KPX Kcommaaccent ohungarumlaut -25 +KPX Kcommaaccent omacron -25 +KPX Kcommaaccent oslash -25 +KPX Kcommaaccent otilde -25 +KPX Kcommaaccent u -15 +KPX Kcommaaccent uacute -15 +KPX Kcommaaccent ucircumflex -15 +KPX Kcommaaccent udieresis -15 +KPX Kcommaaccent ugrave -15 +KPX Kcommaaccent uhungarumlaut -15 +KPX Kcommaaccent umacron -15 +KPX Kcommaaccent uogonek -15 +KPX Kcommaaccent uring -15 +KPX Kcommaaccent y -45 +KPX Kcommaaccent yacute -45 +KPX Kcommaaccent ydieresis -45 +KPX L T -92 +KPX L Tcaron -92 +KPX L Tcommaaccent -92 +KPX L V -92 +KPX L W -92 +KPX L Y -92 +KPX L Yacute -92 +KPX L Ydieresis -92 +KPX L quotedblright -20 +KPX L quoteright -110 +KPX L y -55 +KPX L yacute -55 +KPX L ydieresis -55 +KPX Lacute T -92 +KPX Lacute Tcaron -92 +KPX Lacute Tcommaaccent -92 +KPX Lacute V -92 +KPX Lacute W -92 +KPX Lacute Y -92 +KPX Lacute Yacute -92 +KPX Lacute Ydieresis -92 +KPX Lacute quotedblright -20 +KPX Lacute quoteright -110 +KPX Lacute y -55 +KPX Lacute yacute -55 +KPX Lacute ydieresis -55 +KPX Lcommaaccent T -92 +KPX Lcommaaccent Tcaron -92 +KPX Lcommaaccent Tcommaaccent -92 +KPX Lcommaaccent V -92 +KPX Lcommaaccent W -92 +KPX Lcommaaccent Y -92 +KPX Lcommaaccent Yacute -92 +KPX Lcommaaccent Ydieresis -92 +KPX Lcommaaccent quotedblright -20 +KPX Lcommaaccent quoteright -110 +KPX Lcommaaccent y -55 +KPX Lcommaaccent yacute -55 +KPX Lcommaaccent ydieresis -55 +KPX Lslash T -92 +KPX Lslash Tcaron -92 +KPX Lslash Tcommaaccent -92 +KPX Lslash V -92 +KPX Lslash W -92 +KPX Lslash Y -92 +KPX Lslash Yacute -92 +KPX Lslash Ydieresis -92 +KPX Lslash quotedblright -20 +KPX Lslash quoteright -110 +KPX Lslash y -55 +KPX Lslash yacute -55 +KPX Lslash ydieresis -55 +KPX N A -20 +KPX N Aacute -20 +KPX N Abreve -20 +KPX N Acircumflex -20 +KPX N Adieresis -20 +KPX N Agrave -20 +KPX N Amacron -20 +KPX N Aogonek -20 +KPX N Aring -20 +KPX N Atilde -20 +KPX Nacute A -20 +KPX Nacute Aacute -20 +KPX Nacute Abreve -20 +KPX Nacute Acircumflex -20 +KPX Nacute Adieresis -20 +KPX Nacute Agrave -20 +KPX Nacute Amacron -20 +KPX Nacute Aogonek -20 +KPX Nacute Aring -20 +KPX Nacute Atilde -20 +KPX Ncaron A -20 +KPX Ncaron Aacute -20 +KPX Ncaron Abreve -20 +KPX Ncaron Acircumflex -20 +KPX Ncaron Adieresis -20 +KPX Ncaron Agrave -20 +KPX Ncaron Amacron -20 +KPX Ncaron Aogonek -20 +KPX Ncaron Aring -20 +KPX Ncaron Atilde -20 +KPX Ncommaaccent A -20 +KPX Ncommaaccent Aacute -20 +KPX Ncommaaccent Abreve -20 +KPX Ncommaaccent Acircumflex -20 +KPX Ncommaaccent Adieresis -20 +KPX Ncommaaccent Agrave -20 +KPX Ncommaaccent Amacron -20 +KPX Ncommaaccent Aogonek -20 +KPX Ncommaaccent Aring -20 +KPX Ncommaaccent Atilde -20 +KPX Ntilde A -20 +KPX Ntilde Aacute -20 +KPX Ntilde Abreve -20 +KPX Ntilde Acircumflex -20 +KPX Ntilde Adieresis -20 +KPX Ntilde Agrave -20 +KPX Ntilde Amacron -20 +KPX Ntilde Aogonek -20 +KPX Ntilde Aring -20 +KPX Ntilde Atilde -20 +KPX O A -40 +KPX O Aacute -40 +KPX O Abreve -40 +KPX O Acircumflex -40 +KPX O Adieresis -40 +KPX O Agrave -40 +KPX O Amacron -40 +KPX O Aogonek -40 +KPX O Aring -40 +KPX O Atilde -40 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -50 +KPX O X -40 +KPX O Y -50 +KPX O Yacute -50 +KPX O Ydieresis -50 +KPX Oacute A -40 +KPX Oacute Aacute -40 +KPX Oacute Abreve -40 +KPX Oacute Acircumflex -40 +KPX Oacute Adieresis -40 +KPX Oacute Agrave -40 +KPX Oacute Amacron -40 +KPX Oacute Aogonek -40 +KPX Oacute Aring -40 +KPX Oacute Atilde -40 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -50 +KPX Oacute X -40 +KPX Oacute Y -50 +KPX Oacute Yacute -50 +KPX Oacute Ydieresis -50 +KPX Ocircumflex A -40 +KPX Ocircumflex Aacute -40 +KPX Ocircumflex Abreve -40 +KPX Ocircumflex Acircumflex -40 +KPX Ocircumflex Adieresis -40 +KPX Ocircumflex Agrave -40 +KPX Ocircumflex Amacron -40 +KPX Ocircumflex Aogonek -40 +KPX Ocircumflex Aring -40 +KPX Ocircumflex Atilde -40 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -50 +KPX Ocircumflex X -40 +KPX Ocircumflex Y -50 +KPX Ocircumflex Yacute -50 +KPX Ocircumflex Ydieresis -50 +KPX Odieresis A -40 +KPX Odieresis Aacute -40 +KPX Odieresis Abreve -40 +KPX Odieresis Acircumflex -40 +KPX Odieresis Adieresis -40 +KPX Odieresis Agrave -40 +KPX Odieresis Amacron -40 +KPX Odieresis Aogonek -40 +KPX Odieresis Aring -40 +KPX Odieresis Atilde -40 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -50 +KPX Odieresis X -40 +KPX Odieresis Y -50 +KPX Odieresis Yacute -50 +KPX Odieresis Ydieresis -50 +KPX Ograve A -40 +KPX Ograve Aacute -40 +KPX Ograve Abreve -40 +KPX Ograve Acircumflex -40 +KPX Ograve Adieresis -40 +KPX Ograve Agrave -40 +KPX Ograve Amacron -40 +KPX Ograve Aogonek -40 +KPX Ograve Aring -40 +KPX Ograve Atilde -40 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -50 +KPX Ograve X -40 +KPX Ograve Y -50 +KPX Ograve Yacute -50 +KPX Ograve Ydieresis -50 +KPX Ohungarumlaut A -40 +KPX Ohungarumlaut Aacute -40 +KPX Ohungarumlaut Abreve -40 +KPX Ohungarumlaut Acircumflex -40 +KPX Ohungarumlaut Adieresis -40 +KPX Ohungarumlaut Agrave -40 +KPX Ohungarumlaut Amacron -40 +KPX Ohungarumlaut Aogonek -40 +KPX Ohungarumlaut Aring -40 +KPX Ohungarumlaut Atilde -40 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -50 +KPX Ohungarumlaut X -40 +KPX Ohungarumlaut Y -50 +KPX Ohungarumlaut Yacute -50 +KPX Ohungarumlaut Ydieresis -50 +KPX Omacron A -40 +KPX Omacron Aacute -40 +KPX Omacron Abreve -40 +KPX Omacron Acircumflex -40 +KPX Omacron Adieresis -40 +KPX Omacron Agrave -40 +KPX Omacron Amacron -40 +KPX Omacron Aogonek -40 +KPX Omacron Aring -40 +KPX Omacron Atilde -40 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -50 +KPX Omacron X -40 +KPX Omacron Y -50 +KPX Omacron Yacute -50 +KPX Omacron Ydieresis -50 +KPX Oslash A -40 +KPX Oslash Aacute -40 +KPX Oslash Abreve -40 +KPX Oslash Acircumflex -40 +KPX Oslash Adieresis -40 +KPX Oslash Agrave -40 +KPX Oslash Amacron -40 +KPX Oslash Aogonek -40 +KPX Oslash Aring -40 +KPX Oslash Atilde -40 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -50 +KPX Oslash X -40 +KPX Oslash Y -50 +KPX Oslash Yacute -50 +KPX Oslash Ydieresis -50 +KPX Otilde A -40 +KPX Otilde Aacute -40 +KPX Otilde Abreve -40 +KPX Otilde Acircumflex -40 +KPX Otilde Adieresis -40 +KPX Otilde Agrave -40 +KPX Otilde Amacron -40 +KPX Otilde Aogonek -40 +KPX Otilde Aring -40 +KPX Otilde Atilde -40 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -50 +KPX Otilde X -40 +KPX Otilde Y -50 +KPX Otilde Yacute -50 +KPX Otilde Ydieresis -50 +KPX P A -74 +KPX P Aacute -74 +KPX P Abreve -74 +KPX P Acircumflex -74 +KPX P Adieresis -74 +KPX P Agrave -74 +KPX P Amacron -74 +KPX P Aogonek -74 +KPX P Aring -74 +KPX P Atilde -74 +KPX P a -10 +KPX P aacute -10 +KPX P abreve -10 +KPX P acircumflex -10 +KPX P adieresis -10 +KPX P agrave -10 +KPX P amacron -10 +KPX P aogonek -10 +KPX P aring -10 +KPX P atilde -10 +KPX P comma -92 +KPX P e -20 +KPX P eacute -20 +KPX P ecaron -20 +KPX P ecircumflex -20 +KPX P edieresis -20 +KPX P edotaccent -20 +KPX P egrave -20 +KPX P emacron -20 +KPX P eogonek -20 +KPX P o -20 +KPX P oacute -20 +KPX P ocircumflex -20 +KPX P odieresis -20 +KPX P ograve -20 +KPX P ohungarumlaut -20 +KPX P omacron -20 +KPX P oslash -20 +KPX P otilde -20 +KPX P period -110 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX Q period -20 +KPX R O -30 +KPX R Oacute -30 +KPX R Ocircumflex -30 +KPX R Odieresis -30 +KPX R Ograve -30 +KPX R Ohungarumlaut -30 +KPX R Omacron -30 +KPX R Oslash -30 +KPX R Otilde -30 +KPX R T -40 +KPX R Tcaron -40 +KPX R Tcommaaccent -40 +KPX R U -30 +KPX R Uacute -30 +KPX R Ucircumflex -30 +KPX R Udieresis -30 +KPX R Ugrave -30 +KPX R Uhungarumlaut -30 +KPX R Umacron -30 +KPX R Uogonek -30 +KPX R Uring -30 +KPX R V -55 +KPX R W -35 +KPX R Y -35 +KPX R Yacute -35 +KPX R Ydieresis -35 +KPX Racute O -30 +KPX Racute Oacute -30 +KPX Racute Ocircumflex -30 +KPX Racute Odieresis -30 +KPX Racute Ograve -30 +KPX Racute Ohungarumlaut -30 +KPX Racute Omacron -30 +KPX Racute Oslash -30 +KPX Racute Otilde -30 +KPX Racute T -40 +KPX Racute Tcaron -40 +KPX Racute Tcommaaccent -40 +KPX Racute U -30 +KPX Racute Uacute -30 +KPX Racute Ucircumflex -30 +KPX Racute Udieresis -30 +KPX Racute Ugrave -30 +KPX Racute Uhungarumlaut -30 +KPX Racute Umacron -30 +KPX Racute Uogonek -30 +KPX Racute Uring -30 +KPX Racute V -55 +KPX Racute W -35 +KPX Racute Y -35 +KPX Racute Yacute -35 +KPX Racute Ydieresis -35 +KPX Rcaron O -30 +KPX Rcaron Oacute -30 +KPX Rcaron Ocircumflex -30 +KPX Rcaron Odieresis -30 +KPX Rcaron Ograve -30 +KPX Rcaron Ohungarumlaut -30 +KPX Rcaron Omacron -30 +KPX Rcaron Oslash -30 +KPX Rcaron Otilde -30 +KPX Rcaron T -40 +KPX Rcaron Tcaron -40 +KPX Rcaron Tcommaaccent -40 +KPX Rcaron U -30 +KPX Rcaron Uacute -30 +KPX Rcaron Ucircumflex -30 +KPX Rcaron Udieresis -30 +KPX Rcaron Ugrave -30 +KPX Rcaron Uhungarumlaut -30 +KPX Rcaron Umacron -30 +KPX Rcaron Uogonek -30 +KPX Rcaron Uring -30 +KPX Rcaron V -55 +KPX Rcaron W -35 +KPX Rcaron Y -35 +KPX Rcaron Yacute -35 +KPX Rcaron Ydieresis -35 +KPX Rcommaaccent O -30 +KPX Rcommaaccent Oacute -30 +KPX Rcommaaccent Ocircumflex -30 +KPX Rcommaaccent Odieresis -30 +KPX Rcommaaccent Ograve -30 +KPX Rcommaaccent Ohungarumlaut -30 +KPX Rcommaaccent Omacron -30 +KPX Rcommaaccent Oslash -30 +KPX Rcommaaccent Otilde -30 +KPX Rcommaaccent T -40 +KPX Rcommaaccent Tcaron -40 +KPX Rcommaaccent Tcommaaccent -40 +KPX Rcommaaccent U -30 +KPX Rcommaaccent Uacute -30 +KPX Rcommaaccent Ucircumflex -30 +KPX Rcommaaccent Udieresis -30 +KPX Rcommaaccent Ugrave -30 +KPX Rcommaaccent Uhungarumlaut -30 +KPX Rcommaaccent Umacron -30 +KPX Rcommaaccent Uogonek -30 +KPX Rcommaaccent Uring -30 +KPX Rcommaaccent V -55 +KPX Rcommaaccent W -35 +KPX Rcommaaccent Y -35 +KPX Rcommaaccent Yacute -35 +KPX Rcommaaccent Ydieresis -35 +KPX T A -90 +KPX T Aacute -90 +KPX T Abreve -90 +KPX T Acircumflex -90 +KPX T Adieresis -90 +KPX T Agrave -90 +KPX T Amacron -90 +KPX T Aogonek -90 +KPX T Aring -90 +KPX T Atilde -90 +KPX T O -18 +KPX T Oacute -18 +KPX T Ocircumflex -18 +KPX T Odieresis -18 +KPX T Ograve -18 +KPX T Ohungarumlaut -18 +KPX T Omacron -18 +KPX T Oslash -18 +KPX T Otilde -18 +KPX T a -92 +KPX T aacute -92 +KPX T abreve -52 +KPX T acircumflex -52 +KPX T adieresis -52 +KPX T agrave -52 +KPX T amacron -52 +KPX T aogonek -92 +KPX T aring -92 +KPX T atilde -52 +KPX T colon -74 +KPX T comma -74 +KPX T e -92 +KPX T eacute -92 +KPX T ecaron -92 +KPX T ecircumflex -92 +KPX T edieresis -52 +KPX T edotaccent -92 +KPX T egrave -52 +KPX T emacron -52 +KPX T eogonek -92 +KPX T hyphen -92 +KPX T i -18 +KPX T iacute -18 +KPX T iogonek -18 +KPX T o -92 +KPX T oacute -92 +KPX T ocircumflex -92 +KPX T odieresis -92 +KPX T ograve -92 +KPX T ohungarumlaut -92 +KPX T omacron -92 +KPX T oslash -92 +KPX T otilde -92 +KPX T period -90 +KPX T r -74 +KPX T racute -74 +KPX T rcaron -74 +KPX T rcommaaccent -74 +KPX T semicolon -74 +KPX T u -92 +KPX T uacute -92 +KPX T ucircumflex -92 +KPX T udieresis -92 +KPX T ugrave -92 +KPX T uhungarumlaut -92 +KPX T umacron -92 +KPX T uogonek -92 +KPX T uring -92 +KPX T w -74 +KPX T y -34 +KPX T yacute -34 +KPX T ydieresis -34 +KPX Tcaron A -90 +KPX Tcaron Aacute -90 +KPX Tcaron Abreve -90 +KPX Tcaron Acircumflex -90 +KPX Tcaron Adieresis -90 +KPX Tcaron Agrave -90 +KPX Tcaron Amacron -90 +KPX Tcaron Aogonek -90 +KPX Tcaron Aring -90 +KPX Tcaron Atilde -90 +KPX Tcaron O -18 +KPX Tcaron Oacute -18 +KPX Tcaron Ocircumflex -18 +KPX Tcaron Odieresis -18 +KPX Tcaron Ograve -18 +KPX Tcaron Ohungarumlaut -18 +KPX Tcaron Omacron -18 +KPX Tcaron Oslash -18 +KPX Tcaron Otilde -18 +KPX Tcaron a -92 +KPX Tcaron aacute -92 +KPX Tcaron abreve -52 +KPX Tcaron acircumflex -52 +KPX Tcaron adieresis -52 +KPX Tcaron agrave -52 +KPX Tcaron amacron -52 +KPX Tcaron aogonek -92 +KPX Tcaron aring -92 +KPX Tcaron atilde -52 +KPX Tcaron colon -74 +KPX Tcaron comma -74 +KPX Tcaron e -92 +KPX Tcaron eacute -92 +KPX Tcaron ecaron -92 +KPX Tcaron ecircumflex -92 +KPX Tcaron edieresis -52 +KPX Tcaron edotaccent -92 +KPX Tcaron egrave -52 +KPX Tcaron emacron -52 +KPX Tcaron eogonek -92 +KPX Tcaron hyphen -92 +KPX Tcaron i -18 +KPX Tcaron iacute -18 +KPX Tcaron iogonek -18 +KPX Tcaron o -92 +KPX Tcaron oacute -92 +KPX Tcaron ocircumflex -92 +KPX Tcaron odieresis -92 +KPX Tcaron ograve -92 +KPX Tcaron ohungarumlaut -92 +KPX Tcaron omacron -92 +KPX Tcaron oslash -92 +KPX Tcaron otilde -92 +KPX Tcaron period -90 +KPX Tcaron r -74 +KPX Tcaron racute -74 +KPX Tcaron rcaron -74 +KPX Tcaron rcommaaccent -74 +KPX Tcaron semicolon -74 +KPX Tcaron u -92 +KPX Tcaron uacute -92 +KPX Tcaron ucircumflex -92 +KPX Tcaron udieresis -92 +KPX Tcaron ugrave -92 +KPX Tcaron uhungarumlaut -92 +KPX Tcaron umacron -92 +KPX Tcaron uogonek -92 +KPX Tcaron uring -92 +KPX Tcaron w -74 +KPX Tcaron y -34 +KPX Tcaron yacute -34 +KPX Tcaron ydieresis -34 +KPX Tcommaaccent A -90 +KPX Tcommaaccent Aacute -90 +KPX Tcommaaccent Abreve -90 +KPX Tcommaaccent Acircumflex -90 +KPX Tcommaaccent Adieresis -90 +KPX Tcommaaccent Agrave -90 +KPX Tcommaaccent Amacron -90 +KPX Tcommaaccent Aogonek -90 +KPX Tcommaaccent Aring -90 +KPX Tcommaaccent Atilde -90 +KPX Tcommaaccent O -18 +KPX Tcommaaccent Oacute -18 +KPX Tcommaaccent Ocircumflex -18 +KPX Tcommaaccent Odieresis -18 +KPX Tcommaaccent Ograve -18 +KPX Tcommaaccent Ohungarumlaut -18 +KPX Tcommaaccent Omacron -18 +KPX Tcommaaccent Oslash -18 +KPX Tcommaaccent Otilde -18 +KPX Tcommaaccent a -92 +KPX Tcommaaccent aacute -92 +KPX Tcommaaccent abreve -52 +KPX Tcommaaccent acircumflex -52 +KPX Tcommaaccent adieresis -52 +KPX Tcommaaccent agrave -52 +KPX Tcommaaccent amacron -52 +KPX Tcommaaccent aogonek -92 +KPX Tcommaaccent aring -92 +KPX Tcommaaccent atilde -52 +KPX Tcommaaccent colon -74 +KPX Tcommaaccent comma -74 +KPX Tcommaaccent e -92 +KPX Tcommaaccent eacute -92 +KPX Tcommaaccent ecaron -92 +KPX Tcommaaccent ecircumflex -92 +KPX Tcommaaccent edieresis -52 +KPX Tcommaaccent edotaccent -92 +KPX Tcommaaccent egrave -52 +KPX Tcommaaccent emacron -52 +KPX Tcommaaccent eogonek -92 +KPX Tcommaaccent hyphen -92 +KPX Tcommaaccent i -18 +KPX Tcommaaccent iacute -18 +KPX Tcommaaccent iogonek -18 +KPX Tcommaaccent o -92 +KPX Tcommaaccent oacute -92 +KPX Tcommaaccent ocircumflex -92 +KPX Tcommaaccent odieresis -92 +KPX Tcommaaccent ograve -92 +KPX Tcommaaccent ohungarumlaut -92 +KPX Tcommaaccent omacron -92 +KPX Tcommaaccent oslash -92 +KPX Tcommaaccent otilde -92 +KPX Tcommaaccent period -90 +KPX Tcommaaccent r -74 +KPX Tcommaaccent racute -74 +KPX Tcommaaccent rcaron -74 +KPX Tcommaaccent rcommaaccent -74 +KPX Tcommaaccent semicolon -74 +KPX Tcommaaccent u -92 +KPX Tcommaaccent uacute -92 +KPX Tcommaaccent ucircumflex -92 +KPX Tcommaaccent udieresis -92 +KPX Tcommaaccent ugrave -92 +KPX Tcommaaccent uhungarumlaut -92 +KPX Tcommaaccent umacron -92 +KPX Tcommaaccent uogonek -92 +KPX Tcommaaccent uring -92 +KPX Tcommaaccent w -74 +KPX Tcommaaccent y -34 +KPX Tcommaaccent yacute -34 +KPX Tcommaaccent ydieresis -34 +KPX U A -60 +KPX U Aacute -60 +KPX U Abreve -60 +KPX U Acircumflex -60 +KPX U Adieresis -60 +KPX U Agrave -60 +KPX U Amacron -60 +KPX U Aogonek -60 +KPX U Aring -60 +KPX U Atilde -60 +KPX U comma -50 +KPX U period -50 +KPX Uacute A -60 +KPX Uacute Aacute -60 +KPX Uacute Abreve -60 +KPX Uacute Acircumflex -60 +KPX Uacute Adieresis -60 +KPX Uacute Agrave -60 +KPX Uacute Amacron -60 +KPX Uacute Aogonek -60 +KPX Uacute Aring -60 +KPX Uacute Atilde -60 +KPX Uacute comma -50 +KPX Uacute period -50 +KPX Ucircumflex A -60 +KPX Ucircumflex Aacute -60 +KPX Ucircumflex Abreve -60 +KPX Ucircumflex Acircumflex -60 +KPX Ucircumflex Adieresis -60 +KPX Ucircumflex Agrave -60 +KPX Ucircumflex Amacron -60 +KPX Ucircumflex Aogonek -60 +KPX Ucircumflex Aring -60 +KPX Ucircumflex Atilde -60 +KPX Ucircumflex comma -50 +KPX Ucircumflex period -50 +KPX Udieresis A -60 +KPX Udieresis Aacute -60 +KPX Udieresis Abreve -60 +KPX Udieresis Acircumflex -60 +KPX Udieresis Adieresis -60 +KPX Udieresis Agrave -60 +KPX Udieresis Amacron -60 +KPX Udieresis Aogonek -60 +KPX Udieresis Aring -60 +KPX Udieresis Atilde -60 +KPX Udieresis comma -50 +KPX Udieresis period -50 +KPX Ugrave A -60 +KPX Ugrave Aacute -60 +KPX Ugrave Abreve -60 +KPX Ugrave Acircumflex -60 +KPX Ugrave Adieresis -60 +KPX Ugrave Agrave -60 +KPX Ugrave Amacron -60 +KPX Ugrave Aogonek -60 +KPX Ugrave Aring -60 +KPX Ugrave Atilde -60 +KPX Ugrave comma -50 +KPX Ugrave period -50 +KPX Uhungarumlaut A -60 +KPX Uhungarumlaut Aacute -60 +KPX Uhungarumlaut Abreve -60 +KPX Uhungarumlaut Acircumflex -60 +KPX Uhungarumlaut Adieresis -60 +KPX Uhungarumlaut Agrave -60 +KPX Uhungarumlaut Amacron -60 +KPX Uhungarumlaut Aogonek -60 +KPX Uhungarumlaut Aring -60 +KPX Uhungarumlaut Atilde -60 +KPX Uhungarumlaut comma -50 +KPX Uhungarumlaut period -50 +KPX Umacron A -60 +KPX Umacron Aacute -60 +KPX Umacron Abreve -60 +KPX Umacron Acircumflex -60 +KPX Umacron Adieresis -60 +KPX Umacron Agrave -60 +KPX Umacron Amacron -60 +KPX Umacron Aogonek -60 +KPX Umacron Aring -60 +KPX Umacron Atilde -60 +KPX Umacron comma -50 +KPX Umacron period -50 +KPX Uogonek A -60 +KPX Uogonek Aacute -60 +KPX Uogonek Abreve -60 +KPX Uogonek Acircumflex -60 +KPX Uogonek Adieresis -60 +KPX Uogonek Agrave -60 +KPX Uogonek Amacron -60 +KPX Uogonek Aogonek -60 +KPX Uogonek Aring -60 +KPX Uogonek Atilde -60 +KPX Uogonek comma -50 +KPX Uogonek period -50 +KPX Uring A -60 +KPX Uring Aacute -60 +KPX Uring Abreve -60 +KPX Uring Acircumflex -60 +KPX Uring Adieresis -60 +KPX Uring Agrave -60 +KPX Uring Amacron -60 +KPX Uring Aogonek -60 +KPX Uring Aring -60 +KPX Uring Atilde -60 +KPX Uring comma -50 +KPX Uring period -50 +KPX V A -135 +KPX V Aacute -135 +KPX V Abreve -135 +KPX V Acircumflex -135 +KPX V Adieresis -135 +KPX V Agrave -135 +KPX V Amacron -135 +KPX V Aogonek -135 +KPX V Aring -135 +KPX V Atilde -135 +KPX V G -30 +KPX V Gbreve -30 +KPX V Gcommaaccent -30 +KPX V O -45 +KPX V Oacute -45 +KPX V Ocircumflex -45 +KPX V Odieresis -45 +KPX V Ograve -45 +KPX V Ohungarumlaut -45 +KPX V Omacron -45 +KPX V Oslash -45 +KPX V Otilde -45 +KPX V a -92 +KPX V aacute -92 +KPX V abreve -92 +KPX V acircumflex -92 +KPX V adieresis -92 +KPX V agrave -92 +KPX V amacron -92 +KPX V aogonek -92 +KPX V aring -92 +KPX V atilde -92 +KPX V colon -92 +KPX V comma -129 +KPX V e -100 +KPX V eacute -100 +KPX V ecaron -100 +KPX V ecircumflex -100 +KPX V edieresis -100 +KPX V edotaccent -100 +KPX V egrave -100 +KPX V emacron -100 +KPX V eogonek -100 +KPX V hyphen -74 +KPX V i -37 +KPX V iacute -37 +KPX V icircumflex -37 +KPX V idieresis -37 +KPX V igrave -37 +KPX V imacron -37 +KPX V iogonek -37 +KPX V o -100 +KPX V oacute -100 +KPX V ocircumflex -100 +KPX V odieresis -100 +KPX V ograve -100 +KPX V ohungarumlaut -100 +KPX V omacron -100 +KPX V oslash -100 +KPX V otilde -100 +KPX V period -145 +KPX V semicolon -92 +KPX V u -92 +KPX V uacute -92 +KPX V ucircumflex -92 +KPX V udieresis -92 +KPX V ugrave -92 +KPX V uhungarumlaut -92 +KPX V umacron -92 +KPX V uogonek -92 +KPX V uring -92 +KPX W A -120 +KPX W Aacute -120 +KPX W Abreve -120 +KPX W Acircumflex -120 +KPX W Adieresis -120 +KPX W Agrave -120 +KPX W Amacron -120 +KPX W Aogonek -120 +KPX W Aring -120 +KPX W Atilde -120 +KPX W O -10 +KPX W Oacute -10 +KPX W Ocircumflex -10 +KPX W Odieresis -10 +KPX W Ograve -10 +KPX W Ohungarumlaut -10 +KPX W Omacron -10 +KPX W Oslash -10 +KPX W Otilde -10 +KPX W a -65 +KPX W aacute -65 +KPX W abreve -65 +KPX W acircumflex -65 +KPX W adieresis -65 +KPX W agrave -65 +KPX W amacron -65 +KPX W aogonek -65 +KPX W aring -65 +KPX W atilde -65 +KPX W colon -55 +KPX W comma -92 +KPX W e -65 +KPX W eacute -65 +KPX W ecaron -65 +KPX W ecircumflex -65 +KPX W edieresis -65 +KPX W edotaccent -65 +KPX W egrave -65 +KPX W emacron -65 +KPX W eogonek -65 +KPX W hyphen -37 +KPX W i -18 +KPX W iacute -18 +KPX W iogonek -18 +KPX W o -75 +KPX W oacute -75 +KPX W ocircumflex -75 +KPX W odieresis -75 +KPX W ograve -75 +KPX W ohungarumlaut -75 +KPX W omacron -75 +KPX W oslash -75 +KPX W otilde -75 +KPX W period -92 +KPX W semicolon -55 +KPX W u -50 +KPX W uacute -50 +KPX W ucircumflex -50 +KPX W udieresis -50 +KPX W ugrave -50 +KPX W uhungarumlaut -50 +KPX W umacron -50 +KPX W uogonek -50 +KPX W uring -50 +KPX W y -60 +KPX W yacute -60 +KPX W ydieresis -60 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -35 +KPX Y Oacute -35 +KPX Y Ocircumflex -35 +KPX Y Odieresis -35 +KPX Y Ograve -35 +KPX Y Ohungarumlaut -35 +KPX Y Omacron -35 +KPX Y Oslash -35 +KPX Y Otilde -35 +KPX Y a -85 +KPX Y aacute -85 +KPX Y abreve -85 +KPX Y acircumflex -85 +KPX Y adieresis -85 +KPX Y agrave -85 +KPX Y amacron -85 +KPX Y aogonek -85 +KPX Y aring -85 +KPX Y atilde -85 +KPX Y colon -92 +KPX Y comma -92 +KPX Y e -111 +KPX Y eacute -111 +KPX Y ecaron -111 +KPX Y ecircumflex -111 +KPX Y edieresis -71 +KPX Y edotaccent -111 +KPX Y egrave -71 +KPX Y emacron -71 +KPX Y eogonek -111 +KPX Y hyphen -92 +KPX Y i -37 +KPX Y iacute -37 +KPX Y iogonek -37 +KPX Y o -111 +KPX Y oacute -111 +KPX Y ocircumflex -111 +KPX Y odieresis -111 +KPX Y ograve -111 +KPX Y ohungarumlaut -111 +KPX Y omacron -111 +KPX Y oslash -111 +KPX Y otilde -111 +KPX Y period -92 +KPX Y semicolon -92 +KPX Y u -92 +KPX Y uacute -92 +KPX Y ucircumflex -92 +KPX Y udieresis -92 +KPX Y ugrave -92 +KPX Y uhungarumlaut -92 +KPX Y umacron -92 +KPX Y uogonek -92 +KPX Y uring -92 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -35 +KPX Yacute Oacute -35 +KPX Yacute Ocircumflex -35 +KPX Yacute Odieresis -35 +KPX Yacute Ograve -35 +KPX Yacute Ohungarumlaut -35 +KPX Yacute Omacron -35 +KPX Yacute Oslash -35 +KPX Yacute Otilde -35 +KPX Yacute a -85 +KPX Yacute aacute -85 +KPX Yacute abreve -85 +KPX Yacute acircumflex -85 +KPX Yacute adieresis -85 +KPX Yacute agrave -85 +KPX Yacute amacron -85 +KPX Yacute aogonek -85 +KPX Yacute aring -85 +KPX Yacute atilde -85 +KPX Yacute colon -92 +KPX Yacute comma -92 +KPX Yacute e -111 +KPX Yacute eacute -111 +KPX Yacute ecaron -111 +KPX Yacute ecircumflex -111 +KPX Yacute edieresis -71 +KPX Yacute edotaccent -111 +KPX Yacute egrave -71 +KPX Yacute emacron -71 +KPX Yacute eogonek -111 +KPX Yacute hyphen -92 +KPX Yacute i -37 +KPX Yacute iacute -37 +KPX Yacute iogonek -37 +KPX Yacute o -111 +KPX Yacute oacute -111 +KPX Yacute ocircumflex -111 +KPX Yacute odieresis -111 +KPX Yacute ograve -111 +KPX Yacute ohungarumlaut -111 +KPX Yacute omacron -111 +KPX Yacute oslash -111 +KPX Yacute otilde -111 +KPX Yacute period -92 +KPX Yacute semicolon -92 +KPX Yacute u -92 +KPX Yacute uacute -92 +KPX Yacute ucircumflex -92 +KPX Yacute udieresis -92 +KPX Yacute ugrave -92 +KPX Yacute uhungarumlaut -92 +KPX Yacute umacron -92 +KPX Yacute uogonek -92 +KPX Yacute uring -92 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -35 +KPX Ydieresis Oacute -35 +KPX Ydieresis Ocircumflex -35 +KPX Ydieresis Odieresis -35 +KPX Ydieresis Ograve -35 +KPX Ydieresis Ohungarumlaut -35 +KPX Ydieresis Omacron -35 +KPX Ydieresis Oslash -35 +KPX Ydieresis Otilde -35 +KPX Ydieresis a -85 +KPX Ydieresis aacute -85 +KPX Ydieresis abreve -85 +KPX Ydieresis acircumflex -85 +KPX Ydieresis adieresis -85 +KPX Ydieresis agrave -85 +KPX Ydieresis amacron -85 +KPX Ydieresis aogonek -85 +KPX Ydieresis aring -85 +KPX Ydieresis atilde -85 +KPX Ydieresis colon -92 +KPX Ydieresis comma -92 +KPX Ydieresis e -111 +KPX Ydieresis eacute -111 +KPX Ydieresis ecaron -111 +KPX Ydieresis ecircumflex -111 +KPX Ydieresis edieresis -71 +KPX Ydieresis edotaccent -111 +KPX Ydieresis egrave -71 +KPX Ydieresis emacron -71 +KPX Ydieresis eogonek -111 +KPX Ydieresis hyphen -92 +KPX Ydieresis i -37 +KPX Ydieresis iacute -37 +KPX Ydieresis iogonek -37 +KPX Ydieresis o -111 +KPX Ydieresis oacute -111 +KPX Ydieresis ocircumflex -111 +KPX Ydieresis odieresis -111 +KPX Ydieresis ograve -111 +KPX Ydieresis ohungarumlaut -111 +KPX Ydieresis omacron -111 +KPX Ydieresis oslash -111 +KPX Ydieresis otilde -111 +KPX Ydieresis period -92 +KPX Ydieresis semicolon -92 +KPX Ydieresis u -92 +KPX Ydieresis uacute -92 +KPX Ydieresis ucircumflex -92 +KPX Ydieresis udieresis -92 +KPX Ydieresis ugrave -92 +KPX Ydieresis uhungarumlaut -92 +KPX Ydieresis umacron -92 +KPX Ydieresis uogonek -92 +KPX Ydieresis uring -92 +KPX a v -25 +KPX aacute v -25 +KPX abreve v -25 +KPX acircumflex v -25 +KPX adieresis v -25 +KPX agrave v -25 +KPX amacron v -25 +KPX aogonek v -25 +KPX aring v -25 +KPX atilde v -25 +KPX b b -10 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -15 +KPX comma quotedblright -45 +KPX comma quoteright -55 +KPX d w -15 +KPX dcroat w -15 +KPX e v -15 +KPX eacute v -15 +KPX ecaron v -15 +KPX ecircumflex v -15 +KPX edieresis v -15 +KPX edotaccent v -15 +KPX egrave v -15 +KPX emacron v -15 +KPX eogonek v -15 +KPX f comma -15 +KPX f dotlessi -35 +KPX f i -25 +KPX f o -25 +KPX f oacute -25 +KPX f ocircumflex -25 +KPX f odieresis -25 +KPX f ograve -25 +KPX f ohungarumlaut -25 +KPX f omacron -25 +KPX f oslash -25 +KPX f otilde -25 +KPX f period -15 +KPX f quotedblright 50 +KPX f quoteright 55 +KPX g period -15 +KPX gbreve period -15 +KPX gcommaaccent period -15 +KPX h y -15 +KPX h yacute -15 +KPX h ydieresis -15 +KPX i v -10 +KPX iacute v -10 +KPX icircumflex v -10 +KPX idieresis v -10 +KPX igrave v -10 +KPX imacron v -10 +KPX iogonek v -10 +KPX k e -10 +KPX k eacute -10 +KPX k ecaron -10 +KPX k ecircumflex -10 +KPX k edieresis -10 +KPX k edotaccent -10 +KPX k egrave -10 +KPX k emacron -10 +KPX k eogonek -10 +KPX k o -15 +KPX k oacute -15 +KPX k ocircumflex -15 +KPX k odieresis -15 +KPX k ograve -15 +KPX k ohungarumlaut -15 +KPX k omacron -15 +KPX k oslash -15 +KPX k otilde -15 +KPX k y -15 +KPX k yacute -15 +KPX k ydieresis -15 +KPX kcommaaccent e -10 +KPX kcommaaccent eacute -10 +KPX kcommaaccent ecaron -10 +KPX kcommaaccent ecircumflex -10 +KPX kcommaaccent edieresis -10 +KPX kcommaaccent edotaccent -10 +KPX kcommaaccent egrave -10 +KPX kcommaaccent emacron -10 +KPX kcommaaccent eogonek -10 +KPX kcommaaccent o -15 +KPX kcommaaccent oacute -15 +KPX kcommaaccent ocircumflex -15 +KPX kcommaaccent odieresis -15 +KPX kcommaaccent ograve -15 +KPX kcommaaccent ohungarumlaut -15 +KPX kcommaaccent omacron -15 +KPX kcommaaccent oslash -15 +KPX kcommaaccent otilde -15 +KPX kcommaaccent y -15 +KPX kcommaaccent yacute -15 +KPX kcommaaccent ydieresis -15 +KPX n v -40 +KPX nacute v -40 +KPX ncaron v -40 +KPX ncommaaccent v -40 +KPX ntilde v -40 +KPX o v -10 +KPX o w -10 +KPX oacute v -10 +KPX oacute w -10 +KPX ocircumflex v -10 +KPX ocircumflex w -10 +KPX odieresis v -10 +KPX odieresis w -10 +KPX ograve v -10 +KPX ograve w -10 +KPX ohungarumlaut v -10 +KPX ohungarumlaut w -10 +KPX omacron v -10 +KPX omacron w -10 +KPX oslash v -10 +KPX oslash w -10 +KPX otilde v -10 +KPX otilde w -10 +KPX period quotedblright -55 +KPX period quoteright -55 +KPX quotedblleft A -10 +KPX quotedblleft Aacute -10 +KPX quotedblleft Abreve -10 +KPX quotedblleft Acircumflex -10 +KPX quotedblleft Adieresis -10 +KPX quotedblleft Agrave -10 +KPX quotedblleft Amacron -10 +KPX quotedblleft Aogonek -10 +KPX quotedblleft Aring -10 +KPX quotedblleft Atilde -10 +KPX quoteleft A -10 +KPX quoteleft Aacute -10 +KPX quoteleft Abreve -10 +KPX quoteleft Acircumflex -10 +KPX quoteleft Adieresis -10 +KPX quoteleft Agrave -10 +KPX quoteleft Amacron -10 +KPX quoteleft Aogonek -10 +KPX quoteleft Aring -10 +KPX quoteleft Atilde -10 +KPX quoteleft quoteleft -63 +KPX quoteright d -20 +KPX quoteright dcroat -20 +KPX quoteright quoteright -63 +KPX quoteright r -20 +KPX quoteright racute -20 +KPX quoteright rcaron -20 +KPX quoteright rcommaaccent -20 +KPX quoteright s -37 +KPX quoteright sacute -37 +KPX quoteright scaron -37 +KPX quoteright scedilla -37 +KPX quoteright scommaaccent -37 +KPX quoteright space -74 +KPX quoteright v -20 +KPX r c -18 +KPX r cacute -18 +KPX r ccaron -18 +KPX r ccedilla -18 +KPX r comma -92 +KPX r e -18 +KPX r eacute -18 +KPX r ecaron -18 +KPX r ecircumflex -18 +KPX r edieresis -18 +KPX r edotaccent -18 +KPX r egrave -18 +KPX r emacron -18 +KPX r eogonek -18 +KPX r g -10 +KPX r gbreve -10 +KPX r gcommaaccent -10 +KPX r hyphen -37 +KPX r n -15 +KPX r nacute -15 +KPX r ncaron -15 +KPX r ncommaaccent -15 +KPX r ntilde -15 +KPX r o -18 +KPX r oacute -18 +KPX r ocircumflex -18 +KPX r odieresis -18 +KPX r ograve -18 +KPX r ohungarumlaut -18 +KPX r omacron -18 +KPX r oslash -18 +KPX r otilde -18 +KPX r p -10 +KPX r period -100 +KPX r q -18 +KPX r v -10 +KPX racute c -18 +KPX racute cacute -18 +KPX racute ccaron -18 +KPX racute ccedilla -18 +KPX racute comma -92 +KPX racute e -18 +KPX racute eacute -18 +KPX racute ecaron -18 +KPX racute ecircumflex -18 +KPX racute edieresis -18 +KPX racute edotaccent -18 +KPX racute egrave -18 +KPX racute emacron -18 +KPX racute eogonek -18 +KPX racute g -10 +KPX racute gbreve -10 +KPX racute gcommaaccent -10 +KPX racute hyphen -37 +KPX racute n -15 +KPX racute nacute -15 +KPX racute ncaron -15 +KPX racute ncommaaccent -15 +KPX racute ntilde -15 +KPX racute o -18 +KPX racute oacute -18 +KPX racute ocircumflex -18 +KPX racute odieresis -18 +KPX racute ograve -18 +KPX racute ohungarumlaut -18 +KPX racute omacron -18 +KPX racute oslash -18 +KPX racute otilde -18 +KPX racute p -10 +KPX racute period -100 +KPX racute q -18 +KPX racute v -10 +KPX rcaron c -18 +KPX rcaron cacute -18 +KPX rcaron ccaron -18 +KPX rcaron ccedilla -18 +KPX rcaron comma -92 +KPX rcaron e -18 +KPX rcaron eacute -18 +KPX rcaron ecaron -18 +KPX rcaron ecircumflex -18 +KPX rcaron edieresis -18 +KPX rcaron edotaccent -18 +KPX rcaron egrave -18 +KPX rcaron emacron -18 +KPX rcaron eogonek -18 +KPX rcaron g -10 +KPX rcaron gbreve -10 +KPX rcaron gcommaaccent -10 +KPX rcaron hyphen -37 +KPX rcaron n -15 +KPX rcaron nacute -15 +KPX rcaron ncaron -15 +KPX rcaron ncommaaccent -15 +KPX rcaron ntilde -15 +KPX rcaron o -18 +KPX rcaron oacute -18 +KPX rcaron ocircumflex -18 +KPX rcaron odieresis -18 +KPX rcaron ograve -18 +KPX rcaron ohungarumlaut -18 +KPX rcaron omacron -18 +KPX rcaron oslash -18 +KPX rcaron otilde -18 +KPX rcaron p -10 +KPX rcaron period -100 +KPX rcaron q -18 +KPX rcaron v -10 +KPX rcommaaccent c -18 +KPX rcommaaccent cacute -18 +KPX rcommaaccent ccaron -18 +KPX rcommaaccent ccedilla -18 +KPX rcommaaccent comma -92 +KPX rcommaaccent e -18 +KPX rcommaaccent eacute -18 +KPX rcommaaccent ecaron -18 +KPX rcommaaccent ecircumflex -18 +KPX rcommaaccent edieresis -18 +KPX rcommaaccent edotaccent -18 +KPX rcommaaccent egrave -18 +KPX rcommaaccent emacron -18 +KPX rcommaaccent eogonek -18 +KPX rcommaaccent g -10 +KPX rcommaaccent gbreve -10 +KPX rcommaaccent gcommaaccent -10 +KPX rcommaaccent hyphen -37 +KPX rcommaaccent n -15 +KPX rcommaaccent nacute -15 +KPX rcommaaccent ncaron -15 +KPX rcommaaccent ncommaaccent -15 +KPX rcommaaccent ntilde -15 +KPX rcommaaccent o -18 +KPX rcommaaccent oacute -18 +KPX rcommaaccent ocircumflex -18 +KPX rcommaaccent odieresis -18 +KPX rcommaaccent ograve -18 +KPX rcommaaccent ohungarumlaut -18 +KPX rcommaaccent omacron -18 +KPX rcommaaccent oslash -18 +KPX rcommaaccent otilde -18 +KPX rcommaaccent p -10 +KPX rcommaaccent period -100 +KPX rcommaaccent q -18 +KPX rcommaaccent v -10 +KPX space A -55 +KPX space Aacute -55 +KPX space Abreve -55 +KPX space Acircumflex -55 +KPX space Adieresis -55 +KPX space Agrave -55 +KPX space Amacron -55 +KPX space Aogonek -55 +KPX space Aring -55 +KPX space Atilde -55 +KPX space T -30 +KPX space Tcaron -30 +KPX space Tcommaaccent -30 +KPX space V -45 +KPX space W -30 +KPX space Y -55 +KPX space Yacute -55 +KPX space Ydieresis -55 +KPX v a -10 +KPX v aacute -10 +KPX v abreve -10 +KPX v acircumflex -10 +KPX v adieresis -10 +KPX v agrave -10 +KPX v amacron -10 +KPX v aogonek -10 +KPX v aring -10 +KPX v atilde -10 +KPX v comma -55 +KPX v e -10 +KPX v eacute -10 +KPX v ecaron -10 +KPX v ecircumflex -10 +KPX v edieresis -10 +KPX v edotaccent -10 +KPX v egrave -10 +KPX v emacron -10 +KPX v eogonek -10 +KPX v o -10 +KPX v oacute -10 +KPX v ocircumflex -10 +KPX v odieresis -10 +KPX v ograve -10 +KPX v ohungarumlaut -10 +KPX v omacron -10 +KPX v oslash -10 +KPX v otilde -10 +KPX v period -70 +KPX w comma -55 +KPX w o -10 +KPX w oacute -10 +KPX w ocircumflex -10 +KPX w odieresis -10 +KPX w ograve -10 +KPX w ohungarumlaut -10 +KPX w omacron -10 +KPX w oslash -10 +KPX w otilde -10 +KPX w period -70 +KPX y comma -55 +KPX y e -10 +KPX y eacute -10 +KPX y ecaron -10 +KPX y ecircumflex -10 +KPX y edieresis -10 +KPX y edotaccent -10 +KPX y egrave -10 +KPX y emacron -10 +KPX y eogonek -10 +KPX y o -25 +KPX y oacute -25 +KPX y ocircumflex -25 +KPX y odieresis -25 +KPX y ograve -25 +KPX y ohungarumlaut -25 +KPX y omacron -25 +KPX y oslash -25 +KPX y otilde -25 +KPX y period -70 +KPX yacute comma -55 +KPX yacute e -10 +KPX yacute eacute -10 +KPX yacute ecaron -10 +KPX yacute ecircumflex -10 +KPX yacute edieresis -10 +KPX yacute edotaccent -10 +KPX yacute egrave -10 +KPX yacute emacron -10 +KPX yacute eogonek -10 +KPX yacute o -25 +KPX yacute oacute -25 +KPX yacute ocircumflex -25 +KPX yacute odieresis -25 +KPX yacute ograve -25 +KPX yacute ohungarumlaut -25 +KPX yacute omacron -25 +KPX yacute oslash -25 +KPX yacute otilde -25 +KPX yacute period -70 +KPX ydieresis comma -55 +KPX ydieresis e -10 +KPX ydieresis eacute -10 +KPX ydieresis ecaron -10 +KPX ydieresis ecircumflex -10 +KPX ydieresis edieresis -10 +KPX ydieresis edotaccent -10 +KPX ydieresis egrave -10 +KPX ydieresis emacron -10 +KPX ydieresis eogonek -10 +KPX ydieresis o -25 +KPX ydieresis oacute -25 +KPX ydieresis ocircumflex -25 +KPX ydieresis odieresis -25 +KPX ydieresis ograve -25 +KPX ydieresis ohungarumlaut -25 +KPX ydieresis omacron -25 +KPX ydieresis oslash -25 +KPX ydieresis otilde -25 +KPX ydieresis period -70 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Times-Bold.afm.php b/application/third_party/dompdf/lib/fonts/Times-Bold.afm.php new file mode 100755 index 00000000..c925535c --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Times-Bold.afm.php @@ -0,0 +1,570 @@ + + array ( + 32 => 'space', + 160 => 'space', + 33 => 'exclam', + 34 => 'quotedbl', + 35 => 'numbersign', + 36 => 'dollar', + 37 => 'percent', + 38 => 'ampersand', + 146 => 'quoteright', + 40 => 'parenleft', + 41 => 'parenright', + 42 => 'asterisk', + 43 => 'plus', + 44 => 'comma', + 45 => 'hyphen', + 173 => 'hyphen', + 46 => 'period', + 47 => 'slash', + 48 => 'zero', + 49 => 'one', + 50 => 'two', + 51 => 'three', + 52 => 'four', + 53 => 'five', + 54 => 'six', + 55 => 'seven', + 56 => 'eight', + 57 => 'nine', + 58 => 'colon', + 59 => 'semicolon', + 60 => 'less', + 61 => 'equal', + 62 => 'greater', + 63 => 'question', + 64 => 'at', + 65 => 'A', + 66 => 'B', + 67 => 'C', + 68 => 'D', + 69 => 'E', + 70 => 'F', + 71 => 'G', + 72 => 'H', + 73 => 'I', + 74 => 'J', + 75 => 'K', + 76 => 'L', + 77 => 'M', + 78 => 'N', + 79 => 'O', + 80 => 'P', + 81 => 'Q', + 82 => 'R', + 83 => 'S', + 84 => 'T', + 85 => 'U', + 86 => 'V', + 87 => 'W', + 88 => 'X', + 89 => 'Y', + 90 => 'Z', + 91 => 'bracketleft', + 92 => 'backslash', + 93 => 'bracketright', + 94 => 'asciicircum', + 95 => 'underscore', + 145 => 'quoteleft', + 97 => 'a', + 98 => 'b', + 99 => 'c', + 100 => 'd', + 101 => 'e', + 102 => 'f', + 103 => 'g', + 104 => 'h', + 105 => 'i', + 106 => 'j', + 107 => 'k', + 108 => 'l', + 109 => 'm', + 110 => 'n', + 111 => 'o', + 112 => 'p', + 113 => 'q', + 114 => 'r', + 115 => 's', + 116 => 't', + 117 => 'u', + 118 => 'v', + 119 => 'w', + 120 => 'x', + 121 => 'y', + 122 => 'z', + 123 => 'braceleft', + 124 => 'bar', + 125 => 'braceright', + 126 => 'asciitilde', + 161 => 'exclamdown', + 162 => 'cent', + 163 => 'sterling', + 165 => 'yen', + 131 => 'florin', + 167 => 'section', + 164 => 'currency', + 39 => 'quotesingle', + 147 => 'quotedblleft', + 170 => 'ordfeminine', + 139 => 'guilsinglleft', + 155 => 'guilsinglright', + 150 => 'endash', + 134 => 'dagger', + 135 => 'daggerdbl', + 183 => 'periodcentered', + 182 => 'paragraph', + 149 => 'bullet', + 130 => 'quotesinglbase', + 132 => 'quotedblbase', + 148 => 'quotedblright', + 187 => 'guillemotright', + 133 => 'ellipsis', + 137 => 'perthousand', + 191 => 'questiondown', + 96 => 'grave', + 180 => 'acute', + 136 => 'circumflex', + 152 => 'tilde', + 175 => 'macron', + 168 => 'dieresis', + 184 => 'cedilla', + 151 => 'emdash', + 198 => 'AE', + 216 => 'Oslash', + 140 => 'OE', + 186 => 'ordmasculine', + 230 => 'ae', + 248 => 'oslash', + 156 => 'oe', + 223 => 'germandbls', + 207 => 'Idieresis', + 233 => 'eacute', + 159 => 'Ydieresis', + 247 => 'divide', + 221 => 'Yacute', + 194 => 'Acircumflex', + 225 => 'aacute', + 219 => 'Ucircumflex', + 253 => 'yacute', + 234 => 'ecircumflex', + 220 => 'Udieresis', + 218 => 'Uacute', + 203 => 'Edieresis', + 169 => 'copyright', + 229 => 'aring', + 224 => 'agrave', + 227 => 'atilde', + 154 => 'scaron', + 237 => 'iacute', + 251 => 'ucircumflex', + 226 => 'acircumflex', + 231 => 'ccedilla', + 222 => 'Thorn', + 179 => 'threesuperior', + 210 => 'Ograve', + 192 => 'Agrave', + 215 => 'multiply', + 250 => 'uacute', + 255 => 'ydieresis', + 238 => 'icircumflex', + 202 => 'Ecircumflex', + 228 => 'adieresis', + 235 => 'edieresis', + 205 => 'Iacute', + 177 => 'plusminus', + 166 => 'brokenbar', + 174 => 'registered', + 200 => 'Egrave', + 142 => 'Zcaron', + 208 => 'Eth', + 199 => 'Ccedilla', + 193 => 'Aacute', + 196 => 'Adieresis', + 232 => 'egrave', + 211 => 'Oacute', + 243 => 'oacute', + 239 => 'idieresis', + 212 => 'Ocircumflex', + 217 => 'Ugrave', + 254 => 'thorn', + 178 => 'twosuperior', + 214 => 'Odieresis', + 181 => 'mu', + 236 => 'igrave', + 190 => 'threequarters', + 153 => 'trademark', + 204 => 'Igrave', + 189 => 'onehalf', + 244 => 'ocircumflex', + 241 => 'ntilde', + 201 => 'Eacute', + 188 => 'onequarter', + 138 => 'Scaron', + 176 => 'degree', + 242 => 'ograve', + 249 => 'ugrave', + 209 => 'Ntilde', + 245 => 'otilde', + 195 => 'Atilde', + 197 => 'Aring', + 213 => 'Otilde', + 206 => 'Icircumflex', + 172 => 'logicalnot', + 246 => 'odieresis', + 252 => 'udieresis', + 240 => 'eth', + 158 => 'zcaron', + 185 => 'onesuperior', + 128 => 'Euro', + ), + 'isUnicode' => false, + 'FontName' => 'Times-Bold', + 'FullName' => 'Times Bold', + 'FamilyName' => 'Times', + 'Weight' => 'Bold', + 'ItalicAngle' => '0', + 'IsFixedPitch' => 'false', + 'CharacterSet' => 'ExtendedRoman', + 'FontBBox' => + array ( + 0 => '-168', + 1 => '-218', + 2 => '1000', + 3 => '935', + ), + 'UnderlinePosition' => '-100', + 'UnderlineThickness' => '50', + 'Version' => '002.000', + 'EncodingScheme' => 'WinAnsiEncoding', + 'CapHeight' => '676', + 'XHeight' => '461', + 'Ascender' => '683', + 'Descender' => '-217', + 'StdHW' => '44', + 'StdVW' => '139', + 'StartCharMetrics' => '317', + 'C' => + array ( + 32 => 250.0, + 160 => 250.0, + 33 => 333.0, + 34 => 555.0, + 35 => 500.0, + 36 => 500.0, + 37 => 1000.0, + 38 => 833.0, + 146 => 333.0, + 40 => 333.0, + 41 => 333.0, + 42 => 500.0, + 43 => 570.0, + 44 => 250.0, + 45 => 333.0, + 173 => 333.0, + 46 => 250.0, + 47 => 278.0, + 48 => 500.0, + 49 => 500.0, + 50 => 500.0, + 51 => 500.0, + 52 => 500.0, + 53 => 500.0, + 54 => 500.0, + 55 => 500.0, + 56 => 500.0, + 57 => 500.0, + 58 => 333.0, + 59 => 333.0, + 60 => 570.0, + 61 => 570.0, + 62 => 570.0, + 63 => 500.0, + 64 => 930.0, + 65 => 722.0, + 66 => 667.0, + 67 => 722.0, + 68 => 722.0, + 69 => 667.0, + 70 => 611.0, + 71 => 778.0, + 72 => 778.0, + 73 => 389.0, + 74 => 500.0, + 75 => 778.0, + 76 => 667.0, + 77 => 944.0, + 78 => 722.0, + 79 => 778.0, + 80 => 611.0, + 81 => 778.0, + 82 => 722.0, + 83 => 556.0, + 84 => 667.0, + 85 => 722.0, + 86 => 722.0, + 87 => 1000.0, + 88 => 722.0, + 89 => 722.0, + 90 => 667.0, + 91 => 333.0, + 92 => 278.0, + 93 => 333.0, + 94 => 581.0, + 95 => 500.0, + 145 => 333.0, + 97 => 500.0, + 98 => 556.0, + 99 => 444.0, + 100 => 556.0, + 101 => 444.0, + 102 => 333.0, + 103 => 500.0, + 104 => 556.0, + 105 => 278.0, + 106 => 333.0, + 107 => 556.0, + 108 => 278.0, + 109 => 833.0, + 110 => 556.0, + 111 => 500.0, + 112 => 556.0, + 113 => 556.0, + 114 => 444.0, + 115 => 389.0, + 116 => 333.0, + 117 => 556.0, + 118 => 500.0, + 119 => 722.0, + 120 => 500.0, + 121 => 500.0, + 122 => 444.0, + 123 => 394.0, + 124 => 220.0, + 125 => 394.0, + 126 => 520.0, + 161 => 333.0, + 162 => 500.0, + 163 => 500.0, + 'fraction' => 167.0, + 165 => 500.0, + 131 => 500.0, + 167 => 500.0, + 164 => 500.0, + 39 => 278.0, + 147 => 500.0, + 170 => 300.0, + 139 => 333.0, + 155 => 333.0, + 'fi' => 556.0, + 'fl' => 556.0, + 150 => 500.0, + 134 => 500.0, + 135 => 500.0, + 183 => 250.0, + 182 => 540.0, + 149 => 350.0, + 130 => 333.0, + 132 => 500.0, + 148 => 500.0, + 187 => 500.0, + 133 => 1000.0, + 137 => 1000.0, + 191 => 500.0, + 96 => 333.0, + 180 => 333.0, + 136 => 333.0, + 152 => 333.0, + 175 => 333.0, + 'breve' => 333.0, + 'dotaccent' => 333.0, + 168 => 333.0, + 'ring' => 333.0, + 184 => 333.0, + 'hungarumlaut' => 333.0, + 'ogonek' => 333.0, + 'caron' => 333.0, + 151 => 1000.0, + 198 => 1000.0, + 'Lslash' => 667.0, + 216 => 778.0, + 140 => 1000.0, + 186 => 330.0, + 230 => 722.0, + 'dotlessi' => 278.0, + 'lslash' => 278.0, + 248 => 500.0, + 156 => 722.0, + 223 => 556.0, + 207 => 389.0, + 233 => 444.0, + 'abreve' => 500.0, + 'uhungarumlaut' => 556.0, + 'ecaron' => 444.0, + 159 => 722.0, + 247 => 570.0, + 221 => 722.0, + 194 => 722.0, + 225 => 500.0, + 219 => 722.0, + 253 => 500.0, + 'scommaaccent' => 389.0, + 234 => 444.0, + 'Uring' => 722.0, + 220 => 722.0, + 'aogonek' => 500.0, + 218 => 722.0, + 'uogonek' => 556.0, + 203 => 667.0, + 'Dcroat' => 722.0, + 'commaaccent' => 250.0, + 169 => 747.0, + 'Emacron' => 667.0, + 'ccaron' => 444.0, + 229 => 500.0, + 'Ncommaaccent' => 722.0, + 'lacute' => 278.0, + 224 => 500.0, + 'Tcommaaccent' => 667.0, + 'Cacute' => 722.0, + 227 => 500.0, + 'Edotaccent' => 667.0, + 154 => 389.0, + 'scedilla' => 389.0, + 237 => 278.0, + 'lozenge' => 494.0, + 'Rcaron' => 722.0, + 'Gcommaaccent' => 778.0, + 251 => 556.0, + 226 => 500.0, + 'Amacron' => 722.0, + 'rcaron' => 444.0, + 231 => 444.0, + 'Zdotaccent' => 667.0, + 222 => 611.0, + 'Omacron' => 778.0, + 'Racute' => 722.0, + 'Sacute' => 556.0, + 'dcaron' => 672.0, + 'Umacron' => 722.0, + 'uring' => 556.0, + 179 => 300.0, + 210 => 778.0, + 192 => 722.0, + 'Abreve' => 722.0, + 215 => 570.0, + 250 => 556.0, + 'Tcaron' => 667.0, + 'partialdiff' => 494.0, + 255 => 500.0, + 'Nacute' => 722.0, + 238 => 278.0, + 202 => 667.0, + 228 => 500.0, + 235 => 444.0, + 'cacute' => 444.0, + 'nacute' => 556.0, + 'umacron' => 556.0, + 'Ncaron' => 722.0, + 205 => 389.0, + 177 => 570.0, + 166 => 220.0, + 174 => 747.0, + 'Gbreve' => 778.0, + 'Idotaccent' => 389.0, + 'summation' => 600.0, + 200 => 667.0, + 'racute' => 444.0, + 'omacron' => 500.0, + 'Zacute' => 667.0, + 142 => 667.0, + 'greaterequal' => 549.0, + 208 => 722.0, + 199 => 722.0, + 'lcommaaccent' => 278.0, + 'tcaron' => 416.0, + 'eogonek' => 444.0, + 'Uogonek' => 722.0, + 193 => 722.0, + 196 => 722.0, + 232 => 444.0, + 'zacute' => 444.0, + 'iogonek' => 278.0, + 211 => 778.0, + 243 => 500.0, + 'amacron' => 500.0, + 'sacute' => 389.0, + 239 => 278.0, + 212 => 778.0, + 217 => 722.0, + 'Delta' => 612.0, + 254 => 556.0, + 178 => 300.0, + 214 => 778.0, + 181 => 556.0, + 236 => 278.0, + 'ohungarumlaut' => 500.0, + 'Eogonek' => 667.0, + 'dcroat' => 556.0, + 190 => 750.0, + 'Scedilla' => 556.0, + 'lcaron' => 394.0, + 'Kcommaaccent' => 778.0, + 'Lacute' => 667.0, + 153 => 1000.0, + 'edotaccent' => 444.0, + 204 => 389.0, + 'Imacron' => 389.0, + 'Lcaron' => 667.0, + 189 => 750.0, + 'lessequal' => 549.0, + 244 => 500.0, + 241 => 556.0, + 'Uhungarumlaut' => 722.0, + 201 => 667.0, + 'emacron' => 444.0, + 'gbreve' => 500.0, + 188 => 750.0, + 138 => 556.0, + 'Scommaaccent' => 556.0, + 'Ohungarumlaut' => 778.0, + 176 => 400.0, + 242 => 500.0, + 'Ccaron' => 722.0, + 249 => 556.0, + 'radical' => 549.0, + 'Dcaron' => 722.0, + 'rcommaaccent' => 444.0, + 209 => 722.0, + 245 => 500.0, + 'Rcommaaccent' => 722.0, + 'Lcommaaccent' => 667.0, + 195 => 722.0, + 'Aogonek' => 722.0, + 197 => 722.0, + 213 => 778.0, + 'zdotaccent' => 444.0, + 'Ecaron' => 667.0, + 'Iogonek' => 389.0, + 'kcommaaccent' => 556.0, + 'minus' => 570.0, + 206 => 389.0, + 'ncaron' => 556.0, + 'tcommaaccent' => 333.0, + 172 => 570.0, + 246 => 500.0, + 252 => 556.0, + 'notequal' => 549.0, + 'gcommaaccent' => 500.0, + 240 => 500.0, + 158 => 444.0, + 'ncommaaccent' => 556.0, + 185 => 300.0, + 'imacron' => 278.0, + 128 => 500.0, + ), + 'CIDtoGID_Compressed' => true, + 'CIDtoGID' => 'eJwDAAAAAAE=', + '_version_' => 4, +); \ No newline at end of file diff --git a/application/third_party/dompdf/lib/fonts/Times-BoldItalic.afm b/application/third_party/dompdf/lib/fonts/Times-BoldItalic.afm new file mode 100755 index 00000000..eff5240e --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Times-BoldItalic.afm @@ -0,0 +1,2386 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 13:04:06 1997 +Comment UniqueID 43066 +Comment VMusage 45874 56899 +FontName Times-BoldItalic +FullName Times Bold Italic +FamilyName Times +Weight Bold +ItalicAngle -15 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -200 -218 996 921 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 669 +XHeight 462 +Ascender 683 +Descender -217 +StdHW 42 +StdVW 121 +StartCharMetrics 317 +C 32 ; WX 250 ; N space ; B 0 0 0 0 ; +C 160 ; WX 250 ; N space ; B 0 0 0 0 ; +C 33 ; WX 389 ; N exclam ; B 67 -13 370 684 ; +C 34 ; WX 555 ; N quotedbl ; B 136 398 536 685 ; +C 35 ; WX 500 ; N numbersign ; B -33 0 533 700 ; +C 36 ; WX 500 ; N dollar ; B -20 -100 497 733 ; +C 37 ; WX 833 ; N percent ; B 39 -10 793 692 ; +C 38 ; WX 778 ; N ampersand ; B 5 -19 699 682 ; +C 146 ; WX 333 ; N quoteright ; B 98 369 302 685 ; +C 40 ; WX 333 ; N parenleft ; B 28 -179 344 685 ; +C 41 ; WX 333 ; N parenright ; B -44 -179 271 685 ; +C 42 ; WX 500 ; N asterisk ; B 65 249 456 685 ; +C 43 ; WX 570 ; N plus ; B 33 0 537 506 ; +C 44 ; WX 250 ; N comma ; B -60 -182 144 134 ; +C 45 ; WX 333 ; N hyphen ; B 2 166 271 282 ; +C 173 ; WX 333 ; N hyphen ; B 2 166 271 282 ; +C 46 ; WX 250 ; N period ; B -9 -13 139 135 ; +C 47 ; WX 278 ; N slash ; B -64 -18 342 685 ; +C 48 ; WX 500 ; N zero ; B 17 -14 477 683 ; +C 49 ; WX 500 ; N one ; B 5 0 419 683 ; +C 50 ; WX 500 ; N two ; B -27 0 446 683 ; +C 51 ; WX 500 ; N three ; B -15 -13 450 683 ; +C 52 ; WX 500 ; N four ; B -15 0 503 683 ; +C 53 ; WX 500 ; N five ; B -11 -13 487 669 ; +C 54 ; WX 500 ; N six ; B 23 -15 509 679 ; +C 55 ; WX 500 ; N seven ; B 52 0 525 669 ; +C 56 ; WX 500 ; N eight ; B 3 -13 476 683 ; +C 57 ; WX 500 ; N nine ; B -12 -10 475 683 ; +C 58 ; WX 333 ; N colon ; B 23 -13 264 459 ; +C 59 ; WX 333 ; N semicolon ; B -25 -183 264 459 ; +C 60 ; WX 570 ; N less ; B 31 -8 539 514 ; +C 61 ; WX 570 ; N equal ; B 33 107 537 399 ; +C 62 ; WX 570 ; N greater ; B 31 -8 539 514 ; +C 63 ; WX 500 ; N question ; B 79 -13 470 684 ; +C 64 ; WX 832 ; N at ; B 63 -18 770 685 ; +C 65 ; WX 667 ; N A ; B -67 0 593 683 ; +C 66 ; WX 667 ; N B ; B -24 0 624 669 ; +C 67 ; WX 667 ; N C ; B 32 -18 677 685 ; +C 68 ; WX 722 ; N D ; B -46 0 685 669 ; +C 69 ; WX 667 ; N E ; B -27 0 653 669 ; +C 70 ; WX 667 ; N F ; B -13 0 660 669 ; +C 71 ; WX 722 ; N G ; B 21 -18 706 685 ; +C 72 ; WX 778 ; N H ; B -24 0 799 669 ; +C 73 ; WX 389 ; N I ; B -32 0 406 669 ; +C 74 ; WX 500 ; N J ; B -46 -99 524 669 ; +C 75 ; WX 667 ; N K ; B -21 0 702 669 ; +C 76 ; WX 611 ; N L ; B -22 0 590 669 ; +C 77 ; WX 889 ; N M ; B -29 -12 917 669 ; +C 78 ; WX 722 ; N N ; B -27 -15 748 669 ; +C 79 ; WX 722 ; N O ; B 27 -18 691 685 ; +C 80 ; WX 611 ; N P ; B -27 0 613 669 ; +C 81 ; WX 722 ; N Q ; B 27 -208 691 685 ; +C 82 ; WX 667 ; N R ; B -29 0 623 669 ; +C 83 ; WX 556 ; N S ; B 2 -18 526 685 ; +C 84 ; WX 611 ; N T ; B 50 0 650 669 ; +C 85 ; WX 722 ; N U ; B 67 -18 744 669 ; +C 86 ; WX 667 ; N V ; B 65 -18 715 669 ; +C 87 ; WX 889 ; N W ; B 65 -18 940 669 ; +C 88 ; WX 667 ; N X ; B -24 0 694 669 ; +C 89 ; WX 611 ; N Y ; B 73 0 659 669 ; +C 90 ; WX 611 ; N Z ; B -11 0 590 669 ; +C 91 ; WX 333 ; N bracketleft ; B -37 -159 362 674 ; +C 92 ; WX 278 ; N backslash ; B -1 -18 279 685 ; +C 93 ; WX 333 ; N bracketright ; B -56 -157 343 674 ; +C 94 ; WX 570 ; N asciicircum ; B 67 304 503 669 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 145 ; WX 333 ; N quoteleft ; B 128 369 332 685 ; +C 97 ; WX 500 ; N a ; B -21 -14 455 462 ; +C 98 ; WX 500 ; N b ; B -14 -13 444 699 ; +C 99 ; WX 444 ; N c ; B -5 -13 392 462 ; +C 100 ; WX 500 ; N d ; B -21 -13 517 699 ; +C 101 ; WX 444 ; N e ; B 5 -13 398 462 ; +C 102 ; WX 333 ; N f ; B -169 -205 446 698 ; L i fi ; L l fl ; +C 103 ; WX 500 ; N g ; B -52 -203 478 462 ; +C 104 ; WX 556 ; N h ; B -13 -9 498 699 ; +C 105 ; WX 278 ; N i ; B 2 -9 263 684 ; +C 106 ; WX 278 ; N j ; B -189 -207 279 684 ; +C 107 ; WX 500 ; N k ; B -23 -8 483 699 ; +C 108 ; WX 278 ; N l ; B 2 -9 290 699 ; +C 109 ; WX 778 ; N m ; B -14 -9 722 462 ; +C 110 ; WX 556 ; N n ; B -6 -9 493 462 ; +C 111 ; WX 500 ; N o ; B -3 -13 441 462 ; +C 112 ; WX 500 ; N p ; B -120 -205 446 462 ; +C 113 ; WX 500 ; N q ; B 1 -205 471 462 ; +C 114 ; WX 389 ; N r ; B -21 0 389 462 ; +C 115 ; WX 389 ; N s ; B -19 -13 333 462 ; +C 116 ; WX 278 ; N t ; B -11 -9 281 594 ; +C 117 ; WX 556 ; N u ; B 15 -9 492 462 ; +C 118 ; WX 444 ; N v ; B 16 -13 401 462 ; +C 119 ; WX 667 ; N w ; B 16 -13 614 462 ; +C 120 ; WX 500 ; N x ; B -46 -13 469 462 ; +C 121 ; WX 444 ; N y ; B -94 -205 392 462 ; +C 122 ; WX 389 ; N z ; B -43 -78 368 449 ; +C 123 ; WX 348 ; N braceleft ; B 5 -187 436 686 ; +C 124 ; WX 220 ; N bar ; B 66 -218 154 782 ; +C 125 ; WX 348 ; N braceright ; B -129 -187 302 686 ; +C 126 ; WX 570 ; N asciitilde ; B 54 173 516 333 ; +C 161 ; WX 389 ; N exclamdown ; B 19 -205 322 492 ; +C 162 ; WX 500 ; N cent ; B 42 -143 439 576 ; +C 163 ; WX 500 ; N sterling ; B -32 -12 510 683 ; +C -1 ; WX 167 ; N fraction ; B -169 -14 324 683 ; +C 165 ; WX 500 ; N yen ; B 33 0 628 669 ; +C 131 ; WX 500 ; N florin ; B -87 -156 537 707 ; +C 167 ; WX 500 ; N section ; B 36 -143 459 685 ; +C 164 ; WX 500 ; N currency ; B -26 34 526 586 ; +C 39 ; WX 278 ; N quotesingle ; B 128 398 268 685 ; +C 147 ; WX 500 ; N quotedblleft ; B 53 369 513 685 ; +C 170 ; WX 500 ; N guillemotleft ; B 12 32 468 415 ; +C 139 ; WX 333 ; N guilsinglleft ; B 32 32 303 415 ; +C 155 ; WX 333 ; N guilsinglright ; B 10 32 281 415 ; +C -1 ; WX 556 ; N fi ; B -188 -205 514 703 ; +C -1 ; WX 556 ; N fl ; B -186 -205 553 704 ; +C 150 ; WX 500 ; N endash ; B -40 178 477 269 ; +C 134 ; WX 500 ; N dagger ; B 91 -145 494 685 ; +C 135 ; WX 500 ; N daggerdbl ; B 10 -139 493 685 ; +C 183 ; WX 250 ; N periodcentered ; B 51 257 199 405 ; +C 182 ; WX 500 ; N paragraph ; B -57 -193 562 669 ; +C 149 ; WX 350 ; N bullet ; B 0 175 350 525 ; +C 130 ; WX 333 ; N quotesinglbase ; B -5 -182 199 134 ; +C 132 ; WX 500 ; N quotedblbase ; B -57 -182 403 134 ; +C 148 ; WX 500 ; N quotedblright ; B 53 369 513 685 ; +C 187 ; WX 500 ; N guillemotright ; B 12 32 468 415 ; +C 133 ; WX 1000 ; N ellipsis ; B 40 -13 852 135 ; +C 137 ; WX 1000 ; N perthousand ; B 7 -29 996 706 ; +C 191 ; WX 500 ; N questiondown ; B 30 -205 421 492 ; +C 96 ; WX 333 ; N grave ; B 85 516 297 697 ; +C 180 ; WX 333 ; N acute ; B 139 516 379 697 ; +C 136 ; WX 333 ; N circumflex ; B 40 516 367 690 ; +C 152 ; WX 333 ; N tilde ; B 48 536 407 655 ; +C 175 ; WX 333 ; N macron ; B 51 553 393 623 ; +C -1 ; WX 333 ; N breve ; B 71 516 387 678 ; +C -1 ; WX 333 ; N dotaccent ; B 163 550 298 684 ; +C 168 ; WX 333 ; N dieresis ; B 55 550 402 684 ; +C -1 ; WX 333 ; N ring ; B 127 516 340 729 ; +C 184 ; WX 333 ; N cedilla ; B -80 -218 156 5 ; +C -1 ; WX 333 ; N hungarumlaut ; B 69 516 498 697 ; +C -1 ; WX 333 ; N ogonek ; B 15 -183 244 34 ; +C -1 ; WX 333 ; N caron ; B 79 516 411 690 ; +C 151 ; WX 1000 ; N emdash ; B -40 178 977 269 ; +C 198 ; WX 944 ; N AE ; B -64 0 918 669 ; +C 170 ; WX 266 ; N ordfeminine ; B 16 399 330 685 ; +C -1 ; WX 611 ; N Lslash ; B -22 0 590 669 ; +C 216 ; WX 722 ; N Oslash ; B 27 -125 691 764 ; +C 140 ; WX 944 ; N OE ; B 23 -8 946 677 ; +C 186 ; WX 300 ; N ordmasculine ; B 56 400 347 685 ; +C 230 ; WX 722 ; N ae ; B -5 -13 673 462 ; +C -1 ; WX 278 ; N dotlessi ; B 2 -9 238 462 ; +C -1 ; WX 278 ; N lslash ; B -7 -9 307 699 ; +C 248 ; WX 500 ; N oslash ; B -3 -119 441 560 ; +C 156 ; WX 722 ; N oe ; B 6 -13 674 462 ; +C 223 ; WX 500 ; N germandbls ; B -200 -200 473 705 ; +C 207 ; WX 389 ; N Idieresis ; B -32 0 450 862 ; +C 233 ; WX 444 ; N eacute ; B 5 -13 435 697 ; +C -1 ; WX 500 ; N abreve ; B -21 -14 471 678 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 15 -9 610 697 ; +C -1 ; WX 444 ; N ecaron ; B 5 -13 467 690 ; +C 159 ; WX 611 ; N Ydieresis ; B 73 0 659 862 ; +C 247 ; WX 570 ; N divide ; B 33 -29 537 535 ; +C 221 ; WX 611 ; N Yacute ; B 73 0 659 904 ; +C 194 ; WX 667 ; N Acircumflex ; B -67 0 593 897 ; +C 225 ; WX 500 ; N aacute ; B -21 -14 463 697 ; +C 219 ; WX 722 ; N Ucircumflex ; B 67 -18 744 897 ; +C 253 ; WX 444 ; N yacute ; B -94 -205 435 697 ; +C -1 ; WX 389 ; N scommaaccent ; B -19 -218 333 462 ; +C 234 ; WX 444 ; N ecircumflex ; B 5 -13 423 690 ; +C -1 ; WX 722 ; N Uring ; B 67 -18 744 921 ; +C 220 ; WX 722 ; N Udieresis ; B 67 -18 744 862 ; +C -1 ; WX 500 ; N aogonek ; B -21 -183 455 462 ; +C 218 ; WX 722 ; N Uacute ; B 67 -18 744 904 ; +C -1 ; WX 556 ; N uogonek ; B 15 -183 492 462 ; +C 203 ; WX 667 ; N Edieresis ; B -27 0 653 862 ; +C -1 ; WX 722 ; N Dcroat ; B -31 0 700 669 ; +C -1 ; WX 250 ; N commaaccent ; B -36 -218 131 -50 ; +C 169 ; WX 747 ; N copyright ; B 30 -18 718 685 ; +C -1 ; WX 667 ; N Emacron ; B -27 0 653 830 ; +C -1 ; WX 444 ; N ccaron ; B -5 -13 467 690 ; +C 229 ; WX 500 ; N aring ; B -21 -14 455 729 ; +C -1 ; WX 722 ; N Ncommaaccent ; B -27 -218 748 669 ; +C -1 ; WX 278 ; N lacute ; B 2 -9 392 904 ; +C 224 ; WX 500 ; N agrave ; B -21 -14 455 697 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 50 -218 650 669 ; +C -1 ; WX 667 ; N Cacute ; B 32 -18 677 904 ; +C 227 ; WX 500 ; N atilde ; B -21 -14 491 655 ; +C -1 ; WX 667 ; N Edotaccent ; B -27 0 653 862 ; +C 154 ; WX 389 ; N scaron ; B -19 -13 424 690 ; +C -1 ; WX 389 ; N scedilla ; B -19 -218 333 462 ; +C 237 ; WX 278 ; N iacute ; B 2 -9 352 697 ; +C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; +C -1 ; WX 667 ; N Rcaron ; B -29 0 623 897 ; +C -1 ; WX 722 ; N Gcommaaccent ; B 21 -218 706 685 ; +C 251 ; WX 556 ; N ucircumflex ; B 15 -9 492 690 ; +C 226 ; WX 500 ; N acircumflex ; B -21 -14 455 690 ; +C -1 ; WX 667 ; N Amacron ; B -67 0 593 830 ; +C -1 ; WX 389 ; N rcaron ; B -21 0 424 690 ; +C 231 ; WX 444 ; N ccedilla ; B -5 -218 392 462 ; +C -1 ; WX 611 ; N Zdotaccent ; B -11 0 590 862 ; +C 222 ; WX 611 ; N Thorn ; B -27 0 573 669 ; +C -1 ; WX 722 ; N Omacron ; B 27 -18 691 830 ; +C -1 ; WX 667 ; N Racute ; B -29 0 623 904 ; +C -1 ; WX 556 ; N Sacute ; B 2 -18 531 904 ; +C -1 ; WX 608 ; N dcaron ; B -21 -13 675 708 ; +C -1 ; WX 722 ; N Umacron ; B 67 -18 744 830 ; +C -1 ; WX 556 ; N uring ; B 15 -9 492 729 ; +C 179 ; WX 300 ; N threesuperior ; B 17 265 321 683 ; +C 210 ; WX 722 ; N Ograve ; B 27 -18 691 904 ; +C 192 ; WX 667 ; N Agrave ; B -67 0 593 904 ; +C -1 ; WX 667 ; N Abreve ; B -67 0 593 885 ; +C 215 ; WX 570 ; N multiply ; B 48 16 522 490 ; +C 250 ; WX 556 ; N uacute ; B 15 -9 492 697 ; +C -1 ; WX 611 ; N Tcaron ; B 50 0 650 897 ; +C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; +C 255 ; WX 444 ; N ydieresis ; B -94 -205 443 655 ; +C -1 ; WX 722 ; N Nacute ; B -27 -15 748 904 ; +C 238 ; WX 278 ; N icircumflex ; B -3 -9 324 690 ; +C 202 ; WX 667 ; N Ecircumflex ; B -27 0 653 897 ; +C 228 ; WX 500 ; N adieresis ; B -21 -14 476 655 ; +C 235 ; WX 444 ; N edieresis ; B 5 -13 448 655 ; +C -1 ; WX 444 ; N cacute ; B -5 -13 435 697 ; +C -1 ; WX 556 ; N nacute ; B -6 -9 493 697 ; +C -1 ; WX 556 ; N umacron ; B 15 -9 492 623 ; +C -1 ; WX 722 ; N Ncaron ; B -27 -15 748 897 ; +C 205 ; WX 389 ; N Iacute ; B -32 0 432 904 ; +C 177 ; WX 570 ; N plusminus ; B 33 0 537 506 ; +C 166 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ; +C 174 ; WX 747 ; N registered ; B 30 -18 718 685 ; +C -1 ; WX 722 ; N Gbreve ; B 21 -18 706 885 ; +C -1 ; WX 389 ; N Idotaccent ; B -32 0 406 862 ; +C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; +C 200 ; WX 667 ; N Egrave ; B -27 0 653 904 ; +C -1 ; WX 389 ; N racute ; B -21 0 407 697 ; +C -1 ; WX 500 ; N omacron ; B -3 -13 462 623 ; +C -1 ; WX 611 ; N Zacute ; B -11 0 590 904 ; +C 142 ; WX 611 ; N Zcaron ; B -11 0 590 897 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; +C 208 ; WX 722 ; N Eth ; B -31 0 700 669 ; +C 199 ; WX 667 ; N Ccedilla ; B 32 -218 677 685 ; +C -1 ; WX 278 ; N lcommaaccent ; B -42 -218 290 699 ; +C -1 ; WX 366 ; N tcaron ; B -11 -9 434 754 ; +C -1 ; WX 444 ; N eogonek ; B 5 -183 398 462 ; +C -1 ; WX 722 ; N Uogonek ; B 67 -183 744 669 ; +C 193 ; WX 667 ; N Aacute ; B -67 0 593 904 ; +C 196 ; WX 667 ; N Adieresis ; B -67 0 593 862 ; +C 232 ; WX 444 ; N egrave ; B 5 -13 398 697 ; +C -1 ; WX 389 ; N zacute ; B -43 -78 407 697 ; +C -1 ; WX 278 ; N iogonek ; B -20 -183 263 684 ; +C 211 ; WX 722 ; N Oacute ; B 27 -18 691 904 ; +C 243 ; WX 500 ; N oacute ; B -3 -13 463 697 ; +C -1 ; WX 500 ; N amacron ; B -21 -14 467 623 ; +C -1 ; WX 389 ; N sacute ; B -19 -13 407 697 ; +C 239 ; WX 278 ; N idieresis ; B 2 -9 364 655 ; +C 212 ; WX 722 ; N Ocircumflex ; B 27 -18 691 897 ; +C 217 ; WX 722 ; N Ugrave ; B 67 -18 744 904 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 500 ; N thorn ; B -120 -205 446 699 ; +C 178 ; WX 300 ; N twosuperior ; B 2 274 313 683 ; +C 214 ; WX 722 ; N Odieresis ; B 27 -18 691 862 ; +C 181 ; WX 576 ; N mu ; B -60 -207 516 449 ; +C 236 ; WX 278 ; N igrave ; B 2 -9 259 697 ; +C -1 ; WX 500 ; N ohungarumlaut ; B -3 -13 582 697 ; +C -1 ; WX 667 ; N Eogonek ; B -27 -183 653 669 ; +C -1 ; WX 500 ; N dcroat ; B -21 -13 552 699 ; +C 190 ; WX 750 ; N threequarters ; B 7 -14 726 683 ; +C -1 ; WX 556 ; N Scedilla ; B 2 -218 526 685 ; +C -1 ; WX 382 ; N lcaron ; B 2 -9 448 708 ; +C -1 ; WX 667 ; N Kcommaaccent ; B -21 -218 702 669 ; +C -1 ; WX 611 ; N Lacute ; B -22 0 590 904 ; +C 153 ; WX 1000 ; N trademark ; B 32 263 968 669 ; +C -1 ; WX 444 ; N edotaccent ; B 5 -13 398 655 ; +C 204 ; WX 389 ; N Igrave ; B -32 0 406 904 ; +C -1 ; WX 389 ; N Imacron ; B -32 0 461 830 ; +C -1 ; WX 611 ; N Lcaron ; B -22 0 671 718 ; +C 189 ; WX 750 ; N onehalf ; B -9 -14 723 683 ; +C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; +C 244 ; WX 500 ; N ocircumflex ; B -3 -13 451 690 ; +C 241 ; WX 556 ; N ntilde ; B -6 -9 504 655 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 67 -18 744 904 ; +C 201 ; WX 667 ; N Eacute ; B -27 0 653 904 ; +C -1 ; WX 444 ; N emacron ; B 5 -13 439 623 ; +C -1 ; WX 500 ; N gbreve ; B -52 -203 478 678 ; +C 188 ; WX 750 ; N onequarter ; B 7 -14 721 683 ; +C 138 ; WX 556 ; N Scaron ; B 2 -18 553 897 ; +C -1 ; WX 556 ; N Scommaaccent ; B 2 -218 526 685 ; +C -1 ; WX 722 ; N Ohungarumlaut ; B 27 -18 723 904 ; +C 176 ; WX 400 ; N degree ; B 83 397 369 683 ; +C 242 ; WX 500 ; N ograve ; B -3 -13 441 697 ; +C -1 ; WX 667 ; N Ccaron ; B 32 -18 677 897 ; +C 249 ; WX 556 ; N ugrave ; B 15 -9 492 697 ; +C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; +C -1 ; WX 722 ; N Dcaron ; B -46 0 685 897 ; +C -1 ; WX 389 ; N rcommaaccent ; B -67 -218 389 462 ; +C 209 ; WX 722 ; N Ntilde ; B -27 -15 748 862 ; +C 245 ; WX 500 ; N otilde ; B -3 -13 491 655 ; +C -1 ; WX 667 ; N Rcommaaccent ; B -29 -218 623 669 ; +C -1 ; WX 611 ; N Lcommaaccent ; B -22 -218 590 669 ; +C 195 ; WX 667 ; N Atilde ; B -67 0 593 862 ; +C -1 ; WX 667 ; N Aogonek ; B -67 -183 604 683 ; +C 197 ; WX 667 ; N Aring ; B -67 0 593 921 ; +C 213 ; WX 722 ; N Otilde ; B 27 -18 691 862 ; +C -1 ; WX 389 ; N zdotaccent ; B -43 -78 368 655 ; +C -1 ; WX 667 ; N Ecaron ; B -27 0 653 897 ; +C -1 ; WX 389 ; N Iogonek ; B -32 -183 406 669 ; +C -1 ; WX 500 ; N kcommaaccent ; B -23 -218 483 699 ; +C -1 ; WX 606 ; N minus ; B 51 209 555 297 ; +C 206 ; WX 389 ; N Icircumflex ; B -32 0 450 897 ; +C -1 ; WX 556 ; N ncaron ; B -6 -9 523 690 ; +C -1 ; WX 278 ; N tcommaaccent ; B -62 -218 281 594 ; +C 172 ; WX 606 ; N logicalnot ; B 51 108 555 399 ; +C 246 ; WX 500 ; N odieresis ; B -3 -13 471 655 ; +C 252 ; WX 556 ; N udieresis ; B 15 -9 499 655 ; +C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; +C -1 ; WX 500 ; N gcommaaccent ; B -52 -203 478 767 ; +C 240 ; WX 500 ; N eth ; B -3 -13 454 699 ; +C 158 ; WX 389 ; N zcaron ; B -43 -78 424 690 ; +C -1 ; WX 556 ; N ncommaaccent ; B -6 -218 493 462 ; +C 185 ; WX 300 ; N onesuperior ; B 30 274 301 683 ; +C -1 ; WX 278 ; N imacron ; B 2 -9 294 623 ; +C 128 ; WX 500 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2038 +KPX A C -65 +KPX A Cacute -65 +KPX A Ccaron -65 +KPX A Ccedilla -65 +KPX A G -60 +KPX A Gbreve -60 +KPX A Gcommaaccent -60 +KPX A O -50 +KPX A Oacute -50 +KPX A Ocircumflex -50 +KPX A Odieresis -50 +KPX A Ograve -50 +KPX A Ohungarumlaut -50 +KPX A Omacron -50 +KPX A Oslash -50 +KPX A Otilde -50 +KPX A Q -55 +KPX A T -55 +KPX A Tcaron -55 +KPX A Tcommaaccent -55 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -95 +KPX A W -100 +KPX A Y -70 +KPX A Yacute -70 +KPX A Ydieresis -70 +KPX A quoteright -74 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -74 +KPX A w -74 +KPX A y -74 +KPX A yacute -74 +KPX A ydieresis -74 +KPX Aacute C -65 +KPX Aacute Cacute -65 +KPX Aacute Ccaron -65 +KPX Aacute Ccedilla -65 +KPX Aacute G -60 +KPX Aacute Gbreve -60 +KPX Aacute Gcommaaccent -60 +KPX Aacute O -50 +KPX Aacute Oacute -50 +KPX Aacute Ocircumflex -50 +KPX Aacute Odieresis -50 +KPX Aacute Ograve -50 +KPX Aacute Ohungarumlaut -50 +KPX Aacute Omacron -50 +KPX Aacute Oslash -50 +KPX Aacute Otilde -50 +KPX Aacute Q -55 +KPX Aacute T -55 +KPX Aacute Tcaron -55 +KPX Aacute Tcommaaccent -55 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -95 +KPX Aacute W -100 +KPX Aacute Y -70 +KPX Aacute Yacute -70 +KPX Aacute Ydieresis -70 +KPX Aacute quoteright -74 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -74 +KPX Aacute w -74 +KPX Aacute y -74 +KPX Aacute yacute -74 +KPX Aacute ydieresis -74 +KPX Abreve C -65 +KPX Abreve Cacute -65 +KPX Abreve Ccaron -65 +KPX Abreve Ccedilla -65 +KPX Abreve G -60 +KPX Abreve Gbreve -60 +KPX Abreve Gcommaaccent -60 +KPX Abreve O -50 +KPX Abreve Oacute -50 +KPX Abreve Ocircumflex -50 +KPX Abreve Odieresis -50 +KPX Abreve Ograve -50 +KPX Abreve Ohungarumlaut -50 +KPX Abreve Omacron -50 +KPX Abreve Oslash -50 +KPX Abreve Otilde -50 +KPX Abreve Q -55 +KPX Abreve T -55 +KPX Abreve Tcaron -55 +KPX Abreve Tcommaaccent -55 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -95 +KPX Abreve W -100 +KPX Abreve Y -70 +KPX Abreve Yacute -70 +KPX Abreve Ydieresis -70 +KPX Abreve quoteright -74 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -74 +KPX Abreve w -74 +KPX Abreve y -74 +KPX Abreve yacute -74 +KPX Abreve ydieresis -74 +KPX Acircumflex C -65 +KPX Acircumflex Cacute -65 +KPX Acircumflex Ccaron -65 +KPX Acircumflex Ccedilla -65 +KPX Acircumflex G -60 +KPX Acircumflex Gbreve -60 +KPX Acircumflex Gcommaaccent -60 +KPX Acircumflex O -50 +KPX Acircumflex Oacute -50 +KPX Acircumflex Ocircumflex -50 +KPX Acircumflex Odieresis -50 +KPX Acircumflex Ograve -50 +KPX Acircumflex Ohungarumlaut -50 +KPX Acircumflex Omacron -50 +KPX Acircumflex Oslash -50 +KPX Acircumflex Otilde -50 +KPX Acircumflex Q -55 +KPX Acircumflex T -55 +KPX Acircumflex Tcaron -55 +KPX Acircumflex Tcommaaccent -55 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -95 +KPX Acircumflex W -100 +KPX Acircumflex Y -70 +KPX Acircumflex Yacute -70 +KPX Acircumflex Ydieresis -70 +KPX Acircumflex quoteright -74 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -74 +KPX Acircumflex w -74 +KPX Acircumflex y -74 +KPX Acircumflex yacute -74 +KPX Acircumflex ydieresis -74 +KPX Adieresis C -65 +KPX Adieresis Cacute -65 +KPX Adieresis Ccaron -65 +KPX Adieresis Ccedilla -65 +KPX Adieresis G -60 +KPX Adieresis Gbreve -60 +KPX Adieresis Gcommaaccent -60 +KPX Adieresis O -50 +KPX Adieresis Oacute -50 +KPX Adieresis Ocircumflex -50 +KPX Adieresis Odieresis -50 +KPX Adieresis Ograve -50 +KPX Adieresis Ohungarumlaut -50 +KPX Adieresis Omacron -50 +KPX Adieresis Oslash -50 +KPX Adieresis Otilde -50 +KPX Adieresis Q -55 +KPX Adieresis T -55 +KPX Adieresis Tcaron -55 +KPX Adieresis Tcommaaccent -55 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -95 +KPX Adieresis W -100 +KPX Adieresis Y -70 +KPX Adieresis Yacute -70 +KPX Adieresis Ydieresis -70 +KPX Adieresis quoteright -74 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -74 +KPX Adieresis w -74 +KPX Adieresis y -74 +KPX Adieresis yacute -74 +KPX Adieresis ydieresis -74 +KPX Agrave C -65 +KPX Agrave Cacute -65 +KPX Agrave Ccaron -65 +KPX Agrave Ccedilla -65 +KPX Agrave G -60 +KPX Agrave Gbreve -60 +KPX Agrave Gcommaaccent -60 +KPX Agrave O -50 +KPX Agrave Oacute -50 +KPX Agrave Ocircumflex -50 +KPX Agrave Odieresis -50 +KPX Agrave Ograve -50 +KPX Agrave Ohungarumlaut -50 +KPX Agrave Omacron -50 +KPX Agrave Oslash -50 +KPX Agrave Otilde -50 +KPX Agrave Q -55 +KPX Agrave T -55 +KPX Agrave Tcaron -55 +KPX Agrave Tcommaaccent -55 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -95 +KPX Agrave W -100 +KPX Agrave Y -70 +KPX Agrave Yacute -70 +KPX Agrave Ydieresis -70 +KPX Agrave quoteright -74 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -74 +KPX Agrave w -74 +KPX Agrave y -74 +KPX Agrave yacute -74 +KPX Agrave ydieresis -74 +KPX Amacron C -65 +KPX Amacron Cacute -65 +KPX Amacron Ccaron -65 +KPX Amacron Ccedilla -65 +KPX Amacron G -60 +KPX Amacron Gbreve -60 +KPX Amacron Gcommaaccent -60 +KPX Amacron O -50 +KPX Amacron Oacute -50 +KPX Amacron Ocircumflex -50 +KPX Amacron Odieresis -50 +KPX Amacron Ograve -50 +KPX Amacron Ohungarumlaut -50 +KPX Amacron Omacron -50 +KPX Amacron Oslash -50 +KPX Amacron Otilde -50 +KPX Amacron Q -55 +KPX Amacron T -55 +KPX Amacron Tcaron -55 +KPX Amacron Tcommaaccent -55 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -95 +KPX Amacron W -100 +KPX Amacron Y -70 +KPX Amacron Yacute -70 +KPX Amacron Ydieresis -70 +KPX Amacron quoteright -74 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -74 +KPX Amacron w -74 +KPX Amacron y -74 +KPX Amacron yacute -74 +KPX Amacron ydieresis -74 +KPX Aogonek C -65 +KPX Aogonek Cacute -65 +KPX Aogonek Ccaron -65 +KPX Aogonek Ccedilla -65 +KPX Aogonek G -60 +KPX Aogonek Gbreve -60 +KPX Aogonek Gcommaaccent -60 +KPX Aogonek O -50 +KPX Aogonek Oacute -50 +KPX Aogonek Ocircumflex -50 +KPX Aogonek Odieresis -50 +KPX Aogonek Ograve -50 +KPX Aogonek Ohungarumlaut -50 +KPX Aogonek Omacron -50 +KPX Aogonek Oslash -50 +KPX Aogonek Otilde -50 +KPX Aogonek Q -55 +KPX Aogonek T -55 +KPX Aogonek Tcaron -55 +KPX Aogonek Tcommaaccent -55 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -95 +KPX Aogonek W -100 +KPX Aogonek Y -70 +KPX Aogonek Yacute -70 +KPX Aogonek Ydieresis -70 +KPX Aogonek quoteright -74 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -74 +KPX Aogonek w -74 +KPX Aogonek y -34 +KPX Aogonek yacute -34 +KPX Aogonek ydieresis -34 +KPX Aring C -65 +KPX Aring Cacute -65 +KPX Aring Ccaron -65 +KPX Aring Ccedilla -65 +KPX Aring G -60 +KPX Aring Gbreve -60 +KPX Aring Gcommaaccent -60 +KPX Aring O -50 +KPX Aring Oacute -50 +KPX Aring Ocircumflex -50 +KPX Aring Odieresis -50 +KPX Aring Ograve -50 +KPX Aring Ohungarumlaut -50 +KPX Aring Omacron -50 +KPX Aring Oslash -50 +KPX Aring Otilde -50 +KPX Aring Q -55 +KPX Aring T -55 +KPX Aring Tcaron -55 +KPX Aring Tcommaaccent -55 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -95 +KPX Aring W -100 +KPX Aring Y -70 +KPX Aring Yacute -70 +KPX Aring Ydieresis -70 +KPX Aring quoteright -74 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -74 +KPX Aring w -74 +KPX Aring y -74 +KPX Aring yacute -74 +KPX Aring ydieresis -74 +KPX Atilde C -65 +KPX Atilde Cacute -65 +KPX Atilde Ccaron -65 +KPX Atilde Ccedilla -65 +KPX Atilde G -60 +KPX Atilde Gbreve -60 +KPX Atilde Gcommaaccent -60 +KPX Atilde O -50 +KPX Atilde Oacute -50 +KPX Atilde Ocircumflex -50 +KPX Atilde Odieresis -50 +KPX Atilde Ograve -50 +KPX Atilde Ohungarumlaut -50 +KPX Atilde Omacron -50 +KPX Atilde Oslash -50 +KPX Atilde Otilde -50 +KPX Atilde Q -55 +KPX Atilde T -55 +KPX Atilde Tcaron -55 +KPX Atilde Tcommaaccent -55 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -95 +KPX Atilde W -100 +KPX Atilde Y -70 +KPX Atilde Yacute -70 +KPX Atilde Ydieresis -70 +KPX Atilde quoteright -74 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -74 +KPX Atilde w -74 +KPX Atilde y -74 +KPX Atilde yacute -74 +KPX Atilde ydieresis -74 +KPX B A -25 +KPX B Aacute -25 +KPX B Abreve -25 +KPX B Acircumflex -25 +KPX B Adieresis -25 +KPX B Agrave -25 +KPX B Amacron -25 +KPX B Aogonek -25 +KPX B Aring -25 +KPX B Atilde -25 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -25 +KPX D Aacute -25 +KPX D Abreve -25 +KPX D Acircumflex -25 +KPX D Adieresis -25 +KPX D Agrave -25 +KPX D Amacron -25 +KPX D Aogonek -25 +KPX D Aring -25 +KPX D Atilde -25 +KPX D V -50 +KPX D W -40 +KPX D Y -50 +KPX D Yacute -50 +KPX D Ydieresis -50 +KPX Dcaron A -25 +KPX Dcaron Aacute -25 +KPX Dcaron Abreve -25 +KPX Dcaron Acircumflex -25 +KPX Dcaron Adieresis -25 +KPX Dcaron Agrave -25 +KPX Dcaron Amacron -25 +KPX Dcaron Aogonek -25 +KPX Dcaron Aring -25 +KPX Dcaron Atilde -25 +KPX Dcaron V -50 +KPX Dcaron W -40 +KPX Dcaron Y -50 +KPX Dcaron Yacute -50 +KPX Dcaron Ydieresis -50 +KPX Dcroat A -25 +KPX Dcroat Aacute -25 +KPX Dcroat Abreve -25 +KPX Dcroat Acircumflex -25 +KPX Dcroat Adieresis -25 +KPX Dcroat Agrave -25 +KPX Dcroat Amacron -25 +KPX Dcroat Aogonek -25 +KPX Dcroat Aring -25 +KPX Dcroat Atilde -25 +KPX Dcroat V -50 +KPX Dcroat W -40 +KPX Dcroat Y -50 +KPX Dcroat Yacute -50 +KPX Dcroat Ydieresis -50 +KPX F A -100 +KPX F Aacute -100 +KPX F Abreve -100 +KPX F Acircumflex -100 +KPX F Adieresis -100 +KPX F Agrave -100 +KPX F Amacron -100 +KPX F Aogonek -100 +KPX F Aring -100 +KPX F Atilde -100 +KPX F a -95 +KPX F aacute -95 +KPX F abreve -95 +KPX F acircumflex -95 +KPX F adieresis -95 +KPX F agrave -95 +KPX F amacron -95 +KPX F aogonek -95 +KPX F aring -95 +KPX F atilde -95 +KPX F comma -129 +KPX F e -100 +KPX F eacute -100 +KPX F ecaron -100 +KPX F ecircumflex -100 +KPX F edieresis -100 +KPX F edotaccent -100 +KPX F egrave -100 +KPX F emacron -100 +KPX F eogonek -100 +KPX F i -40 +KPX F iacute -40 +KPX F icircumflex -40 +KPX F idieresis -40 +KPX F igrave -40 +KPX F imacron -40 +KPX F iogonek -40 +KPX F o -70 +KPX F oacute -70 +KPX F ocircumflex -70 +KPX F odieresis -70 +KPX F ograve -70 +KPX F ohungarumlaut -70 +KPX F omacron -70 +KPX F oslash -70 +KPX F otilde -70 +KPX F period -129 +KPX F r -50 +KPX F racute -50 +KPX F rcaron -50 +KPX F rcommaaccent -50 +KPX J A -25 +KPX J Aacute -25 +KPX J Abreve -25 +KPX J Acircumflex -25 +KPX J Adieresis -25 +KPX J Agrave -25 +KPX J Amacron -25 +KPX J Aogonek -25 +KPX J Aring -25 +KPX J Atilde -25 +KPX J a -40 +KPX J aacute -40 +KPX J abreve -40 +KPX J acircumflex -40 +KPX J adieresis -40 +KPX J agrave -40 +KPX J amacron -40 +KPX J aogonek -40 +KPX J aring -40 +KPX J atilde -40 +KPX J comma -10 +KPX J e -40 +KPX J eacute -40 +KPX J ecaron -40 +KPX J ecircumflex -40 +KPX J edieresis -40 +KPX J edotaccent -40 +KPX J egrave -40 +KPX J emacron -40 +KPX J eogonek -40 +KPX J o -40 +KPX J oacute -40 +KPX J ocircumflex -40 +KPX J odieresis -40 +KPX J ograve -40 +KPX J ohungarumlaut -40 +KPX J omacron -40 +KPX J oslash -40 +KPX J otilde -40 +KPX J period -10 +KPX J u -40 +KPX J uacute -40 +KPX J ucircumflex -40 +KPX J udieresis -40 +KPX J ugrave -40 +KPX J uhungarumlaut -40 +KPX J umacron -40 +KPX J uogonek -40 +KPX J uring -40 +KPX K O -30 +KPX K Oacute -30 +KPX K Ocircumflex -30 +KPX K Odieresis -30 +KPX K Ograve -30 +KPX K Ohungarumlaut -30 +KPX K Omacron -30 +KPX K Oslash -30 +KPX K Otilde -30 +KPX K e -25 +KPX K eacute -25 +KPX K ecaron -25 +KPX K ecircumflex -25 +KPX K edieresis -25 +KPX K edotaccent -25 +KPX K egrave -25 +KPX K emacron -25 +KPX K eogonek -25 +KPX K o -25 +KPX K oacute -25 +KPX K ocircumflex -25 +KPX K odieresis -25 +KPX K ograve -25 +KPX K ohungarumlaut -25 +KPX K omacron -25 +KPX K oslash -25 +KPX K otilde -25 +KPX K u -20 +KPX K uacute -20 +KPX K ucircumflex -20 +KPX K udieresis -20 +KPX K ugrave -20 +KPX K uhungarumlaut -20 +KPX K umacron -20 +KPX K uogonek -20 +KPX K uring -20 +KPX K y -20 +KPX K yacute -20 +KPX K ydieresis -20 +KPX Kcommaaccent O -30 +KPX Kcommaaccent Oacute -30 +KPX Kcommaaccent Ocircumflex -30 +KPX Kcommaaccent Odieresis -30 +KPX Kcommaaccent Ograve -30 +KPX Kcommaaccent Ohungarumlaut -30 +KPX Kcommaaccent Omacron -30 +KPX Kcommaaccent Oslash -30 +KPX Kcommaaccent Otilde -30 +KPX Kcommaaccent e -25 +KPX Kcommaaccent eacute -25 +KPX Kcommaaccent ecaron -25 +KPX Kcommaaccent ecircumflex -25 +KPX Kcommaaccent edieresis -25 +KPX Kcommaaccent edotaccent -25 +KPX Kcommaaccent egrave -25 +KPX Kcommaaccent emacron -25 +KPX Kcommaaccent eogonek -25 +KPX Kcommaaccent o -25 +KPX Kcommaaccent oacute -25 +KPX Kcommaaccent ocircumflex -25 +KPX Kcommaaccent odieresis -25 +KPX Kcommaaccent ograve -25 +KPX Kcommaaccent ohungarumlaut -25 +KPX Kcommaaccent omacron -25 +KPX Kcommaaccent oslash -25 +KPX Kcommaaccent otilde -25 +KPX Kcommaaccent u -20 +KPX Kcommaaccent uacute -20 +KPX Kcommaaccent ucircumflex -20 +KPX Kcommaaccent udieresis -20 +KPX Kcommaaccent ugrave -20 +KPX Kcommaaccent uhungarumlaut -20 +KPX Kcommaaccent umacron -20 +KPX Kcommaaccent uogonek -20 +KPX Kcommaaccent uring -20 +KPX Kcommaaccent y -20 +KPX Kcommaaccent yacute -20 +KPX Kcommaaccent ydieresis -20 +KPX L T -18 +KPX L Tcaron -18 +KPX L Tcommaaccent -18 +KPX L V -37 +KPX L W -37 +KPX L Y -37 +KPX L Yacute -37 +KPX L Ydieresis -37 +KPX L quoteright -55 +KPX L y -37 +KPX L yacute -37 +KPX L ydieresis -37 +KPX Lacute T -18 +KPX Lacute Tcaron -18 +KPX Lacute Tcommaaccent -18 +KPX Lacute V -37 +KPX Lacute W -37 +KPX Lacute Y -37 +KPX Lacute Yacute -37 +KPX Lacute Ydieresis -37 +KPX Lacute quoteright -55 +KPX Lacute y -37 +KPX Lacute yacute -37 +KPX Lacute ydieresis -37 +KPX Lcommaaccent T -18 +KPX Lcommaaccent Tcaron -18 +KPX Lcommaaccent Tcommaaccent -18 +KPX Lcommaaccent V -37 +KPX Lcommaaccent W -37 +KPX Lcommaaccent Y -37 +KPX Lcommaaccent Yacute -37 +KPX Lcommaaccent Ydieresis -37 +KPX Lcommaaccent quoteright -55 +KPX Lcommaaccent y -37 +KPX Lcommaaccent yacute -37 +KPX Lcommaaccent ydieresis -37 +KPX Lslash T -18 +KPX Lslash Tcaron -18 +KPX Lslash Tcommaaccent -18 +KPX Lslash V -37 +KPX Lslash W -37 +KPX Lslash Y -37 +KPX Lslash Yacute -37 +KPX Lslash Ydieresis -37 +KPX Lslash quoteright -55 +KPX Lslash y -37 +KPX Lslash yacute -37 +KPX Lslash ydieresis -37 +KPX N A -30 +KPX N Aacute -30 +KPX N Abreve -30 +KPX N Acircumflex -30 +KPX N Adieresis -30 +KPX N Agrave -30 +KPX N Amacron -30 +KPX N Aogonek -30 +KPX N Aring -30 +KPX N Atilde -30 +KPX Nacute A -30 +KPX Nacute Aacute -30 +KPX Nacute Abreve -30 +KPX Nacute Acircumflex -30 +KPX Nacute Adieresis -30 +KPX Nacute Agrave -30 +KPX Nacute Amacron -30 +KPX Nacute Aogonek -30 +KPX Nacute Aring -30 +KPX Nacute Atilde -30 +KPX Ncaron A -30 +KPX Ncaron Aacute -30 +KPX Ncaron Abreve -30 +KPX Ncaron Acircumflex -30 +KPX Ncaron Adieresis -30 +KPX Ncaron Agrave -30 +KPX Ncaron Amacron -30 +KPX Ncaron Aogonek -30 +KPX Ncaron Aring -30 +KPX Ncaron Atilde -30 +KPX Ncommaaccent A -30 +KPX Ncommaaccent Aacute -30 +KPX Ncommaaccent Abreve -30 +KPX Ncommaaccent Acircumflex -30 +KPX Ncommaaccent Adieresis -30 +KPX Ncommaaccent Agrave -30 +KPX Ncommaaccent Amacron -30 +KPX Ncommaaccent Aogonek -30 +KPX Ncommaaccent Aring -30 +KPX Ncommaaccent Atilde -30 +KPX Ntilde A -30 +KPX Ntilde Aacute -30 +KPX Ntilde Abreve -30 +KPX Ntilde Acircumflex -30 +KPX Ntilde Adieresis -30 +KPX Ntilde Agrave -30 +KPX Ntilde Amacron -30 +KPX Ntilde Aogonek -30 +KPX Ntilde Aring -30 +KPX Ntilde Atilde -30 +KPX O A -40 +KPX O Aacute -40 +KPX O Abreve -40 +KPX O Acircumflex -40 +KPX O Adieresis -40 +KPX O Agrave -40 +KPX O Amacron -40 +KPX O Aogonek -40 +KPX O Aring -40 +KPX O Atilde -40 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -50 +KPX O X -40 +KPX O Y -50 +KPX O Yacute -50 +KPX O Ydieresis -50 +KPX Oacute A -40 +KPX Oacute Aacute -40 +KPX Oacute Abreve -40 +KPX Oacute Acircumflex -40 +KPX Oacute Adieresis -40 +KPX Oacute Agrave -40 +KPX Oacute Amacron -40 +KPX Oacute Aogonek -40 +KPX Oacute Aring -40 +KPX Oacute Atilde -40 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -50 +KPX Oacute X -40 +KPX Oacute Y -50 +KPX Oacute Yacute -50 +KPX Oacute Ydieresis -50 +KPX Ocircumflex A -40 +KPX Ocircumflex Aacute -40 +KPX Ocircumflex Abreve -40 +KPX Ocircumflex Acircumflex -40 +KPX Ocircumflex Adieresis -40 +KPX Ocircumflex Agrave -40 +KPX Ocircumflex Amacron -40 +KPX Ocircumflex Aogonek -40 +KPX Ocircumflex Aring -40 +KPX Ocircumflex Atilde -40 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -50 +KPX Ocircumflex X -40 +KPX Ocircumflex Y -50 +KPX Ocircumflex Yacute -50 +KPX Ocircumflex Ydieresis -50 +KPX Odieresis A -40 +KPX Odieresis Aacute -40 +KPX Odieresis Abreve -40 +KPX Odieresis Acircumflex -40 +KPX Odieresis Adieresis -40 +KPX Odieresis Agrave -40 +KPX Odieresis Amacron -40 +KPX Odieresis Aogonek -40 +KPX Odieresis Aring -40 +KPX Odieresis Atilde -40 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -50 +KPX Odieresis X -40 +KPX Odieresis Y -50 +KPX Odieresis Yacute -50 +KPX Odieresis Ydieresis -50 +KPX Ograve A -40 +KPX Ograve Aacute -40 +KPX Ograve Abreve -40 +KPX Ograve Acircumflex -40 +KPX Ograve Adieresis -40 +KPX Ograve Agrave -40 +KPX Ograve Amacron -40 +KPX Ograve Aogonek -40 +KPX Ograve Aring -40 +KPX Ograve Atilde -40 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -50 +KPX Ograve X -40 +KPX Ograve Y -50 +KPX Ograve Yacute -50 +KPX Ograve Ydieresis -50 +KPX Ohungarumlaut A -40 +KPX Ohungarumlaut Aacute -40 +KPX Ohungarumlaut Abreve -40 +KPX Ohungarumlaut Acircumflex -40 +KPX Ohungarumlaut Adieresis -40 +KPX Ohungarumlaut Agrave -40 +KPX Ohungarumlaut Amacron -40 +KPX Ohungarumlaut Aogonek -40 +KPX Ohungarumlaut Aring -40 +KPX Ohungarumlaut Atilde -40 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -50 +KPX Ohungarumlaut X -40 +KPX Ohungarumlaut Y -50 +KPX Ohungarumlaut Yacute -50 +KPX Ohungarumlaut Ydieresis -50 +KPX Omacron A -40 +KPX Omacron Aacute -40 +KPX Omacron Abreve -40 +KPX Omacron Acircumflex -40 +KPX Omacron Adieresis -40 +KPX Omacron Agrave -40 +KPX Omacron Amacron -40 +KPX Omacron Aogonek -40 +KPX Omacron Aring -40 +KPX Omacron Atilde -40 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -50 +KPX Omacron X -40 +KPX Omacron Y -50 +KPX Omacron Yacute -50 +KPX Omacron Ydieresis -50 +KPX Oslash A -40 +KPX Oslash Aacute -40 +KPX Oslash Abreve -40 +KPX Oslash Acircumflex -40 +KPX Oslash Adieresis -40 +KPX Oslash Agrave -40 +KPX Oslash Amacron -40 +KPX Oslash Aogonek -40 +KPX Oslash Aring -40 +KPX Oslash Atilde -40 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -50 +KPX Oslash X -40 +KPX Oslash Y -50 +KPX Oslash Yacute -50 +KPX Oslash Ydieresis -50 +KPX Otilde A -40 +KPX Otilde Aacute -40 +KPX Otilde Abreve -40 +KPX Otilde Acircumflex -40 +KPX Otilde Adieresis -40 +KPX Otilde Agrave -40 +KPX Otilde Amacron -40 +KPX Otilde Aogonek -40 +KPX Otilde Aring -40 +KPX Otilde Atilde -40 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -50 +KPX Otilde X -40 +KPX Otilde Y -50 +KPX Otilde Yacute -50 +KPX Otilde Ydieresis -50 +KPX P A -85 +KPX P Aacute -85 +KPX P Abreve -85 +KPX P Acircumflex -85 +KPX P Adieresis -85 +KPX P Agrave -85 +KPX P Amacron -85 +KPX P Aogonek -85 +KPX P Aring -85 +KPX P Atilde -85 +KPX P a -40 +KPX P aacute -40 +KPX P abreve -40 +KPX P acircumflex -40 +KPX P adieresis -40 +KPX P agrave -40 +KPX P amacron -40 +KPX P aogonek -40 +KPX P aring -40 +KPX P atilde -40 +KPX P comma -129 +KPX P e -50 +KPX P eacute -50 +KPX P ecaron -50 +KPX P ecircumflex -50 +KPX P edieresis -50 +KPX P edotaccent -50 +KPX P egrave -50 +KPX P emacron -50 +KPX P eogonek -50 +KPX P o -55 +KPX P oacute -55 +KPX P ocircumflex -55 +KPX P odieresis -55 +KPX P ograve -55 +KPX P ohungarumlaut -55 +KPX P omacron -55 +KPX P oslash -55 +KPX P otilde -55 +KPX P period -129 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX R O -40 +KPX R Oacute -40 +KPX R Ocircumflex -40 +KPX R Odieresis -40 +KPX R Ograve -40 +KPX R Ohungarumlaut -40 +KPX R Omacron -40 +KPX R Oslash -40 +KPX R Otilde -40 +KPX R T -30 +KPX R Tcaron -30 +KPX R Tcommaaccent -30 +KPX R U -40 +KPX R Uacute -40 +KPX R Ucircumflex -40 +KPX R Udieresis -40 +KPX R Ugrave -40 +KPX R Uhungarumlaut -40 +KPX R Umacron -40 +KPX R Uogonek -40 +KPX R Uring -40 +KPX R V -18 +KPX R W -18 +KPX R Y -18 +KPX R Yacute -18 +KPX R Ydieresis -18 +KPX Racute O -40 +KPX Racute Oacute -40 +KPX Racute Ocircumflex -40 +KPX Racute Odieresis -40 +KPX Racute Ograve -40 +KPX Racute Ohungarumlaut -40 +KPX Racute Omacron -40 +KPX Racute Oslash -40 +KPX Racute Otilde -40 +KPX Racute T -30 +KPX Racute Tcaron -30 +KPX Racute Tcommaaccent -30 +KPX Racute U -40 +KPX Racute Uacute -40 +KPX Racute Ucircumflex -40 +KPX Racute Udieresis -40 +KPX Racute Ugrave -40 +KPX Racute Uhungarumlaut -40 +KPX Racute Umacron -40 +KPX Racute Uogonek -40 +KPX Racute Uring -40 +KPX Racute V -18 +KPX Racute W -18 +KPX Racute Y -18 +KPX Racute Yacute -18 +KPX Racute Ydieresis -18 +KPX Rcaron O -40 +KPX Rcaron Oacute -40 +KPX Rcaron Ocircumflex -40 +KPX Rcaron Odieresis -40 +KPX Rcaron Ograve -40 +KPX Rcaron Ohungarumlaut -40 +KPX Rcaron Omacron -40 +KPX Rcaron Oslash -40 +KPX Rcaron Otilde -40 +KPX Rcaron T -30 +KPX Rcaron Tcaron -30 +KPX Rcaron Tcommaaccent -30 +KPX Rcaron U -40 +KPX Rcaron Uacute -40 +KPX Rcaron Ucircumflex -40 +KPX Rcaron Udieresis -40 +KPX Rcaron Ugrave -40 +KPX Rcaron Uhungarumlaut -40 +KPX Rcaron Umacron -40 +KPX Rcaron Uogonek -40 +KPX Rcaron Uring -40 +KPX Rcaron V -18 +KPX Rcaron W -18 +KPX Rcaron Y -18 +KPX Rcaron Yacute -18 +KPX Rcaron Ydieresis -18 +KPX Rcommaaccent O -40 +KPX Rcommaaccent Oacute -40 +KPX Rcommaaccent Ocircumflex -40 +KPX Rcommaaccent Odieresis -40 +KPX Rcommaaccent Ograve -40 +KPX Rcommaaccent Ohungarumlaut -40 +KPX Rcommaaccent Omacron -40 +KPX Rcommaaccent Oslash -40 +KPX Rcommaaccent Otilde -40 +KPX Rcommaaccent T -30 +KPX Rcommaaccent Tcaron -30 +KPX Rcommaaccent Tcommaaccent -30 +KPX Rcommaaccent U -40 +KPX Rcommaaccent Uacute -40 +KPX Rcommaaccent Ucircumflex -40 +KPX Rcommaaccent Udieresis -40 +KPX Rcommaaccent Ugrave -40 +KPX Rcommaaccent Uhungarumlaut -40 +KPX Rcommaaccent Umacron -40 +KPX Rcommaaccent Uogonek -40 +KPX Rcommaaccent Uring -40 +KPX Rcommaaccent V -18 +KPX Rcommaaccent W -18 +KPX Rcommaaccent Y -18 +KPX Rcommaaccent Yacute -18 +KPX Rcommaaccent Ydieresis -18 +KPX T A -55 +KPX T Aacute -55 +KPX T Abreve -55 +KPX T Acircumflex -55 +KPX T Adieresis -55 +KPX T Agrave -55 +KPX T Amacron -55 +KPX T Aogonek -55 +KPX T Aring -55 +KPX T Atilde -55 +KPX T O -18 +KPX T Oacute -18 +KPX T Ocircumflex -18 +KPX T Odieresis -18 +KPX T Ograve -18 +KPX T Ohungarumlaut -18 +KPX T Omacron -18 +KPX T Oslash -18 +KPX T Otilde -18 +KPX T a -92 +KPX T aacute -92 +KPX T abreve -92 +KPX T acircumflex -92 +KPX T adieresis -92 +KPX T agrave -92 +KPX T amacron -92 +KPX T aogonek -92 +KPX T aring -92 +KPX T atilde -92 +KPX T colon -74 +KPX T comma -92 +KPX T e -92 +KPX T eacute -92 +KPX T ecaron -92 +KPX T ecircumflex -92 +KPX T edieresis -52 +KPX T edotaccent -92 +KPX T egrave -52 +KPX T emacron -52 +KPX T eogonek -92 +KPX T hyphen -92 +KPX T i -37 +KPX T iacute -37 +KPX T iogonek -37 +KPX T o -95 +KPX T oacute -95 +KPX T ocircumflex -95 +KPX T odieresis -95 +KPX T ograve -95 +KPX T ohungarumlaut -95 +KPX T omacron -95 +KPX T oslash -95 +KPX T otilde -95 +KPX T period -92 +KPX T r -37 +KPX T racute -37 +KPX T rcaron -37 +KPX T rcommaaccent -37 +KPX T semicolon -74 +KPX T u -37 +KPX T uacute -37 +KPX T ucircumflex -37 +KPX T udieresis -37 +KPX T ugrave -37 +KPX T uhungarumlaut -37 +KPX T umacron -37 +KPX T uogonek -37 +KPX T uring -37 +KPX T w -37 +KPX T y -37 +KPX T yacute -37 +KPX T ydieresis -37 +KPX Tcaron A -55 +KPX Tcaron Aacute -55 +KPX Tcaron Abreve -55 +KPX Tcaron Acircumflex -55 +KPX Tcaron Adieresis -55 +KPX Tcaron Agrave -55 +KPX Tcaron Amacron -55 +KPX Tcaron Aogonek -55 +KPX Tcaron Aring -55 +KPX Tcaron Atilde -55 +KPX Tcaron O -18 +KPX Tcaron Oacute -18 +KPX Tcaron Ocircumflex -18 +KPX Tcaron Odieresis -18 +KPX Tcaron Ograve -18 +KPX Tcaron Ohungarumlaut -18 +KPX Tcaron Omacron -18 +KPX Tcaron Oslash -18 +KPX Tcaron Otilde -18 +KPX Tcaron a -92 +KPX Tcaron aacute -92 +KPX Tcaron abreve -92 +KPX Tcaron acircumflex -92 +KPX Tcaron adieresis -92 +KPX Tcaron agrave -92 +KPX Tcaron amacron -92 +KPX Tcaron aogonek -92 +KPX Tcaron aring -92 +KPX Tcaron atilde -92 +KPX Tcaron colon -74 +KPX Tcaron comma -92 +KPX Tcaron e -92 +KPX Tcaron eacute -92 +KPX Tcaron ecaron -92 +KPX Tcaron ecircumflex -92 +KPX Tcaron edieresis -52 +KPX Tcaron edotaccent -92 +KPX Tcaron egrave -52 +KPX Tcaron emacron -52 +KPX Tcaron eogonek -92 +KPX Tcaron hyphen -92 +KPX Tcaron i -37 +KPX Tcaron iacute -37 +KPX Tcaron iogonek -37 +KPX Tcaron o -95 +KPX Tcaron oacute -95 +KPX Tcaron ocircumflex -95 +KPX Tcaron odieresis -95 +KPX Tcaron ograve -95 +KPX Tcaron ohungarumlaut -95 +KPX Tcaron omacron -95 +KPX Tcaron oslash -95 +KPX Tcaron otilde -95 +KPX Tcaron period -92 +KPX Tcaron r -37 +KPX Tcaron racute -37 +KPX Tcaron rcaron -37 +KPX Tcaron rcommaaccent -37 +KPX Tcaron semicolon -74 +KPX Tcaron u -37 +KPX Tcaron uacute -37 +KPX Tcaron ucircumflex -37 +KPX Tcaron udieresis -37 +KPX Tcaron ugrave -37 +KPX Tcaron uhungarumlaut -37 +KPX Tcaron umacron -37 +KPX Tcaron uogonek -37 +KPX Tcaron uring -37 +KPX Tcaron w -37 +KPX Tcaron y -37 +KPX Tcaron yacute -37 +KPX Tcaron ydieresis -37 +KPX Tcommaaccent A -55 +KPX Tcommaaccent Aacute -55 +KPX Tcommaaccent Abreve -55 +KPX Tcommaaccent Acircumflex -55 +KPX Tcommaaccent Adieresis -55 +KPX Tcommaaccent Agrave -55 +KPX Tcommaaccent Amacron -55 +KPX Tcommaaccent Aogonek -55 +KPX Tcommaaccent Aring -55 +KPX Tcommaaccent Atilde -55 +KPX Tcommaaccent O -18 +KPX Tcommaaccent Oacute -18 +KPX Tcommaaccent Ocircumflex -18 +KPX Tcommaaccent Odieresis -18 +KPX Tcommaaccent Ograve -18 +KPX Tcommaaccent Ohungarumlaut -18 +KPX Tcommaaccent Omacron -18 +KPX Tcommaaccent Oslash -18 +KPX Tcommaaccent Otilde -18 +KPX Tcommaaccent a -92 +KPX Tcommaaccent aacute -92 +KPX Tcommaaccent abreve -92 +KPX Tcommaaccent acircumflex -92 +KPX Tcommaaccent adieresis -92 +KPX Tcommaaccent agrave -92 +KPX Tcommaaccent amacron -92 +KPX Tcommaaccent aogonek -92 +KPX Tcommaaccent aring -92 +KPX Tcommaaccent atilde -92 +KPX Tcommaaccent colon -74 +KPX Tcommaaccent comma -92 +KPX Tcommaaccent e -92 +KPX Tcommaaccent eacute -92 +KPX Tcommaaccent ecaron -92 +KPX Tcommaaccent ecircumflex -92 +KPX Tcommaaccent edieresis -52 +KPX Tcommaaccent edotaccent -92 +KPX Tcommaaccent egrave -52 +KPX Tcommaaccent emacron -52 +KPX Tcommaaccent eogonek -92 +KPX Tcommaaccent hyphen -92 +KPX Tcommaaccent i -37 +KPX Tcommaaccent iacute -37 +KPX Tcommaaccent iogonek -37 +KPX Tcommaaccent o -95 +KPX Tcommaaccent oacute -95 +KPX Tcommaaccent ocircumflex -95 +KPX Tcommaaccent odieresis -95 +KPX Tcommaaccent ograve -95 +KPX Tcommaaccent ohungarumlaut -95 +KPX Tcommaaccent omacron -95 +KPX Tcommaaccent oslash -95 +KPX Tcommaaccent otilde -95 +KPX Tcommaaccent period -92 +KPX Tcommaaccent r -37 +KPX Tcommaaccent racute -37 +KPX Tcommaaccent rcaron -37 +KPX Tcommaaccent rcommaaccent -37 +KPX Tcommaaccent semicolon -74 +KPX Tcommaaccent u -37 +KPX Tcommaaccent uacute -37 +KPX Tcommaaccent ucircumflex -37 +KPX Tcommaaccent udieresis -37 +KPX Tcommaaccent ugrave -37 +KPX Tcommaaccent uhungarumlaut -37 +KPX Tcommaaccent umacron -37 +KPX Tcommaaccent uogonek -37 +KPX Tcommaaccent uring -37 +KPX Tcommaaccent w -37 +KPX Tcommaaccent y -37 +KPX Tcommaaccent yacute -37 +KPX Tcommaaccent ydieresis -37 +KPX U A -45 +KPX U Aacute -45 +KPX U Abreve -45 +KPX U Acircumflex -45 +KPX U Adieresis -45 +KPX U Agrave -45 +KPX U Amacron -45 +KPX U Aogonek -45 +KPX U Aring -45 +KPX U Atilde -45 +KPX Uacute A -45 +KPX Uacute Aacute -45 +KPX Uacute Abreve -45 +KPX Uacute Acircumflex -45 +KPX Uacute Adieresis -45 +KPX Uacute Agrave -45 +KPX Uacute Amacron -45 +KPX Uacute Aogonek -45 +KPX Uacute Aring -45 +KPX Uacute Atilde -45 +KPX Ucircumflex A -45 +KPX Ucircumflex Aacute -45 +KPX Ucircumflex Abreve -45 +KPX Ucircumflex Acircumflex -45 +KPX Ucircumflex Adieresis -45 +KPX Ucircumflex Agrave -45 +KPX Ucircumflex Amacron -45 +KPX Ucircumflex Aogonek -45 +KPX Ucircumflex Aring -45 +KPX Ucircumflex Atilde -45 +KPX Udieresis A -45 +KPX Udieresis Aacute -45 +KPX Udieresis Abreve -45 +KPX Udieresis Acircumflex -45 +KPX Udieresis Adieresis -45 +KPX Udieresis Agrave -45 +KPX Udieresis Amacron -45 +KPX Udieresis Aogonek -45 +KPX Udieresis Aring -45 +KPX Udieresis Atilde -45 +KPX Ugrave A -45 +KPX Ugrave Aacute -45 +KPX Ugrave Abreve -45 +KPX Ugrave Acircumflex -45 +KPX Ugrave Adieresis -45 +KPX Ugrave Agrave -45 +KPX Ugrave Amacron -45 +KPX Ugrave Aogonek -45 +KPX Ugrave Aring -45 +KPX Ugrave Atilde -45 +KPX Uhungarumlaut A -45 +KPX Uhungarumlaut Aacute -45 +KPX Uhungarumlaut Abreve -45 +KPX Uhungarumlaut Acircumflex -45 +KPX Uhungarumlaut Adieresis -45 +KPX Uhungarumlaut Agrave -45 +KPX Uhungarumlaut Amacron -45 +KPX Uhungarumlaut Aogonek -45 +KPX Uhungarumlaut Aring -45 +KPX Uhungarumlaut Atilde -45 +KPX Umacron A -45 +KPX Umacron Aacute -45 +KPX Umacron Abreve -45 +KPX Umacron Acircumflex -45 +KPX Umacron Adieresis -45 +KPX Umacron Agrave -45 +KPX Umacron Amacron -45 +KPX Umacron Aogonek -45 +KPX Umacron Aring -45 +KPX Umacron Atilde -45 +KPX Uogonek A -45 +KPX Uogonek Aacute -45 +KPX Uogonek Abreve -45 +KPX Uogonek Acircumflex -45 +KPX Uogonek Adieresis -45 +KPX Uogonek Agrave -45 +KPX Uogonek Amacron -45 +KPX Uogonek Aogonek -45 +KPX Uogonek Aring -45 +KPX Uogonek Atilde -45 +KPX Uring A -45 +KPX Uring Aacute -45 +KPX Uring Abreve -45 +KPX Uring Acircumflex -45 +KPX Uring Adieresis -45 +KPX Uring Agrave -45 +KPX Uring Amacron -45 +KPX Uring Aogonek -45 +KPX Uring Aring -45 +KPX Uring Atilde -45 +KPX V A -85 +KPX V Aacute -85 +KPX V Abreve -85 +KPX V Acircumflex -85 +KPX V Adieresis -85 +KPX V Agrave -85 +KPX V Amacron -85 +KPX V Aogonek -85 +KPX V Aring -85 +KPX V Atilde -85 +KPX V G -10 +KPX V Gbreve -10 +KPX V Gcommaaccent -10 +KPX V O -30 +KPX V Oacute -30 +KPX V Ocircumflex -30 +KPX V Odieresis -30 +KPX V Ograve -30 +KPX V Ohungarumlaut -30 +KPX V Omacron -30 +KPX V Oslash -30 +KPX V Otilde -30 +KPX V a -111 +KPX V aacute -111 +KPX V abreve -111 +KPX V acircumflex -111 +KPX V adieresis -111 +KPX V agrave -111 +KPX V amacron -111 +KPX V aogonek -111 +KPX V aring -111 +KPX V atilde -111 +KPX V colon -74 +KPX V comma -129 +KPX V e -111 +KPX V eacute -111 +KPX V ecaron -111 +KPX V ecircumflex -111 +KPX V edieresis -71 +KPX V edotaccent -111 +KPX V egrave -71 +KPX V emacron -71 +KPX V eogonek -111 +KPX V hyphen -70 +KPX V i -55 +KPX V iacute -55 +KPX V iogonek -55 +KPX V o -111 +KPX V oacute -111 +KPX V ocircumflex -111 +KPX V odieresis -111 +KPX V ograve -111 +KPX V ohungarumlaut -111 +KPX V omacron -111 +KPX V oslash -111 +KPX V otilde -111 +KPX V period -129 +KPX V semicolon -74 +KPX V u -55 +KPX V uacute -55 +KPX V ucircumflex -55 +KPX V udieresis -55 +KPX V ugrave -55 +KPX V uhungarumlaut -55 +KPX V umacron -55 +KPX V uogonek -55 +KPX V uring -55 +KPX W A -74 +KPX W Aacute -74 +KPX W Abreve -74 +KPX W Acircumflex -74 +KPX W Adieresis -74 +KPX W Agrave -74 +KPX W Amacron -74 +KPX W Aogonek -74 +KPX W Aring -74 +KPX W Atilde -74 +KPX W O -15 +KPX W Oacute -15 +KPX W Ocircumflex -15 +KPX W Odieresis -15 +KPX W Ograve -15 +KPX W Ohungarumlaut -15 +KPX W Omacron -15 +KPX W Oslash -15 +KPX W Otilde -15 +KPX W a -85 +KPX W aacute -85 +KPX W abreve -85 +KPX W acircumflex -85 +KPX W adieresis -85 +KPX W agrave -85 +KPX W amacron -85 +KPX W aogonek -85 +KPX W aring -85 +KPX W atilde -85 +KPX W colon -55 +KPX W comma -74 +KPX W e -90 +KPX W eacute -90 +KPX W ecaron -90 +KPX W ecircumflex -90 +KPX W edieresis -50 +KPX W edotaccent -90 +KPX W egrave -50 +KPX W emacron -50 +KPX W eogonek -90 +KPX W hyphen -50 +KPX W i -37 +KPX W iacute -37 +KPX W iogonek -37 +KPX W o -80 +KPX W oacute -80 +KPX W ocircumflex -80 +KPX W odieresis -80 +KPX W ograve -80 +KPX W ohungarumlaut -80 +KPX W omacron -80 +KPX W oslash -80 +KPX W otilde -80 +KPX W period -74 +KPX W semicolon -55 +KPX W u -55 +KPX W uacute -55 +KPX W ucircumflex -55 +KPX W udieresis -55 +KPX W ugrave -55 +KPX W uhungarumlaut -55 +KPX W umacron -55 +KPX W uogonek -55 +KPX W uring -55 +KPX W y -55 +KPX W yacute -55 +KPX W ydieresis -55 +KPX Y A -74 +KPX Y Aacute -74 +KPX Y Abreve -74 +KPX Y Acircumflex -74 +KPX Y Adieresis -74 +KPX Y Agrave -74 +KPX Y Amacron -74 +KPX Y Aogonek -74 +KPX Y Aring -74 +KPX Y Atilde -74 +KPX Y O -25 +KPX Y Oacute -25 +KPX Y Ocircumflex -25 +KPX Y Odieresis -25 +KPX Y Ograve -25 +KPX Y Ohungarumlaut -25 +KPX Y Omacron -25 +KPX Y Oslash -25 +KPX Y Otilde -25 +KPX Y a -92 +KPX Y aacute -92 +KPX Y abreve -92 +KPX Y acircumflex -92 +KPX Y adieresis -92 +KPX Y agrave -92 +KPX Y amacron -92 +KPX Y aogonek -92 +KPX Y aring -92 +KPX Y atilde -92 +KPX Y colon -92 +KPX Y comma -92 +KPX Y e -111 +KPX Y eacute -111 +KPX Y ecaron -111 +KPX Y ecircumflex -71 +KPX Y edieresis -71 +KPX Y edotaccent -111 +KPX Y egrave -71 +KPX Y emacron -71 +KPX Y eogonek -111 +KPX Y hyphen -92 +KPX Y i -55 +KPX Y iacute -55 +KPX Y iogonek -55 +KPX Y o -111 +KPX Y oacute -111 +KPX Y ocircumflex -111 +KPX Y odieresis -111 +KPX Y ograve -111 +KPX Y ohungarumlaut -111 +KPX Y omacron -111 +KPX Y oslash -111 +KPX Y otilde -111 +KPX Y period -74 +KPX Y semicolon -92 +KPX Y u -92 +KPX Y uacute -92 +KPX Y ucircumflex -92 +KPX Y udieresis -92 +KPX Y ugrave -92 +KPX Y uhungarumlaut -92 +KPX Y umacron -92 +KPX Y uogonek -92 +KPX Y uring -92 +KPX Yacute A -74 +KPX Yacute Aacute -74 +KPX Yacute Abreve -74 +KPX Yacute Acircumflex -74 +KPX Yacute Adieresis -74 +KPX Yacute Agrave -74 +KPX Yacute Amacron -74 +KPX Yacute Aogonek -74 +KPX Yacute Aring -74 +KPX Yacute Atilde -74 +KPX Yacute O -25 +KPX Yacute Oacute -25 +KPX Yacute Ocircumflex -25 +KPX Yacute Odieresis -25 +KPX Yacute Ograve -25 +KPX Yacute Ohungarumlaut -25 +KPX Yacute Omacron -25 +KPX Yacute Oslash -25 +KPX Yacute Otilde -25 +KPX Yacute a -92 +KPX Yacute aacute -92 +KPX Yacute abreve -92 +KPX Yacute acircumflex -92 +KPX Yacute adieresis -92 +KPX Yacute agrave -92 +KPX Yacute amacron -92 +KPX Yacute aogonek -92 +KPX Yacute aring -92 +KPX Yacute atilde -92 +KPX Yacute colon -92 +KPX Yacute comma -92 +KPX Yacute e -111 +KPX Yacute eacute -111 +KPX Yacute ecaron -111 +KPX Yacute ecircumflex -71 +KPX Yacute edieresis -71 +KPX Yacute edotaccent -111 +KPX Yacute egrave -71 +KPX Yacute emacron -71 +KPX Yacute eogonek -111 +KPX Yacute hyphen -92 +KPX Yacute i -55 +KPX Yacute iacute -55 +KPX Yacute iogonek -55 +KPX Yacute o -111 +KPX Yacute oacute -111 +KPX Yacute ocircumflex -111 +KPX Yacute odieresis -111 +KPX Yacute ograve -111 +KPX Yacute ohungarumlaut -111 +KPX Yacute omacron -111 +KPX Yacute oslash -111 +KPX Yacute otilde -111 +KPX Yacute period -74 +KPX Yacute semicolon -92 +KPX Yacute u -92 +KPX Yacute uacute -92 +KPX Yacute ucircumflex -92 +KPX Yacute udieresis -92 +KPX Yacute ugrave -92 +KPX Yacute uhungarumlaut -92 +KPX Yacute umacron -92 +KPX Yacute uogonek -92 +KPX Yacute uring -92 +KPX Ydieresis A -74 +KPX Ydieresis Aacute -74 +KPX Ydieresis Abreve -74 +KPX Ydieresis Acircumflex -74 +KPX Ydieresis Adieresis -74 +KPX Ydieresis Agrave -74 +KPX Ydieresis Amacron -74 +KPX Ydieresis Aogonek -74 +KPX Ydieresis Aring -74 +KPX Ydieresis Atilde -74 +KPX Ydieresis O -25 +KPX Ydieresis Oacute -25 +KPX Ydieresis Ocircumflex -25 +KPX Ydieresis Odieresis -25 +KPX Ydieresis Ograve -25 +KPX Ydieresis Ohungarumlaut -25 +KPX Ydieresis Omacron -25 +KPX Ydieresis Oslash -25 +KPX Ydieresis Otilde -25 +KPX Ydieresis a -92 +KPX Ydieresis aacute -92 +KPX Ydieresis abreve -92 +KPX Ydieresis acircumflex -92 +KPX Ydieresis adieresis -92 +KPX Ydieresis agrave -92 +KPX Ydieresis amacron -92 +KPX Ydieresis aogonek -92 +KPX Ydieresis aring -92 +KPX Ydieresis atilde -92 +KPX Ydieresis colon -92 +KPX Ydieresis comma -92 +KPX Ydieresis e -111 +KPX Ydieresis eacute -111 +KPX Ydieresis ecaron -111 +KPX Ydieresis ecircumflex -71 +KPX Ydieresis edieresis -71 +KPX Ydieresis edotaccent -111 +KPX Ydieresis egrave -71 +KPX Ydieresis emacron -71 +KPX Ydieresis eogonek -111 +KPX Ydieresis hyphen -92 +KPX Ydieresis i -55 +KPX Ydieresis iacute -55 +KPX Ydieresis iogonek -55 +KPX Ydieresis o -111 +KPX Ydieresis oacute -111 +KPX Ydieresis ocircumflex -111 +KPX Ydieresis odieresis -111 +KPX Ydieresis ograve -111 +KPX Ydieresis ohungarumlaut -111 +KPX Ydieresis omacron -111 +KPX Ydieresis oslash -111 +KPX Ydieresis otilde -111 +KPX Ydieresis period -74 +KPX Ydieresis semicolon -92 +KPX Ydieresis u -92 +KPX Ydieresis uacute -92 +KPX Ydieresis ucircumflex -92 +KPX Ydieresis udieresis -92 +KPX Ydieresis ugrave -92 +KPX Ydieresis uhungarumlaut -92 +KPX Ydieresis umacron -92 +KPX Ydieresis uogonek -92 +KPX Ydieresis uring -92 +KPX b b -10 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX c h -10 +KPX c k -10 +KPX c kcommaaccent -10 +KPX cacute h -10 +KPX cacute k -10 +KPX cacute kcommaaccent -10 +KPX ccaron h -10 +KPX ccaron k -10 +KPX ccaron kcommaaccent -10 +KPX ccedilla h -10 +KPX ccedilla k -10 +KPX ccedilla kcommaaccent -10 +KPX comma quotedblright -95 +KPX comma quoteright -95 +KPX e b -10 +KPX eacute b -10 +KPX ecaron b -10 +KPX ecircumflex b -10 +KPX edieresis b -10 +KPX edotaccent b -10 +KPX egrave b -10 +KPX emacron b -10 +KPX eogonek b -10 +KPX f comma -10 +KPX f dotlessi -30 +KPX f e -10 +KPX f eacute -10 +KPX f edotaccent -10 +KPX f eogonek -10 +KPX f f -18 +KPX f o -10 +KPX f oacute -10 +KPX f ocircumflex -10 +KPX f ograve -10 +KPX f ohungarumlaut -10 +KPX f oslash -10 +KPX f otilde -10 +KPX f period -10 +KPX f quoteright 55 +KPX k e -30 +KPX k eacute -30 +KPX k ecaron -30 +KPX k ecircumflex -30 +KPX k edieresis -30 +KPX k edotaccent -30 +KPX k egrave -30 +KPX k emacron -30 +KPX k eogonek -30 +KPX k o -10 +KPX k oacute -10 +KPX k ocircumflex -10 +KPX k odieresis -10 +KPX k ograve -10 +KPX k ohungarumlaut -10 +KPX k omacron -10 +KPX k oslash -10 +KPX k otilde -10 +KPX kcommaaccent e -30 +KPX kcommaaccent eacute -30 +KPX kcommaaccent ecaron -30 +KPX kcommaaccent ecircumflex -30 +KPX kcommaaccent edieresis -30 +KPX kcommaaccent edotaccent -30 +KPX kcommaaccent egrave -30 +KPX kcommaaccent emacron -30 +KPX kcommaaccent eogonek -30 +KPX kcommaaccent o -10 +KPX kcommaaccent oacute -10 +KPX kcommaaccent ocircumflex -10 +KPX kcommaaccent odieresis -10 +KPX kcommaaccent ograve -10 +KPX kcommaaccent ohungarumlaut -10 +KPX kcommaaccent omacron -10 +KPX kcommaaccent oslash -10 +KPX kcommaaccent otilde -10 +KPX n v -40 +KPX nacute v -40 +KPX ncaron v -40 +KPX ncommaaccent v -40 +KPX ntilde v -40 +KPX o v -15 +KPX o w -25 +KPX o x -10 +KPX o y -10 +KPX o yacute -10 +KPX o ydieresis -10 +KPX oacute v -15 +KPX oacute w -25 +KPX oacute x -10 +KPX oacute y -10 +KPX oacute yacute -10 +KPX oacute ydieresis -10 +KPX ocircumflex v -15 +KPX ocircumflex w -25 +KPX ocircumflex x -10 +KPX ocircumflex y -10 +KPX ocircumflex yacute -10 +KPX ocircumflex ydieresis -10 +KPX odieresis v -15 +KPX odieresis w -25 +KPX odieresis x -10 +KPX odieresis y -10 +KPX odieresis yacute -10 +KPX odieresis ydieresis -10 +KPX ograve v -15 +KPX ograve w -25 +KPX ograve x -10 +KPX ograve y -10 +KPX ograve yacute -10 +KPX ograve ydieresis -10 +KPX ohungarumlaut v -15 +KPX ohungarumlaut w -25 +KPX ohungarumlaut x -10 +KPX ohungarumlaut y -10 +KPX ohungarumlaut yacute -10 +KPX ohungarumlaut ydieresis -10 +KPX omacron v -15 +KPX omacron w -25 +KPX omacron x -10 +KPX omacron y -10 +KPX omacron yacute -10 +KPX omacron ydieresis -10 +KPX oslash v -15 +KPX oslash w -25 +KPX oslash x -10 +KPX oslash y -10 +KPX oslash yacute -10 +KPX oslash ydieresis -10 +KPX otilde v -15 +KPX otilde w -25 +KPX otilde x -10 +KPX otilde y -10 +KPX otilde yacute -10 +KPX otilde ydieresis -10 +KPX period quotedblright -95 +KPX period quoteright -95 +KPX quoteleft quoteleft -74 +KPX quoteright d -15 +KPX quoteright dcroat -15 +KPX quoteright quoteright -74 +KPX quoteright r -15 +KPX quoteright racute -15 +KPX quoteright rcaron -15 +KPX quoteright rcommaaccent -15 +KPX quoteright s -74 +KPX quoteright sacute -74 +KPX quoteright scaron -74 +KPX quoteright scedilla -74 +KPX quoteright scommaaccent -74 +KPX quoteright space -74 +KPX quoteright t -37 +KPX quoteright tcommaaccent -37 +KPX quoteright v -15 +KPX r comma -65 +KPX r period -65 +KPX racute comma -65 +KPX racute period -65 +KPX rcaron comma -65 +KPX rcaron period -65 +KPX rcommaaccent comma -65 +KPX rcommaaccent period -65 +KPX space A -37 +KPX space Aacute -37 +KPX space Abreve -37 +KPX space Acircumflex -37 +KPX space Adieresis -37 +KPX space Agrave -37 +KPX space Amacron -37 +KPX space Aogonek -37 +KPX space Aring -37 +KPX space Atilde -37 +KPX space V -70 +KPX space W -70 +KPX space Y -70 +KPX space Yacute -70 +KPX space Ydieresis -70 +KPX v comma -37 +KPX v e -15 +KPX v eacute -15 +KPX v ecaron -15 +KPX v ecircumflex -15 +KPX v edieresis -15 +KPX v edotaccent -15 +KPX v egrave -15 +KPX v emacron -15 +KPX v eogonek -15 +KPX v o -15 +KPX v oacute -15 +KPX v ocircumflex -15 +KPX v odieresis -15 +KPX v ograve -15 +KPX v ohungarumlaut -15 +KPX v omacron -15 +KPX v oslash -15 +KPX v otilde -15 +KPX v period -37 +KPX w a -10 +KPX w aacute -10 +KPX w abreve -10 +KPX w acircumflex -10 +KPX w adieresis -10 +KPX w agrave -10 +KPX w amacron -10 +KPX w aogonek -10 +KPX w aring -10 +KPX w atilde -10 +KPX w comma -37 +KPX w e -10 +KPX w eacute -10 +KPX w ecaron -10 +KPX w ecircumflex -10 +KPX w edieresis -10 +KPX w edotaccent -10 +KPX w egrave -10 +KPX w emacron -10 +KPX w eogonek -10 +KPX w o -15 +KPX w oacute -15 +KPX w ocircumflex -15 +KPX w odieresis -15 +KPX w ograve -15 +KPX w ohungarumlaut -15 +KPX w omacron -15 +KPX w oslash -15 +KPX w otilde -15 +KPX w period -37 +KPX x e -10 +KPX x eacute -10 +KPX x ecaron -10 +KPX x ecircumflex -10 +KPX x edieresis -10 +KPX x edotaccent -10 +KPX x egrave -10 +KPX x emacron -10 +KPX x eogonek -10 +KPX y comma -37 +KPX y period -37 +KPX yacute comma -37 +KPX yacute period -37 +KPX ydieresis comma -37 +KPX ydieresis period -37 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Times-BoldItalic.afm.php b/application/third_party/dompdf/lib/fonts/Times-BoldItalic.afm.php new file mode 100755 index 00000000..18845ff6 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Times-BoldItalic.afm.php @@ -0,0 +1,570 @@ + + array ( + 32 => 'space', + 160 => 'space', + 33 => 'exclam', + 34 => 'quotedbl', + 35 => 'numbersign', + 36 => 'dollar', + 37 => 'percent', + 38 => 'ampersand', + 146 => 'quoteright', + 40 => 'parenleft', + 41 => 'parenright', + 42 => 'asterisk', + 43 => 'plus', + 44 => 'comma', + 45 => 'hyphen', + 173 => 'hyphen', + 46 => 'period', + 47 => 'slash', + 48 => 'zero', + 49 => 'one', + 50 => 'two', + 51 => 'three', + 52 => 'four', + 53 => 'five', + 54 => 'six', + 55 => 'seven', + 56 => 'eight', + 57 => 'nine', + 58 => 'colon', + 59 => 'semicolon', + 60 => 'less', + 61 => 'equal', + 62 => 'greater', + 63 => 'question', + 64 => 'at', + 65 => 'A', + 66 => 'B', + 67 => 'C', + 68 => 'D', + 69 => 'E', + 70 => 'F', + 71 => 'G', + 72 => 'H', + 73 => 'I', + 74 => 'J', + 75 => 'K', + 76 => 'L', + 77 => 'M', + 78 => 'N', + 79 => 'O', + 80 => 'P', + 81 => 'Q', + 82 => 'R', + 83 => 'S', + 84 => 'T', + 85 => 'U', + 86 => 'V', + 87 => 'W', + 88 => 'X', + 89 => 'Y', + 90 => 'Z', + 91 => 'bracketleft', + 92 => 'backslash', + 93 => 'bracketright', + 94 => 'asciicircum', + 95 => 'underscore', + 145 => 'quoteleft', + 97 => 'a', + 98 => 'b', + 99 => 'c', + 100 => 'd', + 101 => 'e', + 102 => 'f', + 103 => 'g', + 104 => 'h', + 105 => 'i', + 106 => 'j', + 107 => 'k', + 108 => 'l', + 109 => 'm', + 110 => 'n', + 111 => 'o', + 112 => 'p', + 113 => 'q', + 114 => 'r', + 115 => 's', + 116 => 't', + 117 => 'u', + 118 => 'v', + 119 => 'w', + 120 => 'x', + 121 => 'y', + 122 => 'z', + 123 => 'braceleft', + 124 => 'bar', + 125 => 'braceright', + 126 => 'asciitilde', + 161 => 'exclamdown', + 162 => 'cent', + 163 => 'sterling', + 165 => 'yen', + 131 => 'florin', + 167 => 'section', + 164 => 'currency', + 39 => 'quotesingle', + 147 => 'quotedblleft', + 170 => 'ordfeminine', + 139 => 'guilsinglleft', + 155 => 'guilsinglright', + 150 => 'endash', + 134 => 'dagger', + 135 => 'daggerdbl', + 183 => 'periodcentered', + 182 => 'paragraph', + 149 => 'bullet', + 130 => 'quotesinglbase', + 132 => 'quotedblbase', + 148 => 'quotedblright', + 187 => 'guillemotright', + 133 => 'ellipsis', + 137 => 'perthousand', + 191 => 'questiondown', + 96 => 'grave', + 180 => 'acute', + 136 => 'circumflex', + 152 => 'tilde', + 175 => 'macron', + 168 => 'dieresis', + 184 => 'cedilla', + 151 => 'emdash', + 198 => 'AE', + 216 => 'Oslash', + 140 => 'OE', + 186 => 'ordmasculine', + 230 => 'ae', + 248 => 'oslash', + 156 => 'oe', + 223 => 'germandbls', + 207 => 'Idieresis', + 233 => 'eacute', + 159 => 'Ydieresis', + 247 => 'divide', + 221 => 'Yacute', + 194 => 'Acircumflex', + 225 => 'aacute', + 219 => 'Ucircumflex', + 253 => 'yacute', + 234 => 'ecircumflex', + 220 => 'Udieresis', + 218 => 'Uacute', + 203 => 'Edieresis', + 169 => 'copyright', + 229 => 'aring', + 224 => 'agrave', + 227 => 'atilde', + 154 => 'scaron', + 237 => 'iacute', + 251 => 'ucircumflex', + 226 => 'acircumflex', + 231 => 'ccedilla', + 222 => 'Thorn', + 179 => 'threesuperior', + 210 => 'Ograve', + 192 => 'Agrave', + 215 => 'multiply', + 250 => 'uacute', + 255 => 'ydieresis', + 238 => 'icircumflex', + 202 => 'Ecircumflex', + 228 => 'adieresis', + 235 => 'edieresis', + 205 => 'Iacute', + 177 => 'plusminus', + 166 => 'brokenbar', + 174 => 'registered', + 200 => 'Egrave', + 142 => 'Zcaron', + 208 => 'Eth', + 199 => 'Ccedilla', + 193 => 'Aacute', + 196 => 'Adieresis', + 232 => 'egrave', + 211 => 'Oacute', + 243 => 'oacute', + 239 => 'idieresis', + 212 => 'Ocircumflex', + 217 => 'Ugrave', + 254 => 'thorn', + 178 => 'twosuperior', + 214 => 'Odieresis', + 181 => 'mu', + 236 => 'igrave', + 190 => 'threequarters', + 153 => 'trademark', + 204 => 'Igrave', + 189 => 'onehalf', + 244 => 'ocircumflex', + 241 => 'ntilde', + 201 => 'Eacute', + 188 => 'onequarter', + 138 => 'Scaron', + 176 => 'degree', + 242 => 'ograve', + 249 => 'ugrave', + 209 => 'Ntilde', + 245 => 'otilde', + 195 => 'Atilde', + 197 => 'Aring', + 213 => 'Otilde', + 206 => 'Icircumflex', + 172 => 'logicalnot', + 246 => 'odieresis', + 252 => 'udieresis', + 240 => 'eth', + 158 => 'zcaron', + 185 => 'onesuperior', + 128 => 'Euro', + ), + 'isUnicode' => false, + 'FontName' => 'Times-BoldItalic', + 'FullName' => 'Times Bold Italic', + 'FamilyName' => 'Times', + 'Weight' => 'Bold', + 'ItalicAngle' => '-15', + 'IsFixedPitch' => 'false', + 'CharacterSet' => 'ExtendedRoman', + 'FontBBox' => + array ( + 0 => '-200', + 1 => '-218', + 2 => '996', + 3 => '921', + ), + 'UnderlinePosition' => '-100', + 'UnderlineThickness' => '50', + 'Version' => '002.000', + 'EncodingScheme' => 'WinAnsiEncoding', + 'CapHeight' => '669', + 'XHeight' => '462', + 'Ascender' => '683', + 'Descender' => '-217', + 'StdHW' => '42', + 'StdVW' => '121', + 'StartCharMetrics' => '317', + 'C' => + array ( + 32 => 250.0, + 160 => 250.0, + 33 => 389.0, + 34 => 555.0, + 35 => 500.0, + 36 => 500.0, + 37 => 833.0, + 38 => 778.0, + 146 => 333.0, + 40 => 333.0, + 41 => 333.0, + 42 => 500.0, + 43 => 570.0, + 44 => 250.0, + 45 => 333.0, + 173 => 333.0, + 46 => 250.0, + 47 => 278.0, + 48 => 500.0, + 49 => 500.0, + 50 => 500.0, + 51 => 500.0, + 52 => 500.0, + 53 => 500.0, + 54 => 500.0, + 55 => 500.0, + 56 => 500.0, + 57 => 500.0, + 58 => 333.0, + 59 => 333.0, + 60 => 570.0, + 61 => 570.0, + 62 => 570.0, + 63 => 500.0, + 64 => 832.0, + 65 => 667.0, + 66 => 667.0, + 67 => 667.0, + 68 => 722.0, + 69 => 667.0, + 70 => 667.0, + 71 => 722.0, + 72 => 778.0, + 73 => 389.0, + 74 => 500.0, + 75 => 667.0, + 76 => 611.0, + 77 => 889.0, + 78 => 722.0, + 79 => 722.0, + 80 => 611.0, + 81 => 722.0, + 82 => 667.0, + 83 => 556.0, + 84 => 611.0, + 85 => 722.0, + 86 => 667.0, + 87 => 889.0, + 88 => 667.0, + 89 => 611.0, + 90 => 611.0, + 91 => 333.0, + 92 => 278.0, + 93 => 333.0, + 94 => 570.0, + 95 => 500.0, + 145 => 333.0, + 97 => 500.0, + 98 => 500.0, + 99 => 444.0, + 100 => 500.0, + 101 => 444.0, + 102 => 333.0, + 103 => 500.0, + 104 => 556.0, + 105 => 278.0, + 106 => 278.0, + 107 => 500.0, + 108 => 278.0, + 109 => 778.0, + 110 => 556.0, + 111 => 500.0, + 112 => 500.0, + 113 => 500.0, + 114 => 389.0, + 115 => 389.0, + 116 => 278.0, + 117 => 556.0, + 118 => 444.0, + 119 => 667.0, + 120 => 500.0, + 121 => 444.0, + 122 => 389.0, + 123 => 348.0, + 124 => 220.0, + 125 => 348.0, + 126 => 570.0, + 161 => 389.0, + 162 => 500.0, + 163 => 500.0, + 'fraction' => 167.0, + 165 => 500.0, + 131 => 500.0, + 167 => 500.0, + 164 => 500.0, + 39 => 278.0, + 147 => 500.0, + 170 => 266.0, + 139 => 333.0, + 155 => 333.0, + 'fi' => 556.0, + 'fl' => 556.0, + 150 => 500.0, + 134 => 500.0, + 135 => 500.0, + 183 => 250.0, + 182 => 500.0, + 149 => 350.0, + 130 => 333.0, + 132 => 500.0, + 148 => 500.0, + 187 => 500.0, + 133 => 1000.0, + 137 => 1000.0, + 191 => 500.0, + 96 => 333.0, + 180 => 333.0, + 136 => 333.0, + 152 => 333.0, + 175 => 333.0, + 'breve' => 333.0, + 'dotaccent' => 333.0, + 168 => 333.0, + 'ring' => 333.0, + 184 => 333.0, + 'hungarumlaut' => 333.0, + 'ogonek' => 333.0, + 'caron' => 333.0, + 151 => 1000.0, + 198 => 944.0, + 'Lslash' => 611.0, + 216 => 722.0, + 140 => 944.0, + 186 => 300.0, + 230 => 722.0, + 'dotlessi' => 278.0, + 'lslash' => 278.0, + 248 => 500.0, + 156 => 722.0, + 223 => 500.0, + 207 => 389.0, + 233 => 444.0, + 'abreve' => 500.0, + 'uhungarumlaut' => 556.0, + 'ecaron' => 444.0, + 159 => 611.0, + 247 => 570.0, + 221 => 611.0, + 194 => 667.0, + 225 => 500.0, + 219 => 722.0, + 253 => 444.0, + 'scommaaccent' => 389.0, + 234 => 444.0, + 'Uring' => 722.0, + 220 => 722.0, + 'aogonek' => 500.0, + 218 => 722.0, + 'uogonek' => 556.0, + 203 => 667.0, + 'Dcroat' => 722.0, + 'commaaccent' => 250.0, + 169 => 747.0, + 'Emacron' => 667.0, + 'ccaron' => 444.0, + 229 => 500.0, + 'Ncommaaccent' => 722.0, + 'lacute' => 278.0, + 224 => 500.0, + 'Tcommaaccent' => 611.0, + 'Cacute' => 667.0, + 227 => 500.0, + 'Edotaccent' => 667.0, + 154 => 389.0, + 'scedilla' => 389.0, + 237 => 278.0, + 'lozenge' => 494.0, + 'Rcaron' => 667.0, + 'Gcommaaccent' => 722.0, + 251 => 556.0, + 226 => 500.0, + 'Amacron' => 667.0, + 'rcaron' => 389.0, + 231 => 444.0, + 'Zdotaccent' => 611.0, + 222 => 611.0, + 'Omacron' => 722.0, + 'Racute' => 667.0, + 'Sacute' => 556.0, + 'dcaron' => 608.0, + 'Umacron' => 722.0, + 'uring' => 556.0, + 179 => 300.0, + 210 => 722.0, + 192 => 667.0, + 'Abreve' => 667.0, + 215 => 570.0, + 250 => 556.0, + 'Tcaron' => 611.0, + 'partialdiff' => 494.0, + 255 => 444.0, + 'Nacute' => 722.0, + 238 => 278.0, + 202 => 667.0, + 228 => 500.0, + 235 => 444.0, + 'cacute' => 444.0, + 'nacute' => 556.0, + 'umacron' => 556.0, + 'Ncaron' => 722.0, + 205 => 389.0, + 177 => 570.0, + 166 => 220.0, + 174 => 747.0, + 'Gbreve' => 722.0, + 'Idotaccent' => 389.0, + 'summation' => 600.0, + 200 => 667.0, + 'racute' => 389.0, + 'omacron' => 500.0, + 'Zacute' => 611.0, + 142 => 611.0, + 'greaterequal' => 549.0, + 208 => 722.0, + 199 => 667.0, + 'lcommaaccent' => 278.0, + 'tcaron' => 366.0, + 'eogonek' => 444.0, + 'Uogonek' => 722.0, + 193 => 667.0, + 196 => 667.0, + 232 => 444.0, + 'zacute' => 389.0, + 'iogonek' => 278.0, + 211 => 722.0, + 243 => 500.0, + 'amacron' => 500.0, + 'sacute' => 389.0, + 239 => 278.0, + 212 => 722.0, + 217 => 722.0, + 'Delta' => 612.0, + 254 => 500.0, + 178 => 300.0, + 214 => 722.0, + 181 => 576.0, + 236 => 278.0, + 'ohungarumlaut' => 500.0, + 'Eogonek' => 667.0, + 'dcroat' => 500.0, + 190 => 750.0, + 'Scedilla' => 556.0, + 'lcaron' => 382.0, + 'Kcommaaccent' => 667.0, + 'Lacute' => 611.0, + 153 => 1000.0, + 'edotaccent' => 444.0, + 204 => 389.0, + 'Imacron' => 389.0, + 'Lcaron' => 611.0, + 189 => 750.0, + 'lessequal' => 549.0, + 244 => 500.0, + 241 => 556.0, + 'Uhungarumlaut' => 722.0, + 201 => 667.0, + 'emacron' => 444.0, + 'gbreve' => 500.0, + 188 => 750.0, + 138 => 556.0, + 'Scommaaccent' => 556.0, + 'Ohungarumlaut' => 722.0, + 176 => 400.0, + 242 => 500.0, + 'Ccaron' => 667.0, + 249 => 556.0, + 'radical' => 549.0, + 'Dcaron' => 722.0, + 'rcommaaccent' => 389.0, + 209 => 722.0, + 245 => 500.0, + 'Rcommaaccent' => 667.0, + 'Lcommaaccent' => 611.0, + 195 => 667.0, + 'Aogonek' => 667.0, + 197 => 667.0, + 213 => 722.0, + 'zdotaccent' => 389.0, + 'Ecaron' => 667.0, + 'Iogonek' => 389.0, + 'kcommaaccent' => 500.0, + 'minus' => 606.0, + 206 => 389.0, + 'ncaron' => 556.0, + 'tcommaaccent' => 278.0, + 172 => 606.0, + 246 => 500.0, + 252 => 556.0, + 'notequal' => 549.0, + 'gcommaaccent' => 500.0, + 240 => 500.0, + 158 => 389.0, + 'ncommaaccent' => 556.0, + 185 => 300.0, + 'imacron' => 278.0, + 128 => 500.0, + ), + 'CIDtoGID_Compressed' => true, + 'CIDtoGID' => 'eJwDAAAAAAE=', + '_version_' => 4, +); \ No newline at end of file diff --git a/application/third_party/dompdf/lib/fonts/Times-Italic.afm b/application/third_party/dompdf/lib/fonts/Times-Italic.afm new file mode 100755 index 00000000..822e8986 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Times-Italic.afm @@ -0,0 +1,2669 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:56:55 1997 +Comment UniqueID 43067 +Comment VMusage 47727 58752 +FontName Times-Italic +FullName Times Italic +FamilyName Times +Weight Medium +ItalicAngle -15.5 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -169 -217 1010 883 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 653 +XHeight 441 +Ascender 683 +Descender -217 +StdHW 32 +StdVW 76 +StartCharMetrics 317 +C 32 ; WX 250 ; N space ; B 0 0 0 0 ; +C 160 ; WX 250 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 39 -11 302 667 ; +C 34 ; WX 420 ; N quotedbl ; B 144 421 432 666 ; +C 35 ; WX 500 ; N numbersign ; B 2 0 540 676 ; +C 36 ; WX 500 ; N dollar ; B 31 -89 497 731 ; +C 37 ; WX 833 ; N percent ; B 79 -13 790 676 ; +C 38 ; WX 778 ; N ampersand ; B 76 -18 723 666 ; +C 146 ; WX 333 ; N quoteright ; B 151 436 290 666 ; +C 40 ; WX 333 ; N parenleft ; B 42 -181 315 669 ; +C 41 ; WX 333 ; N parenright ; B 16 -180 289 669 ; +C 42 ; WX 500 ; N asterisk ; B 128 255 492 666 ; +C 43 ; WX 675 ; N plus ; B 86 0 590 506 ; +C 44 ; WX 250 ; N comma ; B -4 -129 135 101 ; +C 45 ; WX 333 ; N hyphen ; B 49 192 282 255 ; +C 173 ; WX 333 ; N hyphen ; B 49 192 282 255 ; +C 46 ; WX 250 ; N period ; B 27 -11 138 100 ; +C 47 ; WX 278 ; N slash ; B -65 -18 386 666 ; +C 48 ; WX 500 ; N zero ; B 32 -7 497 676 ; +C 49 ; WX 500 ; N one ; B 49 0 409 676 ; +C 50 ; WX 500 ; N two ; B 12 0 452 676 ; +C 51 ; WX 500 ; N three ; B 15 -7 465 676 ; +C 52 ; WX 500 ; N four ; B 1 0 479 676 ; +C 53 ; WX 500 ; N five ; B 15 -7 491 666 ; +C 54 ; WX 500 ; N six ; B 30 -7 521 686 ; +C 55 ; WX 500 ; N seven ; B 75 -8 537 666 ; +C 56 ; WX 500 ; N eight ; B 30 -7 493 676 ; +C 57 ; WX 500 ; N nine ; B 23 -17 492 676 ; +C 58 ; WX 333 ; N colon ; B 50 -11 261 441 ; +C 59 ; WX 333 ; N semicolon ; B 27 -129 261 441 ; +C 60 ; WX 675 ; N less ; B 84 -8 592 514 ; +C 61 ; WX 675 ; N equal ; B 86 120 590 386 ; +C 62 ; WX 675 ; N greater ; B 84 -8 592 514 ; +C 63 ; WX 500 ; N question ; B 132 -12 472 664 ; +C 64 ; WX 920 ; N at ; B 118 -18 806 666 ; +C 65 ; WX 611 ; N A ; B -51 0 564 668 ; +C 66 ; WX 611 ; N B ; B -8 0 588 653 ; +C 67 ; WX 667 ; N C ; B 66 -18 689 666 ; +C 68 ; WX 722 ; N D ; B -8 0 700 653 ; +C 69 ; WX 611 ; N E ; B -1 0 634 653 ; +C 70 ; WX 611 ; N F ; B 8 0 645 653 ; +C 71 ; WX 722 ; N G ; B 52 -18 722 666 ; +C 72 ; WX 722 ; N H ; B -8 0 767 653 ; +C 73 ; WX 333 ; N I ; B -8 0 384 653 ; +C 74 ; WX 444 ; N J ; B -6 -18 491 653 ; +C 75 ; WX 667 ; N K ; B 7 0 722 653 ; +C 76 ; WX 556 ; N L ; B -8 0 559 653 ; +C 77 ; WX 833 ; N M ; B -18 0 873 653 ; +C 78 ; WX 667 ; N N ; B -20 -15 727 653 ; +C 79 ; WX 722 ; N O ; B 60 -18 699 666 ; +C 80 ; WX 611 ; N P ; B 0 0 605 653 ; +C 81 ; WX 722 ; N Q ; B 59 -182 699 666 ; +C 82 ; WX 611 ; N R ; B -13 0 588 653 ; +C 83 ; WX 500 ; N S ; B 17 -18 508 667 ; +C 84 ; WX 556 ; N T ; B 59 0 633 653 ; +C 85 ; WX 722 ; N U ; B 102 -18 765 653 ; +C 86 ; WX 611 ; N V ; B 76 -18 688 653 ; +C 87 ; WX 833 ; N W ; B 71 -18 906 653 ; +C 88 ; WX 611 ; N X ; B -29 0 655 653 ; +C 89 ; WX 556 ; N Y ; B 78 0 633 653 ; +C 90 ; WX 556 ; N Z ; B -6 0 606 653 ; +C 91 ; WX 389 ; N bracketleft ; B 21 -153 391 663 ; +C 92 ; WX 278 ; N backslash ; B -41 -18 319 666 ; +C 93 ; WX 389 ; N bracketright ; B 12 -153 382 663 ; +C 94 ; WX 422 ; N asciicircum ; B 0 301 422 666 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 145 ; WX 333 ; N quoteleft ; B 171 436 310 666 ; +C 97 ; WX 500 ; N a ; B 17 -11 476 441 ; +C 98 ; WX 500 ; N b ; B 23 -11 473 683 ; +C 99 ; WX 444 ; N c ; B 30 -11 425 441 ; +C 100 ; WX 500 ; N d ; B 15 -13 527 683 ; +C 101 ; WX 444 ; N e ; B 31 -11 412 441 ; +C 102 ; WX 278 ; N f ; B -147 -207 424 678 ; L i fi ; L l fl ; +C 103 ; WX 500 ; N g ; B 8 -206 472 441 ; +C 104 ; WX 500 ; N h ; B 19 -9 478 683 ; +C 105 ; WX 278 ; N i ; B 49 -11 264 654 ; +C 106 ; WX 278 ; N j ; B -124 -207 276 654 ; +C 107 ; WX 444 ; N k ; B 14 -11 461 683 ; +C 108 ; WX 278 ; N l ; B 41 -11 279 683 ; +C 109 ; WX 722 ; N m ; B 12 -9 704 441 ; +C 110 ; WX 500 ; N n ; B 14 -9 474 441 ; +C 111 ; WX 500 ; N o ; B 27 -11 468 441 ; +C 112 ; WX 500 ; N p ; B -75 -205 469 441 ; +C 113 ; WX 500 ; N q ; B 25 -209 483 441 ; +C 114 ; WX 389 ; N r ; B 45 0 412 441 ; +C 115 ; WX 389 ; N s ; B 16 -13 366 442 ; +C 116 ; WX 278 ; N t ; B 37 -11 296 546 ; +C 117 ; WX 500 ; N u ; B 42 -11 475 441 ; +C 118 ; WX 444 ; N v ; B 21 -18 426 441 ; +C 119 ; WX 667 ; N w ; B 16 -18 648 441 ; +C 120 ; WX 444 ; N x ; B -27 -11 447 441 ; +C 121 ; WX 444 ; N y ; B -24 -206 426 441 ; +C 122 ; WX 389 ; N z ; B -2 -81 380 428 ; +C 123 ; WX 400 ; N braceleft ; B 51 -177 407 687 ; +C 124 ; WX 275 ; N bar ; B 105 -217 171 783 ; +C 125 ; WX 400 ; N braceright ; B -7 -177 349 687 ; +C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ; +C 161 ; WX 389 ; N exclamdown ; B 59 -205 322 473 ; +C 162 ; WX 500 ; N cent ; B 77 -143 472 560 ; +C 163 ; WX 500 ; N sterling ; B 10 -6 517 670 ; +C -1 ; WX 167 ; N fraction ; B -169 -10 337 676 ; +C 165 ; WX 500 ; N yen ; B 27 0 603 653 ; +C 131 ; WX 500 ; N florin ; B 25 -182 507 682 ; +C 167 ; WX 500 ; N section ; B 53 -162 461 666 ; +C 164 ; WX 500 ; N currency ; B -22 53 522 597 ; +C 39 ; WX 214 ; N quotesingle ; B 132 421 241 666 ; +C 147 ; WX 556 ; N quotedblleft ; B 166 436 514 666 ; +C 170 ; WX 500 ; N guillemotleft ; B 53 37 445 403 ; +C 139 ; WX 333 ; N guilsinglleft ; B 51 37 281 403 ; +C 155 ; WX 333 ; N guilsinglright ; B 52 37 282 403 ; +C -1 ; WX 500 ; N fi ; B -141 -207 481 681 ; +C -1 ; WX 500 ; N fl ; B -141 -204 518 682 ; +C 150 ; WX 500 ; N endash ; B -6 197 505 243 ; +C 134 ; WX 500 ; N dagger ; B 101 -159 488 666 ; +C 135 ; WX 500 ; N daggerdbl ; B 22 -143 491 666 ; +C 183 ; WX 250 ; N periodcentered ; B 70 199 181 310 ; +C 182 ; WX 523 ; N paragraph ; B 55 -123 616 653 ; +C 149 ; WX 350 ; N bullet ; B 40 191 310 461 ; +C 130 ; WX 333 ; N quotesinglbase ; B 44 -129 183 101 ; +C 132 ; WX 556 ; N quotedblbase ; B 57 -129 405 101 ; +C 148 ; WX 556 ; N quotedblright ; B 151 436 499 666 ; +C 187 ; WX 500 ; N guillemotright ; B 55 37 447 403 ; +C 133 ; WX 889 ; N ellipsis ; B 57 -11 762 100 ; +C 137 ; WX 1000 ; N perthousand ; B 25 -19 1010 706 ; +C 191 ; WX 500 ; N questiondown ; B 28 -205 368 471 ; +C 96 ; WX 333 ; N grave ; B 121 492 311 664 ; +C 180 ; WX 333 ; N acute ; B 180 494 403 664 ; +C 136 ; WX 333 ; N circumflex ; B 91 492 385 661 ; +C 152 ; WX 333 ; N tilde ; B 100 517 427 624 ; +C 175 ; WX 333 ; N macron ; B 99 532 411 583 ; +C -1 ; WX 333 ; N breve ; B 117 492 418 650 ; +C -1 ; WX 333 ; N dotaccent ; B 207 548 305 646 ; +C 168 ; WX 333 ; N dieresis ; B 107 548 405 646 ; +C -1 ; WX 333 ; N ring ; B 155 492 355 691 ; +C 184 ; WX 333 ; N cedilla ; B -30 -217 182 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B 93 494 486 664 ; +C -1 ; WX 333 ; N ogonek ; B 20 -169 203 40 ; +C -1 ; WX 333 ; N caron ; B 121 492 426 661 ; +C 151 ; WX 889 ; N emdash ; B -6 197 894 243 ; +C 198 ; WX 889 ; N AE ; B -27 0 911 653 ; +C 170 ; WX 276 ; N ordfeminine ; B 42 406 352 676 ; +C -1 ; WX 556 ; N Lslash ; B -8 0 559 653 ; +C 216 ; WX 722 ; N Oslash ; B 60 -105 699 722 ; +C 140 ; WX 944 ; N OE ; B 49 -8 964 666 ; +C 186 ; WX 310 ; N ordmasculine ; B 67 406 362 676 ; +C 230 ; WX 667 ; N ae ; B 23 -11 640 441 ; +C -1 ; WX 278 ; N dotlessi ; B 49 -11 235 441 ; +C -1 ; WX 278 ; N lslash ; B 41 -11 312 683 ; +C 248 ; WX 500 ; N oslash ; B 28 -135 469 554 ; +C 156 ; WX 667 ; N oe ; B 20 -12 646 441 ; +C 223 ; WX 500 ; N germandbls ; B -168 -207 493 679 ; +C 207 ; WX 333 ; N Idieresis ; B -8 0 435 818 ; +C 233 ; WX 444 ; N eacute ; B 31 -11 459 664 ; +C -1 ; WX 500 ; N abreve ; B 17 -11 502 650 ; +C -1 ; WX 500 ; N uhungarumlaut ; B 42 -11 580 664 ; +C -1 ; WX 444 ; N ecaron ; B 31 -11 482 661 ; +C 159 ; WX 556 ; N Ydieresis ; B 78 0 633 818 ; +C 247 ; WX 675 ; N divide ; B 86 -11 590 517 ; +C 221 ; WX 556 ; N Yacute ; B 78 0 633 876 ; +C 194 ; WX 611 ; N Acircumflex ; B -51 0 564 873 ; +C 225 ; WX 500 ; N aacute ; B 17 -11 487 664 ; +C 219 ; WX 722 ; N Ucircumflex ; B 102 -18 765 873 ; +C 253 ; WX 444 ; N yacute ; B -24 -206 459 664 ; +C -1 ; WX 389 ; N scommaaccent ; B 16 -217 366 442 ; +C 234 ; WX 444 ; N ecircumflex ; B 31 -11 441 661 ; +C -1 ; WX 722 ; N Uring ; B 102 -18 765 883 ; +C 220 ; WX 722 ; N Udieresis ; B 102 -18 765 818 ; +C -1 ; WX 500 ; N aogonek ; B 17 -169 476 441 ; +C 218 ; WX 722 ; N Uacute ; B 102 -18 765 876 ; +C -1 ; WX 500 ; N uogonek ; B 42 -169 477 441 ; +C 203 ; WX 611 ; N Edieresis ; B -1 0 634 818 ; +C -1 ; WX 722 ; N Dcroat ; B -8 0 700 653 ; +C -1 ; WX 250 ; N commaaccent ; B 8 -217 133 -50 ; +C 169 ; WX 760 ; N copyright ; B 41 -18 719 666 ; +C -1 ; WX 611 ; N Emacron ; B -1 0 634 795 ; +C -1 ; WX 444 ; N ccaron ; B 30 -11 482 661 ; +C 229 ; WX 500 ; N aring ; B 17 -11 476 691 ; +C -1 ; WX 667 ; N Ncommaaccent ; B -20 -187 727 653 ; +C -1 ; WX 278 ; N lacute ; B 41 -11 395 876 ; +C 224 ; WX 500 ; N agrave ; B 17 -11 476 664 ; +C -1 ; WX 556 ; N Tcommaaccent ; B 59 -217 633 653 ; +C -1 ; WX 667 ; N Cacute ; B 66 -18 690 876 ; +C 227 ; WX 500 ; N atilde ; B 17 -11 511 624 ; +C -1 ; WX 611 ; N Edotaccent ; B -1 0 634 818 ; +C 154 ; WX 389 ; N scaron ; B 16 -13 454 661 ; +C -1 ; WX 389 ; N scedilla ; B 16 -217 366 442 ; +C 237 ; WX 278 ; N iacute ; B 49 -11 355 664 ; +C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ; +C -1 ; WX 611 ; N Rcaron ; B -13 0 588 873 ; +C -1 ; WX 722 ; N Gcommaaccent ; B 52 -217 722 666 ; +C 251 ; WX 500 ; N ucircumflex ; B 42 -11 475 661 ; +C 226 ; WX 500 ; N acircumflex ; B 17 -11 476 661 ; +C -1 ; WX 611 ; N Amacron ; B -51 0 564 795 ; +C -1 ; WX 389 ; N rcaron ; B 45 0 434 661 ; +C 231 ; WX 444 ; N ccedilla ; B 30 -217 425 441 ; +C -1 ; WX 556 ; N Zdotaccent ; B -6 0 606 818 ; +C 222 ; WX 611 ; N Thorn ; B 0 0 569 653 ; +C -1 ; WX 722 ; N Omacron ; B 60 -18 699 795 ; +C -1 ; WX 611 ; N Racute ; B -13 0 588 876 ; +C -1 ; WX 500 ; N Sacute ; B 17 -18 508 876 ; +C -1 ; WX 544 ; N dcaron ; B 15 -13 658 683 ; +C -1 ; WX 722 ; N Umacron ; B 102 -18 765 795 ; +C -1 ; WX 500 ; N uring ; B 42 -11 475 691 ; +C 179 ; WX 300 ; N threesuperior ; B 43 268 339 676 ; +C 210 ; WX 722 ; N Ograve ; B 60 -18 699 876 ; +C 192 ; WX 611 ; N Agrave ; B -51 0 564 876 ; +C -1 ; WX 611 ; N Abreve ; B -51 0 564 862 ; +C 215 ; WX 675 ; N multiply ; B 93 8 582 497 ; +C 250 ; WX 500 ; N uacute ; B 42 -11 477 664 ; +C -1 ; WX 556 ; N Tcaron ; B 59 0 633 873 ; +C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ; +C 255 ; WX 444 ; N ydieresis ; B -24 -206 441 606 ; +C -1 ; WX 667 ; N Nacute ; B -20 -15 727 876 ; +C 238 ; WX 278 ; N icircumflex ; B 33 -11 327 661 ; +C 202 ; WX 611 ; N Ecircumflex ; B -1 0 634 873 ; +C 228 ; WX 500 ; N adieresis ; B 17 -11 489 606 ; +C 235 ; WX 444 ; N edieresis ; B 31 -11 451 606 ; +C -1 ; WX 444 ; N cacute ; B 30 -11 459 664 ; +C -1 ; WX 500 ; N nacute ; B 14 -9 477 664 ; +C -1 ; WX 500 ; N umacron ; B 42 -11 485 583 ; +C -1 ; WX 667 ; N Ncaron ; B -20 -15 727 873 ; +C 205 ; WX 333 ; N Iacute ; B -8 0 433 876 ; +C 177 ; WX 675 ; N plusminus ; B 86 0 590 506 ; +C 166 ; WX 275 ; N brokenbar ; B 105 -142 171 708 ; +C 174 ; WX 760 ; N registered ; B 41 -18 719 666 ; +C -1 ; WX 722 ; N Gbreve ; B 52 -18 722 862 ; +C -1 ; WX 333 ; N Idotaccent ; B -8 0 384 818 ; +C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ; +C 200 ; WX 611 ; N Egrave ; B -1 0 634 876 ; +C -1 ; WX 389 ; N racute ; B 45 0 431 664 ; +C -1 ; WX 500 ; N omacron ; B 27 -11 495 583 ; +C -1 ; WX 556 ; N Zacute ; B -6 0 606 876 ; +C 142 ; WX 556 ; N Zcaron ; B -6 0 606 873 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 658 ; +C 208 ; WX 722 ; N Eth ; B -8 0 700 653 ; +C 199 ; WX 667 ; N Ccedilla ; B 66 -217 689 666 ; +C -1 ; WX 278 ; N lcommaaccent ; B 22 -217 279 683 ; +C -1 ; WX 300 ; N tcaron ; B 37 -11 407 681 ; +C -1 ; WX 444 ; N eogonek ; B 31 -169 412 441 ; +C -1 ; WX 722 ; N Uogonek ; B 102 -184 765 653 ; +C 193 ; WX 611 ; N Aacute ; B -51 0 564 876 ; +C 196 ; WX 611 ; N Adieresis ; B -51 0 564 818 ; +C 232 ; WX 444 ; N egrave ; B 31 -11 412 664 ; +C -1 ; WX 389 ; N zacute ; B -2 -81 431 664 ; +C -1 ; WX 278 ; N iogonek ; B 49 -169 264 654 ; +C 211 ; WX 722 ; N Oacute ; B 60 -18 699 876 ; +C 243 ; WX 500 ; N oacute ; B 27 -11 487 664 ; +C -1 ; WX 500 ; N amacron ; B 17 -11 495 583 ; +C -1 ; WX 389 ; N sacute ; B 16 -13 431 664 ; +C 239 ; WX 278 ; N idieresis ; B 49 -11 352 606 ; +C 212 ; WX 722 ; N Ocircumflex ; B 60 -18 699 873 ; +C 217 ; WX 722 ; N Ugrave ; B 102 -18 765 876 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 500 ; N thorn ; B -75 -205 469 683 ; +C 178 ; WX 300 ; N twosuperior ; B 33 271 324 676 ; +C 214 ; WX 722 ; N Odieresis ; B 60 -18 699 818 ; +C 181 ; WX 500 ; N mu ; B -30 -209 497 428 ; +C 236 ; WX 278 ; N igrave ; B 49 -11 284 664 ; +C -1 ; WX 500 ; N ohungarumlaut ; B 27 -11 590 664 ; +C -1 ; WX 611 ; N Eogonek ; B -1 -169 634 653 ; +C -1 ; WX 500 ; N dcroat ; B 15 -13 572 683 ; +C 190 ; WX 750 ; N threequarters ; B 23 -10 736 676 ; +C -1 ; WX 500 ; N Scedilla ; B 17 -217 508 667 ; +C -1 ; WX 300 ; N lcaron ; B 41 -11 407 683 ; +C -1 ; WX 667 ; N Kcommaaccent ; B 7 -217 722 653 ; +C -1 ; WX 556 ; N Lacute ; B -8 0 559 876 ; +C 153 ; WX 980 ; N trademark ; B 30 247 957 653 ; +C -1 ; WX 444 ; N edotaccent ; B 31 -11 412 606 ; +C 204 ; WX 333 ; N Igrave ; B -8 0 384 876 ; +C -1 ; WX 333 ; N Imacron ; B -8 0 441 795 ; +C -1 ; WX 611 ; N Lcaron ; B -8 0 586 653 ; +C 189 ; WX 750 ; N onehalf ; B 34 -10 749 676 ; +C -1 ; WX 549 ; N lessequal ; B 26 0 523 658 ; +C 244 ; WX 500 ; N ocircumflex ; B 27 -11 468 661 ; +C 241 ; WX 500 ; N ntilde ; B 14 -9 476 624 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 102 -18 765 876 ; +C 201 ; WX 611 ; N Eacute ; B -1 0 634 876 ; +C -1 ; WX 444 ; N emacron ; B 31 -11 457 583 ; +C -1 ; WX 500 ; N gbreve ; B 8 -206 487 650 ; +C 188 ; WX 750 ; N onequarter ; B 33 -10 736 676 ; +C 138 ; WX 500 ; N Scaron ; B 17 -18 520 873 ; +C -1 ; WX 500 ; N Scommaaccent ; B 17 -217 508 667 ; +C -1 ; WX 722 ; N Ohungarumlaut ; B 60 -18 699 876 ; +C 176 ; WX 400 ; N degree ; B 101 390 387 676 ; +C 242 ; WX 500 ; N ograve ; B 27 -11 468 664 ; +C -1 ; WX 667 ; N Ccaron ; B 66 -18 689 873 ; +C 249 ; WX 500 ; N ugrave ; B 42 -11 475 664 ; +C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ; +C -1 ; WX 722 ; N Dcaron ; B -8 0 700 873 ; +C -1 ; WX 389 ; N rcommaaccent ; B -3 -217 412 441 ; +C 209 ; WX 667 ; N Ntilde ; B -20 -15 727 836 ; +C 245 ; WX 500 ; N otilde ; B 27 -11 496 624 ; +C -1 ; WX 611 ; N Rcommaaccent ; B -13 -187 588 653 ; +C -1 ; WX 556 ; N Lcommaaccent ; B -8 -217 559 653 ; +C 195 ; WX 611 ; N Atilde ; B -51 0 566 836 ; +C -1 ; WX 611 ; N Aogonek ; B -51 -169 566 668 ; +C 197 ; WX 611 ; N Aring ; B -51 0 564 883 ; +C 213 ; WX 722 ; N Otilde ; B 60 -18 699 836 ; +C -1 ; WX 389 ; N zdotaccent ; B -2 -81 380 606 ; +C -1 ; WX 611 ; N Ecaron ; B -1 0 634 873 ; +C -1 ; WX 333 ; N Iogonek ; B -8 -169 384 653 ; +C -1 ; WX 444 ; N kcommaaccent ; B 14 -187 461 683 ; +C -1 ; WX 675 ; N minus ; B 86 220 590 286 ; +C 206 ; WX 333 ; N Icircumflex ; B -8 0 425 873 ; +C -1 ; WX 500 ; N ncaron ; B 14 -9 510 661 ; +C -1 ; WX 278 ; N tcommaaccent ; B 2 -217 296 546 ; +C 172 ; WX 675 ; N logicalnot ; B 86 108 590 386 ; +C 246 ; WX 500 ; N odieresis ; B 27 -11 489 606 ; +C 252 ; WX 500 ; N udieresis ; B 42 -11 479 606 ; +C -1 ; WX 549 ; N notequal ; B 12 -29 537 541 ; +C -1 ; WX 500 ; N gcommaaccent ; B 8 -206 472 706 ; +C 240 ; WX 500 ; N eth ; B 27 -11 482 683 ; +C 158 ; WX 389 ; N zcaron ; B -2 -81 434 661 ; +C -1 ; WX 500 ; N ncommaaccent ; B 14 -187 474 441 ; +C 185 ; WX 300 ; N onesuperior ; B 43 271 284 676 ; +C -1 ; WX 278 ; N imacron ; B 46 -11 311 583 ; +C 128 ; WX 500 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2321 +KPX A C -30 +KPX A Cacute -30 +KPX A Ccaron -30 +KPX A Ccedilla -30 +KPX A G -35 +KPX A Gbreve -35 +KPX A Gcommaaccent -35 +KPX A O -40 +KPX A Oacute -40 +KPX A Ocircumflex -40 +KPX A Odieresis -40 +KPX A Ograve -40 +KPX A Ohungarumlaut -40 +KPX A Omacron -40 +KPX A Oslash -40 +KPX A Otilde -40 +KPX A Q -40 +KPX A T -37 +KPX A Tcaron -37 +KPX A Tcommaaccent -37 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -105 +KPX A W -95 +KPX A Y -55 +KPX A Yacute -55 +KPX A Ydieresis -55 +KPX A quoteright -37 +KPX A u -20 +KPX A uacute -20 +KPX A ucircumflex -20 +KPX A udieresis -20 +KPX A ugrave -20 +KPX A uhungarumlaut -20 +KPX A umacron -20 +KPX A uogonek -20 +KPX A uring -20 +KPX A v -55 +KPX A w -55 +KPX A y -55 +KPX A yacute -55 +KPX A ydieresis -55 +KPX Aacute C -30 +KPX Aacute Cacute -30 +KPX Aacute Ccaron -30 +KPX Aacute Ccedilla -30 +KPX Aacute G -35 +KPX Aacute Gbreve -35 +KPX Aacute Gcommaaccent -35 +KPX Aacute O -40 +KPX Aacute Oacute -40 +KPX Aacute Ocircumflex -40 +KPX Aacute Odieresis -40 +KPX Aacute Ograve -40 +KPX Aacute Ohungarumlaut -40 +KPX Aacute Omacron -40 +KPX Aacute Oslash -40 +KPX Aacute Otilde -40 +KPX Aacute Q -40 +KPX Aacute T -37 +KPX Aacute Tcaron -37 +KPX Aacute Tcommaaccent -37 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -105 +KPX Aacute W -95 +KPX Aacute Y -55 +KPX Aacute Yacute -55 +KPX Aacute Ydieresis -55 +KPX Aacute quoteright -37 +KPX Aacute u -20 +KPX Aacute uacute -20 +KPX Aacute ucircumflex -20 +KPX Aacute udieresis -20 +KPX Aacute ugrave -20 +KPX Aacute uhungarumlaut -20 +KPX Aacute umacron -20 +KPX Aacute uogonek -20 +KPX Aacute uring -20 +KPX Aacute v -55 +KPX Aacute w -55 +KPX Aacute y -55 +KPX Aacute yacute -55 +KPX Aacute ydieresis -55 +KPX Abreve C -30 +KPX Abreve Cacute -30 +KPX Abreve Ccaron -30 +KPX Abreve Ccedilla -30 +KPX Abreve G -35 +KPX Abreve Gbreve -35 +KPX Abreve Gcommaaccent -35 +KPX Abreve O -40 +KPX Abreve Oacute -40 +KPX Abreve Ocircumflex -40 +KPX Abreve Odieresis -40 +KPX Abreve Ograve -40 +KPX Abreve Ohungarumlaut -40 +KPX Abreve Omacron -40 +KPX Abreve Oslash -40 +KPX Abreve Otilde -40 +KPX Abreve Q -40 +KPX Abreve T -37 +KPX Abreve Tcaron -37 +KPX Abreve Tcommaaccent -37 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -105 +KPX Abreve W -95 +KPX Abreve Y -55 +KPX Abreve Yacute -55 +KPX Abreve Ydieresis -55 +KPX Abreve quoteright -37 +KPX Abreve u -20 +KPX Abreve uacute -20 +KPX Abreve ucircumflex -20 +KPX Abreve udieresis -20 +KPX Abreve ugrave -20 +KPX Abreve uhungarumlaut -20 +KPX Abreve umacron -20 +KPX Abreve uogonek -20 +KPX Abreve uring -20 +KPX Abreve v -55 +KPX Abreve w -55 +KPX Abreve y -55 +KPX Abreve yacute -55 +KPX Abreve ydieresis -55 +KPX Acircumflex C -30 +KPX Acircumflex Cacute -30 +KPX Acircumflex Ccaron -30 +KPX Acircumflex Ccedilla -30 +KPX Acircumflex G -35 +KPX Acircumflex Gbreve -35 +KPX Acircumflex Gcommaaccent -35 +KPX Acircumflex O -40 +KPX Acircumflex Oacute -40 +KPX Acircumflex Ocircumflex -40 +KPX Acircumflex Odieresis -40 +KPX Acircumflex Ograve -40 +KPX Acircumflex Ohungarumlaut -40 +KPX Acircumflex Omacron -40 +KPX Acircumflex Oslash -40 +KPX Acircumflex Otilde -40 +KPX Acircumflex Q -40 +KPX Acircumflex T -37 +KPX Acircumflex Tcaron -37 +KPX Acircumflex Tcommaaccent -37 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -105 +KPX Acircumflex W -95 +KPX Acircumflex Y -55 +KPX Acircumflex Yacute -55 +KPX Acircumflex Ydieresis -55 +KPX Acircumflex quoteright -37 +KPX Acircumflex u -20 +KPX Acircumflex uacute -20 +KPX Acircumflex ucircumflex -20 +KPX Acircumflex udieresis -20 +KPX Acircumflex ugrave -20 +KPX Acircumflex uhungarumlaut -20 +KPX Acircumflex umacron -20 +KPX Acircumflex uogonek -20 +KPX Acircumflex uring -20 +KPX Acircumflex v -55 +KPX Acircumflex w -55 +KPX Acircumflex y -55 +KPX Acircumflex yacute -55 +KPX Acircumflex ydieresis -55 +KPX Adieresis C -30 +KPX Adieresis Cacute -30 +KPX Adieresis Ccaron -30 +KPX Adieresis Ccedilla -30 +KPX Adieresis G -35 +KPX Adieresis Gbreve -35 +KPX Adieresis Gcommaaccent -35 +KPX Adieresis O -40 +KPX Adieresis Oacute -40 +KPX Adieresis Ocircumflex -40 +KPX Adieresis Odieresis -40 +KPX Adieresis Ograve -40 +KPX Adieresis Ohungarumlaut -40 +KPX Adieresis Omacron -40 +KPX Adieresis Oslash -40 +KPX Adieresis Otilde -40 +KPX Adieresis Q -40 +KPX Adieresis T -37 +KPX Adieresis Tcaron -37 +KPX Adieresis Tcommaaccent -37 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -105 +KPX Adieresis W -95 +KPX Adieresis Y -55 +KPX Adieresis Yacute -55 +KPX Adieresis Ydieresis -55 +KPX Adieresis quoteright -37 +KPX Adieresis u -20 +KPX Adieresis uacute -20 +KPX Adieresis ucircumflex -20 +KPX Adieresis udieresis -20 +KPX Adieresis ugrave -20 +KPX Adieresis uhungarumlaut -20 +KPX Adieresis umacron -20 +KPX Adieresis uogonek -20 +KPX Adieresis uring -20 +KPX Adieresis v -55 +KPX Adieresis w -55 +KPX Adieresis y -55 +KPX Adieresis yacute -55 +KPX Adieresis ydieresis -55 +KPX Agrave C -30 +KPX Agrave Cacute -30 +KPX Agrave Ccaron -30 +KPX Agrave Ccedilla -30 +KPX Agrave G -35 +KPX Agrave Gbreve -35 +KPX Agrave Gcommaaccent -35 +KPX Agrave O -40 +KPX Agrave Oacute -40 +KPX Agrave Ocircumflex -40 +KPX Agrave Odieresis -40 +KPX Agrave Ograve -40 +KPX Agrave Ohungarumlaut -40 +KPX Agrave Omacron -40 +KPX Agrave Oslash -40 +KPX Agrave Otilde -40 +KPX Agrave Q -40 +KPX Agrave T -37 +KPX Agrave Tcaron -37 +KPX Agrave Tcommaaccent -37 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -105 +KPX Agrave W -95 +KPX Agrave Y -55 +KPX Agrave Yacute -55 +KPX Agrave Ydieresis -55 +KPX Agrave quoteright -37 +KPX Agrave u -20 +KPX Agrave uacute -20 +KPX Agrave ucircumflex -20 +KPX Agrave udieresis -20 +KPX Agrave ugrave -20 +KPX Agrave uhungarumlaut -20 +KPX Agrave umacron -20 +KPX Agrave uogonek -20 +KPX Agrave uring -20 +KPX Agrave v -55 +KPX Agrave w -55 +KPX Agrave y -55 +KPX Agrave yacute -55 +KPX Agrave ydieresis -55 +KPX Amacron C -30 +KPX Amacron Cacute -30 +KPX Amacron Ccaron -30 +KPX Amacron Ccedilla -30 +KPX Amacron G -35 +KPX Amacron Gbreve -35 +KPX Amacron Gcommaaccent -35 +KPX Amacron O -40 +KPX Amacron Oacute -40 +KPX Amacron Ocircumflex -40 +KPX Amacron Odieresis -40 +KPX Amacron Ograve -40 +KPX Amacron Ohungarumlaut -40 +KPX Amacron Omacron -40 +KPX Amacron Oslash -40 +KPX Amacron Otilde -40 +KPX Amacron Q -40 +KPX Amacron T -37 +KPX Amacron Tcaron -37 +KPX Amacron Tcommaaccent -37 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -105 +KPX Amacron W -95 +KPX Amacron Y -55 +KPX Amacron Yacute -55 +KPX Amacron Ydieresis -55 +KPX Amacron quoteright -37 +KPX Amacron u -20 +KPX Amacron uacute -20 +KPX Amacron ucircumflex -20 +KPX Amacron udieresis -20 +KPX Amacron ugrave -20 +KPX Amacron uhungarumlaut -20 +KPX Amacron umacron -20 +KPX Amacron uogonek -20 +KPX Amacron uring -20 +KPX Amacron v -55 +KPX Amacron w -55 +KPX Amacron y -55 +KPX Amacron yacute -55 +KPX Amacron ydieresis -55 +KPX Aogonek C -30 +KPX Aogonek Cacute -30 +KPX Aogonek Ccaron -30 +KPX Aogonek Ccedilla -30 +KPX Aogonek G -35 +KPX Aogonek Gbreve -35 +KPX Aogonek Gcommaaccent -35 +KPX Aogonek O -40 +KPX Aogonek Oacute -40 +KPX Aogonek Ocircumflex -40 +KPX Aogonek Odieresis -40 +KPX Aogonek Ograve -40 +KPX Aogonek Ohungarumlaut -40 +KPX Aogonek Omacron -40 +KPX Aogonek Oslash -40 +KPX Aogonek Otilde -40 +KPX Aogonek Q -40 +KPX Aogonek T -37 +KPX Aogonek Tcaron -37 +KPX Aogonek Tcommaaccent -37 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -105 +KPX Aogonek W -95 +KPX Aogonek Y -55 +KPX Aogonek Yacute -55 +KPX Aogonek Ydieresis -55 +KPX Aogonek quoteright -37 +KPX Aogonek u -20 +KPX Aogonek uacute -20 +KPX Aogonek ucircumflex -20 +KPX Aogonek udieresis -20 +KPX Aogonek ugrave -20 +KPX Aogonek uhungarumlaut -20 +KPX Aogonek umacron -20 +KPX Aogonek uogonek -20 +KPX Aogonek uring -20 +KPX Aogonek v -55 +KPX Aogonek w -55 +KPX Aogonek y -55 +KPX Aogonek yacute -55 +KPX Aogonek ydieresis -55 +KPX Aring C -30 +KPX Aring Cacute -30 +KPX Aring Ccaron -30 +KPX Aring Ccedilla -30 +KPX Aring G -35 +KPX Aring Gbreve -35 +KPX Aring Gcommaaccent -35 +KPX Aring O -40 +KPX Aring Oacute -40 +KPX Aring Ocircumflex -40 +KPX Aring Odieresis -40 +KPX Aring Ograve -40 +KPX Aring Ohungarumlaut -40 +KPX Aring Omacron -40 +KPX Aring Oslash -40 +KPX Aring Otilde -40 +KPX Aring Q -40 +KPX Aring T -37 +KPX Aring Tcaron -37 +KPX Aring Tcommaaccent -37 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -105 +KPX Aring W -95 +KPX Aring Y -55 +KPX Aring Yacute -55 +KPX Aring Ydieresis -55 +KPX Aring quoteright -37 +KPX Aring u -20 +KPX Aring uacute -20 +KPX Aring ucircumflex -20 +KPX Aring udieresis -20 +KPX Aring ugrave -20 +KPX Aring uhungarumlaut -20 +KPX Aring umacron -20 +KPX Aring uogonek -20 +KPX Aring uring -20 +KPX Aring v -55 +KPX Aring w -55 +KPX Aring y -55 +KPX Aring yacute -55 +KPX Aring ydieresis -55 +KPX Atilde C -30 +KPX Atilde Cacute -30 +KPX Atilde Ccaron -30 +KPX Atilde Ccedilla -30 +KPX Atilde G -35 +KPX Atilde Gbreve -35 +KPX Atilde Gcommaaccent -35 +KPX Atilde O -40 +KPX Atilde Oacute -40 +KPX Atilde Ocircumflex -40 +KPX Atilde Odieresis -40 +KPX Atilde Ograve -40 +KPX Atilde Ohungarumlaut -40 +KPX Atilde Omacron -40 +KPX Atilde Oslash -40 +KPX Atilde Otilde -40 +KPX Atilde Q -40 +KPX Atilde T -37 +KPX Atilde Tcaron -37 +KPX Atilde Tcommaaccent -37 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -105 +KPX Atilde W -95 +KPX Atilde Y -55 +KPX Atilde Yacute -55 +KPX Atilde Ydieresis -55 +KPX Atilde quoteright -37 +KPX Atilde u -20 +KPX Atilde uacute -20 +KPX Atilde ucircumflex -20 +KPX Atilde udieresis -20 +KPX Atilde ugrave -20 +KPX Atilde uhungarumlaut -20 +KPX Atilde umacron -20 +KPX Atilde uogonek -20 +KPX Atilde uring -20 +KPX Atilde v -55 +KPX Atilde w -55 +KPX Atilde y -55 +KPX Atilde yacute -55 +KPX Atilde ydieresis -55 +KPX B A -25 +KPX B Aacute -25 +KPX B Abreve -25 +KPX B Acircumflex -25 +KPX B Adieresis -25 +KPX B Agrave -25 +KPX B Amacron -25 +KPX B Aogonek -25 +KPX B Aring -25 +KPX B Atilde -25 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -35 +KPX D Aacute -35 +KPX D Abreve -35 +KPX D Acircumflex -35 +KPX D Adieresis -35 +KPX D Agrave -35 +KPX D Amacron -35 +KPX D Aogonek -35 +KPX D Aring -35 +KPX D Atilde -35 +KPX D V -40 +KPX D W -40 +KPX D Y -40 +KPX D Yacute -40 +KPX D Ydieresis -40 +KPX Dcaron A -35 +KPX Dcaron Aacute -35 +KPX Dcaron Abreve -35 +KPX Dcaron Acircumflex -35 +KPX Dcaron Adieresis -35 +KPX Dcaron Agrave -35 +KPX Dcaron Amacron -35 +KPX Dcaron Aogonek -35 +KPX Dcaron Aring -35 +KPX Dcaron Atilde -35 +KPX Dcaron V -40 +KPX Dcaron W -40 +KPX Dcaron Y -40 +KPX Dcaron Yacute -40 +KPX Dcaron Ydieresis -40 +KPX Dcroat A -35 +KPX Dcroat Aacute -35 +KPX Dcroat Abreve -35 +KPX Dcroat Acircumflex -35 +KPX Dcroat Adieresis -35 +KPX Dcroat Agrave -35 +KPX Dcroat Amacron -35 +KPX Dcroat Aogonek -35 +KPX Dcroat Aring -35 +KPX Dcroat Atilde -35 +KPX Dcroat V -40 +KPX Dcroat W -40 +KPX Dcroat Y -40 +KPX Dcroat Yacute -40 +KPX Dcroat Ydieresis -40 +KPX F A -115 +KPX F Aacute -115 +KPX F Abreve -115 +KPX F Acircumflex -115 +KPX F Adieresis -115 +KPX F Agrave -115 +KPX F Amacron -115 +KPX F Aogonek -115 +KPX F Aring -115 +KPX F Atilde -115 +KPX F a -75 +KPX F aacute -75 +KPX F abreve -75 +KPX F acircumflex -75 +KPX F adieresis -75 +KPX F agrave -75 +KPX F amacron -75 +KPX F aogonek -75 +KPX F aring -75 +KPX F atilde -75 +KPX F comma -135 +KPX F e -75 +KPX F eacute -75 +KPX F ecaron -75 +KPX F ecircumflex -75 +KPX F edieresis -75 +KPX F edotaccent -75 +KPX F egrave -75 +KPX F emacron -75 +KPX F eogonek -75 +KPX F i -45 +KPX F iacute -45 +KPX F icircumflex -45 +KPX F idieresis -45 +KPX F igrave -45 +KPX F imacron -45 +KPX F iogonek -45 +KPX F o -105 +KPX F oacute -105 +KPX F ocircumflex -105 +KPX F odieresis -105 +KPX F ograve -105 +KPX F ohungarumlaut -105 +KPX F omacron -105 +KPX F oslash -105 +KPX F otilde -105 +KPX F period -135 +KPX F r -55 +KPX F racute -55 +KPX F rcaron -55 +KPX F rcommaaccent -55 +KPX J A -40 +KPX J Aacute -40 +KPX J Abreve -40 +KPX J Acircumflex -40 +KPX J Adieresis -40 +KPX J Agrave -40 +KPX J Amacron -40 +KPX J Aogonek -40 +KPX J Aring -40 +KPX J Atilde -40 +KPX J a -35 +KPX J aacute -35 +KPX J abreve -35 +KPX J acircumflex -35 +KPX J adieresis -35 +KPX J agrave -35 +KPX J amacron -35 +KPX J aogonek -35 +KPX J aring -35 +KPX J atilde -35 +KPX J comma -25 +KPX J e -25 +KPX J eacute -25 +KPX J ecaron -25 +KPX J ecircumflex -25 +KPX J edieresis -25 +KPX J edotaccent -25 +KPX J egrave -25 +KPX J emacron -25 +KPX J eogonek -25 +KPX J o -25 +KPX J oacute -25 +KPX J ocircumflex -25 +KPX J odieresis -25 +KPX J ograve -25 +KPX J ohungarumlaut -25 +KPX J omacron -25 +KPX J oslash -25 +KPX J otilde -25 +KPX J period -25 +KPX J u -35 +KPX J uacute -35 +KPX J ucircumflex -35 +KPX J udieresis -35 +KPX J ugrave -35 +KPX J uhungarumlaut -35 +KPX J umacron -35 +KPX J uogonek -35 +KPX J uring -35 +KPX K O -50 +KPX K Oacute -50 +KPX K Ocircumflex -50 +KPX K Odieresis -50 +KPX K Ograve -50 +KPX K Ohungarumlaut -50 +KPX K Omacron -50 +KPX K Oslash -50 +KPX K Otilde -50 +KPX K e -35 +KPX K eacute -35 +KPX K ecaron -35 +KPX K ecircumflex -35 +KPX K edieresis -35 +KPX K edotaccent -35 +KPX K egrave -35 +KPX K emacron -35 +KPX K eogonek -35 +KPX K o -40 +KPX K oacute -40 +KPX K ocircumflex -40 +KPX K odieresis -40 +KPX K ograve -40 +KPX K ohungarumlaut -40 +KPX K omacron -40 +KPX K oslash -40 +KPX K otilde -40 +KPX K u -40 +KPX K uacute -40 +KPX K ucircumflex -40 +KPX K udieresis -40 +KPX K ugrave -40 +KPX K uhungarumlaut -40 +KPX K umacron -40 +KPX K uogonek -40 +KPX K uring -40 +KPX K y -40 +KPX K yacute -40 +KPX K ydieresis -40 +KPX Kcommaaccent O -50 +KPX Kcommaaccent Oacute -50 +KPX Kcommaaccent Ocircumflex -50 +KPX Kcommaaccent Odieresis -50 +KPX Kcommaaccent Ograve -50 +KPX Kcommaaccent Ohungarumlaut -50 +KPX Kcommaaccent Omacron -50 +KPX Kcommaaccent Oslash -50 +KPX Kcommaaccent Otilde -50 +KPX Kcommaaccent e -35 +KPX Kcommaaccent eacute -35 +KPX Kcommaaccent ecaron -35 +KPX Kcommaaccent ecircumflex -35 +KPX Kcommaaccent edieresis -35 +KPX Kcommaaccent edotaccent -35 +KPX Kcommaaccent egrave -35 +KPX Kcommaaccent emacron -35 +KPX Kcommaaccent eogonek -35 +KPX Kcommaaccent o -40 +KPX Kcommaaccent oacute -40 +KPX Kcommaaccent ocircumflex -40 +KPX Kcommaaccent odieresis -40 +KPX Kcommaaccent ograve -40 +KPX Kcommaaccent ohungarumlaut -40 +KPX Kcommaaccent omacron -40 +KPX Kcommaaccent oslash -40 +KPX Kcommaaccent otilde -40 +KPX Kcommaaccent u -40 +KPX Kcommaaccent uacute -40 +KPX Kcommaaccent ucircumflex -40 +KPX Kcommaaccent udieresis -40 +KPX Kcommaaccent ugrave -40 +KPX Kcommaaccent uhungarumlaut -40 +KPX Kcommaaccent umacron -40 +KPX Kcommaaccent uogonek -40 +KPX Kcommaaccent uring -40 +KPX Kcommaaccent y -40 +KPX Kcommaaccent yacute -40 +KPX Kcommaaccent ydieresis -40 +KPX L T -20 +KPX L Tcaron -20 +KPX L Tcommaaccent -20 +KPX L V -55 +KPX L W -55 +KPX L Y -20 +KPX L Yacute -20 +KPX L Ydieresis -20 +KPX L quoteright -37 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -20 +KPX Lacute Tcaron -20 +KPX Lacute Tcommaaccent -20 +KPX Lacute V -55 +KPX Lacute W -55 +KPX Lacute Y -20 +KPX Lacute Yacute -20 +KPX Lacute Ydieresis -20 +KPX Lacute quoteright -37 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcommaaccent T -20 +KPX Lcommaaccent Tcaron -20 +KPX Lcommaaccent Tcommaaccent -20 +KPX Lcommaaccent V -55 +KPX Lcommaaccent W -55 +KPX Lcommaaccent Y -20 +KPX Lcommaaccent Yacute -20 +KPX Lcommaaccent Ydieresis -20 +KPX Lcommaaccent quoteright -37 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -20 +KPX Lslash Tcaron -20 +KPX Lslash Tcommaaccent -20 +KPX Lslash V -55 +KPX Lslash W -55 +KPX Lslash Y -20 +KPX Lslash Yacute -20 +KPX Lslash Ydieresis -20 +KPX Lslash quoteright -37 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX N A -27 +KPX N Aacute -27 +KPX N Abreve -27 +KPX N Acircumflex -27 +KPX N Adieresis -27 +KPX N Agrave -27 +KPX N Amacron -27 +KPX N Aogonek -27 +KPX N Aring -27 +KPX N Atilde -27 +KPX Nacute A -27 +KPX Nacute Aacute -27 +KPX Nacute Abreve -27 +KPX Nacute Acircumflex -27 +KPX Nacute Adieresis -27 +KPX Nacute Agrave -27 +KPX Nacute Amacron -27 +KPX Nacute Aogonek -27 +KPX Nacute Aring -27 +KPX Nacute Atilde -27 +KPX Ncaron A -27 +KPX Ncaron Aacute -27 +KPX Ncaron Abreve -27 +KPX Ncaron Acircumflex -27 +KPX Ncaron Adieresis -27 +KPX Ncaron Agrave -27 +KPX Ncaron Amacron -27 +KPX Ncaron Aogonek -27 +KPX Ncaron Aring -27 +KPX Ncaron Atilde -27 +KPX Ncommaaccent A -27 +KPX Ncommaaccent Aacute -27 +KPX Ncommaaccent Abreve -27 +KPX Ncommaaccent Acircumflex -27 +KPX Ncommaaccent Adieresis -27 +KPX Ncommaaccent Agrave -27 +KPX Ncommaaccent Amacron -27 +KPX Ncommaaccent Aogonek -27 +KPX Ncommaaccent Aring -27 +KPX Ncommaaccent Atilde -27 +KPX Ntilde A -27 +KPX Ntilde Aacute -27 +KPX Ntilde Abreve -27 +KPX Ntilde Acircumflex -27 +KPX Ntilde Adieresis -27 +KPX Ntilde Agrave -27 +KPX Ntilde Amacron -27 +KPX Ntilde Aogonek -27 +KPX Ntilde Aring -27 +KPX Ntilde Atilde -27 +KPX O A -55 +KPX O Aacute -55 +KPX O Abreve -55 +KPX O Acircumflex -55 +KPX O Adieresis -55 +KPX O Agrave -55 +KPX O Amacron -55 +KPX O Aogonek -55 +KPX O Aring -55 +KPX O Atilde -55 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -50 +KPX O X -40 +KPX O Y -50 +KPX O Yacute -50 +KPX O Ydieresis -50 +KPX Oacute A -55 +KPX Oacute Aacute -55 +KPX Oacute Abreve -55 +KPX Oacute Acircumflex -55 +KPX Oacute Adieresis -55 +KPX Oacute Agrave -55 +KPX Oacute Amacron -55 +KPX Oacute Aogonek -55 +KPX Oacute Aring -55 +KPX Oacute Atilde -55 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -50 +KPX Oacute X -40 +KPX Oacute Y -50 +KPX Oacute Yacute -50 +KPX Oacute Ydieresis -50 +KPX Ocircumflex A -55 +KPX Ocircumflex Aacute -55 +KPX Ocircumflex Abreve -55 +KPX Ocircumflex Acircumflex -55 +KPX Ocircumflex Adieresis -55 +KPX Ocircumflex Agrave -55 +KPX Ocircumflex Amacron -55 +KPX Ocircumflex Aogonek -55 +KPX Ocircumflex Aring -55 +KPX Ocircumflex Atilde -55 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -50 +KPX Ocircumflex X -40 +KPX Ocircumflex Y -50 +KPX Ocircumflex Yacute -50 +KPX Ocircumflex Ydieresis -50 +KPX Odieresis A -55 +KPX Odieresis Aacute -55 +KPX Odieresis Abreve -55 +KPX Odieresis Acircumflex -55 +KPX Odieresis Adieresis -55 +KPX Odieresis Agrave -55 +KPX Odieresis Amacron -55 +KPX Odieresis Aogonek -55 +KPX Odieresis Aring -55 +KPX Odieresis Atilde -55 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -50 +KPX Odieresis X -40 +KPX Odieresis Y -50 +KPX Odieresis Yacute -50 +KPX Odieresis Ydieresis -50 +KPX Ograve A -55 +KPX Ograve Aacute -55 +KPX Ograve Abreve -55 +KPX Ograve Acircumflex -55 +KPX Ograve Adieresis -55 +KPX Ograve Agrave -55 +KPX Ograve Amacron -55 +KPX Ograve Aogonek -55 +KPX Ograve Aring -55 +KPX Ograve Atilde -55 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -50 +KPX Ograve X -40 +KPX Ograve Y -50 +KPX Ograve Yacute -50 +KPX Ograve Ydieresis -50 +KPX Ohungarumlaut A -55 +KPX Ohungarumlaut Aacute -55 +KPX Ohungarumlaut Abreve -55 +KPX Ohungarumlaut Acircumflex -55 +KPX Ohungarumlaut Adieresis -55 +KPX Ohungarumlaut Agrave -55 +KPX Ohungarumlaut Amacron -55 +KPX Ohungarumlaut Aogonek -55 +KPX Ohungarumlaut Aring -55 +KPX Ohungarumlaut Atilde -55 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -50 +KPX Ohungarumlaut X -40 +KPX Ohungarumlaut Y -50 +KPX Ohungarumlaut Yacute -50 +KPX Ohungarumlaut Ydieresis -50 +KPX Omacron A -55 +KPX Omacron Aacute -55 +KPX Omacron Abreve -55 +KPX Omacron Acircumflex -55 +KPX Omacron Adieresis -55 +KPX Omacron Agrave -55 +KPX Omacron Amacron -55 +KPX Omacron Aogonek -55 +KPX Omacron Aring -55 +KPX Omacron Atilde -55 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -50 +KPX Omacron X -40 +KPX Omacron Y -50 +KPX Omacron Yacute -50 +KPX Omacron Ydieresis -50 +KPX Oslash A -55 +KPX Oslash Aacute -55 +KPX Oslash Abreve -55 +KPX Oslash Acircumflex -55 +KPX Oslash Adieresis -55 +KPX Oslash Agrave -55 +KPX Oslash Amacron -55 +KPX Oslash Aogonek -55 +KPX Oslash Aring -55 +KPX Oslash Atilde -55 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -50 +KPX Oslash X -40 +KPX Oslash Y -50 +KPX Oslash Yacute -50 +KPX Oslash Ydieresis -50 +KPX Otilde A -55 +KPX Otilde Aacute -55 +KPX Otilde Abreve -55 +KPX Otilde Acircumflex -55 +KPX Otilde Adieresis -55 +KPX Otilde Agrave -55 +KPX Otilde Amacron -55 +KPX Otilde Aogonek -55 +KPX Otilde Aring -55 +KPX Otilde Atilde -55 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -50 +KPX Otilde X -40 +KPX Otilde Y -50 +KPX Otilde Yacute -50 +KPX Otilde Ydieresis -50 +KPX P A -90 +KPX P Aacute -90 +KPX P Abreve -90 +KPX P Acircumflex -90 +KPX P Adieresis -90 +KPX P Agrave -90 +KPX P Amacron -90 +KPX P Aogonek -90 +KPX P Aring -90 +KPX P Atilde -90 +KPX P a -80 +KPX P aacute -80 +KPX P abreve -80 +KPX P acircumflex -80 +KPX P adieresis -80 +KPX P agrave -80 +KPX P amacron -80 +KPX P aogonek -80 +KPX P aring -80 +KPX P atilde -80 +KPX P comma -135 +KPX P e -80 +KPX P eacute -80 +KPX P ecaron -80 +KPX P ecircumflex -80 +KPX P edieresis -80 +KPX P edotaccent -80 +KPX P egrave -80 +KPX P emacron -80 +KPX P eogonek -80 +KPX P o -80 +KPX P oacute -80 +KPX P ocircumflex -80 +KPX P odieresis -80 +KPX P ograve -80 +KPX P ohungarumlaut -80 +KPX P omacron -80 +KPX P oslash -80 +KPX P otilde -80 +KPX P period -135 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX R O -40 +KPX R Oacute -40 +KPX R Ocircumflex -40 +KPX R Odieresis -40 +KPX R Ograve -40 +KPX R Ohungarumlaut -40 +KPX R Omacron -40 +KPX R Oslash -40 +KPX R Otilde -40 +KPX R U -40 +KPX R Uacute -40 +KPX R Ucircumflex -40 +KPX R Udieresis -40 +KPX R Ugrave -40 +KPX R Uhungarumlaut -40 +KPX R Umacron -40 +KPX R Uogonek -40 +KPX R Uring -40 +KPX R V -18 +KPX R W -18 +KPX R Y -18 +KPX R Yacute -18 +KPX R Ydieresis -18 +KPX Racute O -40 +KPX Racute Oacute -40 +KPX Racute Ocircumflex -40 +KPX Racute Odieresis -40 +KPX Racute Ograve -40 +KPX Racute Ohungarumlaut -40 +KPX Racute Omacron -40 +KPX Racute Oslash -40 +KPX Racute Otilde -40 +KPX Racute U -40 +KPX Racute Uacute -40 +KPX Racute Ucircumflex -40 +KPX Racute Udieresis -40 +KPX Racute Ugrave -40 +KPX Racute Uhungarumlaut -40 +KPX Racute Umacron -40 +KPX Racute Uogonek -40 +KPX Racute Uring -40 +KPX Racute V -18 +KPX Racute W -18 +KPX Racute Y -18 +KPX Racute Yacute -18 +KPX Racute Ydieresis -18 +KPX Rcaron O -40 +KPX Rcaron Oacute -40 +KPX Rcaron Ocircumflex -40 +KPX Rcaron Odieresis -40 +KPX Rcaron Ograve -40 +KPX Rcaron Ohungarumlaut -40 +KPX Rcaron Omacron -40 +KPX Rcaron Oslash -40 +KPX Rcaron Otilde -40 +KPX Rcaron U -40 +KPX Rcaron Uacute -40 +KPX Rcaron Ucircumflex -40 +KPX Rcaron Udieresis -40 +KPX Rcaron Ugrave -40 +KPX Rcaron Uhungarumlaut -40 +KPX Rcaron Umacron -40 +KPX Rcaron Uogonek -40 +KPX Rcaron Uring -40 +KPX Rcaron V -18 +KPX Rcaron W -18 +KPX Rcaron Y -18 +KPX Rcaron Yacute -18 +KPX Rcaron Ydieresis -18 +KPX Rcommaaccent O -40 +KPX Rcommaaccent Oacute -40 +KPX Rcommaaccent Ocircumflex -40 +KPX Rcommaaccent Odieresis -40 +KPX Rcommaaccent Ograve -40 +KPX Rcommaaccent Ohungarumlaut -40 +KPX Rcommaaccent Omacron -40 +KPX Rcommaaccent Oslash -40 +KPX Rcommaaccent Otilde -40 +KPX Rcommaaccent U -40 +KPX Rcommaaccent Uacute -40 +KPX Rcommaaccent Ucircumflex -40 +KPX Rcommaaccent Udieresis -40 +KPX Rcommaaccent Ugrave -40 +KPX Rcommaaccent Uhungarumlaut -40 +KPX Rcommaaccent Umacron -40 +KPX Rcommaaccent Uogonek -40 +KPX Rcommaaccent Uring -40 +KPX Rcommaaccent V -18 +KPX Rcommaaccent W -18 +KPX Rcommaaccent Y -18 +KPX Rcommaaccent Yacute -18 +KPX Rcommaaccent Ydieresis -18 +KPX T A -50 +KPX T Aacute -50 +KPX T Abreve -50 +KPX T Acircumflex -50 +KPX T Adieresis -50 +KPX T Agrave -50 +KPX T Amacron -50 +KPX T Aogonek -50 +KPX T Aring -50 +KPX T Atilde -50 +KPX T O -18 +KPX T Oacute -18 +KPX T Ocircumflex -18 +KPX T Odieresis -18 +KPX T Ograve -18 +KPX T Ohungarumlaut -18 +KPX T Omacron -18 +KPX T Oslash -18 +KPX T Otilde -18 +KPX T a -92 +KPX T aacute -92 +KPX T abreve -92 +KPX T acircumflex -92 +KPX T adieresis -92 +KPX T agrave -92 +KPX T amacron -92 +KPX T aogonek -92 +KPX T aring -92 +KPX T atilde -92 +KPX T colon -55 +KPX T comma -74 +KPX T e -92 +KPX T eacute -92 +KPX T ecaron -92 +KPX T ecircumflex -52 +KPX T edieresis -52 +KPX T edotaccent -92 +KPX T egrave -52 +KPX T emacron -52 +KPX T eogonek -92 +KPX T hyphen -74 +KPX T i -55 +KPX T iacute -55 +KPX T iogonek -55 +KPX T o -92 +KPX T oacute -92 +KPX T ocircumflex -92 +KPX T odieresis -92 +KPX T ograve -92 +KPX T ohungarumlaut -92 +KPX T omacron -92 +KPX T oslash -92 +KPX T otilde -92 +KPX T period -74 +KPX T r -55 +KPX T racute -55 +KPX T rcaron -55 +KPX T rcommaaccent -55 +KPX T semicolon -65 +KPX T u -55 +KPX T uacute -55 +KPX T ucircumflex -55 +KPX T udieresis -55 +KPX T ugrave -55 +KPX T uhungarumlaut -55 +KPX T umacron -55 +KPX T uogonek -55 +KPX T uring -55 +KPX T w -74 +KPX T y -74 +KPX T yacute -74 +KPX T ydieresis -34 +KPX Tcaron A -50 +KPX Tcaron Aacute -50 +KPX Tcaron Abreve -50 +KPX Tcaron Acircumflex -50 +KPX Tcaron Adieresis -50 +KPX Tcaron Agrave -50 +KPX Tcaron Amacron -50 +KPX Tcaron Aogonek -50 +KPX Tcaron Aring -50 +KPX Tcaron Atilde -50 +KPX Tcaron O -18 +KPX Tcaron Oacute -18 +KPX Tcaron Ocircumflex -18 +KPX Tcaron Odieresis -18 +KPX Tcaron Ograve -18 +KPX Tcaron Ohungarumlaut -18 +KPX Tcaron Omacron -18 +KPX Tcaron Oslash -18 +KPX Tcaron Otilde -18 +KPX Tcaron a -92 +KPX Tcaron aacute -92 +KPX Tcaron abreve -92 +KPX Tcaron acircumflex -92 +KPX Tcaron adieresis -92 +KPX Tcaron agrave -92 +KPX Tcaron amacron -92 +KPX Tcaron aogonek -92 +KPX Tcaron aring -92 +KPX Tcaron atilde -92 +KPX Tcaron colon -55 +KPX Tcaron comma -74 +KPX Tcaron e -92 +KPX Tcaron eacute -92 +KPX Tcaron ecaron -92 +KPX Tcaron ecircumflex -52 +KPX Tcaron edieresis -52 +KPX Tcaron edotaccent -92 +KPX Tcaron egrave -52 +KPX Tcaron emacron -52 +KPX Tcaron eogonek -92 +KPX Tcaron hyphen -74 +KPX Tcaron i -55 +KPX Tcaron iacute -55 +KPX Tcaron iogonek -55 +KPX Tcaron o -92 +KPX Tcaron oacute -92 +KPX Tcaron ocircumflex -92 +KPX Tcaron odieresis -92 +KPX Tcaron ograve -92 +KPX Tcaron ohungarumlaut -92 +KPX Tcaron omacron -92 +KPX Tcaron oslash -92 +KPX Tcaron otilde -92 +KPX Tcaron period -74 +KPX Tcaron r -55 +KPX Tcaron racute -55 +KPX Tcaron rcaron -55 +KPX Tcaron rcommaaccent -55 +KPX Tcaron semicolon -65 +KPX Tcaron u -55 +KPX Tcaron uacute -55 +KPX Tcaron ucircumflex -55 +KPX Tcaron udieresis -55 +KPX Tcaron ugrave -55 +KPX Tcaron uhungarumlaut -55 +KPX Tcaron umacron -55 +KPX Tcaron uogonek -55 +KPX Tcaron uring -55 +KPX Tcaron w -74 +KPX Tcaron y -74 +KPX Tcaron yacute -74 +KPX Tcaron ydieresis -34 +KPX Tcommaaccent A -50 +KPX Tcommaaccent Aacute -50 +KPX Tcommaaccent Abreve -50 +KPX Tcommaaccent Acircumflex -50 +KPX Tcommaaccent Adieresis -50 +KPX Tcommaaccent Agrave -50 +KPX Tcommaaccent Amacron -50 +KPX Tcommaaccent Aogonek -50 +KPX Tcommaaccent Aring -50 +KPX Tcommaaccent Atilde -50 +KPX Tcommaaccent O -18 +KPX Tcommaaccent Oacute -18 +KPX Tcommaaccent Ocircumflex -18 +KPX Tcommaaccent Odieresis -18 +KPX Tcommaaccent Ograve -18 +KPX Tcommaaccent Ohungarumlaut -18 +KPX Tcommaaccent Omacron -18 +KPX Tcommaaccent Oslash -18 +KPX Tcommaaccent Otilde -18 +KPX Tcommaaccent a -92 +KPX Tcommaaccent aacute -92 +KPX Tcommaaccent abreve -92 +KPX Tcommaaccent acircumflex -92 +KPX Tcommaaccent adieresis -92 +KPX Tcommaaccent agrave -92 +KPX Tcommaaccent amacron -92 +KPX Tcommaaccent aogonek -92 +KPX Tcommaaccent aring -92 +KPX Tcommaaccent atilde -92 +KPX Tcommaaccent colon -55 +KPX Tcommaaccent comma -74 +KPX Tcommaaccent e -92 +KPX Tcommaaccent eacute -92 +KPX Tcommaaccent ecaron -92 +KPX Tcommaaccent ecircumflex -52 +KPX Tcommaaccent edieresis -52 +KPX Tcommaaccent edotaccent -92 +KPX Tcommaaccent egrave -52 +KPX Tcommaaccent emacron -52 +KPX Tcommaaccent eogonek -92 +KPX Tcommaaccent hyphen -74 +KPX Tcommaaccent i -55 +KPX Tcommaaccent iacute -55 +KPX Tcommaaccent iogonek -55 +KPX Tcommaaccent o -92 +KPX Tcommaaccent oacute -92 +KPX Tcommaaccent ocircumflex -92 +KPX Tcommaaccent odieresis -92 +KPX Tcommaaccent ograve -92 +KPX Tcommaaccent ohungarumlaut -92 +KPX Tcommaaccent omacron -92 +KPX Tcommaaccent oslash -92 +KPX Tcommaaccent otilde -92 +KPX Tcommaaccent period -74 +KPX Tcommaaccent r -55 +KPX Tcommaaccent racute -55 +KPX Tcommaaccent rcaron -55 +KPX Tcommaaccent rcommaaccent -55 +KPX Tcommaaccent semicolon -65 +KPX Tcommaaccent u -55 +KPX Tcommaaccent uacute -55 +KPX Tcommaaccent ucircumflex -55 +KPX Tcommaaccent udieresis -55 +KPX Tcommaaccent ugrave -55 +KPX Tcommaaccent uhungarumlaut -55 +KPX Tcommaaccent umacron -55 +KPX Tcommaaccent uogonek -55 +KPX Tcommaaccent uring -55 +KPX Tcommaaccent w -74 +KPX Tcommaaccent y -74 +KPX Tcommaaccent yacute -74 +KPX Tcommaaccent ydieresis -34 +KPX U A -40 +KPX U Aacute -40 +KPX U Abreve -40 +KPX U Acircumflex -40 +KPX U Adieresis -40 +KPX U Agrave -40 +KPX U Amacron -40 +KPX U Aogonek -40 +KPX U Aring -40 +KPX U Atilde -40 +KPX U comma -25 +KPX U period -25 +KPX Uacute A -40 +KPX Uacute Aacute -40 +KPX Uacute Abreve -40 +KPX Uacute Acircumflex -40 +KPX Uacute Adieresis -40 +KPX Uacute Agrave -40 +KPX Uacute Amacron -40 +KPX Uacute Aogonek -40 +KPX Uacute Aring -40 +KPX Uacute Atilde -40 +KPX Uacute comma -25 +KPX Uacute period -25 +KPX Ucircumflex A -40 +KPX Ucircumflex Aacute -40 +KPX Ucircumflex Abreve -40 +KPX Ucircumflex Acircumflex -40 +KPX Ucircumflex Adieresis -40 +KPX Ucircumflex Agrave -40 +KPX Ucircumflex Amacron -40 +KPX Ucircumflex Aogonek -40 +KPX Ucircumflex Aring -40 +KPX Ucircumflex Atilde -40 +KPX Ucircumflex comma -25 +KPX Ucircumflex period -25 +KPX Udieresis A -40 +KPX Udieresis Aacute -40 +KPX Udieresis Abreve -40 +KPX Udieresis Acircumflex -40 +KPX Udieresis Adieresis -40 +KPX Udieresis Agrave -40 +KPX Udieresis Amacron -40 +KPX Udieresis Aogonek -40 +KPX Udieresis Aring -40 +KPX Udieresis Atilde -40 +KPX Udieresis comma -25 +KPX Udieresis period -25 +KPX Ugrave A -40 +KPX Ugrave Aacute -40 +KPX Ugrave Abreve -40 +KPX Ugrave Acircumflex -40 +KPX Ugrave Adieresis -40 +KPX Ugrave Agrave -40 +KPX Ugrave Amacron -40 +KPX Ugrave Aogonek -40 +KPX Ugrave Aring -40 +KPX Ugrave Atilde -40 +KPX Ugrave comma -25 +KPX Ugrave period -25 +KPX Uhungarumlaut A -40 +KPX Uhungarumlaut Aacute -40 +KPX Uhungarumlaut Abreve -40 +KPX Uhungarumlaut Acircumflex -40 +KPX Uhungarumlaut Adieresis -40 +KPX Uhungarumlaut Agrave -40 +KPX Uhungarumlaut Amacron -40 +KPX Uhungarumlaut Aogonek -40 +KPX Uhungarumlaut Aring -40 +KPX Uhungarumlaut Atilde -40 +KPX Uhungarumlaut comma -25 +KPX Uhungarumlaut period -25 +KPX Umacron A -40 +KPX Umacron Aacute -40 +KPX Umacron Abreve -40 +KPX Umacron Acircumflex -40 +KPX Umacron Adieresis -40 +KPX Umacron Agrave -40 +KPX Umacron Amacron -40 +KPX Umacron Aogonek -40 +KPX Umacron Aring -40 +KPX Umacron Atilde -40 +KPX Umacron comma -25 +KPX Umacron period -25 +KPX Uogonek A -40 +KPX Uogonek Aacute -40 +KPX Uogonek Abreve -40 +KPX Uogonek Acircumflex -40 +KPX Uogonek Adieresis -40 +KPX Uogonek Agrave -40 +KPX Uogonek Amacron -40 +KPX Uogonek Aogonek -40 +KPX Uogonek Aring -40 +KPX Uogonek Atilde -40 +KPX Uogonek comma -25 +KPX Uogonek period -25 +KPX Uring A -40 +KPX Uring Aacute -40 +KPX Uring Abreve -40 +KPX Uring Acircumflex -40 +KPX Uring Adieresis -40 +KPX Uring Agrave -40 +KPX Uring Amacron -40 +KPX Uring Aogonek -40 +KPX Uring Aring -40 +KPX Uring Atilde -40 +KPX Uring comma -25 +KPX Uring period -25 +KPX V A -60 +KPX V Aacute -60 +KPX V Abreve -60 +KPX V Acircumflex -60 +KPX V Adieresis -60 +KPX V Agrave -60 +KPX V Amacron -60 +KPX V Aogonek -60 +KPX V Aring -60 +KPX V Atilde -60 +KPX V O -30 +KPX V Oacute -30 +KPX V Ocircumflex -30 +KPX V Odieresis -30 +KPX V Ograve -30 +KPX V Ohungarumlaut -30 +KPX V Omacron -30 +KPX V Oslash -30 +KPX V Otilde -30 +KPX V a -111 +KPX V aacute -111 +KPX V abreve -111 +KPX V acircumflex -111 +KPX V adieresis -111 +KPX V agrave -111 +KPX V amacron -111 +KPX V aogonek -111 +KPX V aring -111 +KPX V atilde -111 +KPX V colon -65 +KPX V comma -129 +KPX V e -111 +KPX V eacute -111 +KPX V ecaron -111 +KPX V ecircumflex -111 +KPX V edieresis -71 +KPX V edotaccent -111 +KPX V egrave -71 +KPX V emacron -71 +KPX V eogonek -111 +KPX V hyphen -55 +KPX V i -74 +KPX V iacute -74 +KPX V icircumflex -34 +KPX V idieresis -34 +KPX V igrave -34 +KPX V imacron -34 +KPX V iogonek -74 +KPX V o -111 +KPX V oacute -111 +KPX V ocircumflex -111 +KPX V odieresis -111 +KPX V ograve -111 +KPX V ohungarumlaut -111 +KPX V omacron -111 +KPX V oslash -111 +KPX V otilde -111 +KPX V period -129 +KPX V semicolon -74 +KPX V u -74 +KPX V uacute -74 +KPX V ucircumflex -74 +KPX V udieresis -74 +KPX V ugrave -74 +KPX V uhungarumlaut -74 +KPX V umacron -74 +KPX V uogonek -74 +KPX V uring -74 +KPX W A -60 +KPX W Aacute -60 +KPX W Abreve -60 +KPX W Acircumflex -60 +KPX W Adieresis -60 +KPX W Agrave -60 +KPX W Amacron -60 +KPX W Aogonek -60 +KPX W Aring -60 +KPX W Atilde -60 +KPX W O -25 +KPX W Oacute -25 +KPX W Ocircumflex -25 +KPX W Odieresis -25 +KPX W Ograve -25 +KPX W Ohungarumlaut -25 +KPX W Omacron -25 +KPX W Oslash -25 +KPX W Otilde -25 +KPX W a -92 +KPX W aacute -92 +KPX W abreve -92 +KPX W acircumflex -92 +KPX W adieresis -92 +KPX W agrave -92 +KPX W amacron -92 +KPX W aogonek -92 +KPX W aring -92 +KPX W atilde -92 +KPX W colon -65 +KPX W comma -92 +KPX W e -92 +KPX W eacute -92 +KPX W ecaron -92 +KPX W ecircumflex -92 +KPX W edieresis -52 +KPX W edotaccent -92 +KPX W egrave -52 +KPX W emacron -52 +KPX W eogonek -92 +KPX W hyphen -37 +KPX W i -55 +KPX W iacute -55 +KPX W iogonek -55 +KPX W o -92 +KPX W oacute -92 +KPX W ocircumflex -92 +KPX W odieresis -92 +KPX W ograve -92 +KPX W ohungarumlaut -92 +KPX W omacron -92 +KPX W oslash -92 +KPX W otilde -92 +KPX W period -92 +KPX W semicolon -65 +KPX W u -55 +KPX W uacute -55 +KPX W ucircumflex -55 +KPX W udieresis -55 +KPX W ugrave -55 +KPX W uhungarumlaut -55 +KPX W umacron -55 +KPX W uogonek -55 +KPX W uring -55 +KPX W y -70 +KPX W yacute -70 +KPX W ydieresis -70 +KPX Y A -50 +KPX Y Aacute -50 +KPX Y Abreve -50 +KPX Y Acircumflex -50 +KPX Y Adieresis -50 +KPX Y Agrave -50 +KPX Y Amacron -50 +KPX Y Aogonek -50 +KPX Y Aring -50 +KPX Y Atilde -50 +KPX Y O -15 +KPX Y Oacute -15 +KPX Y Ocircumflex -15 +KPX Y Odieresis -15 +KPX Y Ograve -15 +KPX Y Ohungarumlaut -15 +KPX Y Omacron -15 +KPX Y Oslash -15 +KPX Y Otilde -15 +KPX Y a -92 +KPX Y aacute -92 +KPX Y abreve -92 +KPX Y acircumflex -92 +KPX Y adieresis -92 +KPX Y agrave -92 +KPX Y amacron -92 +KPX Y aogonek -92 +KPX Y aring -92 +KPX Y atilde -92 +KPX Y colon -65 +KPX Y comma -92 +KPX Y e -92 +KPX Y eacute -92 +KPX Y ecaron -92 +KPX Y ecircumflex -92 +KPX Y edieresis -52 +KPX Y edotaccent -92 +KPX Y egrave -52 +KPX Y emacron -52 +KPX Y eogonek -92 +KPX Y hyphen -74 +KPX Y i -74 +KPX Y iacute -74 +KPX Y icircumflex -34 +KPX Y idieresis -34 +KPX Y igrave -34 +KPX Y imacron -34 +KPX Y iogonek -74 +KPX Y o -92 +KPX Y oacute -92 +KPX Y ocircumflex -92 +KPX Y odieresis -92 +KPX Y ograve -92 +KPX Y ohungarumlaut -92 +KPX Y omacron -92 +KPX Y oslash -92 +KPX Y otilde -92 +KPX Y period -92 +KPX Y semicolon -65 +KPX Y u -92 +KPX Y uacute -92 +KPX Y ucircumflex -92 +KPX Y udieresis -92 +KPX Y ugrave -92 +KPX Y uhungarumlaut -92 +KPX Y umacron -92 +KPX Y uogonek -92 +KPX Y uring -92 +KPX Yacute A -50 +KPX Yacute Aacute -50 +KPX Yacute Abreve -50 +KPX Yacute Acircumflex -50 +KPX Yacute Adieresis -50 +KPX Yacute Agrave -50 +KPX Yacute Amacron -50 +KPX Yacute Aogonek -50 +KPX Yacute Aring -50 +KPX Yacute Atilde -50 +KPX Yacute O -15 +KPX Yacute Oacute -15 +KPX Yacute Ocircumflex -15 +KPX Yacute Odieresis -15 +KPX Yacute Ograve -15 +KPX Yacute Ohungarumlaut -15 +KPX Yacute Omacron -15 +KPX Yacute Oslash -15 +KPX Yacute Otilde -15 +KPX Yacute a -92 +KPX Yacute aacute -92 +KPX Yacute abreve -92 +KPX Yacute acircumflex -92 +KPX Yacute adieresis -92 +KPX Yacute agrave -92 +KPX Yacute amacron -92 +KPX Yacute aogonek -92 +KPX Yacute aring -92 +KPX Yacute atilde -92 +KPX Yacute colon -65 +KPX Yacute comma -92 +KPX Yacute e -92 +KPX Yacute eacute -92 +KPX Yacute ecaron -92 +KPX Yacute ecircumflex -92 +KPX Yacute edieresis -52 +KPX Yacute edotaccent -92 +KPX Yacute egrave -52 +KPX Yacute emacron -52 +KPX Yacute eogonek -92 +KPX Yacute hyphen -74 +KPX Yacute i -74 +KPX Yacute iacute -74 +KPX Yacute icircumflex -34 +KPX Yacute idieresis -34 +KPX Yacute igrave -34 +KPX Yacute imacron -34 +KPX Yacute iogonek -74 +KPX Yacute o -92 +KPX Yacute oacute -92 +KPX Yacute ocircumflex -92 +KPX Yacute odieresis -92 +KPX Yacute ograve -92 +KPX Yacute ohungarumlaut -92 +KPX Yacute omacron -92 +KPX Yacute oslash -92 +KPX Yacute otilde -92 +KPX Yacute period -92 +KPX Yacute semicolon -65 +KPX Yacute u -92 +KPX Yacute uacute -92 +KPX Yacute ucircumflex -92 +KPX Yacute udieresis -92 +KPX Yacute ugrave -92 +KPX Yacute uhungarumlaut -92 +KPX Yacute umacron -92 +KPX Yacute uogonek -92 +KPX Yacute uring -92 +KPX Ydieresis A -50 +KPX Ydieresis Aacute -50 +KPX Ydieresis Abreve -50 +KPX Ydieresis Acircumflex -50 +KPX Ydieresis Adieresis -50 +KPX Ydieresis Agrave -50 +KPX Ydieresis Amacron -50 +KPX Ydieresis Aogonek -50 +KPX Ydieresis Aring -50 +KPX Ydieresis Atilde -50 +KPX Ydieresis O -15 +KPX Ydieresis Oacute -15 +KPX Ydieresis Ocircumflex -15 +KPX Ydieresis Odieresis -15 +KPX Ydieresis Ograve -15 +KPX Ydieresis Ohungarumlaut -15 +KPX Ydieresis Omacron -15 +KPX Ydieresis Oslash -15 +KPX Ydieresis Otilde -15 +KPX Ydieresis a -92 +KPX Ydieresis aacute -92 +KPX Ydieresis abreve -92 +KPX Ydieresis acircumflex -92 +KPX Ydieresis adieresis -92 +KPX Ydieresis agrave -92 +KPX Ydieresis amacron -92 +KPX Ydieresis aogonek -92 +KPX Ydieresis aring -92 +KPX Ydieresis atilde -92 +KPX Ydieresis colon -65 +KPX Ydieresis comma -92 +KPX Ydieresis e -92 +KPX Ydieresis eacute -92 +KPX Ydieresis ecaron -92 +KPX Ydieresis ecircumflex -92 +KPX Ydieresis edieresis -52 +KPX Ydieresis edotaccent -92 +KPX Ydieresis egrave -52 +KPX Ydieresis emacron -52 +KPX Ydieresis eogonek -92 +KPX Ydieresis hyphen -74 +KPX Ydieresis i -74 +KPX Ydieresis iacute -74 +KPX Ydieresis icircumflex -34 +KPX Ydieresis idieresis -34 +KPX Ydieresis igrave -34 +KPX Ydieresis imacron -34 +KPX Ydieresis iogonek -74 +KPX Ydieresis o -92 +KPX Ydieresis oacute -92 +KPX Ydieresis ocircumflex -92 +KPX Ydieresis odieresis -92 +KPX Ydieresis ograve -92 +KPX Ydieresis ohungarumlaut -92 +KPX Ydieresis omacron -92 +KPX Ydieresis oslash -92 +KPX Ydieresis otilde -92 +KPX Ydieresis period -92 +KPX Ydieresis semicolon -65 +KPX Ydieresis u -92 +KPX Ydieresis uacute -92 +KPX Ydieresis ucircumflex -92 +KPX Ydieresis udieresis -92 +KPX Ydieresis ugrave -92 +KPX Ydieresis uhungarumlaut -92 +KPX Ydieresis umacron -92 +KPX Ydieresis uogonek -92 +KPX Ydieresis uring -92 +KPX a g -10 +KPX a gbreve -10 +KPX a gcommaaccent -10 +KPX aacute g -10 +KPX aacute gbreve -10 +KPX aacute gcommaaccent -10 +KPX abreve g -10 +KPX abreve gbreve -10 +KPX abreve gcommaaccent -10 +KPX acircumflex g -10 +KPX acircumflex gbreve -10 +KPX acircumflex gcommaaccent -10 +KPX adieresis g -10 +KPX adieresis gbreve -10 +KPX adieresis gcommaaccent -10 +KPX agrave g -10 +KPX agrave gbreve -10 +KPX agrave gcommaaccent -10 +KPX amacron g -10 +KPX amacron gbreve -10 +KPX amacron gcommaaccent -10 +KPX aogonek g -10 +KPX aogonek gbreve -10 +KPX aogonek gcommaaccent -10 +KPX aring g -10 +KPX aring gbreve -10 +KPX aring gcommaaccent -10 +KPX atilde g -10 +KPX atilde gbreve -10 +KPX atilde gcommaaccent -10 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX c h -15 +KPX c k -20 +KPX c kcommaaccent -20 +KPX cacute h -15 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX ccaron h -15 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccedilla h -15 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX comma quotedblright -140 +KPX comma quoteright -140 +KPX e comma -10 +KPX e g -40 +KPX e gbreve -40 +KPX e gcommaaccent -40 +KPX e period -15 +KPX e v -15 +KPX e w -15 +KPX e x -20 +KPX e y -30 +KPX e yacute -30 +KPX e ydieresis -30 +KPX eacute comma -10 +KPX eacute g -40 +KPX eacute gbreve -40 +KPX eacute gcommaaccent -40 +KPX eacute period -15 +KPX eacute v -15 +KPX eacute w -15 +KPX eacute x -20 +KPX eacute y -30 +KPX eacute yacute -30 +KPX eacute ydieresis -30 +KPX ecaron comma -10 +KPX ecaron g -40 +KPX ecaron gbreve -40 +KPX ecaron gcommaaccent -40 +KPX ecaron period -15 +KPX ecaron v -15 +KPX ecaron w -15 +KPX ecaron x -20 +KPX ecaron y -30 +KPX ecaron yacute -30 +KPX ecaron ydieresis -30 +KPX ecircumflex comma -10 +KPX ecircumflex g -40 +KPX ecircumflex gbreve -40 +KPX ecircumflex gcommaaccent -40 +KPX ecircumflex period -15 +KPX ecircumflex v -15 +KPX ecircumflex w -15 +KPX ecircumflex x -20 +KPX ecircumflex y -30 +KPX ecircumflex yacute -30 +KPX ecircumflex ydieresis -30 +KPX edieresis comma -10 +KPX edieresis g -40 +KPX edieresis gbreve -40 +KPX edieresis gcommaaccent -40 +KPX edieresis period -15 +KPX edieresis v -15 +KPX edieresis w -15 +KPX edieresis x -20 +KPX edieresis y -30 +KPX edieresis yacute -30 +KPX edieresis ydieresis -30 +KPX edotaccent comma -10 +KPX edotaccent g -40 +KPX edotaccent gbreve -40 +KPX edotaccent gcommaaccent -40 +KPX edotaccent period -15 +KPX edotaccent v -15 +KPX edotaccent w -15 +KPX edotaccent x -20 +KPX edotaccent y -30 +KPX edotaccent yacute -30 +KPX edotaccent ydieresis -30 +KPX egrave comma -10 +KPX egrave g -40 +KPX egrave gbreve -40 +KPX egrave gcommaaccent -40 +KPX egrave period -15 +KPX egrave v -15 +KPX egrave w -15 +KPX egrave x -20 +KPX egrave y -30 +KPX egrave yacute -30 +KPX egrave ydieresis -30 +KPX emacron comma -10 +KPX emacron g -40 +KPX emacron gbreve -40 +KPX emacron gcommaaccent -40 +KPX emacron period -15 +KPX emacron v -15 +KPX emacron w -15 +KPX emacron x -20 +KPX emacron y -30 +KPX emacron yacute -30 +KPX emacron ydieresis -30 +KPX eogonek comma -10 +KPX eogonek g -40 +KPX eogonek gbreve -40 +KPX eogonek gcommaaccent -40 +KPX eogonek period -15 +KPX eogonek v -15 +KPX eogonek w -15 +KPX eogonek x -20 +KPX eogonek y -30 +KPX eogonek yacute -30 +KPX eogonek ydieresis -30 +KPX f comma -10 +KPX f dotlessi -60 +KPX f f -18 +KPX f i -20 +KPX f iogonek -20 +KPX f period -15 +KPX f quoteright 92 +KPX g comma -10 +KPX g e -10 +KPX g eacute -10 +KPX g ecaron -10 +KPX g ecircumflex -10 +KPX g edieresis -10 +KPX g edotaccent -10 +KPX g egrave -10 +KPX g emacron -10 +KPX g eogonek -10 +KPX g g -10 +KPX g gbreve -10 +KPX g gcommaaccent -10 +KPX g period -15 +KPX gbreve comma -10 +KPX gbreve e -10 +KPX gbreve eacute -10 +KPX gbreve ecaron -10 +KPX gbreve ecircumflex -10 +KPX gbreve edieresis -10 +KPX gbreve edotaccent -10 +KPX gbreve egrave -10 +KPX gbreve emacron -10 +KPX gbreve eogonek -10 +KPX gbreve g -10 +KPX gbreve gbreve -10 +KPX gbreve gcommaaccent -10 +KPX gbreve period -15 +KPX gcommaaccent comma -10 +KPX gcommaaccent e -10 +KPX gcommaaccent eacute -10 +KPX gcommaaccent ecaron -10 +KPX gcommaaccent ecircumflex -10 +KPX gcommaaccent edieresis -10 +KPX gcommaaccent edotaccent -10 +KPX gcommaaccent egrave -10 +KPX gcommaaccent emacron -10 +KPX gcommaaccent eogonek -10 +KPX gcommaaccent g -10 +KPX gcommaaccent gbreve -10 +KPX gcommaaccent gcommaaccent -10 +KPX gcommaaccent period -15 +KPX k e -10 +KPX k eacute -10 +KPX k ecaron -10 +KPX k ecircumflex -10 +KPX k edieresis -10 +KPX k edotaccent -10 +KPX k egrave -10 +KPX k emacron -10 +KPX k eogonek -10 +KPX k o -10 +KPX k oacute -10 +KPX k ocircumflex -10 +KPX k odieresis -10 +KPX k ograve -10 +KPX k ohungarumlaut -10 +KPX k omacron -10 +KPX k oslash -10 +KPX k otilde -10 +KPX k y -10 +KPX k yacute -10 +KPX k ydieresis -10 +KPX kcommaaccent e -10 +KPX kcommaaccent eacute -10 +KPX kcommaaccent ecaron -10 +KPX kcommaaccent ecircumflex -10 +KPX kcommaaccent edieresis -10 +KPX kcommaaccent edotaccent -10 +KPX kcommaaccent egrave -10 +KPX kcommaaccent emacron -10 +KPX kcommaaccent eogonek -10 +KPX kcommaaccent o -10 +KPX kcommaaccent oacute -10 +KPX kcommaaccent ocircumflex -10 +KPX kcommaaccent odieresis -10 +KPX kcommaaccent ograve -10 +KPX kcommaaccent ohungarumlaut -10 +KPX kcommaaccent omacron -10 +KPX kcommaaccent oslash -10 +KPX kcommaaccent otilde -10 +KPX kcommaaccent y -10 +KPX kcommaaccent yacute -10 +KPX kcommaaccent ydieresis -10 +KPX n v -40 +KPX nacute v -40 +KPX ncaron v -40 +KPX ncommaaccent v -40 +KPX ntilde v -40 +KPX o g -10 +KPX o gbreve -10 +KPX o gcommaaccent -10 +KPX o v -10 +KPX oacute g -10 +KPX oacute gbreve -10 +KPX oacute gcommaaccent -10 +KPX oacute v -10 +KPX ocircumflex g -10 +KPX ocircumflex gbreve -10 +KPX ocircumflex gcommaaccent -10 +KPX ocircumflex v -10 +KPX odieresis g -10 +KPX odieresis gbreve -10 +KPX odieresis gcommaaccent -10 +KPX odieresis v -10 +KPX ograve g -10 +KPX ograve gbreve -10 +KPX ograve gcommaaccent -10 +KPX ograve v -10 +KPX ohungarumlaut g -10 +KPX ohungarumlaut gbreve -10 +KPX ohungarumlaut gcommaaccent -10 +KPX ohungarumlaut v -10 +KPX omacron g -10 +KPX omacron gbreve -10 +KPX omacron gcommaaccent -10 +KPX omacron v -10 +KPX oslash g -10 +KPX oslash gbreve -10 +KPX oslash gcommaaccent -10 +KPX oslash v -10 +KPX otilde g -10 +KPX otilde gbreve -10 +KPX otilde gcommaaccent -10 +KPX otilde v -10 +KPX period quotedblright -140 +KPX period quoteright -140 +KPX quoteleft quoteleft -111 +KPX quoteright d -25 +KPX quoteright dcroat -25 +KPX quoteright quoteright -111 +KPX quoteright r -25 +KPX quoteright racute -25 +KPX quoteright rcaron -25 +KPX quoteright rcommaaccent -25 +KPX quoteright s -40 +KPX quoteright sacute -40 +KPX quoteright scaron -40 +KPX quoteright scedilla -40 +KPX quoteright scommaaccent -40 +KPX quoteright space -111 +KPX quoteright t -30 +KPX quoteright tcommaaccent -30 +KPX quoteright v -10 +KPX r a -15 +KPX r aacute -15 +KPX r abreve -15 +KPX r acircumflex -15 +KPX r adieresis -15 +KPX r agrave -15 +KPX r amacron -15 +KPX r aogonek -15 +KPX r aring -15 +KPX r atilde -15 +KPX r c -37 +KPX r cacute -37 +KPX r ccaron -37 +KPX r ccedilla -37 +KPX r comma -111 +KPX r d -37 +KPX r dcroat -37 +KPX r e -37 +KPX r eacute -37 +KPX r ecaron -37 +KPX r ecircumflex -37 +KPX r edieresis -37 +KPX r edotaccent -37 +KPX r egrave -37 +KPX r emacron -37 +KPX r eogonek -37 +KPX r g -37 +KPX r gbreve -37 +KPX r gcommaaccent -37 +KPX r hyphen -20 +KPX r o -45 +KPX r oacute -45 +KPX r ocircumflex -45 +KPX r odieresis -45 +KPX r ograve -45 +KPX r ohungarumlaut -45 +KPX r omacron -45 +KPX r oslash -45 +KPX r otilde -45 +KPX r period -111 +KPX r q -37 +KPX r s -10 +KPX r sacute -10 +KPX r scaron -10 +KPX r scedilla -10 +KPX r scommaaccent -10 +KPX racute a -15 +KPX racute aacute -15 +KPX racute abreve -15 +KPX racute acircumflex -15 +KPX racute adieresis -15 +KPX racute agrave -15 +KPX racute amacron -15 +KPX racute aogonek -15 +KPX racute aring -15 +KPX racute atilde -15 +KPX racute c -37 +KPX racute cacute -37 +KPX racute ccaron -37 +KPX racute ccedilla -37 +KPX racute comma -111 +KPX racute d -37 +KPX racute dcroat -37 +KPX racute e -37 +KPX racute eacute -37 +KPX racute ecaron -37 +KPX racute ecircumflex -37 +KPX racute edieresis -37 +KPX racute edotaccent -37 +KPX racute egrave -37 +KPX racute emacron -37 +KPX racute eogonek -37 +KPX racute g -37 +KPX racute gbreve -37 +KPX racute gcommaaccent -37 +KPX racute hyphen -20 +KPX racute o -45 +KPX racute oacute -45 +KPX racute ocircumflex -45 +KPX racute odieresis -45 +KPX racute ograve -45 +KPX racute ohungarumlaut -45 +KPX racute omacron -45 +KPX racute oslash -45 +KPX racute otilde -45 +KPX racute period -111 +KPX racute q -37 +KPX racute s -10 +KPX racute sacute -10 +KPX racute scaron -10 +KPX racute scedilla -10 +KPX racute scommaaccent -10 +KPX rcaron a -15 +KPX rcaron aacute -15 +KPX rcaron abreve -15 +KPX rcaron acircumflex -15 +KPX rcaron adieresis -15 +KPX rcaron agrave -15 +KPX rcaron amacron -15 +KPX rcaron aogonek -15 +KPX rcaron aring -15 +KPX rcaron atilde -15 +KPX rcaron c -37 +KPX rcaron cacute -37 +KPX rcaron ccaron -37 +KPX rcaron ccedilla -37 +KPX rcaron comma -111 +KPX rcaron d -37 +KPX rcaron dcroat -37 +KPX rcaron e -37 +KPX rcaron eacute -37 +KPX rcaron ecaron -37 +KPX rcaron ecircumflex -37 +KPX rcaron edieresis -37 +KPX rcaron edotaccent -37 +KPX rcaron egrave -37 +KPX rcaron emacron -37 +KPX rcaron eogonek -37 +KPX rcaron g -37 +KPX rcaron gbreve -37 +KPX rcaron gcommaaccent -37 +KPX rcaron hyphen -20 +KPX rcaron o -45 +KPX rcaron oacute -45 +KPX rcaron ocircumflex -45 +KPX rcaron odieresis -45 +KPX rcaron ograve -45 +KPX rcaron ohungarumlaut -45 +KPX rcaron omacron -45 +KPX rcaron oslash -45 +KPX rcaron otilde -45 +KPX rcaron period -111 +KPX rcaron q -37 +KPX rcaron s -10 +KPX rcaron sacute -10 +KPX rcaron scaron -10 +KPX rcaron scedilla -10 +KPX rcaron scommaaccent -10 +KPX rcommaaccent a -15 +KPX rcommaaccent aacute -15 +KPX rcommaaccent abreve -15 +KPX rcommaaccent acircumflex -15 +KPX rcommaaccent adieresis -15 +KPX rcommaaccent agrave -15 +KPX rcommaaccent amacron -15 +KPX rcommaaccent aogonek -15 +KPX rcommaaccent aring -15 +KPX rcommaaccent atilde -15 +KPX rcommaaccent c -37 +KPX rcommaaccent cacute -37 +KPX rcommaaccent ccaron -37 +KPX rcommaaccent ccedilla -37 +KPX rcommaaccent comma -111 +KPX rcommaaccent d -37 +KPX rcommaaccent dcroat -37 +KPX rcommaaccent e -37 +KPX rcommaaccent eacute -37 +KPX rcommaaccent ecaron -37 +KPX rcommaaccent ecircumflex -37 +KPX rcommaaccent edieresis -37 +KPX rcommaaccent edotaccent -37 +KPX rcommaaccent egrave -37 +KPX rcommaaccent emacron -37 +KPX rcommaaccent eogonek -37 +KPX rcommaaccent g -37 +KPX rcommaaccent gbreve -37 +KPX rcommaaccent gcommaaccent -37 +KPX rcommaaccent hyphen -20 +KPX rcommaaccent o -45 +KPX rcommaaccent oacute -45 +KPX rcommaaccent ocircumflex -45 +KPX rcommaaccent odieresis -45 +KPX rcommaaccent ograve -45 +KPX rcommaaccent ohungarumlaut -45 +KPX rcommaaccent omacron -45 +KPX rcommaaccent oslash -45 +KPX rcommaaccent otilde -45 +KPX rcommaaccent period -111 +KPX rcommaaccent q -37 +KPX rcommaaccent s -10 +KPX rcommaaccent sacute -10 +KPX rcommaaccent scaron -10 +KPX rcommaaccent scedilla -10 +KPX rcommaaccent scommaaccent -10 +KPX space A -18 +KPX space Aacute -18 +KPX space Abreve -18 +KPX space Acircumflex -18 +KPX space Adieresis -18 +KPX space Agrave -18 +KPX space Amacron -18 +KPX space Aogonek -18 +KPX space Aring -18 +KPX space Atilde -18 +KPX space T -18 +KPX space Tcaron -18 +KPX space Tcommaaccent -18 +KPX space V -35 +KPX space W -40 +KPX space Y -75 +KPX space Yacute -75 +KPX space Ydieresis -75 +KPX v comma -74 +KPX v period -74 +KPX w comma -74 +KPX w period -74 +KPX y comma -55 +KPX y period -55 +KPX yacute comma -55 +KPX yacute period -55 +KPX ydieresis comma -55 +KPX ydieresis period -55 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Times-Italic.afm.php b/application/third_party/dompdf/lib/fonts/Times-Italic.afm.php new file mode 100755 index 00000000..1da38ff5 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Times-Italic.afm.php @@ -0,0 +1,570 @@ + + array ( + 32 => 'space', + 160 => 'space', + 33 => 'exclam', + 34 => 'quotedbl', + 35 => 'numbersign', + 36 => 'dollar', + 37 => 'percent', + 38 => 'ampersand', + 146 => 'quoteright', + 40 => 'parenleft', + 41 => 'parenright', + 42 => 'asterisk', + 43 => 'plus', + 44 => 'comma', + 45 => 'hyphen', + 173 => 'hyphen', + 46 => 'period', + 47 => 'slash', + 48 => 'zero', + 49 => 'one', + 50 => 'two', + 51 => 'three', + 52 => 'four', + 53 => 'five', + 54 => 'six', + 55 => 'seven', + 56 => 'eight', + 57 => 'nine', + 58 => 'colon', + 59 => 'semicolon', + 60 => 'less', + 61 => 'equal', + 62 => 'greater', + 63 => 'question', + 64 => 'at', + 65 => 'A', + 66 => 'B', + 67 => 'C', + 68 => 'D', + 69 => 'E', + 70 => 'F', + 71 => 'G', + 72 => 'H', + 73 => 'I', + 74 => 'J', + 75 => 'K', + 76 => 'L', + 77 => 'M', + 78 => 'N', + 79 => 'O', + 80 => 'P', + 81 => 'Q', + 82 => 'R', + 83 => 'S', + 84 => 'T', + 85 => 'U', + 86 => 'V', + 87 => 'W', + 88 => 'X', + 89 => 'Y', + 90 => 'Z', + 91 => 'bracketleft', + 92 => 'backslash', + 93 => 'bracketright', + 94 => 'asciicircum', + 95 => 'underscore', + 145 => 'quoteleft', + 97 => 'a', + 98 => 'b', + 99 => 'c', + 100 => 'd', + 101 => 'e', + 102 => 'f', + 103 => 'g', + 104 => 'h', + 105 => 'i', + 106 => 'j', + 107 => 'k', + 108 => 'l', + 109 => 'm', + 110 => 'n', + 111 => 'o', + 112 => 'p', + 113 => 'q', + 114 => 'r', + 115 => 's', + 116 => 't', + 117 => 'u', + 118 => 'v', + 119 => 'w', + 120 => 'x', + 121 => 'y', + 122 => 'z', + 123 => 'braceleft', + 124 => 'bar', + 125 => 'braceright', + 126 => 'asciitilde', + 161 => 'exclamdown', + 162 => 'cent', + 163 => 'sterling', + 165 => 'yen', + 131 => 'florin', + 167 => 'section', + 164 => 'currency', + 39 => 'quotesingle', + 147 => 'quotedblleft', + 170 => 'ordfeminine', + 139 => 'guilsinglleft', + 155 => 'guilsinglright', + 150 => 'endash', + 134 => 'dagger', + 135 => 'daggerdbl', + 183 => 'periodcentered', + 182 => 'paragraph', + 149 => 'bullet', + 130 => 'quotesinglbase', + 132 => 'quotedblbase', + 148 => 'quotedblright', + 187 => 'guillemotright', + 133 => 'ellipsis', + 137 => 'perthousand', + 191 => 'questiondown', + 96 => 'grave', + 180 => 'acute', + 136 => 'circumflex', + 152 => 'tilde', + 175 => 'macron', + 168 => 'dieresis', + 184 => 'cedilla', + 151 => 'emdash', + 198 => 'AE', + 216 => 'Oslash', + 140 => 'OE', + 186 => 'ordmasculine', + 230 => 'ae', + 248 => 'oslash', + 156 => 'oe', + 223 => 'germandbls', + 207 => 'Idieresis', + 233 => 'eacute', + 159 => 'Ydieresis', + 247 => 'divide', + 221 => 'Yacute', + 194 => 'Acircumflex', + 225 => 'aacute', + 219 => 'Ucircumflex', + 253 => 'yacute', + 234 => 'ecircumflex', + 220 => 'Udieresis', + 218 => 'Uacute', + 203 => 'Edieresis', + 169 => 'copyright', + 229 => 'aring', + 224 => 'agrave', + 227 => 'atilde', + 154 => 'scaron', + 237 => 'iacute', + 251 => 'ucircumflex', + 226 => 'acircumflex', + 231 => 'ccedilla', + 222 => 'Thorn', + 179 => 'threesuperior', + 210 => 'Ograve', + 192 => 'Agrave', + 215 => 'multiply', + 250 => 'uacute', + 255 => 'ydieresis', + 238 => 'icircumflex', + 202 => 'Ecircumflex', + 228 => 'adieresis', + 235 => 'edieresis', + 205 => 'Iacute', + 177 => 'plusminus', + 166 => 'brokenbar', + 174 => 'registered', + 200 => 'Egrave', + 142 => 'Zcaron', + 208 => 'Eth', + 199 => 'Ccedilla', + 193 => 'Aacute', + 196 => 'Adieresis', + 232 => 'egrave', + 211 => 'Oacute', + 243 => 'oacute', + 239 => 'idieresis', + 212 => 'Ocircumflex', + 217 => 'Ugrave', + 254 => 'thorn', + 178 => 'twosuperior', + 214 => 'Odieresis', + 181 => 'mu', + 236 => 'igrave', + 190 => 'threequarters', + 153 => 'trademark', + 204 => 'Igrave', + 189 => 'onehalf', + 244 => 'ocircumflex', + 241 => 'ntilde', + 201 => 'Eacute', + 188 => 'onequarter', + 138 => 'Scaron', + 176 => 'degree', + 242 => 'ograve', + 249 => 'ugrave', + 209 => 'Ntilde', + 245 => 'otilde', + 195 => 'Atilde', + 197 => 'Aring', + 213 => 'Otilde', + 206 => 'Icircumflex', + 172 => 'logicalnot', + 246 => 'odieresis', + 252 => 'udieresis', + 240 => 'eth', + 158 => 'zcaron', + 185 => 'onesuperior', + 128 => 'Euro', + ), + 'isUnicode' => false, + 'FontName' => 'Times-Italic', + 'FullName' => 'Times Italic', + 'FamilyName' => 'Times', + 'Weight' => 'Medium', + 'ItalicAngle' => '-15.5', + 'IsFixedPitch' => 'false', + 'CharacterSet' => 'ExtendedRoman', + 'FontBBox' => + array ( + 0 => '-169', + 1 => '-217', + 2 => '1010', + 3 => '883', + ), + 'UnderlinePosition' => '-100', + 'UnderlineThickness' => '50', + 'Version' => '002.000', + 'EncodingScheme' => 'WinAnsiEncoding', + 'CapHeight' => '653', + 'XHeight' => '441', + 'Ascender' => '683', + 'Descender' => '-217', + 'StdHW' => '32', + 'StdVW' => '76', + 'StartCharMetrics' => '317', + 'C' => + array ( + 32 => 250.0, + 160 => 250.0, + 33 => 333.0, + 34 => 420.0, + 35 => 500.0, + 36 => 500.0, + 37 => 833.0, + 38 => 778.0, + 146 => 333.0, + 40 => 333.0, + 41 => 333.0, + 42 => 500.0, + 43 => 675.0, + 44 => 250.0, + 45 => 333.0, + 173 => 333.0, + 46 => 250.0, + 47 => 278.0, + 48 => 500.0, + 49 => 500.0, + 50 => 500.0, + 51 => 500.0, + 52 => 500.0, + 53 => 500.0, + 54 => 500.0, + 55 => 500.0, + 56 => 500.0, + 57 => 500.0, + 58 => 333.0, + 59 => 333.0, + 60 => 675.0, + 61 => 675.0, + 62 => 675.0, + 63 => 500.0, + 64 => 920.0, + 65 => 611.0, + 66 => 611.0, + 67 => 667.0, + 68 => 722.0, + 69 => 611.0, + 70 => 611.0, + 71 => 722.0, + 72 => 722.0, + 73 => 333.0, + 74 => 444.0, + 75 => 667.0, + 76 => 556.0, + 77 => 833.0, + 78 => 667.0, + 79 => 722.0, + 80 => 611.0, + 81 => 722.0, + 82 => 611.0, + 83 => 500.0, + 84 => 556.0, + 85 => 722.0, + 86 => 611.0, + 87 => 833.0, + 88 => 611.0, + 89 => 556.0, + 90 => 556.0, + 91 => 389.0, + 92 => 278.0, + 93 => 389.0, + 94 => 422.0, + 95 => 500.0, + 145 => 333.0, + 97 => 500.0, + 98 => 500.0, + 99 => 444.0, + 100 => 500.0, + 101 => 444.0, + 102 => 278.0, + 103 => 500.0, + 104 => 500.0, + 105 => 278.0, + 106 => 278.0, + 107 => 444.0, + 108 => 278.0, + 109 => 722.0, + 110 => 500.0, + 111 => 500.0, + 112 => 500.0, + 113 => 500.0, + 114 => 389.0, + 115 => 389.0, + 116 => 278.0, + 117 => 500.0, + 118 => 444.0, + 119 => 667.0, + 120 => 444.0, + 121 => 444.0, + 122 => 389.0, + 123 => 400.0, + 124 => 275.0, + 125 => 400.0, + 126 => 541.0, + 161 => 389.0, + 162 => 500.0, + 163 => 500.0, + 'fraction' => 167.0, + 165 => 500.0, + 131 => 500.0, + 167 => 500.0, + 164 => 500.0, + 39 => 214.0, + 147 => 556.0, + 170 => 276.0, + 139 => 333.0, + 155 => 333.0, + 'fi' => 500.0, + 'fl' => 500.0, + 150 => 500.0, + 134 => 500.0, + 135 => 500.0, + 183 => 250.0, + 182 => 523.0, + 149 => 350.0, + 130 => 333.0, + 132 => 556.0, + 148 => 556.0, + 187 => 500.0, + 133 => 889.0, + 137 => 1000.0, + 191 => 500.0, + 96 => 333.0, + 180 => 333.0, + 136 => 333.0, + 152 => 333.0, + 175 => 333.0, + 'breve' => 333.0, + 'dotaccent' => 333.0, + 168 => 333.0, + 'ring' => 333.0, + 184 => 333.0, + 'hungarumlaut' => 333.0, + 'ogonek' => 333.0, + 'caron' => 333.0, + 151 => 889.0, + 198 => 889.0, + 'Lslash' => 556.0, + 216 => 722.0, + 140 => 944.0, + 186 => 310.0, + 230 => 667.0, + 'dotlessi' => 278.0, + 'lslash' => 278.0, + 248 => 500.0, + 156 => 667.0, + 223 => 500.0, + 207 => 333.0, + 233 => 444.0, + 'abreve' => 500.0, + 'uhungarumlaut' => 500.0, + 'ecaron' => 444.0, + 159 => 556.0, + 247 => 675.0, + 221 => 556.0, + 194 => 611.0, + 225 => 500.0, + 219 => 722.0, + 253 => 444.0, + 'scommaaccent' => 389.0, + 234 => 444.0, + 'Uring' => 722.0, + 220 => 722.0, + 'aogonek' => 500.0, + 218 => 722.0, + 'uogonek' => 500.0, + 203 => 611.0, + 'Dcroat' => 722.0, + 'commaaccent' => 250.0, + 169 => 760.0, + 'Emacron' => 611.0, + 'ccaron' => 444.0, + 229 => 500.0, + 'Ncommaaccent' => 667.0, + 'lacute' => 278.0, + 224 => 500.0, + 'Tcommaaccent' => 556.0, + 'Cacute' => 667.0, + 227 => 500.0, + 'Edotaccent' => 611.0, + 154 => 389.0, + 'scedilla' => 389.0, + 237 => 278.0, + 'lozenge' => 471.0, + 'Rcaron' => 611.0, + 'Gcommaaccent' => 722.0, + 251 => 500.0, + 226 => 500.0, + 'Amacron' => 611.0, + 'rcaron' => 389.0, + 231 => 444.0, + 'Zdotaccent' => 556.0, + 222 => 611.0, + 'Omacron' => 722.0, + 'Racute' => 611.0, + 'Sacute' => 500.0, + 'dcaron' => 544.0, + 'Umacron' => 722.0, + 'uring' => 500.0, + 179 => 300.0, + 210 => 722.0, + 192 => 611.0, + 'Abreve' => 611.0, + 215 => 675.0, + 250 => 500.0, + 'Tcaron' => 556.0, + 'partialdiff' => 476.0, + 255 => 444.0, + 'Nacute' => 667.0, + 238 => 278.0, + 202 => 611.0, + 228 => 500.0, + 235 => 444.0, + 'cacute' => 444.0, + 'nacute' => 500.0, + 'umacron' => 500.0, + 'Ncaron' => 667.0, + 205 => 333.0, + 177 => 675.0, + 166 => 275.0, + 174 => 760.0, + 'Gbreve' => 722.0, + 'Idotaccent' => 333.0, + 'summation' => 600.0, + 200 => 611.0, + 'racute' => 389.0, + 'omacron' => 500.0, + 'Zacute' => 556.0, + 142 => 556.0, + 'greaterequal' => 549.0, + 208 => 722.0, + 199 => 667.0, + 'lcommaaccent' => 278.0, + 'tcaron' => 300.0, + 'eogonek' => 444.0, + 'Uogonek' => 722.0, + 193 => 611.0, + 196 => 611.0, + 232 => 444.0, + 'zacute' => 389.0, + 'iogonek' => 278.0, + 211 => 722.0, + 243 => 500.0, + 'amacron' => 500.0, + 'sacute' => 389.0, + 239 => 278.0, + 212 => 722.0, + 217 => 722.0, + 'Delta' => 612.0, + 254 => 500.0, + 178 => 300.0, + 214 => 722.0, + 181 => 500.0, + 236 => 278.0, + 'ohungarumlaut' => 500.0, + 'Eogonek' => 611.0, + 'dcroat' => 500.0, + 190 => 750.0, + 'Scedilla' => 500.0, + 'lcaron' => 300.0, + 'Kcommaaccent' => 667.0, + 'Lacute' => 556.0, + 153 => 980.0, + 'edotaccent' => 444.0, + 204 => 333.0, + 'Imacron' => 333.0, + 'Lcaron' => 611.0, + 189 => 750.0, + 'lessequal' => 549.0, + 244 => 500.0, + 241 => 500.0, + 'Uhungarumlaut' => 722.0, + 201 => 611.0, + 'emacron' => 444.0, + 'gbreve' => 500.0, + 188 => 750.0, + 138 => 500.0, + 'Scommaaccent' => 500.0, + 'Ohungarumlaut' => 722.0, + 176 => 400.0, + 242 => 500.0, + 'Ccaron' => 667.0, + 249 => 500.0, + 'radical' => 453.0, + 'Dcaron' => 722.0, + 'rcommaaccent' => 389.0, + 209 => 667.0, + 245 => 500.0, + 'Rcommaaccent' => 611.0, + 'Lcommaaccent' => 556.0, + 195 => 611.0, + 'Aogonek' => 611.0, + 197 => 611.0, + 213 => 722.0, + 'zdotaccent' => 389.0, + 'Ecaron' => 611.0, + 'Iogonek' => 333.0, + 'kcommaaccent' => 444.0, + 'minus' => 675.0, + 206 => 333.0, + 'ncaron' => 500.0, + 'tcommaaccent' => 278.0, + 172 => 675.0, + 246 => 500.0, + 252 => 500.0, + 'notequal' => 549.0, + 'gcommaaccent' => 500.0, + 240 => 500.0, + 158 => 389.0, + 'ncommaaccent' => 500.0, + 185 => 300.0, + 'imacron' => 278.0, + 128 => 500.0, + ), + 'CIDtoGID_Compressed' => true, + 'CIDtoGID' => 'eJwDAAAAAAE=', + '_version_' => 4, +); \ No newline at end of file diff --git a/application/third_party/dompdf/lib/fonts/Times-Roman.afm b/application/third_party/dompdf/lib/fonts/Times-Roman.afm new file mode 100755 index 00000000..cf0ce275 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Times-Roman.afm @@ -0,0 +1,2421 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:49:17 1997 +Comment UniqueID 43068 +Comment VMusage 43909 54934 +FontName Times-Roman +FullName Times Roman +FamilyName Times +Weight Roman +ItalicAngle 0 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -168 -218 1000 898 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.00 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 662 +XHeight 450 +Ascender 683 +Descender -217 +StdHW 28 +StdVW 84 +StartCharMetrics 317 +C 32 ; WX 250 ; N space ; B 0 0 0 0 ; +C 160 ; WX 250 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 130 -9 238 676 ; +C 34 ; WX 408 ; N quotedbl ; B 77 431 331 676 ; +C 35 ; WX 500 ; N numbersign ; B 5 0 496 662 ; +C 36 ; WX 500 ; N dollar ; B 44 -87 457 727 ; +C 37 ; WX 833 ; N percent ; B 61 -13 772 676 ; +C 38 ; WX 778 ; N ampersand ; B 42 -13 750 676 ; +C 146 ; WX 333 ; N quoteright ; B 79 433 218 676 ; +C 40 ; WX 333 ; N parenleft ; B 48 -177 304 676 ; +C 41 ; WX 333 ; N parenright ; B 29 -177 285 676 ; +C 42 ; WX 500 ; N asterisk ; B 69 265 432 676 ; +C 43 ; WX 564 ; N plus ; B 30 0 534 506 ; +C 44 ; WX 250 ; N comma ; B 56 -141 195 102 ; +C 45 ; WX 333 ; N hyphen ; B 39 194 285 257 ; +C 173 ; WX 333 ; N hyphen ; B 39 194 285 257 ; +C 46 ; WX 250 ; N period ; B 70 -11 181 100 ; +C 47 ; WX 278 ; N slash ; B -9 -14 287 676 ; +C 48 ; WX 500 ; N zero ; B 24 -14 476 676 ; +C 49 ; WX 500 ; N one ; B 111 0 394 676 ; +C 50 ; WX 500 ; N two ; B 30 0 475 676 ; +C 51 ; WX 500 ; N three ; B 43 -14 431 676 ; +C 52 ; WX 500 ; N four ; B 12 0 472 676 ; +C 53 ; WX 500 ; N five ; B 32 -14 438 688 ; +C 54 ; WX 500 ; N six ; B 34 -14 468 684 ; +C 55 ; WX 500 ; N seven ; B 20 -8 449 662 ; +C 56 ; WX 500 ; N eight ; B 56 -14 445 676 ; +C 57 ; WX 500 ; N nine ; B 30 -22 459 676 ; +C 58 ; WX 278 ; N colon ; B 81 -11 192 459 ; +C 59 ; WX 278 ; N semicolon ; B 80 -141 219 459 ; +C 60 ; WX 564 ; N less ; B 28 -8 536 514 ; +C 61 ; WX 564 ; N equal ; B 30 120 534 386 ; +C 62 ; WX 564 ; N greater ; B 28 -8 536 514 ; +C 63 ; WX 444 ; N question ; B 68 -8 414 676 ; +C 64 ; WX 921 ; N at ; B 116 -14 809 676 ; +C 65 ; WX 722 ; N A ; B 15 0 706 674 ; +C 66 ; WX 667 ; N B ; B 17 0 593 662 ; +C 67 ; WX 667 ; N C ; B 28 -14 633 676 ; +C 68 ; WX 722 ; N D ; B 16 0 685 662 ; +C 69 ; WX 611 ; N E ; B 12 0 597 662 ; +C 70 ; WX 556 ; N F ; B 12 0 546 662 ; +C 71 ; WX 722 ; N G ; B 32 -14 709 676 ; +C 72 ; WX 722 ; N H ; B 19 0 702 662 ; +C 73 ; WX 333 ; N I ; B 18 0 315 662 ; +C 74 ; WX 389 ; N J ; B 10 -14 370 662 ; +C 75 ; WX 722 ; N K ; B 34 0 723 662 ; +C 76 ; WX 611 ; N L ; B 12 0 598 662 ; +C 77 ; WX 889 ; N M ; B 12 0 863 662 ; +C 78 ; WX 722 ; N N ; B 12 -11 707 662 ; +C 79 ; WX 722 ; N O ; B 34 -14 688 676 ; +C 80 ; WX 556 ; N P ; B 16 0 542 662 ; +C 81 ; WX 722 ; N Q ; B 34 -178 701 676 ; +C 82 ; WX 667 ; N R ; B 17 0 659 662 ; +C 83 ; WX 556 ; N S ; B 42 -14 491 676 ; +C 84 ; WX 611 ; N T ; B 17 0 593 662 ; +C 85 ; WX 722 ; N U ; B 14 -14 705 662 ; +C 86 ; WX 722 ; N V ; B 16 -11 697 662 ; +C 87 ; WX 944 ; N W ; B 5 -11 932 662 ; +C 88 ; WX 722 ; N X ; B 10 0 704 662 ; +C 89 ; WX 722 ; N Y ; B 22 0 703 662 ; +C 90 ; WX 611 ; N Z ; B 9 0 597 662 ; +C 91 ; WX 333 ; N bracketleft ; B 88 -156 299 662 ; +C 92 ; WX 278 ; N backslash ; B -9 -14 287 676 ; +C 93 ; WX 333 ; N bracketright ; B 34 -156 245 662 ; +C 94 ; WX 469 ; N asciicircum ; B 24 297 446 662 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 145 ; WX 333 ; N quoteleft ; B 115 433 254 676 ; +C 97 ; WX 444 ; N a ; B 37 -10 442 460 ; +C 98 ; WX 500 ; N b ; B 3 -10 468 683 ; +C 99 ; WX 444 ; N c ; B 25 -10 412 460 ; +C 100 ; WX 500 ; N d ; B 27 -10 491 683 ; +C 101 ; WX 444 ; N e ; B 25 -10 424 460 ; +C 102 ; WX 333 ; N f ; B 20 0 383 683 ; L i fi ; L l fl ; +C 103 ; WX 500 ; N g ; B 28 -218 470 460 ; +C 104 ; WX 500 ; N h ; B 9 0 487 683 ; +C 105 ; WX 278 ; N i ; B 16 0 253 683 ; +C 106 ; WX 278 ; N j ; B -70 -218 194 683 ; +C 107 ; WX 500 ; N k ; B 7 0 505 683 ; +C 108 ; WX 278 ; N l ; B 19 0 257 683 ; +C 109 ; WX 778 ; N m ; B 16 0 775 460 ; +C 110 ; WX 500 ; N n ; B 16 0 485 460 ; +C 111 ; WX 500 ; N o ; B 29 -10 470 460 ; +C 112 ; WX 500 ; N p ; B 5 -217 470 460 ; +C 113 ; WX 500 ; N q ; B 24 -217 488 460 ; +C 114 ; WX 333 ; N r ; B 5 0 335 460 ; +C 115 ; WX 389 ; N s ; B 51 -10 348 460 ; +C 116 ; WX 278 ; N t ; B 13 -10 279 579 ; +C 117 ; WX 500 ; N u ; B 9 -10 479 450 ; +C 118 ; WX 500 ; N v ; B 19 -14 477 450 ; +C 119 ; WX 722 ; N w ; B 21 -14 694 450 ; +C 120 ; WX 500 ; N x ; B 17 0 479 450 ; +C 121 ; WX 500 ; N y ; B 14 -218 475 450 ; +C 122 ; WX 444 ; N z ; B 27 0 418 450 ; +C 123 ; WX 480 ; N braceleft ; B 100 -181 350 680 ; +C 124 ; WX 200 ; N bar ; B 67 -218 133 782 ; +C 125 ; WX 480 ; N braceright ; B 130 -181 380 680 ; +C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ; +C 161 ; WX 333 ; N exclamdown ; B 97 -218 205 467 ; +C 162 ; WX 500 ; N cent ; B 53 -138 448 579 ; +C 163 ; WX 500 ; N sterling ; B 12 -8 490 676 ; +C -1 ; WX 167 ; N fraction ; B -168 -14 331 676 ; +C 165 ; WX 500 ; N yen ; B -53 0 512 662 ; +C 131 ; WX 500 ; N florin ; B 7 -189 490 676 ; +C 167 ; WX 500 ; N section ; B 70 -148 426 676 ; +C 164 ; WX 500 ; N currency ; B -22 58 522 602 ; +C 39 ; WX 180 ; N quotesingle ; B 48 431 133 676 ; +C 147 ; WX 444 ; N quotedblleft ; B 43 433 414 676 ; +C 170 ; WX 500 ; N guillemotleft ; B 42 33 456 416 ; +C 139 ; WX 333 ; N guilsinglleft ; B 63 33 285 416 ; +C 155 ; WX 333 ; N guilsinglright ; B 48 33 270 416 ; +C -1 ; WX 556 ; N fi ; B 31 0 521 683 ; +C -1 ; WX 556 ; N fl ; B 32 0 521 683 ; +C 150 ; WX 500 ; N endash ; B 0 201 500 250 ; +C 134 ; WX 500 ; N dagger ; B 59 -149 442 676 ; +C 135 ; WX 500 ; N daggerdbl ; B 58 -153 442 676 ; +C 183 ; WX 250 ; N periodcentered ; B 70 199 181 310 ; +C 182 ; WX 453 ; N paragraph ; B -22 -154 450 662 ; +C 149 ; WX 350 ; N bullet ; B 40 196 310 466 ; +C 130 ; WX 333 ; N quotesinglbase ; B 79 -141 218 102 ; +C 132 ; WX 444 ; N quotedblbase ; B 45 -141 416 102 ; +C 148 ; WX 444 ; N quotedblright ; B 30 433 401 676 ; +C 187 ; WX 500 ; N guillemotright ; B 44 33 458 416 ; +C 133 ; WX 1000 ; N ellipsis ; B 111 -11 888 100 ; +C 137 ; WX 1000 ; N perthousand ; B 7 -19 994 706 ; +C 191 ; WX 444 ; N questiondown ; B 30 -218 376 466 ; +C 96 ; WX 333 ; N grave ; B 19 507 242 678 ; +C 180 ; WX 333 ; N acute ; B 93 507 317 678 ; +C 136 ; WX 333 ; N circumflex ; B 11 507 322 674 ; +C 152 ; WX 333 ; N tilde ; B 1 532 331 638 ; +C 175 ; WX 333 ; N macron ; B 11 547 322 601 ; +C -1 ; WX 333 ; N breve ; B 26 507 307 664 ; +C -1 ; WX 333 ; N dotaccent ; B 118 581 216 681 ; +C 168 ; WX 333 ; N dieresis ; B 18 581 315 681 ; +C -1 ; WX 333 ; N ring ; B 67 512 266 711 ; +C 184 ; WX 333 ; N cedilla ; B 52 -215 261 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B -3 507 377 678 ; +C -1 ; WX 333 ; N ogonek ; B 62 -165 243 0 ; +C -1 ; WX 333 ; N caron ; B 11 507 322 674 ; +C 151 ; WX 1000 ; N emdash ; B 0 201 1000 250 ; +C 198 ; WX 889 ; N AE ; B 0 0 863 662 ; +C 170 ; WX 276 ; N ordfeminine ; B 4 394 270 676 ; +C -1 ; WX 611 ; N Lslash ; B 12 0 598 662 ; +C 216 ; WX 722 ; N Oslash ; B 34 -80 688 734 ; +C 140 ; WX 889 ; N OE ; B 30 -6 885 668 ; +C 186 ; WX 310 ; N ordmasculine ; B 6 394 304 676 ; +C 230 ; WX 667 ; N ae ; B 38 -10 632 460 ; +C -1 ; WX 278 ; N dotlessi ; B 16 0 253 460 ; +C -1 ; WX 278 ; N lslash ; B 19 0 259 683 ; +C 248 ; WX 500 ; N oslash ; B 29 -112 470 551 ; +C 156 ; WX 722 ; N oe ; B 30 -10 690 460 ; +C 223 ; WX 500 ; N germandbls ; B 12 -9 468 683 ; +C 207 ; WX 333 ; N Idieresis ; B 18 0 315 835 ; +C 233 ; WX 444 ; N eacute ; B 25 -10 424 678 ; +C -1 ; WX 444 ; N abreve ; B 37 -10 442 664 ; +C -1 ; WX 500 ; N uhungarumlaut ; B 9 -10 501 678 ; +C -1 ; WX 444 ; N ecaron ; B 25 -10 424 674 ; +C 159 ; WX 722 ; N Ydieresis ; B 22 0 703 835 ; +C 247 ; WX 564 ; N divide ; B 30 -10 534 516 ; +C 221 ; WX 722 ; N Yacute ; B 22 0 703 890 ; +C 194 ; WX 722 ; N Acircumflex ; B 15 0 706 886 ; +C 225 ; WX 444 ; N aacute ; B 37 -10 442 678 ; +C 219 ; WX 722 ; N Ucircumflex ; B 14 -14 705 886 ; +C 253 ; WX 500 ; N yacute ; B 14 -218 475 678 ; +C -1 ; WX 389 ; N scommaaccent ; B 51 -218 348 460 ; +C 234 ; WX 444 ; N ecircumflex ; B 25 -10 424 674 ; +C -1 ; WX 722 ; N Uring ; B 14 -14 705 898 ; +C 220 ; WX 722 ; N Udieresis ; B 14 -14 705 835 ; +C -1 ; WX 444 ; N aogonek ; B 37 -165 469 460 ; +C 218 ; WX 722 ; N Uacute ; B 14 -14 705 890 ; +C -1 ; WX 500 ; N uogonek ; B 9 -155 487 450 ; +C 203 ; WX 611 ; N Edieresis ; B 12 0 597 835 ; +C -1 ; WX 722 ; N Dcroat ; B 16 0 685 662 ; +C -1 ; WX 250 ; N commaaccent ; B 59 -218 184 -50 ; +C 169 ; WX 760 ; N copyright ; B 38 -14 722 676 ; +C -1 ; WX 611 ; N Emacron ; B 12 0 597 813 ; +C -1 ; WX 444 ; N ccaron ; B 25 -10 412 674 ; +C 229 ; WX 444 ; N aring ; B 37 -10 442 711 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 12 -198 707 662 ; +C -1 ; WX 278 ; N lacute ; B 19 0 290 890 ; +C 224 ; WX 444 ; N agrave ; B 37 -10 442 678 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 17 -218 593 662 ; +C -1 ; WX 667 ; N Cacute ; B 28 -14 633 890 ; +C 227 ; WX 444 ; N atilde ; B 37 -10 442 638 ; +C -1 ; WX 611 ; N Edotaccent ; B 12 0 597 835 ; +C 154 ; WX 389 ; N scaron ; B 39 -10 350 674 ; +C -1 ; WX 389 ; N scedilla ; B 51 -215 348 460 ; +C 237 ; WX 278 ; N iacute ; B 16 0 290 678 ; +C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ; +C -1 ; WX 667 ; N Rcaron ; B 17 0 659 886 ; +C -1 ; WX 722 ; N Gcommaaccent ; B 32 -218 709 676 ; +C 251 ; WX 500 ; N ucircumflex ; B 9 -10 479 674 ; +C 226 ; WX 444 ; N acircumflex ; B 37 -10 442 674 ; +C -1 ; WX 722 ; N Amacron ; B 15 0 706 813 ; +C -1 ; WX 333 ; N rcaron ; B 5 0 335 674 ; +C 231 ; WX 444 ; N ccedilla ; B 25 -215 412 460 ; +C -1 ; WX 611 ; N Zdotaccent ; B 9 0 597 835 ; +C 222 ; WX 556 ; N Thorn ; B 16 0 542 662 ; +C -1 ; WX 722 ; N Omacron ; B 34 -14 688 813 ; +C -1 ; WX 667 ; N Racute ; B 17 0 659 890 ; +C -1 ; WX 556 ; N Sacute ; B 42 -14 491 890 ; +C -1 ; WX 588 ; N dcaron ; B 27 -10 589 695 ; +C -1 ; WX 722 ; N Umacron ; B 14 -14 705 813 ; +C -1 ; WX 500 ; N uring ; B 9 -10 479 711 ; +C 179 ; WX 300 ; N threesuperior ; B 15 262 291 676 ; +C 210 ; WX 722 ; N Ograve ; B 34 -14 688 890 ; +C 192 ; WX 722 ; N Agrave ; B 15 0 706 890 ; +C -1 ; WX 722 ; N Abreve ; B 15 0 706 876 ; +C 215 ; WX 564 ; N multiply ; B 38 8 527 497 ; +C 250 ; WX 500 ; N uacute ; B 9 -10 479 678 ; +C -1 ; WX 611 ; N Tcaron ; B 17 0 593 886 ; +C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ; +C 255 ; WX 500 ; N ydieresis ; B 14 -218 475 623 ; +C -1 ; WX 722 ; N Nacute ; B 12 -11 707 890 ; +C 238 ; WX 278 ; N icircumflex ; B -16 0 295 674 ; +C 202 ; WX 611 ; N Ecircumflex ; B 12 0 597 886 ; +C 228 ; WX 444 ; N adieresis ; B 37 -10 442 623 ; +C 235 ; WX 444 ; N edieresis ; B 25 -10 424 623 ; +C -1 ; WX 444 ; N cacute ; B 25 -10 413 678 ; +C -1 ; WX 500 ; N nacute ; B 16 0 485 678 ; +C -1 ; WX 500 ; N umacron ; B 9 -10 479 601 ; +C -1 ; WX 722 ; N Ncaron ; B 12 -11 707 886 ; +C 205 ; WX 333 ; N Iacute ; B 18 0 317 890 ; +C 177 ; WX 564 ; N plusminus ; B 30 0 534 506 ; +C 166 ; WX 200 ; N brokenbar ; B 67 -143 133 707 ; +C 174 ; WX 760 ; N registered ; B 38 -14 722 676 ; +C -1 ; WX 722 ; N Gbreve ; B 32 -14 709 876 ; +C -1 ; WX 333 ; N Idotaccent ; B 18 0 315 835 ; +C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ; +C 200 ; WX 611 ; N Egrave ; B 12 0 597 890 ; +C -1 ; WX 333 ; N racute ; B 5 0 335 678 ; +C -1 ; WX 500 ; N omacron ; B 29 -10 470 601 ; +C -1 ; WX 611 ; N Zacute ; B 9 0 597 890 ; +C 142 ; WX 611 ; N Zcaron ; B 9 0 597 886 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 666 ; +C 208 ; WX 722 ; N Eth ; B 16 0 685 662 ; +C 199 ; WX 667 ; N Ccedilla ; B 28 -215 633 676 ; +C -1 ; WX 278 ; N lcommaaccent ; B 19 -218 257 683 ; +C -1 ; WX 326 ; N tcaron ; B 13 -10 318 722 ; +C -1 ; WX 444 ; N eogonek ; B 25 -165 424 460 ; +C -1 ; WX 722 ; N Uogonek ; B 14 -165 705 662 ; +C 193 ; WX 722 ; N Aacute ; B 15 0 706 890 ; +C 196 ; WX 722 ; N Adieresis ; B 15 0 706 835 ; +C 232 ; WX 444 ; N egrave ; B 25 -10 424 678 ; +C -1 ; WX 444 ; N zacute ; B 27 0 418 678 ; +C -1 ; WX 278 ; N iogonek ; B 16 -165 265 683 ; +C 211 ; WX 722 ; N Oacute ; B 34 -14 688 890 ; +C 243 ; WX 500 ; N oacute ; B 29 -10 470 678 ; +C -1 ; WX 444 ; N amacron ; B 37 -10 442 601 ; +C -1 ; WX 389 ; N sacute ; B 51 -10 348 678 ; +C 239 ; WX 278 ; N idieresis ; B -9 0 288 623 ; +C 212 ; WX 722 ; N Ocircumflex ; B 34 -14 688 886 ; +C 217 ; WX 722 ; N Ugrave ; B 14 -14 705 890 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 500 ; N thorn ; B 5 -217 470 683 ; +C 178 ; WX 300 ; N twosuperior ; B 1 270 296 676 ; +C 214 ; WX 722 ; N Odieresis ; B 34 -14 688 835 ; +C 181 ; WX 500 ; N mu ; B 36 -218 512 450 ; +C 236 ; WX 278 ; N igrave ; B -8 0 253 678 ; +C -1 ; WX 500 ; N ohungarumlaut ; B 29 -10 491 678 ; +C -1 ; WX 611 ; N Eogonek ; B 12 -165 597 662 ; +C -1 ; WX 500 ; N dcroat ; B 27 -10 500 683 ; +C 190 ; WX 750 ; N threequarters ; B 15 -14 718 676 ; +C -1 ; WX 556 ; N Scedilla ; B 42 -215 491 676 ; +C -1 ; WX 344 ; N lcaron ; B 19 0 347 695 ; +C -1 ; WX 722 ; N Kcommaaccent ; B 34 -198 723 662 ; +C -1 ; WX 611 ; N Lacute ; B 12 0 598 890 ; +C 153 ; WX 980 ; N trademark ; B 30 256 957 662 ; +C -1 ; WX 444 ; N edotaccent ; B 25 -10 424 623 ; +C 204 ; WX 333 ; N Igrave ; B 18 0 315 890 ; +C -1 ; WX 333 ; N Imacron ; B 11 0 322 813 ; +C -1 ; WX 611 ; N Lcaron ; B 12 0 598 676 ; +C 189 ; WX 750 ; N onehalf ; B 31 -14 746 676 ; +C -1 ; WX 549 ; N lessequal ; B 26 0 523 666 ; +C 244 ; WX 500 ; N ocircumflex ; B 29 -10 470 674 ; +C 241 ; WX 500 ; N ntilde ; B 16 0 485 638 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 14 -14 705 890 ; +C 201 ; WX 611 ; N Eacute ; B 12 0 597 890 ; +C -1 ; WX 444 ; N emacron ; B 25 -10 424 601 ; +C -1 ; WX 500 ; N gbreve ; B 28 -218 470 664 ; +C 188 ; WX 750 ; N onequarter ; B 37 -14 718 676 ; +C 138 ; WX 556 ; N Scaron ; B 42 -14 491 886 ; +C -1 ; WX 556 ; N Scommaaccent ; B 42 -218 491 676 ; +C -1 ; WX 722 ; N Ohungarumlaut ; B 34 -14 688 890 ; +C 176 ; WX 400 ; N degree ; B 57 390 343 676 ; +C 242 ; WX 500 ; N ograve ; B 29 -10 470 678 ; +C -1 ; WX 667 ; N Ccaron ; B 28 -14 633 886 ; +C 249 ; WX 500 ; N ugrave ; B 9 -10 479 678 ; +C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ; +C -1 ; WX 722 ; N Dcaron ; B 16 0 685 886 ; +C -1 ; WX 333 ; N rcommaaccent ; B 5 -218 335 460 ; +C 209 ; WX 722 ; N Ntilde ; B 12 -11 707 850 ; +C 245 ; WX 500 ; N otilde ; B 29 -10 470 638 ; +C -1 ; WX 667 ; N Rcommaaccent ; B 17 -198 659 662 ; +C -1 ; WX 611 ; N Lcommaaccent ; B 12 -218 598 662 ; +C 195 ; WX 722 ; N Atilde ; B 15 0 706 850 ; +C -1 ; WX 722 ; N Aogonek ; B 15 -165 738 674 ; +C 197 ; WX 722 ; N Aring ; B 15 0 706 898 ; +C 213 ; WX 722 ; N Otilde ; B 34 -14 688 850 ; +C -1 ; WX 444 ; N zdotaccent ; B 27 0 418 623 ; +C -1 ; WX 611 ; N Ecaron ; B 12 0 597 886 ; +C -1 ; WX 333 ; N Iogonek ; B 18 -165 315 662 ; +C -1 ; WX 500 ; N kcommaaccent ; B 7 -218 505 683 ; +C -1 ; WX 564 ; N minus ; B 30 220 534 286 ; +C 206 ; WX 333 ; N Icircumflex ; B 11 0 322 886 ; +C -1 ; WX 500 ; N ncaron ; B 16 0 485 674 ; +C -1 ; WX 278 ; N tcommaaccent ; B 13 -218 279 579 ; +C 172 ; WX 564 ; N logicalnot ; B 30 108 534 386 ; +C 246 ; WX 500 ; N odieresis ; B 29 -10 470 623 ; +C 252 ; WX 500 ; N udieresis ; B 9 -10 479 623 ; +C -1 ; WX 549 ; N notequal ; B 12 -31 537 547 ; +C -1 ; WX 500 ; N gcommaaccent ; B 28 -218 470 749 ; +C 240 ; WX 500 ; N eth ; B 29 -10 471 686 ; +C 158 ; WX 444 ; N zcaron ; B 27 0 418 674 ; +C -1 ; WX 500 ; N ncommaaccent ; B 16 -218 485 460 ; +C 185 ; WX 300 ; N onesuperior ; B 57 270 248 676 ; +C -1 ; WX 278 ; N imacron ; B 6 0 271 601 ; +C 128 ; WX 500 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2073 +KPX A C -40 +KPX A Cacute -40 +KPX A Ccaron -40 +KPX A Ccedilla -40 +KPX A G -40 +KPX A Gbreve -40 +KPX A Gcommaaccent -40 +KPX A O -55 +KPX A Oacute -55 +KPX A Ocircumflex -55 +KPX A Odieresis -55 +KPX A Ograve -55 +KPX A Ohungarumlaut -55 +KPX A Omacron -55 +KPX A Oslash -55 +KPX A Otilde -55 +KPX A Q -55 +KPX A T -111 +KPX A Tcaron -111 +KPX A Tcommaaccent -111 +KPX A U -55 +KPX A Uacute -55 +KPX A Ucircumflex -55 +KPX A Udieresis -55 +KPX A Ugrave -55 +KPX A Uhungarumlaut -55 +KPX A Umacron -55 +KPX A Uogonek -55 +KPX A Uring -55 +KPX A V -135 +KPX A W -90 +KPX A Y -105 +KPX A Yacute -105 +KPX A Ydieresis -105 +KPX A quoteright -111 +KPX A v -74 +KPX A w -92 +KPX A y -92 +KPX A yacute -92 +KPX A ydieresis -92 +KPX Aacute C -40 +KPX Aacute Cacute -40 +KPX Aacute Ccaron -40 +KPX Aacute Ccedilla -40 +KPX Aacute G -40 +KPX Aacute Gbreve -40 +KPX Aacute Gcommaaccent -40 +KPX Aacute O -55 +KPX Aacute Oacute -55 +KPX Aacute Ocircumflex -55 +KPX Aacute Odieresis -55 +KPX Aacute Ograve -55 +KPX Aacute Ohungarumlaut -55 +KPX Aacute Omacron -55 +KPX Aacute Oslash -55 +KPX Aacute Otilde -55 +KPX Aacute Q -55 +KPX Aacute T -111 +KPX Aacute Tcaron -111 +KPX Aacute Tcommaaccent -111 +KPX Aacute U -55 +KPX Aacute Uacute -55 +KPX Aacute Ucircumflex -55 +KPX Aacute Udieresis -55 +KPX Aacute Ugrave -55 +KPX Aacute Uhungarumlaut -55 +KPX Aacute Umacron -55 +KPX Aacute Uogonek -55 +KPX Aacute Uring -55 +KPX Aacute V -135 +KPX Aacute W -90 +KPX Aacute Y -105 +KPX Aacute Yacute -105 +KPX Aacute Ydieresis -105 +KPX Aacute quoteright -111 +KPX Aacute v -74 +KPX Aacute w -92 +KPX Aacute y -92 +KPX Aacute yacute -92 +KPX Aacute ydieresis -92 +KPX Abreve C -40 +KPX Abreve Cacute -40 +KPX Abreve Ccaron -40 +KPX Abreve Ccedilla -40 +KPX Abreve G -40 +KPX Abreve Gbreve -40 +KPX Abreve Gcommaaccent -40 +KPX Abreve O -55 +KPX Abreve Oacute -55 +KPX Abreve Ocircumflex -55 +KPX Abreve Odieresis -55 +KPX Abreve Ograve -55 +KPX Abreve Ohungarumlaut -55 +KPX Abreve Omacron -55 +KPX Abreve Oslash -55 +KPX Abreve Otilde -55 +KPX Abreve Q -55 +KPX Abreve T -111 +KPX Abreve Tcaron -111 +KPX Abreve Tcommaaccent -111 +KPX Abreve U -55 +KPX Abreve Uacute -55 +KPX Abreve Ucircumflex -55 +KPX Abreve Udieresis -55 +KPX Abreve Ugrave -55 +KPX Abreve Uhungarumlaut -55 +KPX Abreve Umacron -55 +KPX Abreve Uogonek -55 +KPX Abreve Uring -55 +KPX Abreve V -135 +KPX Abreve W -90 +KPX Abreve Y -105 +KPX Abreve Yacute -105 +KPX Abreve Ydieresis -105 +KPX Abreve quoteright -111 +KPX Abreve v -74 +KPX Abreve w -92 +KPX Abreve y -92 +KPX Abreve yacute -92 +KPX Abreve ydieresis -92 +KPX Acircumflex C -40 +KPX Acircumflex Cacute -40 +KPX Acircumflex Ccaron -40 +KPX Acircumflex Ccedilla -40 +KPX Acircumflex G -40 +KPX Acircumflex Gbreve -40 +KPX Acircumflex Gcommaaccent -40 +KPX Acircumflex O -55 +KPX Acircumflex Oacute -55 +KPX Acircumflex Ocircumflex -55 +KPX Acircumflex Odieresis -55 +KPX Acircumflex Ograve -55 +KPX Acircumflex Ohungarumlaut -55 +KPX Acircumflex Omacron -55 +KPX Acircumflex Oslash -55 +KPX Acircumflex Otilde -55 +KPX Acircumflex Q -55 +KPX Acircumflex T -111 +KPX Acircumflex Tcaron -111 +KPX Acircumflex Tcommaaccent -111 +KPX Acircumflex U -55 +KPX Acircumflex Uacute -55 +KPX Acircumflex Ucircumflex -55 +KPX Acircumflex Udieresis -55 +KPX Acircumflex Ugrave -55 +KPX Acircumflex Uhungarumlaut -55 +KPX Acircumflex Umacron -55 +KPX Acircumflex Uogonek -55 +KPX Acircumflex Uring -55 +KPX Acircumflex V -135 +KPX Acircumflex W -90 +KPX Acircumflex Y -105 +KPX Acircumflex Yacute -105 +KPX Acircumflex Ydieresis -105 +KPX Acircumflex quoteright -111 +KPX Acircumflex v -74 +KPX Acircumflex w -92 +KPX Acircumflex y -92 +KPX Acircumflex yacute -92 +KPX Acircumflex ydieresis -92 +KPX Adieresis C -40 +KPX Adieresis Cacute -40 +KPX Adieresis Ccaron -40 +KPX Adieresis Ccedilla -40 +KPX Adieresis G -40 +KPX Adieresis Gbreve -40 +KPX Adieresis Gcommaaccent -40 +KPX Adieresis O -55 +KPX Adieresis Oacute -55 +KPX Adieresis Ocircumflex -55 +KPX Adieresis Odieresis -55 +KPX Adieresis Ograve -55 +KPX Adieresis Ohungarumlaut -55 +KPX Adieresis Omacron -55 +KPX Adieresis Oslash -55 +KPX Adieresis Otilde -55 +KPX Adieresis Q -55 +KPX Adieresis T -111 +KPX Adieresis Tcaron -111 +KPX Adieresis Tcommaaccent -111 +KPX Adieresis U -55 +KPX Adieresis Uacute -55 +KPX Adieresis Ucircumflex -55 +KPX Adieresis Udieresis -55 +KPX Adieresis Ugrave -55 +KPX Adieresis Uhungarumlaut -55 +KPX Adieresis Umacron -55 +KPX Adieresis Uogonek -55 +KPX Adieresis Uring -55 +KPX Adieresis V -135 +KPX Adieresis W -90 +KPX Adieresis Y -105 +KPX Adieresis Yacute -105 +KPX Adieresis Ydieresis -105 +KPX Adieresis quoteright -111 +KPX Adieresis v -74 +KPX Adieresis w -92 +KPX Adieresis y -92 +KPX Adieresis yacute -92 +KPX Adieresis ydieresis -92 +KPX Agrave C -40 +KPX Agrave Cacute -40 +KPX Agrave Ccaron -40 +KPX Agrave Ccedilla -40 +KPX Agrave G -40 +KPX Agrave Gbreve -40 +KPX Agrave Gcommaaccent -40 +KPX Agrave O -55 +KPX Agrave Oacute -55 +KPX Agrave Ocircumflex -55 +KPX Agrave Odieresis -55 +KPX Agrave Ograve -55 +KPX Agrave Ohungarumlaut -55 +KPX Agrave Omacron -55 +KPX Agrave Oslash -55 +KPX Agrave Otilde -55 +KPX Agrave Q -55 +KPX Agrave T -111 +KPX Agrave Tcaron -111 +KPX Agrave Tcommaaccent -111 +KPX Agrave U -55 +KPX Agrave Uacute -55 +KPX Agrave Ucircumflex -55 +KPX Agrave Udieresis -55 +KPX Agrave Ugrave -55 +KPX Agrave Uhungarumlaut -55 +KPX Agrave Umacron -55 +KPX Agrave Uogonek -55 +KPX Agrave Uring -55 +KPX Agrave V -135 +KPX Agrave W -90 +KPX Agrave Y -105 +KPX Agrave Yacute -105 +KPX Agrave Ydieresis -105 +KPX Agrave quoteright -111 +KPX Agrave v -74 +KPX Agrave w -92 +KPX Agrave y -92 +KPX Agrave yacute -92 +KPX Agrave ydieresis -92 +KPX Amacron C -40 +KPX Amacron Cacute -40 +KPX Amacron Ccaron -40 +KPX Amacron Ccedilla -40 +KPX Amacron G -40 +KPX Amacron Gbreve -40 +KPX Amacron Gcommaaccent -40 +KPX Amacron O -55 +KPX Amacron Oacute -55 +KPX Amacron Ocircumflex -55 +KPX Amacron Odieresis -55 +KPX Amacron Ograve -55 +KPX Amacron Ohungarumlaut -55 +KPX Amacron Omacron -55 +KPX Amacron Oslash -55 +KPX Amacron Otilde -55 +KPX Amacron Q -55 +KPX Amacron T -111 +KPX Amacron Tcaron -111 +KPX Amacron Tcommaaccent -111 +KPX Amacron U -55 +KPX Amacron Uacute -55 +KPX Amacron Ucircumflex -55 +KPX Amacron Udieresis -55 +KPX Amacron Ugrave -55 +KPX Amacron Uhungarumlaut -55 +KPX Amacron Umacron -55 +KPX Amacron Uogonek -55 +KPX Amacron Uring -55 +KPX Amacron V -135 +KPX Amacron W -90 +KPX Amacron Y -105 +KPX Amacron Yacute -105 +KPX Amacron Ydieresis -105 +KPX Amacron quoteright -111 +KPX Amacron v -74 +KPX Amacron w -92 +KPX Amacron y -92 +KPX Amacron yacute -92 +KPX Amacron ydieresis -92 +KPX Aogonek C -40 +KPX Aogonek Cacute -40 +KPX Aogonek Ccaron -40 +KPX Aogonek Ccedilla -40 +KPX Aogonek G -40 +KPX Aogonek Gbreve -40 +KPX Aogonek Gcommaaccent -40 +KPX Aogonek O -55 +KPX Aogonek Oacute -55 +KPX Aogonek Ocircumflex -55 +KPX Aogonek Odieresis -55 +KPX Aogonek Ograve -55 +KPX Aogonek Ohungarumlaut -55 +KPX Aogonek Omacron -55 +KPX Aogonek Oslash -55 +KPX Aogonek Otilde -55 +KPX Aogonek Q -55 +KPX Aogonek T -111 +KPX Aogonek Tcaron -111 +KPX Aogonek Tcommaaccent -111 +KPX Aogonek U -55 +KPX Aogonek Uacute -55 +KPX Aogonek Ucircumflex -55 +KPX Aogonek Udieresis -55 +KPX Aogonek Ugrave -55 +KPX Aogonek Uhungarumlaut -55 +KPX Aogonek Umacron -55 +KPX Aogonek Uogonek -55 +KPX Aogonek Uring -55 +KPX Aogonek V -135 +KPX Aogonek W -90 +KPX Aogonek Y -105 +KPX Aogonek Yacute -105 +KPX Aogonek Ydieresis -105 +KPX Aogonek quoteright -111 +KPX Aogonek v -74 +KPX Aogonek w -52 +KPX Aogonek y -52 +KPX Aogonek yacute -52 +KPX Aogonek ydieresis -52 +KPX Aring C -40 +KPX Aring Cacute -40 +KPX Aring Ccaron -40 +KPX Aring Ccedilla -40 +KPX Aring G -40 +KPX Aring Gbreve -40 +KPX Aring Gcommaaccent -40 +KPX Aring O -55 +KPX Aring Oacute -55 +KPX Aring Ocircumflex -55 +KPX Aring Odieresis -55 +KPX Aring Ograve -55 +KPX Aring Ohungarumlaut -55 +KPX Aring Omacron -55 +KPX Aring Oslash -55 +KPX Aring Otilde -55 +KPX Aring Q -55 +KPX Aring T -111 +KPX Aring Tcaron -111 +KPX Aring Tcommaaccent -111 +KPX Aring U -55 +KPX Aring Uacute -55 +KPX Aring Ucircumflex -55 +KPX Aring Udieresis -55 +KPX Aring Ugrave -55 +KPX Aring Uhungarumlaut -55 +KPX Aring Umacron -55 +KPX Aring Uogonek -55 +KPX Aring Uring -55 +KPX Aring V -135 +KPX Aring W -90 +KPX Aring Y -105 +KPX Aring Yacute -105 +KPX Aring Ydieresis -105 +KPX Aring quoteright -111 +KPX Aring v -74 +KPX Aring w -92 +KPX Aring y -92 +KPX Aring yacute -92 +KPX Aring ydieresis -92 +KPX Atilde C -40 +KPX Atilde Cacute -40 +KPX Atilde Ccaron -40 +KPX Atilde Ccedilla -40 +KPX Atilde G -40 +KPX Atilde Gbreve -40 +KPX Atilde Gcommaaccent -40 +KPX Atilde O -55 +KPX Atilde Oacute -55 +KPX Atilde Ocircumflex -55 +KPX Atilde Odieresis -55 +KPX Atilde Ograve -55 +KPX Atilde Ohungarumlaut -55 +KPX Atilde Omacron -55 +KPX Atilde Oslash -55 +KPX Atilde Otilde -55 +KPX Atilde Q -55 +KPX Atilde T -111 +KPX Atilde Tcaron -111 +KPX Atilde Tcommaaccent -111 +KPX Atilde U -55 +KPX Atilde Uacute -55 +KPX Atilde Ucircumflex -55 +KPX Atilde Udieresis -55 +KPX Atilde Ugrave -55 +KPX Atilde Uhungarumlaut -55 +KPX Atilde Umacron -55 +KPX Atilde Uogonek -55 +KPX Atilde Uring -55 +KPX Atilde V -135 +KPX Atilde W -90 +KPX Atilde Y -105 +KPX Atilde Yacute -105 +KPX Atilde Ydieresis -105 +KPX Atilde quoteright -111 +KPX Atilde v -74 +KPX Atilde w -92 +KPX Atilde y -92 +KPX Atilde yacute -92 +KPX Atilde ydieresis -92 +KPX B A -35 +KPX B Aacute -35 +KPX B Abreve -35 +KPX B Acircumflex -35 +KPX B Adieresis -35 +KPX B Agrave -35 +KPX B Amacron -35 +KPX B Aogonek -35 +KPX B Aring -35 +KPX B Atilde -35 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -40 +KPX D W -30 +KPX D Y -55 +KPX D Yacute -55 +KPX D Ydieresis -55 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -40 +KPX Dcaron W -30 +KPX Dcaron Y -55 +KPX Dcaron Yacute -55 +KPX Dcaron Ydieresis -55 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -40 +KPX Dcroat W -30 +KPX Dcroat Y -55 +KPX Dcroat Yacute -55 +KPX Dcroat Ydieresis -55 +KPX F A -74 +KPX F Aacute -74 +KPX F Abreve -74 +KPX F Acircumflex -74 +KPX F Adieresis -74 +KPX F Agrave -74 +KPX F Amacron -74 +KPX F Aogonek -74 +KPX F Aring -74 +KPX F Atilde -74 +KPX F a -15 +KPX F aacute -15 +KPX F abreve -15 +KPX F acircumflex -15 +KPX F adieresis -15 +KPX F agrave -15 +KPX F amacron -15 +KPX F aogonek -15 +KPX F aring -15 +KPX F atilde -15 +KPX F comma -80 +KPX F o -15 +KPX F oacute -15 +KPX F ocircumflex -15 +KPX F odieresis -15 +KPX F ograve -15 +KPX F ohungarumlaut -15 +KPX F omacron -15 +KPX F oslash -15 +KPX F otilde -15 +KPX F period -80 +KPX J A -60 +KPX J Aacute -60 +KPX J Abreve -60 +KPX J Acircumflex -60 +KPX J Adieresis -60 +KPX J Agrave -60 +KPX J Amacron -60 +KPX J Aogonek -60 +KPX J Aring -60 +KPX J Atilde -60 +KPX K O -30 +KPX K Oacute -30 +KPX K Ocircumflex -30 +KPX K Odieresis -30 +KPX K Ograve -30 +KPX K Ohungarumlaut -30 +KPX K Omacron -30 +KPX K Oslash -30 +KPX K Otilde -30 +KPX K e -25 +KPX K eacute -25 +KPX K ecaron -25 +KPX K ecircumflex -25 +KPX K edieresis -25 +KPX K edotaccent -25 +KPX K egrave -25 +KPX K emacron -25 +KPX K eogonek -25 +KPX K o -35 +KPX K oacute -35 +KPX K ocircumflex -35 +KPX K odieresis -35 +KPX K ograve -35 +KPX K ohungarumlaut -35 +KPX K omacron -35 +KPX K oslash -35 +KPX K otilde -35 +KPX K u -15 +KPX K uacute -15 +KPX K ucircumflex -15 +KPX K udieresis -15 +KPX K ugrave -15 +KPX K uhungarumlaut -15 +KPX K umacron -15 +KPX K uogonek -15 +KPX K uring -15 +KPX K y -25 +KPX K yacute -25 +KPX K ydieresis -25 +KPX Kcommaaccent O -30 +KPX Kcommaaccent Oacute -30 +KPX Kcommaaccent Ocircumflex -30 +KPX Kcommaaccent Odieresis -30 +KPX Kcommaaccent Ograve -30 +KPX Kcommaaccent Ohungarumlaut -30 +KPX Kcommaaccent Omacron -30 +KPX Kcommaaccent Oslash -30 +KPX Kcommaaccent Otilde -30 +KPX Kcommaaccent e -25 +KPX Kcommaaccent eacute -25 +KPX Kcommaaccent ecaron -25 +KPX Kcommaaccent ecircumflex -25 +KPX Kcommaaccent edieresis -25 +KPX Kcommaaccent edotaccent -25 +KPX Kcommaaccent egrave -25 +KPX Kcommaaccent emacron -25 +KPX Kcommaaccent eogonek -25 +KPX Kcommaaccent o -35 +KPX Kcommaaccent oacute -35 +KPX Kcommaaccent ocircumflex -35 +KPX Kcommaaccent odieresis -35 +KPX Kcommaaccent ograve -35 +KPX Kcommaaccent ohungarumlaut -35 +KPX Kcommaaccent omacron -35 +KPX Kcommaaccent oslash -35 +KPX Kcommaaccent otilde -35 +KPX Kcommaaccent u -15 +KPX Kcommaaccent uacute -15 +KPX Kcommaaccent ucircumflex -15 +KPX Kcommaaccent udieresis -15 +KPX Kcommaaccent ugrave -15 +KPX Kcommaaccent uhungarumlaut -15 +KPX Kcommaaccent umacron -15 +KPX Kcommaaccent uogonek -15 +KPX Kcommaaccent uring -15 +KPX Kcommaaccent y -25 +KPX Kcommaaccent yacute -25 +KPX Kcommaaccent ydieresis -25 +KPX L T -92 +KPX L Tcaron -92 +KPX L Tcommaaccent -92 +KPX L V -100 +KPX L W -74 +KPX L Y -100 +KPX L Yacute -100 +KPX L Ydieresis -100 +KPX L quoteright -92 +KPX L y -55 +KPX L yacute -55 +KPX L ydieresis -55 +KPX Lacute T -92 +KPX Lacute Tcaron -92 +KPX Lacute Tcommaaccent -92 +KPX Lacute V -100 +KPX Lacute W -74 +KPX Lacute Y -100 +KPX Lacute Yacute -100 +KPX Lacute Ydieresis -100 +KPX Lacute quoteright -92 +KPX Lacute y -55 +KPX Lacute yacute -55 +KPX Lacute ydieresis -55 +KPX Lcaron quoteright -92 +KPX Lcaron y -55 +KPX Lcaron yacute -55 +KPX Lcaron ydieresis -55 +KPX Lcommaaccent T -92 +KPX Lcommaaccent Tcaron -92 +KPX Lcommaaccent Tcommaaccent -92 +KPX Lcommaaccent V -100 +KPX Lcommaaccent W -74 +KPX Lcommaaccent Y -100 +KPX Lcommaaccent Yacute -100 +KPX Lcommaaccent Ydieresis -100 +KPX Lcommaaccent quoteright -92 +KPX Lcommaaccent y -55 +KPX Lcommaaccent yacute -55 +KPX Lcommaaccent ydieresis -55 +KPX Lslash T -92 +KPX Lslash Tcaron -92 +KPX Lslash Tcommaaccent -92 +KPX Lslash V -100 +KPX Lslash W -74 +KPX Lslash Y -100 +KPX Lslash Yacute -100 +KPX Lslash Ydieresis -100 +KPX Lslash quoteright -92 +KPX Lslash y -55 +KPX Lslash yacute -55 +KPX Lslash ydieresis -55 +KPX N A -35 +KPX N Aacute -35 +KPX N Abreve -35 +KPX N Acircumflex -35 +KPX N Adieresis -35 +KPX N Agrave -35 +KPX N Amacron -35 +KPX N Aogonek -35 +KPX N Aring -35 +KPX N Atilde -35 +KPX Nacute A -35 +KPX Nacute Aacute -35 +KPX Nacute Abreve -35 +KPX Nacute Acircumflex -35 +KPX Nacute Adieresis -35 +KPX Nacute Agrave -35 +KPX Nacute Amacron -35 +KPX Nacute Aogonek -35 +KPX Nacute Aring -35 +KPX Nacute Atilde -35 +KPX Ncaron A -35 +KPX Ncaron Aacute -35 +KPX Ncaron Abreve -35 +KPX Ncaron Acircumflex -35 +KPX Ncaron Adieresis -35 +KPX Ncaron Agrave -35 +KPX Ncaron Amacron -35 +KPX Ncaron Aogonek -35 +KPX Ncaron Aring -35 +KPX Ncaron Atilde -35 +KPX Ncommaaccent A -35 +KPX Ncommaaccent Aacute -35 +KPX Ncommaaccent Abreve -35 +KPX Ncommaaccent Acircumflex -35 +KPX Ncommaaccent Adieresis -35 +KPX Ncommaaccent Agrave -35 +KPX Ncommaaccent Amacron -35 +KPX Ncommaaccent Aogonek -35 +KPX Ncommaaccent Aring -35 +KPX Ncommaaccent Atilde -35 +KPX Ntilde A -35 +KPX Ntilde Aacute -35 +KPX Ntilde Abreve -35 +KPX Ntilde Acircumflex -35 +KPX Ntilde Adieresis -35 +KPX Ntilde Agrave -35 +KPX Ntilde Amacron -35 +KPX Ntilde Aogonek -35 +KPX Ntilde Aring -35 +KPX Ntilde Atilde -35 +KPX O A -35 +KPX O Aacute -35 +KPX O Abreve -35 +KPX O Acircumflex -35 +KPX O Adieresis -35 +KPX O Agrave -35 +KPX O Amacron -35 +KPX O Aogonek -35 +KPX O Aring -35 +KPX O Atilde -35 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -35 +KPX O X -40 +KPX O Y -50 +KPX O Yacute -50 +KPX O Ydieresis -50 +KPX Oacute A -35 +KPX Oacute Aacute -35 +KPX Oacute Abreve -35 +KPX Oacute Acircumflex -35 +KPX Oacute Adieresis -35 +KPX Oacute Agrave -35 +KPX Oacute Amacron -35 +KPX Oacute Aogonek -35 +KPX Oacute Aring -35 +KPX Oacute Atilde -35 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -35 +KPX Oacute X -40 +KPX Oacute Y -50 +KPX Oacute Yacute -50 +KPX Oacute Ydieresis -50 +KPX Ocircumflex A -35 +KPX Ocircumflex Aacute -35 +KPX Ocircumflex Abreve -35 +KPX Ocircumflex Acircumflex -35 +KPX Ocircumflex Adieresis -35 +KPX Ocircumflex Agrave -35 +KPX Ocircumflex Amacron -35 +KPX Ocircumflex Aogonek -35 +KPX Ocircumflex Aring -35 +KPX Ocircumflex Atilde -35 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -35 +KPX Ocircumflex X -40 +KPX Ocircumflex Y -50 +KPX Ocircumflex Yacute -50 +KPX Ocircumflex Ydieresis -50 +KPX Odieresis A -35 +KPX Odieresis Aacute -35 +KPX Odieresis Abreve -35 +KPX Odieresis Acircumflex -35 +KPX Odieresis Adieresis -35 +KPX Odieresis Agrave -35 +KPX Odieresis Amacron -35 +KPX Odieresis Aogonek -35 +KPX Odieresis Aring -35 +KPX Odieresis Atilde -35 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -35 +KPX Odieresis X -40 +KPX Odieresis Y -50 +KPX Odieresis Yacute -50 +KPX Odieresis Ydieresis -50 +KPX Ograve A -35 +KPX Ograve Aacute -35 +KPX Ograve Abreve -35 +KPX Ograve Acircumflex -35 +KPX Ograve Adieresis -35 +KPX Ograve Agrave -35 +KPX Ograve Amacron -35 +KPX Ograve Aogonek -35 +KPX Ograve Aring -35 +KPX Ograve Atilde -35 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -35 +KPX Ograve X -40 +KPX Ograve Y -50 +KPX Ograve Yacute -50 +KPX Ograve Ydieresis -50 +KPX Ohungarumlaut A -35 +KPX Ohungarumlaut Aacute -35 +KPX Ohungarumlaut Abreve -35 +KPX Ohungarumlaut Acircumflex -35 +KPX Ohungarumlaut Adieresis -35 +KPX Ohungarumlaut Agrave -35 +KPX Ohungarumlaut Amacron -35 +KPX Ohungarumlaut Aogonek -35 +KPX Ohungarumlaut Aring -35 +KPX Ohungarumlaut Atilde -35 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -35 +KPX Ohungarumlaut X -40 +KPX Ohungarumlaut Y -50 +KPX Ohungarumlaut Yacute -50 +KPX Ohungarumlaut Ydieresis -50 +KPX Omacron A -35 +KPX Omacron Aacute -35 +KPX Omacron Abreve -35 +KPX Omacron Acircumflex -35 +KPX Omacron Adieresis -35 +KPX Omacron Agrave -35 +KPX Omacron Amacron -35 +KPX Omacron Aogonek -35 +KPX Omacron Aring -35 +KPX Omacron Atilde -35 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -35 +KPX Omacron X -40 +KPX Omacron Y -50 +KPX Omacron Yacute -50 +KPX Omacron Ydieresis -50 +KPX Oslash A -35 +KPX Oslash Aacute -35 +KPX Oslash Abreve -35 +KPX Oslash Acircumflex -35 +KPX Oslash Adieresis -35 +KPX Oslash Agrave -35 +KPX Oslash Amacron -35 +KPX Oslash Aogonek -35 +KPX Oslash Aring -35 +KPX Oslash Atilde -35 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -35 +KPX Oslash X -40 +KPX Oslash Y -50 +KPX Oslash Yacute -50 +KPX Oslash Ydieresis -50 +KPX Otilde A -35 +KPX Otilde Aacute -35 +KPX Otilde Abreve -35 +KPX Otilde Acircumflex -35 +KPX Otilde Adieresis -35 +KPX Otilde Agrave -35 +KPX Otilde Amacron -35 +KPX Otilde Aogonek -35 +KPX Otilde Aring -35 +KPX Otilde Atilde -35 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -35 +KPX Otilde X -40 +KPX Otilde Y -50 +KPX Otilde Yacute -50 +KPX Otilde Ydieresis -50 +KPX P A -92 +KPX P Aacute -92 +KPX P Abreve -92 +KPX P Acircumflex -92 +KPX P Adieresis -92 +KPX P Agrave -92 +KPX P Amacron -92 +KPX P Aogonek -92 +KPX P Aring -92 +KPX P Atilde -92 +KPX P a -15 +KPX P aacute -15 +KPX P abreve -15 +KPX P acircumflex -15 +KPX P adieresis -15 +KPX P agrave -15 +KPX P amacron -15 +KPX P aogonek -15 +KPX P aring -15 +KPX P atilde -15 +KPX P comma -111 +KPX P period -111 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX R O -40 +KPX R Oacute -40 +KPX R Ocircumflex -40 +KPX R Odieresis -40 +KPX R Ograve -40 +KPX R Ohungarumlaut -40 +KPX R Omacron -40 +KPX R Oslash -40 +KPX R Otilde -40 +KPX R T -60 +KPX R Tcaron -60 +KPX R Tcommaaccent -60 +KPX R U -40 +KPX R Uacute -40 +KPX R Ucircumflex -40 +KPX R Udieresis -40 +KPX R Ugrave -40 +KPX R Uhungarumlaut -40 +KPX R Umacron -40 +KPX R Uogonek -40 +KPX R Uring -40 +KPX R V -80 +KPX R W -55 +KPX R Y -65 +KPX R Yacute -65 +KPX R Ydieresis -65 +KPX Racute O -40 +KPX Racute Oacute -40 +KPX Racute Ocircumflex -40 +KPX Racute Odieresis -40 +KPX Racute Ograve -40 +KPX Racute Ohungarumlaut -40 +KPX Racute Omacron -40 +KPX Racute Oslash -40 +KPX Racute Otilde -40 +KPX Racute T -60 +KPX Racute Tcaron -60 +KPX Racute Tcommaaccent -60 +KPX Racute U -40 +KPX Racute Uacute -40 +KPX Racute Ucircumflex -40 +KPX Racute Udieresis -40 +KPX Racute Ugrave -40 +KPX Racute Uhungarumlaut -40 +KPX Racute Umacron -40 +KPX Racute Uogonek -40 +KPX Racute Uring -40 +KPX Racute V -80 +KPX Racute W -55 +KPX Racute Y -65 +KPX Racute Yacute -65 +KPX Racute Ydieresis -65 +KPX Rcaron O -40 +KPX Rcaron Oacute -40 +KPX Rcaron Ocircumflex -40 +KPX Rcaron Odieresis -40 +KPX Rcaron Ograve -40 +KPX Rcaron Ohungarumlaut -40 +KPX Rcaron Omacron -40 +KPX Rcaron Oslash -40 +KPX Rcaron Otilde -40 +KPX Rcaron T -60 +KPX Rcaron Tcaron -60 +KPX Rcaron Tcommaaccent -60 +KPX Rcaron U -40 +KPX Rcaron Uacute -40 +KPX Rcaron Ucircumflex -40 +KPX Rcaron Udieresis -40 +KPX Rcaron Ugrave -40 +KPX Rcaron Uhungarumlaut -40 +KPX Rcaron Umacron -40 +KPX Rcaron Uogonek -40 +KPX Rcaron Uring -40 +KPX Rcaron V -80 +KPX Rcaron W -55 +KPX Rcaron Y -65 +KPX Rcaron Yacute -65 +KPX Rcaron Ydieresis -65 +KPX Rcommaaccent O -40 +KPX Rcommaaccent Oacute -40 +KPX Rcommaaccent Ocircumflex -40 +KPX Rcommaaccent Odieresis -40 +KPX Rcommaaccent Ograve -40 +KPX Rcommaaccent Ohungarumlaut -40 +KPX Rcommaaccent Omacron -40 +KPX Rcommaaccent Oslash -40 +KPX Rcommaaccent Otilde -40 +KPX Rcommaaccent T -60 +KPX Rcommaaccent Tcaron -60 +KPX Rcommaaccent Tcommaaccent -60 +KPX Rcommaaccent U -40 +KPX Rcommaaccent Uacute -40 +KPX Rcommaaccent Ucircumflex -40 +KPX Rcommaaccent Udieresis -40 +KPX Rcommaaccent Ugrave -40 +KPX Rcommaaccent Uhungarumlaut -40 +KPX Rcommaaccent Umacron -40 +KPX Rcommaaccent Uogonek -40 +KPX Rcommaaccent Uring -40 +KPX Rcommaaccent V -80 +KPX Rcommaaccent W -55 +KPX Rcommaaccent Y -65 +KPX Rcommaaccent Yacute -65 +KPX Rcommaaccent Ydieresis -65 +KPX T A -93 +KPX T Aacute -93 +KPX T Abreve -93 +KPX T Acircumflex -93 +KPX T Adieresis -93 +KPX T Agrave -93 +KPX T Amacron -93 +KPX T Aogonek -93 +KPX T Aring -93 +KPX T Atilde -93 +KPX T O -18 +KPX T Oacute -18 +KPX T Ocircumflex -18 +KPX T Odieresis -18 +KPX T Ograve -18 +KPX T Ohungarumlaut -18 +KPX T Omacron -18 +KPX T Oslash -18 +KPX T Otilde -18 +KPX T a -80 +KPX T aacute -80 +KPX T abreve -80 +KPX T acircumflex -80 +KPX T adieresis -40 +KPX T agrave -40 +KPX T amacron -40 +KPX T aogonek -80 +KPX T aring -80 +KPX T atilde -40 +KPX T colon -50 +KPX T comma -74 +KPX T e -70 +KPX T eacute -70 +KPX T ecaron -70 +KPX T ecircumflex -70 +KPX T edieresis -30 +KPX T edotaccent -70 +KPX T egrave -70 +KPX T emacron -30 +KPX T eogonek -70 +KPX T hyphen -92 +KPX T i -35 +KPX T iacute -35 +KPX T iogonek -35 +KPX T o -80 +KPX T oacute -80 +KPX T ocircumflex -80 +KPX T odieresis -80 +KPX T ograve -80 +KPX T ohungarumlaut -80 +KPX T omacron -80 +KPX T oslash -80 +KPX T otilde -80 +KPX T period -74 +KPX T r -35 +KPX T racute -35 +KPX T rcaron -35 +KPX T rcommaaccent -35 +KPX T semicolon -55 +KPX T u -45 +KPX T uacute -45 +KPX T ucircumflex -45 +KPX T udieresis -45 +KPX T ugrave -45 +KPX T uhungarumlaut -45 +KPX T umacron -45 +KPX T uogonek -45 +KPX T uring -45 +KPX T w -80 +KPX T y -80 +KPX T yacute -80 +KPX T ydieresis -80 +KPX Tcaron A -93 +KPX Tcaron Aacute -93 +KPX Tcaron Abreve -93 +KPX Tcaron Acircumflex -93 +KPX Tcaron Adieresis -93 +KPX Tcaron Agrave -93 +KPX Tcaron Amacron -93 +KPX Tcaron Aogonek -93 +KPX Tcaron Aring -93 +KPX Tcaron Atilde -93 +KPX Tcaron O -18 +KPX Tcaron Oacute -18 +KPX Tcaron Ocircumflex -18 +KPX Tcaron Odieresis -18 +KPX Tcaron Ograve -18 +KPX Tcaron Ohungarumlaut -18 +KPX Tcaron Omacron -18 +KPX Tcaron Oslash -18 +KPX Tcaron Otilde -18 +KPX Tcaron a -80 +KPX Tcaron aacute -80 +KPX Tcaron abreve -80 +KPX Tcaron acircumflex -80 +KPX Tcaron adieresis -40 +KPX Tcaron agrave -40 +KPX Tcaron amacron -40 +KPX Tcaron aogonek -80 +KPX Tcaron aring -80 +KPX Tcaron atilde -40 +KPX Tcaron colon -50 +KPX Tcaron comma -74 +KPX Tcaron e -70 +KPX Tcaron eacute -70 +KPX Tcaron ecaron -70 +KPX Tcaron ecircumflex -30 +KPX Tcaron edieresis -30 +KPX Tcaron edotaccent -70 +KPX Tcaron egrave -70 +KPX Tcaron emacron -30 +KPX Tcaron eogonek -70 +KPX Tcaron hyphen -92 +KPX Tcaron i -35 +KPX Tcaron iacute -35 +KPX Tcaron iogonek -35 +KPX Tcaron o -80 +KPX Tcaron oacute -80 +KPX Tcaron ocircumflex -80 +KPX Tcaron odieresis -80 +KPX Tcaron ograve -80 +KPX Tcaron ohungarumlaut -80 +KPX Tcaron omacron -80 +KPX Tcaron oslash -80 +KPX Tcaron otilde -80 +KPX Tcaron period -74 +KPX Tcaron r -35 +KPX Tcaron racute -35 +KPX Tcaron rcaron -35 +KPX Tcaron rcommaaccent -35 +KPX Tcaron semicolon -55 +KPX Tcaron u -45 +KPX Tcaron uacute -45 +KPX Tcaron ucircumflex -45 +KPX Tcaron udieresis -45 +KPX Tcaron ugrave -45 +KPX Tcaron uhungarumlaut -45 +KPX Tcaron umacron -45 +KPX Tcaron uogonek -45 +KPX Tcaron uring -45 +KPX Tcaron w -80 +KPX Tcaron y -80 +KPX Tcaron yacute -80 +KPX Tcaron ydieresis -80 +KPX Tcommaaccent A -93 +KPX Tcommaaccent Aacute -93 +KPX Tcommaaccent Abreve -93 +KPX Tcommaaccent Acircumflex -93 +KPX Tcommaaccent Adieresis -93 +KPX Tcommaaccent Agrave -93 +KPX Tcommaaccent Amacron -93 +KPX Tcommaaccent Aogonek -93 +KPX Tcommaaccent Aring -93 +KPX Tcommaaccent Atilde -93 +KPX Tcommaaccent O -18 +KPX Tcommaaccent Oacute -18 +KPX Tcommaaccent Ocircumflex -18 +KPX Tcommaaccent Odieresis -18 +KPX Tcommaaccent Ograve -18 +KPX Tcommaaccent Ohungarumlaut -18 +KPX Tcommaaccent Omacron -18 +KPX Tcommaaccent Oslash -18 +KPX Tcommaaccent Otilde -18 +KPX Tcommaaccent a -80 +KPX Tcommaaccent aacute -80 +KPX Tcommaaccent abreve -80 +KPX Tcommaaccent acircumflex -80 +KPX Tcommaaccent adieresis -40 +KPX Tcommaaccent agrave -40 +KPX Tcommaaccent amacron -40 +KPX Tcommaaccent aogonek -80 +KPX Tcommaaccent aring -80 +KPX Tcommaaccent atilde -40 +KPX Tcommaaccent colon -50 +KPX Tcommaaccent comma -74 +KPX Tcommaaccent e -70 +KPX Tcommaaccent eacute -70 +KPX Tcommaaccent ecaron -70 +KPX Tcommaaccent ecircumflex -30 +KPX Tcommaaccent edieresis -30 +KPX Tcommaaccent edotaccent -70 +KPX Tcommaaccent egrave -30 +KPX Tcommaaccent emacron -70 +KPX Tcommaaccent eogonek -70 +KPX Tcommaaccent hyphen -92 +KPX Tcommaaccent i -35 +KPX Tcommaaccent iacute -35 +KPX Tcommaaccent iogonek -35 +KPX Tcommaaccent o -80 +KPX Tcommaaccent oacute -80 +KPX Tcommaaccent ocircumflex -80 +KPX Tcommaaccent odieresis -80 +KPX Tcommaaccent ograve -80 +KPX Tcommaaccent ohungarumlaut -80 +KPX Tcommaaccent omacron -80 +KPX Tcommaaccent oslash -80 +KPX Tcommaaccent otilde -80 +KPX Tcommaaccent period -74 +KPX Tcommaaccent r -35 +KPX Tcommaaccent racute -35 +KPX Tcommaaccent rcaron -35 +KPX Tcommaaccent rcommaaccent -35 +KPX Tcommaaccent semicolon -55 +KPX Tcommaaccent u -45 +KPX Tcommaaccent uacute -45 +KPX Tcommaaccent ucircumflex -45 +KPX Tcommaaccent udieresis -45 +KPX Tcommaaccent ugrave -45 +KPX Tcommaaccent uhungarumlaut -45 +KPX Tcommaaccent umacron -45 +KPX Tcommaaccent uogonek -45 +KPX Tcommaaccent uring -45 +KPX Tcommaaccent w -80 +KPX Tcommaaccent y -80 +KPX Tcommaaccent yacute -80 +KPX Tcommaaccent ydieresis -80 +KPX U A -40 +KPX U Aacute -40 +KPX U Abreve -40 +KPX U Acircumflex -40 +KPX U Adieresis -40 +KPX U Agrave -40 +KPX U Amacron -40 +KPX U Aogonek -40 +KPX U Aring -40 +KPX U Atilde -40 +KPX Uacute A -40 +KPX Uacute Aacute -40 +KPX Uacute Abreve -40 +KPX Uacute Acircumflex -40 +KPX Uacute Adieresis -40 +KPX Uacute Agrave -40 +KPX Uacute Amacron -40 +KPX Uacute Aogonek -40 +KPX Uacute Aring -40 +KPX Uacute Atilde -40 +KPX Ucircumflex A -40 +KPX Ucircumflex Aacute -40 +KPX Ucircumflex Abreve -40 +KPX Ucircumflex Acircumflex -40 +KPX Ucircumflex Adieresis -40 +KPX Ucircumflex Agrave -40 +KPX Ucircumflex Amacron -40 +KPX Ucircumflex Aogonek -40 +KPX Ucircumflex Aring -40 +KPX Ucircumflex Atilde -40 +KPX Udieresis A -40 +KPX Udieresis Aacute -40 +KPX Udieresis Abreve -40 +KPX Udieresis Acircumflex -40 +KPX Udieresis Adieresis -40 +KPX Udieresis Agrave -40 +KPX Udieresis Amacron -40 +KPX Udieresis Aogonek -40 +KPX Udieresis Aring -40 +KPX Udieresis Atilde -40 +KPX Ugrave A -40 +KPX Ugrave Aacute -40 +KPX Ugrave Abreve -40 +KPX Ugrave Acircumflex -40 +KPX Ugrave Adieresis -40 +KPX Ugrave Agrave -40 +KPX Ugrave Amacron -40 +KPX Ugrave Aogonek -40 +KPX Ugrave Aring -40 +KPX Ugrave Atilde -40 +KPX Uhungarumlaut A -40 +KPX Uhungarumlaut Aacute -40 +KPX Uhungarumlaut Abreve -40 +KPX Uhungarumlaut Acircumflex -40 +KPX Uhungarumlaut Adieresis -40 +KPX Uhungarumlaut Agrave -40 +KPX Uhungarumlaut Amacron -40 +KPX Uhungarumlaut Aogonek -40 +KPX Uhungarumlaut Aring -40 +KPX Uhungarumlaut Atilde -40 +KPX Umacron A -40 +KPX Umacron Aacute -40 +KPX Umacron Abreve -40 +KPX Umacron Acircumflex -40 +KPX Umacron Adieresis -40 +KPX Umacron Agrave -40 +KPX Umacron Amacron -40 +KPX Umacron Aogonek -40 +KPX Umacron Aring -40 +KPX Umacron Atilde -40 +KPX Uogonek A -40 +KPX Uogonek Aacute -40 +KPX Uogonek Abreve -40 +KPX Uogonek Acircumflex -40 +KPX Uogonek Adieresis -40 +KPX Uogonek Agrave -40 +KPX Uogonek Amacron -40 +KPX Uogonek Aogonek -40 +KPX Uogonek Aring -40 +KPX Uogonek Atilde -40 +KPX Uring A -40 +KPX Uring Aacute -40 +KPX Uring Abreve -40 +KPX Uring Acircumflex -40 +KPX Uring Adieresis -40 +KPX Uring Agrave -40 +KPX Uring Amacron -40 +KPX Uring Aogonek -40 +KPX Uring Aring -40 +KPX Uring Atilde -40 +KPX V A -135 +KPX V Aacute -135 +KPX V Abreve -135 +KPX V Acircumflex -135 +KPX V Adieresis -135 +KPX V Agrave -135 +KPX V Amacron -135 +KPX V Aogonek -135 +KPX V Aring -135 +KPX V Atilde -135 +KPX V G -15 +KPX V Gbreve -15 +KPX V Gcommaaccent -15 +KPX V O -40 +KPX V Oacute -40 +KPX V Ocircumflex -40 +KPX V Odieresis -40 +KPX V Ograve -40 +KPX V Ohungarumlaut -40 +KPX V Omacron -40 +KPX V Oslash -40 +KPX V Otilde -40 +KPX V a -111 +KPX V aacute -111 +KPX V abreve -111 +KPX V acircumflex -71 +KPX V adieresis -71 +KPX V agrave -71 +KPX V amacron -71 +KPX V aogonek -111 +KPX V aring -111 +KPX V atilde -71 +KPX V colon -74 +KPX V comma -129 +KPX V e -111 +KPX V eacute -111 +KPX V ecaron -71 +KPX V ecircumflex -71 +KPX V edieresis -71 +KPX V edotaccent -111 +KPX V egrave -71 +KPX V emacron -71 +KPX V eogonek -111 +KPX V hyphen -100 +KPX V i -60 +KPX V iacute -60 +KPX V icircumflex -20 +KPX V idieresis -20 +KPX V igrave -20 +KPX V imacron -20 +KPX V iogonek -60 +KPX V o -129 +KPX V oacute -129 +KPX V ocircumflex -129 +KPX V odieresis -89 +KPX V ograve -89 +KPX V ohungarumlaut -129 +KPX V omacron -89 +KPX V oslash -129 +KPX V otilde -89 +KPX V period -129 +KPX V semicolon -74 +KPX V u -75 +KPX V uacute -75 +KPX V ucircumflex -75 +KPX V udieresis -75 +KPX V ugrave -75 +KPX V uhungarumlaut -75 +KPX V umacron -75 +KPX V uogonek -75 +KPX V uring -75 +KPX W A -120 +KPX W Aacute -120 +KPX W Abreve -120 +KPX W Acircumflex -120 +KPX W Adieresis -120 +KPX W Agrave -120 +KPX W Amacron -120 +KPX W Aogonek -120 +KPX W Aring -120 +KPX W Atilde -120 +KPX W O -10 +KPX W Oacute -10 +KPX W Ocircumflex -10 +KPX W Odieresis -10 +KPX W Ograve -10 +KPX W Ohungarumlaut -10 +KPX W Omacron -10 +KPX W Oslash -10 +KPX W Otilde -10 +KPX W a -80 +KPX W aacute -80 +KPX W abreve -80 +KPX W acircumflex -80 +KPX W adieresis -80 +KPX W agrave -80 +KPX W amacron -80 +KPX W aogonek -80 +KPX W aring -80 +KPX W atilde -80 +KPX W colon -37 +KPX W comma -92 +KPX W e -80 +KPX W eacute -80 +KPX W ecaron -80 +KPX W ecircumflex -80 +KPX W edieresis -40 +KPX W edotaccent -80 +KPX W egrave -40 +KPX W emacron -40 +KPX W eogonek -80 +KPX W hyphen -65 +KPX W i -40 +KPX W iacute -40 +KPX W iogonek -40 +KPX W o -80 +KPX W oacute -80 +KPX W ocircumflex -80 +KPX W odieresis -80 +KPX W ograve -80 +KPX W ohungarumlaut -80 +KPX W omacron -80 +KPX W oslash -80 +KPX W otilde -80 +KPX W period -92 +KPX W semicolon -37 +KPX W u -50 +KPX W uacute -50 +KPX W ucircumflex -50 +KPX W udieresis -50 +KPX W ugrave -50 +KPX W uhungarumlaut -50 +KPX W umacron -50 +KPX W uogonek -50 +KPX W uring -50 +KPX W y -73 +KPX W yacute -73 +KPX W ydieresis -73 +KPX Y A -120 +KPX Y Aacute -120 +KPX Y Abreve -120 +KPX Y Acircumflex -120 +KPX Y Adieresis -120 +KPX Y Agrave -120 +KPX Y Amacron -120 +KPX Y Aogonek -120 +KPX Y Aring -120 +KPX Y Atilde -120 +KPX Y O -30 +KPX Y Oacute -30 +KPX Y Ocircumflex -30 +KPX Y Odieresis -30 +KPX Y Ograve -30 +KPX Y Ohungarumlaut -30 +KPX Y Omacron -30 +KPX Y Oslash -30 +KPX Y Otilde -30 +KPX Y a -100 +KPX Y aacute -100 +KPX Y abreve -100 +KPX Y acircumflex -100 +KPX Y adieresis -60 +KPX Y agrave -60 +KPX Y amacron -60 +KPX Y aogonek -100 +KPX Y aring -100 +KPX Y atilde -60 +KPX Y colon -92 +KPX Y comma -129 +KPX Y e -100 +KPX Y eacute -100 +KPX Y ecaron -100 +KPX Y ecircumflex -100 +KPX Y edieresis -60 +KPX Y edotaccent -100 +KPX Y egrave -60 +KPX Y emacron -60 +KPX Y eogonek -100 +KPX Y hyphen -111 +KPX Y i -55 +KPX Y iacute -55 +KPX Y iogonek -55 +KPX Y o -110 +KPX Y oacute -110 +KPX Y ocircumflex -110 +KPX Y odieresis -70 +KPX Y ograve -70 +KPX Y ohungarumlaut -110 +KPX Y omacron -70 +KPX Y oslash -110 +KPX Y otilde -70 +KPX Y period -129 +KPX Y semicolon -92 +KPX Y u -111 +KPX Y uacute -111 +KPX Y ucircumflex -111 +KPX Y udieresis -71 +KPX Y ugrave -71 +KPX Y uhungarumlaut -111 +KPX Y umacron -71 +KPX Y uogonek -111 +KPX Y uring -111 +KPX Yacute A -120 +KPX Yacute Aacute -120 +KPX Yacute Abreve -120 +KPX Yacute Acircumflex -120 +KPX Yacute Adieresis -120 +KPX Yacute Agrave -120 +KPX Yacute Amacron -120 +KPX Yacute Aogonek -120 +KPX Yacute Aring -120 +KPX Yacute Atilde -120 +KPX Yacute O -30 +KPX Yacute Oacute -30 +KPX Yacute Ocircumflex -30 +KPX Yacute Odieresis -30 +KPX Yacute Ograve -30 +KPX Yacute Ohungarumlaut -30 +KPX Yacute Omacron -30 +KPX Yacute Oslash -30 +KPX Yacute Otilde -30 +KPX Yacute a -100 +KPX Yacute aacute -100 +KPX Yacute abreve -100 +KPX Yacute acircumflex -100 +KPX Yacute adieresis -60 +KPX Yacute agrave -60 +KPX Yacute amacron -60 +KPX Yacute aogonek -100 +KPX Yacute aring -100 +KPX Yacute atilde -60 +KPX Yacute colon -92 +KPX Yacute comma -129 +KPX Yacute e -100 +KPX Yacute eacute -100 +KPX Yacute ecaron -100 +KPX Yacute ecircumflex -100 +KPX Yacute edieresis -60 +KPX Yacute edotaccent -100 +KPX Yacute egrave -60 +KPX Yacute emacron -60 +KPX Yacute eogonek -100 +KPX Yacute hyphen -111 +KPX Yacute i -55 +KPX Yacute iacute -55 +KPX Yacute iogonek -55 +KPX Yacute o -110 +KPX Yacute oacute -110 +KPX Yacute ocircumflex -110 +KPX Yacute odieresis -70 +KPX Yacute ograve -70 +KPX Yacute ohungarumlaut -110 +KPX Yacute omacron -70 +KPX Yacute oslash -110 +KPX Yacute otilde -70 +KPX Yacute period -129 +KPX Yacute semicolon -92 +KPX Yacute u -111 +KPX Yacute uacute -111 +KPX Yacute ucircumflex -111 +KPX Yacute udieresis -71 +KPX Yacute ugrave -71 +KPX Yacute uhungarumlaut -111 +KPX Yacute umacron -71 +KPX Yacute uogonek -111 +KPX Yacute uring -111 +KPX Ydieresis A -120 +KPX Ydieresis Aacute -120 +KPX Ydieresis Abreve -120 +KPX Ydieresis Acircumflex -120 +KPX Ydieresis Adieresis -120 +KPX Ydieresis Agrave -120 +KPX Ydieresis Amacron -120 +KPX Ydieresis Aogonek -120 +KPX Ydieresis Aring -120 +KPX Ydieresis Atilde -120 +KPX Ydieresis O -30 +KPX Ydieresis Oacute -30 +KPX Ydieresis Ocircumflex -30 +KPX Ydieresis Odieresis -30 +KPX Ydieresis Ograve -30 +KPX Ydieresis Ohungarumlaut -30 +KPX Ydieresis Omacron -30 +KPX Ydieresis Oslash -30 +KPX Ydieresis Otilde -30 +KPX Ydieresis a -100 +KPX Ydieresis aacute -100 +KPX Ydieresis abreve -100 +KPX Ydieresis acircumflex -100 +KPX Ydieresis adieresis -60 +KPX Ydieresis agrave -60 +KPX Ydieresis amacron -60 +KPX Ydieresis aogonek -100 +KPX Ydieresis aring -100 +KPX Ydieresis atilde -100 +KPX Ydieresis colon -92 +KPX Ydieresis comma -129 +KPX Ydieresis e -100 +KPX Ydieresis eacute -100 +KPX Ydieresis ecaron -100 +KPX Ydieresis ecircumflex -100 +KPX Ydieresis edieresis -60 +KPX Ydieresis edotaccent -100 +KPX Ydieresis egrave -60 +KPX Ydieresis emacron -60 +KPX Ydieresis eogonek -100 +KPX Ydieresis hyphen -111 +KPX Ydieresis i -55 +KPX Ydieresis iacute -55 +KPX Ydieresis iogonek -55 +KPX Ydieresis o -110 +KPX Ydieresis oacute -110 +KPX Ydieresis ocircumflex -110 +KPX Ydieresis odieresis -70 +KPX Ydieresis ograve -70 +KPX Ydieresis ohungarumlaut -110 +KPX Ydieresis omacron -70 +KPX Ydieresis oslash -110 +KPX Ydieresis otilde -70 +KPX Ydieresis period -129 +KPX Ydieresis semicolon -92 +KPX Ydieresis u -111 +KPX Ydieresis uacute -111 +KPX Ydieresis ucircumflex -111 +KPX Ydieresis udieresis -71 +KPX Ydieresis ugrave -71 +KPX Ydieresis uhungarumlaut -111 +KPX Ydieresis umacron -71 +KPX Ydieresis uogonek -111 +KPX Ydieresis uring -111 +KPX a v -20 +KPX a w -15 +KPX aacute v -20 +KPX aacute w -15 +KPX abreve v -20 +KPX abreve w -15 +KPX acircumflex v -20 +KPX acircumflex w -15 +KPX adieresis v -20 +KPX adieresis w -15 +KPX agrave v -20 +KPX agrave w -15 +KPX amacron v -20 +KPX amacron w -15 +KPX aogonek v -20 +KPX aogonek w -15 +KPX aring v -20 +KPX aring w -15 +KPX atilde v -20 +KPX atilde w -15 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -15 +KPX c y -15 +KPX c yacute -15 +KPX c ydieresis -15 +KPX cacute y -15 +KPX cacute yacute -15 +KPX cacute ydieresis -15 +KPX ccaron y -15 +KPX ccaron yacute -15 +KPX ccaron ydieresis -15 +KPX ccedilla y -15 +KPX ccedilla yacute -15 +KPX ccedilla ydieresis -15 +KPX comma quotedblright -70 +KPX comma quoteright -70 +KPX e g -15 +KPX e gbreve -15 +KPX e gcommaaccent -15 +KPX e v -25 +KPX e w -25 +KPX e x -15 +KPX e y -15 +KPX e yacute -15 +KPX e ydieresis -15 +KPX eacute g -15 +KPX eacute gbreve -15 +KPX eacute gcommaaccent -15 +KPX eacute v -25 +KPX eacute w -25 +KPX eacute x -15 +KPX eacute y -15 +KPX eacute yacute -15 +KPX eacute ydieresis -15 +KPX ecaron g -15 +KPX ecaron gbreve -15 +KPX ecaron gcommaaccent -15 +KPX ecaron v -25 +KPX ecaron w -25 +KPX ecaron x -15 +KPX ecaron y -15 +KPX ecaron yacute -15 +KPX ecaron ydieresis -15 +KPX ecircumflex g -15 +KPX ecircumflex gbreve -15 +KPX ecircumflex gcommaaccent -15 +KPX ecircumflex v -25 +KPX ecircumflex w -25 +KPX ecircumflex x -15 +KPX ecircumflex y -15 +KPX ecircumflex yacute -15 +KPX ecircumflex ydieresis -15 +KPX edieresis g -15 +KPX edieresis gbreve -15 +KPX edieresis gcommaaccent -15 +KPX edieresis v -25 +KPX edieresis w -25 +KPX edieresis x -15 +KPX edieresis y -15 +KPX edieresis yacute -15 +KPX edieresis ydieresis -15 +KPX edotaccent g -15 +KPX edotaccent gbreve -15 +KPX edotaccent gcommaaccent -15 +KPX edotaccent v -25 +KPX edotaccent w -25 +KPX edotaccent x -15 +KPX edotaccent y -15 +KPX edotaccent yacute -15 +KPX edotaccent ydieresis -15 +KPX egrave g -15 +KPX egrave gbreve -15 +KPX egrave gcommaaccent -15 +KPX egrave v -25 +KPX egrave w -25 +KPX egrave x -15 +KPX egrave y -15 +KPX egrave yacute -15 +KPX egrave ydieresis -15 +KPX emacron g -15 +KPX emacron gbreve -15 +KPX emacron gcommaaccent -15 +KPX emacron v -25 +KPX emacron w -25 +KPX emacron x -15 +KPX emacron y -15 +KPX emacron yacute -15 +KPX emacron ydieresis -15 +KPX eogonek g -15 +KPX eogonek gbreve -15 +KPX eogonek gcommaaccent -15 +KPX eogonek v -25 +KPX eogonek w -25 +KPX eogonek x -15 +KPX eogonek y -15 +KPX eogonek yacute -15 +KPX eogonek ydieresis -15 +KPX f a -10 +KPX f aacute -10 +KPX f abreve -10 +KPX f acircumflex -10 +KPX f adieresis -10 +KPX f agrave -10 +KPX f amacron -10 +KPX f aogonek -10 +KPX f aring -10 +KPX f atilde -10 +KPX f dotlessi -50 +KPX f f -25 +KPX f i -20 +KPX f iacute -20 +KPX f quoteright 55 +KPX g a -5 +KPX g aacute -5 +KPX g abreve -5 +KPX g acircumflex -5 +KPX g adieresis -5 +KPX g agrave -5 +KPX g amacron -5 +KPX g aogonek -5 +KPX g aring -5 +KPX g atilde -5 +KPX gbreve a -5 +KPX gbreve aacute -5 +KPX gbreve abreve -5 +KPX gbreve acircumflex -5 +KPX gbreve adieresis -5 +KPX gbreve agrave -5 +KPX gbreve amacron -5 +KPX gbreve aogonek -5 +KPX gbreve aring -5 +KPX gbreve atilde -5 +KPX gcommaaccent a -5 +KPX gcommaaccent aacute -5 +KPX gcommaaccent abreve -5 +KPX gcommaaccent acircumflex -5 +KPX gcommaaccent adieresis -5 +KPX gcommaaccent agrave -5 +KPX gcommaaccent amacron -5 +KPX gcommaaccent aogonek -5 +KPX gcommaaccent aring -5 +KPX gcommaaccent atilde -5 +KPX h y -5 +KPX h yacute -5 +KPX h ydieresis -5 +KPX i v -25 +KPX iacute v -25 +KPX icircumflex v -25 +KPX idieresis v -25 +KPX igrave v -25 +KPX imacron v -25 +KPX iogonek v -25 +KPX k e -10 +KPX k eacute -10 +KPX k ecaron -10 +KPX k ecircumflex -10 +KPX k edieresis -10 +KPX k edotaccent -10 +KPX k egrave -10 +KPX k emacron -10 +KPX k eogonek -10 +KPX k o -10 +KPX k oacute -10 +KPX k ocircumflex -10 +KPX k odieresis -10 +KPX k ograve -10 +KPX k ohungarumlaut -10 +KPX k omacron -10 +KPX k oslash -10 +KPX k otilde -10 +KPX k y -15 +KPX k yacute -15 +KPX k ydieresis -15 +KPX kcommaaccent e -10 +KPX kcommaaccent eacute -10 +KPX kcommaaccent ecaron -10 +KPX kcommaaccent ecircumflex -10 +KPX kcommaaccent edieresis -10 +KPX kcommaaccent edotaccent -10 +KPX kcommaaccent egrave -10 +KPX kcommaaccent emacron -10 +KPX kcommaaccent eogonek -10 +KPX kcommaaccent o -10 +KPX kcommaaccent oacute -10 +KPX kcommaaccent ocircumflex -10 +KPX kcommaaccent odieresis -10 +KPX kcommaaccent ograve -10 +KPX kcommaaccent ohungarumlaut -10 +KPX kcommaaccent omacron -10 +KPX kcommaaccent oslash -10 +KPX kcommaaccent otilde -10 +KPX kcommaaccent y -15 +KPX kcommaaccent yacute -15 +KPX kcommaaccent ydieresis -15 +KPX l w -10 +KPX lacute w -10 +KPX lcommaaccent w -10 +KPX lslash w -10 +KPX n v -40 +KPX n y -15 +KPX n yacute -15 +KPX n ydieresis -15 +KPX nacute v -40 +KPX nacute y -15 +KPX nacute yacute -15 +KPX nacute ydieresis -15 +KPX ncaron v -40 +KPX ncaron y -15 +KPX ncaron yacute -15 +KPX ncaron ydieresis -15 +KPX ncommaaccent v -40 +KPX ncommaaccent y -15 +KPX ncommaaccent yacute -15 +KPX ncommaaccent ydieresis -15 +KPX ntilde v -40 +KPX ntilde y -15 +KPX ntilde yacute -15 +KPX ntilde ydieresis -15 +KPX o v -15 +KPX o w -25 +KPX o y -10 +KPX o yacute -10 +KPX o ydieresis -10 +KPX oacute v -15 +KPX oacute w -25 +KPX oacute y -10 +KPX oacute yacute -10 +KPX oacute ydieresis -10 +KPX ocircumflex v -15 +KPX ocircumflex w -25 +KPX ocircumflex y -10 +KPX ocircumflex yacute -10 +KPX ocircumflex ydieresis -10 +KPX odieresis v -15 +KPX odieresis w -25 +KPX odieresis y -10 +KPX odieresis yacute -10 +KPX odieresis ydieresis -10 +KPX ograve v -15 +KPX ograve w -25 +KPX ograve y -10 +KPX ograve yacute -10 +KPX ograve ydieresis -10 +KPX ohungarumlaut v -15 +KPX ohungarumlaut w -25 +KPX ohungarumlaut y -10 +KPX ohungarumlaut yacute -10 +KPX ohungarumlaut ydieresis -10 +KPX omacron v -15 +KPX omacron w -25 +KPX omacron y -10 +KPX omacron yacute -10 +KPX omacron ydieresis -10 +KPX oslash v -15 +KPX oslash w -25 +KPX oslash y -10 +KPX oslash yacute -10 +KPX oslash ydieresis -10 +KPX otilde v -15 +KPX otilde w -25 +KPX otilde y -10 +KPX otilde yacute -10 +KPX otilde ydieresis -10 +KPX p y -10 +KPX p yacute -10 +KPX p ydieresis -10 +KPX period quotedblright -70 +KPX period quoteright -70 +KPX quotedblleft A -80 +KPX quotedblleft Aacute -80 +KPX quotedblleft Abreve -80 +KPX quotedblleft Acircumflex -80 +KPX quotedblleft Adieresis -80 +KPX quotedblleft Agrave -80 +KPX quotedblleft Amacron -80 +KPX quotedblleft Aogonek -80 +KPX quotedblleft Aring -80 +KPX quotedblleft Atilde -80 +KPX quoteleft A -80 +KPX quoteleft Aacute -80 +KPX quoteleft Abreve -80 +KPX quoteleft Acircumflex -80 +KPX quoteleft Adieresis -80 +KPX quoteleft Agrave -80 +KPX quoteleft Amacron -80 +KPX quoteleft Aogonek -80 +KPX quoteleft Aring -80 +KPX quoteleft Atilde -80 +KPX quoteleft quoteleft -74 +KPX quoteright d -50 +KPX quoteright dcroat -50 +KPX quoteright l -10 +KPX quoteright lacute -10 +KPX quoteright lcommaaccent -10 +KPX quoteright lslash -10 +KPX quoteright quoteright -74 +KPX quoteright r -50 +KPX quoteright racute -50 +KPX quoteright rcaron -50 +KPX quoteright rcommaaccent -50 +KPX quoteright s -55 +KPX quoteright sacute -55 +KPX quoteright scaron -55 +KPX quoteright scedilla -55 +KPX quoteright scommaaccent -55 +KPX quoteright space -74 +KPX quoteright t -18 +KPX quoteright tcommaaccent -18 +KPX quoteright v -50 +KPX r comma -40 +KPX r g -18 +KPX r gbreve -18 +KPX r gcommaaccent -18 +KPX r hyphen -20 +KPX r period -55 +KPX racute comma -40 +KPX racute g -18 +KPX racute gbreve -18 +KPX racute gcommaaccent -18 +KPX racute hyphen -20 +KPX racute period -55 +KPX rcaron comma -40 +KPX rcaron g -18 +KPX rcaron gbreve -18 +KPX rcaron gcommaaccent -18 +KPX rcaron hyphen -20 +KPX rcaron period -55 +KPX rcommaaccent comma -40 +KPX rcommaaccent g -18 +KPX rcommaaccent gbreve -18 +KPX rcommaaccent gcommaaccent -18 +KPX rcommaaccent hyphen -20 +KPX rcommaaccent period -55 +KPX space A -55 +KPX space Aacute -55 +KPX space Abreve -55 +KPX space Acircumflex -55 +KPX space Adieresis -55 +KPX space Agrave -55 +KPX space Amacron -55 +KPX space Aogonek -55 +KPX space Aring -55 +KPX space Atilde -55 +KPX space T -18 +KPX space Tcaron -18 +KPX space Tcommaaccent -18 +KPX space V -50 +KPX space W -30 +KPX space Y -90 +KPX space Yacute -90 +KPX space Ydieresis -90 +KPX v a -25 +KPX v aacute -25 +KPX v abreve -25 +KPX v acircumflex -25 +KPX v adieresis -25 +KPX v agrave -25 +KPX v amacron -25 +KPX v aogonek -25 +KPX v aring -25 +KPX v atilde -25 +KPX v comma -65 +KPX v e -15 +KPX v eacute -15 +KPX v ecaron -15 +KPX v ecircumflex -15 +KPX v edieresis -15 +KPX v edotaccent -15 +KPX v egrave -15 +KPX v emacron -15 +KPX v eogonek -15 +KPX v o -20 +KPX v oacute -20 +KPX v ocircumflex -20 +KPX v odieresis -20 +KPX v ograve -20 +KPX v ohungarumlaut -20 +KPX v omacron -20 +KPX v oslash -20 +KPX v otilde -20 +KPX v period -65 +KPX w a -10 +KPX w aacute -10 +KPX w abreve -10 +KPX w acircumflex -10 +KPX w adieresis -10 +KPX w agrave -10 +KPX w amacron -10 +KPX w aogonek -10 +KPX w aring -10 +KPX w atilde -10 +KPX w comma -65 +KPX w o -10 +KPX w oacute -10 +KPX w ocircumflex -10 +KPX w odieresis -10 +KPX w ograve -10 +KPX w ohungarumlaut -10 +KPX w omacron -10 +KPX w oslash -10 +KPX w otilde -10 +KPX w period -65 +KPX x e -15 +KPX x eacute -15 +KPX x ecaron -15 +KPX x ecircumflex -15 +KPX x edieresis -15 +KPX x edotaccent -15 +KPX x egrave -15 +KPX x emacron -15 +KPX x eogonek -15 +KPX y comma -65 +KPX y period -65 +KPX yacute comma -65 +KPX yacute period -65 +KPX ydieresis comma -65 +KPX ydieresis period -65 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/Times-Roman.afm.php b/application/third_party/dompdf/lib/fonts/Times-Roman.afm.php new file mode 100755 index 00000000..db367a77 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/Times-Roman.afm.php @@ -0,0 +1,570 @@ + + array ( + 32 => 'space', + 160 => 'space', + 33 => 'exclam', + 34 => 'quotedbl', + 35 => 'numbersign', + 36 => 'dollar', + 37 => 'percent', + 38 => 'ampersand', + 146 => 'quoteright', + 40 => 'parenleft', + 41 => 'parenright', + 42 => 'asterisk', + 43 => 'plus', + 44 => 'comma', + 45 => 'hyphen', + 173 => 'hyphen', + 46 => 'period', + 47 => 'slash', + 48 => 'zero', + 49 => 'one', + 50 => 'two', + 51 => 'three', + 52 => 'four', + 53 => 'five', + 54 => 'six', + 55 => 'seven', + 56 => 'eight', + 57 => 'nine', + 58 => 'colon', + 59 => 'semicolon', + 60 => 'less', + 61 => 'equal', + 62 => 'greater', + 63 => 'question', + 64 => 'at', + 65 => 'A', + 66 => 'B', + 67 => 'C', + 68 => 'D', + 69 => 'E', + 70 => 'F', + 71 => 'G', + 72 => 'H', + 73 => 'I', + 74 => 'J', + 75 => 'K', + 76 => 'L', + 77 => 'M', + 78 => 'N', + 79 => 'O', + 80 => 'P', + 81 => 'Q', + 82 => 'R', + 83 => 'S', + 84 => 'T', + 85 => 'U', + 86 => 'V', + 87 => 'W', + 88 => 'X', + 89 => 'Y', + 90 => 'Z', + 91 => 'bracketleft', + 92 => 'backslash', + 93 => 'bracketright', + 94 => 'asciicircum', + 95 => 'underscore', + 145 => 'quoteleft', + 97 => 'a', + 98 => 'b', + 99 => 'c', + 100 => 'd', + 101 => 'e', + 102 => 'f', + 103 => 'g', + 104 => 'h', + 105 => 'i', + 106 => 'j', + 107 => 'k', + 108 => 'l', + 109 => 'm', + 110 => 'n', + 111 => 'o', + 112 => 'p', + 113 => 'q', + 114 => 'r', + 115 => 's', + 116 => 't', + 117 => 'u', + 118 => 'v', + 119 => 'w', + 120 => 'x', + 121 => 'y', + 122 => 'z', + 123 => 'braceleft', + 124 => 'bar', + 125 => 'braceright', + 126 => 'asciitilde', + 161 => 'exclamdown', + 162 => 'cent', + 163 => 'sterling', + 165 => 'yen', + 131 => 'florin', + 167 => 'section', + 164 => 'currency', + 39 => 'quotesingle', + 147 => 'quotedblleft', + 170 => 'ordfeminine', + 139 => 'guilsinglleft', + 155 => 'guilsinglright', + 150 => 'endash', + 134 => 'dagger', + 135 => 'daggerdbl', + 183 => 'periodcentered', + 182 => 'paragraph', + 149 => 'bullet', + 130 => 'quotesinglbase', + 132 => 'quotedblbase', + 148 => 'quotedblright', + 187 => 'guillemotright', + 133 => 'ellipsis', + 137 => 'perthousand', + 191 => 'questiondown', + 96 => 'grave', + 180 => 'acute', + 136 => 'circumflex', + 152 => 'tilde', + 175 => 'macron', + 168 => 'dieresis', + 184 => 'cedilla', + 151 => 'emdash', + 198 => 'AE', + 216 => 'Oslash', + 140 => 'OE', + 186 => 'ordmasculine', + 230 => 'ae', + 248 => 'oslash', + 156 => 'oe', + 223 => 'germandbls', + 207 => 'Idieresis', + 233 => 'eacute', + 159 => 'Ydieresis', + 247 => 'divide', + 221 => 'Yacute', + 194 => 'Acircumflex', + 225 => 'aacute', + 219 => 'Ucircumflex', + 253 => 'yacute', + 234 => 'ecircumflex', + 220 => 'Udieresis', + 218 => 'Uacute', + 203 => 'Edieresis', + 169 => 'copyright', + 229 => 'aring', + 224 => 'agrave', + 227 => 'atilde', + 154 => 'scaron', + 237 => 'iacute', + 251 => 'ucircumflex', + 226 => 'acircumflex', + 231 => 'ccedilla', + 222 => 'Thorn', + 179 => 'threesuperior', + 210 => 'Ograve', + 192 => 'Agrave', + 215 => 'multiply', + 250 => 'uacute', + 255 => 'ydieresis', + 238 => 'icircumflex', + 202 => 'Ecircumflex', + 228 => 'adieresis', + 235 => 'edieresis', + 205 => 'Iacute', + 177 => 'plusminus', + 166 => 'brokenbar', + 174 => 'registered', + 200 => 'Egrave', + 142 => 'Zcaron', + 208 => 'Eth', + 199 => 'Ccedilla', + 193 => 'Aacute', + 196 => 'Adieresis', + 232 => 'egrave', + 211 => 'Oacute', + 243 => 'oacute', + 239 => 'idieresis', + 212 => 'Ocircumflex', + 217 => 'Ugrave', + 254 => 'thorn', + 178 => 'twosuperior', + 214 => 'Odieresis', + 181 => 'mu', + 236 => 'igrave', + 190 => 'threequarters', + 153 => 'trademark', + 204 => 'Igrave', + 189 => 'onehalf', + 244 => 'ocircumflex', + 241 => 'ntilde', + 201 => 'Eacute', + 188 => 'onequarter', + 138 => 'Scaron', + 176 => 'degree', + 242 => 'ograve', + 249 => 'ugrave', + 209 => 'Ntilde', + 245 => 'otilde', + 195 => 'Atilde', + 197 => 'Aring', + 213 => 'Otilde', + 206 => 'Icircumflex', + 172 => 'logicalnot', + 246 => 'odieresis', + 252 => 'udieresis', + 240 => 'eth', + 158 => 'zcaron', + 185 => 'onesuperior', + 128 => 'Euro', + ), + 'isUnicode' => false, + 'FontName' => 'Times-Roman', + 'FullName' => 'Times Roman', + 'FamilyName' => 'Times', + 'Weight' => 'Roman', + 'ItalicAngle' => '0', + 'IsFixedPitch' => 'false', + 'CharacterSet' => 'ExtendedRoman', + 'FontBBox' => + array ( + 0 => '-168', + 1 => '-218', + 2 => '1000', + 3 => '898', + ), + 'UnderlinePosition' => '-100', + 'UnderlineThickness' => '50', + 'Version' => '002.00', + 'EncodingScheme' => 'WinAnsiEncoding', + 'CapHeight' => '662', + 'XHeight' => '450', + 'Ascender' => '683', + 'Descender' => '-217', + 'StdHW' => '28', + 'StdVW' => '84', + 'StartCharMetrics' => '317', + 'C' => + array ( + 32 => 250.0, + 160 => 250.0, + 33 => 333.0, + 34 => 408.0, + 35 => 500.0, + 36 => 500.0, + 37 => 833.0, + 38 => 778.0, + 146 => 333.0, + 40 => 333.0, + 41 => 333.0, + 42 => 500.0, + 43 => 564.0, + 44 => 250.0, + 45 => 333.0, + 173 => 333.0, + 46 => 250.0, + 47 => 278.0, + 48 => 500.0, + 49 => 500.0, + 50 => 500.0, + 51 => 500.0, + 52 => 500.0, + 53 => 500.0, + 54 => 500.0, + 55 => 500.0, + 56 => 500.0, + 57 => 500.0, + 58 => 278.0, + 59 => 278.0, + 60 => 564.0, + 61 => 564.0, + 62 => 564.0, + 63 => 444.0, + 64 => 921.0, + 65 => 722.0, + 66 => 667.0, + 67 => 667.0, + 68 => 722.0, + 69 => 611.0, + 70 => 556.0, + 71 => 722.0, + 72 => 722.0, + 73 => 333.0, + 74 => 389.0, + 75 => 722.0, + 76 => 611.0, + 77 => 889.0, + 78 => 722.0, + 79 => 722.0, + 80 => 556.0, + 81 => 722.0, + 82 => 667.0, + 83 => 556.0, + 84 => 611.0, + 85 => 722.0, + 86 => 722.0, + 87 => 944.0, + 88 => 722.0, + 89 => 722.0, + 90 => 611.0, + 91 => 333.0, + 92 => 278.0, + 93 => 333.0, + 94 => 469.0, + 95 => 500.0, + 145 => 333.0, + 97 => 444.0, + 98 => 500.0, + 99 => 444.0, + 100 => 500.0, + 101 => 444.0, + 102 => 333.0, + 103 => 500.0, + 104 => 500.0, + 105 => 278.0, + 106 => 278.0, + 107 => 500.0, + 108 => 278.0, + 109 => 778.0, + 110 => 500.0, + 111 => 500.0, + 112 => 500.0, + 113 => 500.0, + 114 => 333.0, + 115 => 389.0, + 116 => 278.0, + 117 => 500.0, + 118 => 500.0, + 119 => 722.0, + 120 => 500.0, + 121 => 500.0, + 122 => 444.0, + 123 => 480.0, + 124 => 200.0, + 125 => 480.0, + 126 => 541.0, + 161 => 333.0, + 162 => 500.0, + 163 => 500.0, + 'fraction' => 167.0, + 165 => 500.0, + 131 => 500.0, + 167 => 500.0, + 164 => 500.0, + 39 => 180.0, + 147 => 444.0, + 170 => 276.0, + 139 => 333.0, + 155 => 333.0, + 'fi' => 556.0, + 'fl' => 556.0, + 150 => 500.0, + 134 => 500.0, + 135 => 500.0, + 183 => 250.0, + 182 => 453.0, + 149 => 350.0, + 130 => 333.0, + 132 => 444.0, + 148 => 444.0, + 187 => 500.0, + 133 => 1000.0, + 137 => 1000.0, + 191 => 444.0, + 96 => 333.0, + 180 => 333.0, + 136 => 333.0, + 152 => 333.0, + 175 => 333.0, + 'breve' => 333.0, + 'dotaccent' => 333.0, + 168 => 333.0, + 'ring' => 333.0, + 184 => 333.0, + 'hungarumlaut' => 333.0, + 'ogonek' => 333.0, + 'caron' => 333.0, + 151 => 1000.0, + 198 => 889.0, + 'Lslash' => 611.0, + 216 => 722.0, + 140 => 889.0, + 186 => 310.0, + 230 => 667.0, + 'dotlessi' => 278.0, + 'lslash' => 278.0, + 248 => 500.0, + 156 => 722.0, + 223 => 500.0, + 207 => 333.0, + 233 => 444.0, + 'abreve' => 444.0, + 'uhungarumlaut' => 500.0, + 'ecaron' => 444.0, + 159 => 722.0, + 247 => 564.0, + 221 => 722.0, + 194 => 722.0, + 225 => 444.0, + 219 => 722.0, + 253 => 500.0, + 'scommaaccent' => 389.0, + 234 => 444.0, + 'Uring' => 722.0, + 220 => 722.0, + 'aogonek' => 444.0, + 218 => 722.0, + 'uogonek' => 500.0, + 203 => 611.0, + 'Dcroat' => 722.0, + 'commaaccent' => 250.0, + 169 => 760.0, + 'Emacron' => 611.0, + 'ccaron' => 444.0, + 229 => 444.0, + 'Ncommaaccent' => 722.0, + 'lacute' => 278.0, + 224 => 444.0, + 'Tcommaaccent' => 611.0, + 'Cacute' => 667.0, + 227 => 444.0, + 'Edotaccent' => 611.0, + 154 => 389.0, + 'scedilla' => 389.0, + 237 => 278.0, + 'lozenge' => 471.0, + 'Rcaron' => 667.0, + 'Gcommaaccent' => 722.0, + 251 => 500.0, + 226 => 444.0, + 'Amacron' => 722.0, + 'rcaron' => 333.0, + 231 => 444.0, + 'Zdotaccent' => 611.0, + 222 => 556.0, + 'Omacron' => 722.0, + 'Racute' => 667.0, + 'Sacute' => 556.0, + 'dcaron' => 588.0, + 'Umacron' => 722.0, + 'uring' => 500.0, + 179 => 300.0, + 210 => 722.0, + 192 => 722.0, + 'Abreve' => 722.0, + 215 => 564.0, + 250 => 500.0, + 'Tcaron' => 611.0, + 'partialdiff' => 476.0, + 255 => 500.0, + 'Nacute' => 722.0, + 238 => 278.0, + 202 => 611.0, + 228 => 444.0, + 235 => 444.0, + 'cacute' => 444.0, + 'nacute' => 500.0, + 'umacron' => 500.0, + 'Ncaron' => 722.0, + 205 => 333.0, + 177 => 564.0, + 166 => 200.0, + 174 => 760.0, + 'Gbreve' => 722.0, + 'Idotaccent' => 333.0, + 'summation' => 600.0, + 200 => 611.0, + 'racute' => 333.0, + 'omacron' => 500.0, + 'Zacute' => 611.0, + 142 => 611.0, + 'greaterequal' => 549.0, + 208 => 722.0, + 199 => 667.0, + 'lcommaaccent' => 278.0, + 'tcaron' => 326.0, + 'eogonek' => 444.0, + 'Uogonek' => 722.0, + 193 => 722.0, + 196 => 722.0, + 232 => 444.0, + 'zacute' => 444.0, + 'iogonek' => 278.0, + 211 => 722.0, + 243 => 500.0, + 'amacron' => 444.0, + 'sacute' => 389.0, + 239 => 278.0, + 212 => 722.0, + 217 => 722.0, + 'Delta' => 612.0, + 254 => 500.0, + 178 => 300.0, + 214 => 722.0, + 181 => 500.0, + 236 => 278.0, + 'ohungarumlaut' => 500.0, + 'Eogonek' => 611.0, + 'dcroat' => 500.0, + 190 => 750.0, + 'Scedilla' => 556.0, + 'lcaron' => 344.0, + 'Kcommaaccent' => 722.0, + 'Lacute' => 611.0, + 153 => 980.0, + 'edotaccent' => 444.0, + 204 => 333.0, + 'Imacron' => 333.0, + 'Lcaron' => 611.0, + 189 => 750.0, + 'lessequal' => 549.0, + 244 => 500.0, + 241 => 500.0, + 'Uhungarumlaut' => 722.0, + 201 => 611.0, + 'emacron' => 444.0, + 'gbreve' => 500.0, + 188 => 750.0, + 138 => 556.0, + 'Scommaaccent' => 556.0, + 'Ohungarumlaut' => 722.0, + 176 => 400.0, + 242 => 500.0, + 'Ccaron' => 667.0, + 249 => 500.0, + 'radical' => 453.0, + 'Dcaron' => 722.0, + 'rcommaaccent' => 333.0, + 209 => 722.0, + 245 => 500.0, + 'Rcommaaccent' => 667.0, + 'Lcommaaccent' => 611.0, + 195 => 722.0, + 'Aogonek' => 722.0, + 197 => 722.0, + 213 => 722.0, + 'zdotaccent' => 444.0, + 'Ecaron' => 611.0, + 'Iogonek' => 333.0, + 'kcommaaccent' => 500.0, + 'minus' => 564.0, + 206 => 333.0, + 'ncaron' => 500.0, + 'tcommaaccent' => 278.0, + 172 => 564.0, + 246 => 500.0, + 252 => 500.0, + 'notequal' => 549.0, + 'gcommaaccent' => 500.0, + 240 => 500.0, + 158 => 444.0, + 'ncommaaccent' => 500.0, + 185 => 300.0, + 'imacron' => 278.0, + 128 => 500.0, + ), + 'CIDtoGID_Compressed' => true, + 'CIDtoGID' => 'eJwDAAAAAAE=', + '_version_' => 4, +); \ No newline at end of file diff --git a/application/third_party/dompdf/lib/fonts/ZapfDingbats.afm b/application/third_party/dompdf/lib/fonts/ZapfDingbats.afm new file mode 100755 index 00000000..b2745053 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/ZapfDingbats.afm @@ -0,0 +1,225 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 15:14:13 1997 +Comment UniqueID 43082 +Comment VMusage 45775 55535 +FontName ZapfDingbats +FullName ITC Zapf Dingbats +FamilyName ZapfDingbats +Weight Medium +ItalicAngle 0 +IsFixedPitch false +CharacterSet Special +FontBBox -1 -143 981 820 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Zapf Dingbats is a registered trademark of International Typeface Corporation. +EncodingScheme FontSpecific +StdHW 28 +StdVW 90 +StartCharMetrics 202 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 974 ; N a1 ; B 35 72 939 621 ; +C 34 ; WX 961 ; N a2 ; B 35 81 927 611 ; +C 35 ; WX 974 ; N a202 ; B 35 72 939 621 ; +C 36 ; WX 980 ; N a3 ; B 35 0 945 692 ; +C 37 ; WX 719 ; N a4 ; B 34 139 685 566 ; +C 38 ; WX 789 ; N a5 ; B 35 -14 755 705 ; +C 39 ; WX 790 ; N a119 ; B 35 -14 755 705 ; +C 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ; +C 41 ; WX 690 ; N a117 ; B 34 138 655 553 ; +C 42 ; WX 960 ; N a11 ; B 35 123 925 568 ; +C 43 ; WX 939 ; N a12 ; B 35 134 904 559 ; +C 44 ; WX 549 ; N a13 ; B 29 -11 516 705 ; +C 45 ; WX 855 ; N a14 ; B 34 59 820 632 ; +C 46 ; WX 911 ; N a15 ; B 35 50 876 642 ; +C 47 ; WX 933 ; N a16 ; B 35 139 899 550 ; +C 48 ; WX 911 ; N a105 ; B 35 50 876 642 ; +C 49 ; WX 945 ; N a17 ; B 35 139 909 553 ; +C 50 ; WX 974 ; N a18 ; B 35 104 938 587 ; +C 51 ; WX 755 ; N a19 ; B 34 -13 721 705 ; +C 52 ; WX 846 ; N a20 ; B 36 -14 811 705 ; +C 53 ; WX 762 ; N a21 ; B 35 0 727 692 ; +C 54 ; WX 761 ; N a22 ; B 35 0 727 692 ; +C 55 ; WX 571 ; N a23 ; B -1 -68 571 661 ; +C 56 ; WX 677 ; N a24 ; B 36 -13 642 705 ; +C 57 ; WX 763 ; N a25 ; B 35 0 728 692 ; +C 58 ; WX 760 ; N a26 ; B 35 0 726 692 ; +C 59 ; WX 759 ; N a27 ; B 35 0 725 692 ; +C 60 ; WX 754 ; N a28 ; B 35 0 720 692 ; +C 61 ; WX 494 ; N a6 ; B 35 0 460 692 ; +C 62 ; WX 552 ; N a7 ; B 35 0 517 692 ; +C 63 ; WX 537 ; N a8 ; B 35 0 503 692 ; +C 64 ; WX 577 ; N a9 ; B 35 96 542 596 ; +C 65 ; WX 692 ; N a10 ; B 35 -14 657 705 ; +C 66 ; WX 786 ; N a29 ; B 35 -14 751 705 ; +C 67 ; WX 788 ; N a30 ; B 35 -14 752 705 ; +C 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ; +C 69 ; WX 790 ; N a32 ; B 35 -14 756 705 ; +C 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ; +C 71 ; WX 794 ; N a34 ; B 35 -13 759 705 ; +C 72 ; WX 816 ; N a35 ; B 35 -14 782 705 ; +C 73 ; WX 823 ; N a36 ; B 35 -14 787 705 ; +C 74 ; WX 789 ; N a37 ; B 35 -14 754 705 ; +C 75 ; WX 841 ; N a38 ; B 35 -14 807 705 ; +C 76 ; WX 823 ; N a39 ; B 35 -14 789 705 ; +C 77 ; WX 833 ; N a40 ; B 35 -14 798 705 ; +C 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ; +C 79 ; WX 831 ; N a42 ; B 35 -14 796 705 ; +C 80 ; WX 923 ; N a43 ; B 35 -14 888 705 ; +C 81 ; WX 744 ; N a44 ; B 35 0 710 692 ; +C 82 ; WX 723 ; N a45 ; B 35 0 688 692 ; +C 83 ; WX 749 ; N a46 ; B 35 0 714 692 ; +C 84 ; WX 790 ; N a47 ; B 34 -14 756 705 ; +C 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ; +C 86 ; WX 695 ; N a49 ; B 35 -14 661 706 ; +C 87 ; WX 776 ; N a50 ; B 35 -6 741 699 ; +C 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ; +C 89 ; WX 792 ; N a52 ; B 35 -14 757 705 ; +C 90 ; WX 759 ; N a53 ; B 35 0 725 692 ; +C 91 ; WX 707 ; N a54 ; B 35 -13 672 704 ; +C 92 ; WX 708 ; N a55 ; B 35 -14 672 705 ; +C 93 ; WX 682 ; N a56 ; B 35 -14 647 705 ; +C 94 ; WX 701 ; N a57 ; B 35 -14 666 705 ; +C 95 ; WX 826 ; N a58 ; B 35 -14 791 705 ; +C 96 ; WX 815 ; N a59 ; B 35 -14 780 705 ; +C 97 ; WX 789 ; N a60 ; B 35 -14 754 705 ; +C 98 ; WX 789 ; N a61 ; B 35 -14 754 705 ; +C 99 ; WX 707 ; N a62 ; B 34 -14 673 705 ; +C 100 ; WX 687 ; N a63 ; B 36 0 651 692 ; +C 101 ; WX 696 ; N a64 ; B 35 0 661 691 ; +C 102 ; WX 689 ; N a65 ; B 35 0 655 692 ; +C 103 ; WX 786 ; N a66 ; B 34 -14 751 705 ; +C 104 ; WX 787 ; N a67 ; B 35 -14 752 705 ; +C 105 ; WX 713 ; N a68 ; B 35 -14 678 705 ; +C 106 ; WX 791 ; N a69 ; B 35 -14 756 705 ; +C 107 ; WX 785 ; N a70 ; B 36 -14 751 705 ; +C 108 ; WX 791 ; N a71 ; B 35 -14 757 705 ; +C 109 ; WX 873 ; N a72 ; B 35 -14 838 705 ; +C 110 ; WX 761 ; N a73 ; B 35 0 726 692 ; +C 111 ; WX 762 ; N a74 ; B 35 0 727 692 ; +C 112 ; WX 762 ; N a203 ; B 35 0 727 692 ; +C 113 ; WX 759 ; N a75 ; B 35 0 725 692 ; +C 114 ; WX 759 ; N a204 ; B 35 0 725 692 ; +C 115 ; WX 892 ; N a76 ; B 35 0 858 705 ; +C 116 ; WX 892 ; N a77 ; B 35 -14 858 692 ; +C 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ; +C 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ; +C 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ; +C 120 ; WX 138 ; N a82 ; B 35 0 104 692 ; +C 121 ; WX 277 ; N a83 ; B 35 0 242 692 ; +C 122 ; WX 415 ; N a84 ; B 35 0 380 692 ; +C 123 ; WX 392 ; N a97 ; B 35 263 357 705 ; +C 124 ; WX 392 ; N a98 ; B 34 263 357 705 ; +C 125 ; WX 668 ; N a99 ; B 35 263 633 705 ; +C 126 ; WX 668 ; N a100 ; B 36 263 634 705 ; +C 128 ; WX 390 ; N a89 ; B 35 -14 356 705 ; +C 129 ; WX 390 ; N a90 ; B 35 -14 355 705 ; +C 130 ; WX 317 ; N a93 ; B 35 0 283 692 ; +C 131 ; WX 317 ; N a94 ; B 35 0 283 692 ; +C 132 ; WX 276 ; N a91 ; B 35 0 242 692 ; +C 133 ; WX 276 ; N a92 ; B 35 0 242 692 ; +C 134 ; WX 509 ; N a205 ; B 35 0 475 692 ; +C 135 ; WX 509 ; N a85 ; B 35 0 475 692 ; +C 136 ; WX 410 ; N a206 ; B 35 0 375 692 ; +C 137 ; WX 410 ; N a86 ; B 35 0 375 692 ; +C 138 ; WX 234 ; N a87 ; B 35 -14 199 705 ; +C 139 ; WX 234 ; N a88 ; B 35 -14 199 705 ; +C 140 ; WX 334 ; N a95 ; B 35 0 299 692 ; +C 141 ; WX 334 ; N a96 ; B 35 0 299 692 ; +C 161 ; WX 732 ; N a101 ; B 35 -143 697 806 ; +C 162 ; WX 544 ; N a102 ; B 56 -14 488 706 ; +C 163 ; WX 544 ; N a103 ; B 34 -14 508 705 ; +C 164 ; WX 910 ; N a104 ; B 35 40 875 651 ; +C 165 ; WX 667 ; N a106 ; B 35 -14 633 705 ; +C 166 ; WX 760 ; N a107 ; B 35 -14 726 705 ; +C 167 ; WX 760 ; N a108 ; B 0 121 758 569 ; +C 168 ; WX 776 ; N a112 ; B 35 0 741 705 ; +C 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ; +C 170 ; WX 694 ; N a110 ; B 35 -14 659 705 ; +C 171 ; WX 626 ; N a109 ; B 34 0 591 705 ; +C 172 ; WX 788 ; N a120 ; B 35 -14 754 705 ; +C 173 ; WX 788 ; N a121 ; B 35 -14 754 705 ; +C 174 ; WX 788 ; N a122 ; B 35 -14 754 705 ; +C 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ; +C 176 ; WX 788 ; N a124 ; B 35 -14 754 705 ; +C 177 ; WX 788 ; N a125 ; B 35 -14 754 705 ; +C 178 ; WX 788 ; N a126 ; B 35 -14 754 705 ; +C 179 ; WX 788 ; N a127 ; B 35 -14 754 705 ; +C 180 ; WX 788 ; N a128 ; B 35 -14 754 705 ; +C 181 ; WX 788 ; N a129 ; B 35 -14 754 705 ; +C 182 ; WX 788 ; N a130 ; B 35 -14 754 705 ; +C 183 ; WX 788 ; N a131 ; B 35 -14 754 705 ; +C 184 ; WX 788 ; N a132 ; B 35 -14 754 705 ; +C 185 ; WX 788 ; N a133 ; B 35 -14 754 705 ; +C 186 ; WX 788 ; N a134 ; B 35 -14 754 705 ; +C 187 ; WX 788 ; N a135 ; B 35 -14 754 705 ; +C 188 ; WX 788 ; N a136 ; B 35 -14 754 705 ; +C 189 ; WX 788 ; N a137 ; B 35 -14 754 705 ; +C 190 ; WX 788 ; N a138 ; B 35 -14 754 705 ; +C 191 ; WX 788 ; N a139 ; B 35 -14 754 705 ; +C 192 ; WX 788 ; N a140 ; B 35 -14 754 705 ; +C 193 ; WX 788 ; N a141 ; B 35 -14 754 705 ; +C 194 ; WX 788 ; N a142 ; B 35 -14 754 705 ; +C 195 ; WX 788 ; N a143 ; B 35 -14 754 705 ; +C 196 ; WX 788 ; N a144 ; B 35 -14 754 705 ; +C 197 ; WX 788 ; N a145 ; B 35 -14 754 705 ; +C 198 ; WX 788 ; N a146 ; B 35 -14 754 705 ; +C 199 ; WX 788 ; N a147 ; B 35 -14 754 705 ; +C 200 ; WX 788 ; N a148 ; B 35 -14 754 705 ; +C 201 ; WX 788 ; N a149 ; B 35 -14 754 705 ; +C 202 ; WX 788 ; N a150 ; B 35 -14 754 705 ; +C 203 ; WX 788 ; N a151 ; B 35 -14 754 705 ; +C 204 ; WX 788 ; N a152 ; B 35 -14 754 705 ; +C 205 ; WX 788 ; N a153 ; B 35 -14 754 705 ; +C 206 ; WX 788 ; N a154 ; B 35 -14 754 705 ; +C 207 ; WX 788 ; N a155 ; B 35 -14 754 705 ; +C 208 ; WX 788 ; N a156 ; B 35 -14 754 705 ; +C 209 ; WX 788 ; N a157 ; B 35 -14 754 705 ; +C 210 ; WX 788 ; N a158 ; B 35 -14 754 705 ; +C 211 ; WX 788 ; N a159 ; B 35 -14 754 705 ; +C 212 ; WX 894 ; N a160 ; B 35 58 860 634 ; +C 213 ; WX 838 ; N a161 ; B 35 152 803 540 ; +C 214 ; WX 1016 ; N a163 ; B 34 152 981 540 ; +C 215 ; WX 458 ; N a164 ; B 35 -127 422 820 ; +C 216 ; WX 748 ; N a196 ; B 35 94 698 597 ; +C 217 ; WX 924 ; N a165 ; B 35 140 890 552 ; +C 218 ; WX 748 ; N a192 ; B 35 94 698 597 ; +C 219 ; WX 918 ; N a166 ; B 35 166 884 526 ; +C 220 ; WX 927 ; N a167 ; B 35 32 892 660 ; +C 221 ; WX 928 ; N a168 ; B 35 129 891 562 ; +C 222 ; WX 928 ; N a169 ; B 35 128 893 563 ; +C 223 ; WX 834 ; N a170 ; B 35 155 799 537 ; +C 224 ; WX 873 ; N a171 ; B 35 93 838 599 ; +C 225 ; WX 828 ; N a172 ; B 35 104 791 588 ; +C 226 ; WX 924 ; N a173 ; B 35 98 889 594 ; +C 227 ; WX 924 ; N a162 ; B 35 98 889 594 ; +C 228 ; WX 917 ; N a174 ; B 35 0 882 692 ; +C 229 ; WX 930 ; N a175 ; B 35 84 896 608 ; +C 230 ; WX 931 ; N a176 ; B 35 84 896 608 ; +C 231 ; WX 463 ; N a177 ; B 35 -99 429 791 ; +C 232 ; WX 883 ; N a178 ; B 35 71 848 623 ; +C 233 ; WX 836 ; N a179 ; B 35 44 802 648 ; +C 234 ; WX 836 ; N a193 ; B 35 44 802 648 ; +C 235 ; WX 867 ; N a180 ; B 35 101 832 591 ; +C 236 ; WX 867 ; N a199 ; B 35 101 832 591 ; +C 237 ; WX 696 ; N a181 ; B 35 44 661 648 ; +C 238 ; WX 696 ; N a200 ; B 35 44 661 648 ; +C 239 ; WX 874 ; N a182 ; B 35 77 840 619 ; +C 241 ; WX 874 ; N a201 ; B 35 73 840 615 ; +C 242 ; WX 760 ; N a183 ; B 35 0 725 692 ; +C 243 ; WX 946 ; N a184 ; B 35 160 911 533 ; +C 244 ; WX 771 ; N a197 ; B 34 37 736 655 ; +C 245 ; WX 865 ; N a185 ; B 35 207 830 481 ; +C 246 ; WX 771 ; N a194 ; B 34 37 736 655 ; +C 247 ; WX 888 ; N a198 ; B 34 -19 853 712 ; +C 248 ; WX 967 ; N a186 ; B 35 124 932 568 ; +C 249 ; WX 888 ; N a195 ; B 34 -19 853 712 ; +C 250 ; WX 831 ; N a187 ; B 35 113 796 579 ; +C 251 ; WX 873 ; N a188 ; B 36 118 838 578 ; +C 252 ; WX 927 ; N a189 ; B 35 150 891 542 ; +C 253 ; WX 970 ; N a190 ; B 35 76 931 616 ; +C 254 ; WX 918 ; N a191 ; B 34 99 884 593 ; +EndCharMetrics +EndFontMetrics diff --git a/application/third_party/dompdf/lib/fonts/dompdf_font_family_cache.dist.php b/application/third_party/dompdf/lib/fonts/dompdf_font_family_cache.dist.php new file mode 100755 index 00000000..d634e889 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/dompdf_font_family_cache.dist.php @@ -0,0 +1,92 @@ + array ( + 'normal' => DOMPDF_FONT_DIR . 'Helvetica', + 'bold' => DOMPDF_FONT_DIR . 'Helvetica-Bold', + 'italic' => DOMPDF_FONT_DIR . 'Helvetica-Oblique', + 'bold_italic' => DOMPDF_FONT_DIR . 'Helvetica-BoldOblique' + ), + 'times' => array ( + 'normal' => DOMPDF_FONT_DIR . 'Times-Roman', + 'bold' => DOMPDF_FONT_DIR . 'Times-Bold', + 'italic' => DOMPDF_FONT_DIR . 'Times-Italic', + 'bold_italic' => DOMPDF_FONT_DIR . 'Times-BoldItalic' + ), + 'times-roman' => array ( + 'normal' => DOMPDF_FONT_DIR . 'Times-Roman', + 'bold' => DOMPDF_FONT_DIR . 'Times-Bold', + 'italic' => DOMPDF_FONT_DIR . 'Times-Italic', + 'bold_italic' => DOMPDF_FONT_DIR . 'Times-BoldItalic' + ), + 'courier' => array ( + 'normal' => DOMPDF_FONT_DIR . 'Courier', + 'bold' => DOMPDF_FONT_DIR . 'Courier-Bold', + 'italic' => DOMPDF_FONT_DIR . 'Courier-Oblique', + 'bold_italic' => DOMPDF_FONT_DIR . 'Courier-BoldOblique' + ), + 'helvetica' => array ( + 'normal' => DOMPDF_FONT_DIR . 'Helvetica', + 'bold' => DOMPDF_FONT_DIR . 'Helvetica-Bold', + 'italic' => DOMPDF_FONT_DIR . 'Helvetica-Oblique', + 'bold_italic' => DOMPDF_FONT_DIR . 'Helvetica-BoldOblique' + ), + 'zapfdingbats' => array ( + 'normal' => DOMPDF_FONT_DIR . 'ZapfDingbats', + 'bold' => DOMPDF_FONT_DIR . 'ZapfDingbats', + 'italic' => DOMPDF_FONT_DIR . 'ZapfDingbats', + 'bold_italic' => DOMPDF_FONT_DIR . 'ZapfDingbats' + ), + 'symbol' => array ( + 'normal' => DOMPDF_FONT_DIR . 'Symbol', + 'bold' => DOMPDF_FONT_DIR . 'Symbol', + 'italic' => DOMPDF_FONT_DIR . 'Symbol', + 'bold_italic' => DOMPDF_FONT_DIR . 'Symbol' + ), + 'serif' => array ( + 'normal' => DOMPDF_FONT_DIR . 'Times-Roman', + 'bold' => DOMPDF_FONT_DIR . 'Times-Bold', + 'italic' => DOMPDF_FONT_DIR . 'Times-Italic', + 'bold_italic' => DOMPDF_FONT_DIR . 'Times-BoldItalic' + ), + 'monospace' => array ( + 'normal' => DOMPDF_FONT_DIR . 'Courier', + 'bold' => DOMPDF_FONT_DIR . 'Courier-Bold', + 'italic' => DOMPDF_FONT_DIR . 'Courier-Oblique', + 'bold_italic' => DOMPDF_FONT_DIR . 'Courier-BoldOblique' + ), + 'fixed' => array ( + 'normal' => DOMPDF_FONT_DIR . 'Courier', + 'bold' => DOMPDF_FONT_DIR . 'Courier-Bold', + 'italic' => DOMPDF_FONT_DIR . 'Courier-Oblique', + 'bold_italic' => DOMPDF_FONT_DIR . 'Courier-BoldOblique' + ) +) + +/* The proper way for web browser environment independent font handling in html/css is, + * to defining a font search path ending in serif, sans-serif, or monospace, e.g.: + * + * + * For more satisfying results on html files without proper font search path, + * popular fonts which are candidates for further font aliases similar to + * 'sans-serif' and 'helvetica' above might be: + * + * See + * http://www.codestyle.org/css/font-family/index.shtml + * http://mondaybynoon.com/2007/04/02/linux-font-equivalents-to-popular-web-typefaces/ + * C:\Windows\Fonts + * + * Times: + * serif, times, times-roman, times, times new roman, georgia, garamond, ms reference serif, + * palatino, palatino linotype, dejavu serif, freeserif, liberation serif, luxi serif, + * century schoolbook, new century schoolbook + * + * Helvetica: + * sans-serif, helvetica, helvetica, microsoft sans serif, verdana, arial, tahoma, + * trebuchet ms, lucida sans, ms reference sans serif, lucida grande, freesans, + * liberation sans, dejavu sans, luxi sans, lucida + * + * Courier: + * monospace, fixed, courier, courier new, lucida console, lucida sans typewriter, freeMono, + * fixed, terminal, dejavu sans mono, liberation mono, luxi mono + */ + +?> \ No newline at end of file diff --git a/application/third_party/dompdf/lib/fonts/log.htm b/application/third_party/dompdf/lib/fonts/log.htm new file mode 100755 index 00000000..9ae8bef3 --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/log.htm @@ -0,0 +1 @@ +12,032 KB 920.3300 ms
\ No newline at end of file diff --git a/application/third_party/dompdf/lib/fonts/mustRead.html b/application/third_party/dompdf/lib/fonts/mustRead.html new file mode 100755 index 00000000..b9f4ba2a --- /dev/null +++ b/application/third_party/dompdf/lib/fonts/mustRead.html @@ -0,0 +1,17 @@ + + + + + Core 14 AFM Files - ReadMe + + + or + + + + + +
This file and the 14 PostScript(R) AFM files it accompanies may be used, copied, and distributed for any purpose and without charge, with or without modification, provided that all copyright notices are retained; that the AFM files are not distributed without this file; that all modifications to this file or any of the AFM files are prominently noted in the modified file(s); and that this paragraph is not modified. Adobe Systems has no responsibility or obligation to support the use of the AFM files. Col
+

Source http://www.adobe.com/devnet/font/#pcfi

+ + \ No newline at end of file diff --git a/application/third_party/dompdf/lib/res/broken_image.png b/application/third_party/dompdf/lib/res/broken_image.png new file mode 100755 index 0000000000000000000000000000000000000000..eda02feb81f99ed50d26a6d75201adc4abe44edf GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1SGfcUswyII14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sf6%I}&MWK>~4&p!|*%H@?66gHf+|;}h2Ir#G#FEq$h4Rdj426)4R0VfW-+=ci zs(C<#jh-%!Ar-gQUUuYbQQ&EPxPS7Of12vAcHXcFf4m?>IW2GU=JS^4KU>(YwyzZE7zR&Q KKbLh*2~7YiRcFrt literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/lib/res/html.css b/application/third_party/dompdf/lib/res/html.css new file mode 100755 index 00000000..d8aa95f9 --- /dev/null +++ b/application/third_party/dompdf/lib/res/html.css @@ -0,0 +1,427 @@ +/** + * DOMPDF - PHP5 HTML to PDF renderer + * + * File: $RCSfile: html.css,v $ + * Created on: 2004-08-04 + * + * Copyright (c) 2004 - Benj Carson + * 1998 - Netscape Communications Corporation + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Originally from mozilla (http://www.mozilla.org). Original code was + * licensed under the NPL, with the option of release under the GPL or LGPL. + * This file is hence released under the LGPL. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Blake Ross + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + * @version 0.3 + */ + +/* $Id: html.css,v 1.4 2006-04-05 20:09:00 benjcarson Exp $ */ + +@page { + margin: 1.2cm; +} + +html { + display: -dompdf-page; + counter-increment: page; +} + +/* blocks */ + +div, map, dt, isindex { + display: block; +} + +body { + page-break-before: avoid; + display: block; +} + +p, dl, multicol { + display: block; + margin: 1em 0; +} + +dd { + display: block; + margin-left: 40px; +} + +blockquote { + display: block; + margin: 1em 40px; +} + +address { + display: block; + font-style: italic; +} + +center { + display: block; + text-align: center; +} + +blockquote[type=cite] { + display: block; + margin: 1em 0px; + padding-left: 1em; + border-left: solid; + border-color: blue; + border-width: thin; +} + +h1, h2, h3, h4, h5, h6 { + display: block; + font-weight: bold; +} + +h1 { + font-size: 2em; + margin: .67em 0; +} + +h2 { + font-size: 1.5em; + margin: .83em 0; +} + +h3 { + font-size: 1.17em; + margin: 1em 0; +} + +h4 { + margin: 1.33em 0; +} + +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} + +h6 { + font-size: 0.67em; + margin: 2.33em 0; +} + +listing { + display: block; + font-family: fixed; + font-size: medium; + white-space: pre; + margin: 1em 0; +} + +plaintext, xmp, pre { + display: block; + font-family: fixed; + white-space: pre; + margin: 1em 0; +} + +/* tables */ + +table { + display: table; + border-spacing: 2px; + border-collapse: separate; + margin-top: 0; + margin-bottom: 0; + text-indent: 0; + text-align: left; /* quirk */ +} + +table[border] { + border-style: outset; + border-color: gray; +} + +/* This won't work (???) */ +/* +table[border] td, +table[border] th { + border: 1pt solid grey; +}*/ + +/* make sure backgrounds are inherited in tables -- see bug 4510 */ +td, th, tr { + background: inherit; +} + +/* caption inherits from table not table-outer */ +caption { + display: table-caption; + text-align: center; +} + +tr { + display: table-row; + vertical-align: inherit; +} + +col { + display: table-column; +} + +colgroup { + display: table-column-group; +} + +tbody { + display: table-row-group; + vertical-align: middle; +} + +thead { + display: table-header-group; + vertical-align: middle; +} + +tfoot { + display: table-footer-group; + vertical-align: middle; +} + +/* To simulate tbody auto-insertion */ +table > tr { + vertical-align: middle; +} + +td { + display: table-cell; + vertical-align: inherit; + text-align: inherit; + padding: 1px; +} + +th { + display: table-cell; + vertical-align: inherit; + font-weight: bold; + padding: 1px; + text-align: center; +} + +/* inlines */ +q { + quotes: '"' '"' "'" "'"; /* FIXME only the first level is used */ +} + +q:before { + content: open-quote; +} + +q:after { + content: close-quote; +} + +a:link { + color: #00c; + text-decoration: underline; +} + +b, strong { + font-weight: bolder; +} + +i, cite, em, var, dfn { + font-style: italic; +} + +tt, code, kbd, samp { + font-family: fixed; +} + +u, ins { + text-decoration: underline; +} + +s, strike, del { + text-decoration: line-through; +} + +blink { + text-decoration: blink; +} + +big { + font-size: larger; +} + +small { + font-size: smaller; +} + +sub { + vertical-align: sub; + font-size: smaller; + line-height: normal; +} + +sup { + vertical-align: super; + font-size: smaller; + line-height: normal; +} + +nobr { + white-space: nowrap; +} + +/* lists */ + +ul, menu, dir { + display: block; + list-style-type: disc; + margin: 1em 0; + padding-left: 40px; +} + +ol { + display: block; + list-style-type: decimal; + margin: 1em 0; + padding-left: 40px; +} + +li { + display: list-item; +} + +/* nested lists have no top/bottom margins */ +ul ul, ul ol, ul dir, ul menu, ul dl, +ol ul, ol ol, ol dir, ol menu, ol dl, +dir ul, dir ol, dir dir, dir menu, dir dl, +menu ul, menu ol, menu dir, menu menu, menu dl, +dl ul, dl ol, dl dir, dl menu, dl dl { + margin-top: 0; + margin-bottom: 0; +} + +/* 2 deep unordered lists use a circle */ +ol ul, ul ul, menu ul, dir ul, +ol menu, ul menu, menu menu, dir menu, +ol dir, ul dir, menu dir, dir dir { + list-style-type: circle; +} + +/* 3 deep (or more) unordered lists use a square */ +ol ol ul, ol ul ul, ol menu ul, ol dir ul, +ol ol menu, ol ul menu, ol menu menu, ol dir menu, +ol ol dir, ol ul dir, ol menu dir, ol dir dir, +ul ol ul, ul ul ul, ul menu ul, ul dir ul, +ul ol menu, ul ul menu, ul menu menu, ul dir menu, +ul ol dir, ul ul dir, ul menu dir, ul dir dir, +menu ol ul, menu ul ul, menu menu ul, menu dir ul, +menu ol menu, menu ul menu, menu menu menu, menu dir menu, +menu ol dir, menu ul dir, menu menu dir, menu dir dir, +dir ol ul, dir ul ul, dir menu ul, dir dir ul, +dir ol menu, dir ul menu, dir menu menu, dir dir menu, +dir ol dir, dir ul dir, dir menu dir, dir dir dir { + list-style-type: square; +} + +/* forms */ + +/* +input[type=text] { + border: 1pt solid black; + background-color: white; +} + +input[type=text]:before { + content: attr(value); +}*/ + +fieldset { + display: block; + margin-left: 2px; + margin-right: 2px; + padding: 0.35em 0.625em 0.75em; + border: 1pt groove #666; +} + +fieldset > legend { + padding-left: 2px; + padding-right: 2px; + min-width: 1em; + max-width: none; + height: auto; + min-height: 0; + max-height: none; + white-space: nowrap; + margin-top: -1.0em; + background: white; +} + +legend { + display: inline-block; +} + + +/* leafs */ + +hr { + display: block; + height: 2px; + border: 1px inset; + margin: 0.5em auto 0.5em auto; +} + +iframe { + border: 2px inset; +} + +noframes { + display: none; +} + +br { + display: -dompdf-br; +} + +img, img_generated { + display: -dompdf-image; +} + +dompdf_generated { + display: inline; +} + +/* hidden elements */ +area, base, basefont, head, meta, script, style, title, +noembed, noscript, param { + display: none; +} \ No newline at end of file diff --git a/application/third_party/dompdf/lib/ttf2ufm/README.TXT b/application/third_party/dompdf/lib/ttf2ufm/README.TXT new file mode 100755 index 00000000..be9839b6 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/README.TXT @@ -0,0 +1,24 @@ +To embed TrueType fonts (.TTF) files, you need to extract the font metrics and +build the required tables using the provided utility (/fonts/ttf2ufm). + +TTF2UFM is a modified version of Mark Heath's TTF 2 PT1 converter +(http://ttf2pt1.sourceforge.net/) by Steven Wittens +(http://www.acko.net/blog/ufpdf). ttf2ufm, is included in /ttf2ufm-src. +The /fonts/ttf2ufm folder contains a compiled Windows binary. +TTF 2 UFM is identical to TTF 2 PT1 except that it also generates a .ufm file +for usage with makefontuni.php. + + +Setting up a Truetype font for usage with TCPDF: + 1) Generate the font's .ufm metrics file by processing it with the provided + ttf2ufm program (modified ttf2pt1). For example: + $ ttf2ufm -a -F myfont.ttf + 2) Run makefontuni.php with the .ttf and .ufm filenames as argument: + $ php -q makefontuni.php myfont.ttf myfont.ufm + 3) Copy the resulting .php, .z and .ctg.z file to the TCPDF font directory. + 4) Rename php font files variations for bold and italic using the following schema: + [basic-font-name]b.php for bold variation + [basic-font-name]i.php for oblique variation + [basic-font-name]bi.php for bold oblique variation + 5) Convert all fonts filenames to lowercase. + \ No newline at end of file diff --git a/application/third_party/dompdf/lib/ttf2ufm/bin/ttf2ufm.exe b/application/third_party/dompdf/lib/ttf2ufm/bin/ttf2ufm.exe new file mode 100755 index 0000000000000000000000000000000000000000..ad6235927c651d0045468a251f99890cf6578472 GIT binary patch literal 355187 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­v$ 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 R_dA;%rhWp$#2osr{|CAdCCmT- literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/CHANGES b/application/third_party/dompdf/lib/ttf2ufm/src/CHANGES new file mode 100755 index 00000000..e69de29b diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/CHANGES.html b/application/third_party/dompdf/lib/ttf2ufm/src/CHANGES.html new file mode 100755 index 00000000..c638b6d4 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/CHANGES.html @@ -0,0 +1,815 @@ + + + +TTF2PT1 - CHANGES history + + + +

+TTF2PT1 - CHANGES history +

+ + + +

+3.4.4 -- December 31, 2003 +

+ + +New features: +
    +
  • Improved the auto-vectoring (-OV) alrogithm. +
  • Allow use of any encoding table of format 4 in the ttf parser. +
  • Take the first available format 4 encoding table if no known + table is found in the ttf parser. +
  • The ttf parser lists the available encodings if no supported + encoding table is found. This can be used to list the encodings in + any font by specifying a bogus explicit PID/EID, such as + with option -l plane+pid=50,eid=50. +
+ +Bug fixes: +
    +
  • Fix to build all the features on Windows MS C++, by Tomoo Amano. +
  • Fix for a null pointer in the encodings, bad inner loop variable. +
  • Unified the parsing of font name strings and improved the checks + against invalid characters. +
+ +

+3.4.3 -- December 2, 2002 +

+ + +New features: +
    +
  • scripts/forceiso got an optional argument to select the + format of the names for glyphs without standard Latin-1 names. +
+ +Bug fixes: +
    +
  • Changed the glyph names in scripts/forceiso to match those in ttf2pt1. +
  • Included the missing directory app/TeX. +
+ +

+3.4.2 -- August 30, 2002 +

+ + +New features: +
    +
  • New map for T2A_compat encoding (for Cyrillic LaTeX) by Mikhail + Umorin. +
  • Scripts supporting font conversion for CJK-LaTeX, by Mike Fabian + from SuSE. +
+ +Bug fixes: +
    +
  • Explicit owner/group/permissions are used to install directories. +
  • In scripts/convert fixed the addition of encoding name to the font + name for the external encoding maps, was missing "/" at the start. +
  • Fixed the divergence between two copies of UniqueID. +
  • Fixed the recovery after defective empty contours. +
+ +

+3.4.1 -- June 13, 2002 +

+ + +New features: +
    +
  • Added Autotrace support for the bitmap fonts (-OZ). It's horrible. +
  • Added vectorization of bitmap fonts (-OV) - functionally the same thing as + autotrace but home-grown. Works mostly decently but still with large + space for impprovement. +
  • Relaxed the conditions for warnings about long glyphs. +
+ +Bug fixes: +
    +
  • Fix by Rob Kolstad for a crash in the new outline smoothing + code (on small thin contours) and diagnostic for another crash. +
  • Fix by Holger Huesing for a crash on degenerate contours. +
  • Fix for bitmaps of zero dimensions. +
  • The BDF reader does not fail on redefintion of the properties. +
  • Fix for reading of BDF glyphs with 0 size. +
  • Fix for a hang when guessing the boldness of some fonts. +
  • Fix by Adriano Konzen for scaling coefficients in composite glyphs. +
+ +

+3.4.0 -- November 24, 2001 +

+ + +New features: +
    +
  • Parser for the BDF bitmap fonts. +
  • Vastly improved the smoothing of the outlines. +
  • The options are saved as a comment in the output file. +
  • New script other/showdf for visual comparison of the fonts. +
  • New option -G to select the file types to generate. +
  • Creation of the dvips encoding files (by Rigel). +
  • More glyphs in the Chinese maps (by Rigel). +
  • Made the assignment of ISO8859/1 glyph names to the glyphs in the + fonts without PostScript names in them dependent on the original + encoding: no change for the 8-bit encodings, for the Unicode encoding + the names are assigned to the glyph with the codes 0-255 in Unicode, + and for the other 16-bit encodings the 8859/1 names are not assigned + at all. +
+ +Bug fixes: +
    +
  • Added a check for spaces in the PostScript font name in the FreeType + parser. +
  • Made "-" a valid character in the glyph names. +
  • Fixed handling of the Unicode names returned by FreeType, though + not perfectly. +
  • Changed the build for FreeType-2.0.4. +
  • Fixed the handling and printing of bad glyph names. +
  • Fixed the bug with duplicated glyph names when more than 256 glyphs are + extracted from a font that has no PostScript glyph names defined. +
  • Added ability to map a glyph to more than one code when unisng the + native parser (-pttf). +
+ +

+3.3.5 -- September 12, 2001 +

+ + +Packaged by Sergey Babkin. +

+ +Bug fixes: +

    +
  • Fixed the scaling of Ascender and Descender in the AFM file. +
  • Fixed the brekage of "-l adobestd". +
+ +

+3.3.4 -- June 4, 2001 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

+ +Bug fixes: +
    +
  • TH: Print out metrics of un-encoded glyphs even without "-a" option. +
  • Added missing "/" in Fontmap generation in convert (by Zvezdan Petkovic). +
  • Removed unneccessary "\n" in messages in x2gs. +
  • Removed the broken overoptimisation of "0 0 rmoveto". +
  • Removed the useless warnings about multiple codes for a glyph. +
  • Changed the FreeType2 include directory in the Makefile to match the + FreeType's default. +
+ +

+3.3.3 -- March 4, 2001 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • TH: Added printing of front-end parser in the header of the font file. +
  • Tested build with FreeType 2.0 Release. +
+ +Bug fixes: +
    +
  • Changed the installation script which on some versions of bash + copied all files into the share directory. +
  • Fixed the close sequences of html2man comments in the HTML files, + now they should display correctly with lynx. +
  • Restored the ability to include un-encoded characters into the + customised maps (those with codes over 255). +
  • Fixed the Unicode mapping of the Cyrillic letters "YO" and "yo" + (by Yuri Shemanin). +
  • Fixed the spurious aborts when the conversion-by-plane function + gets called for auto-guessing of encoding. +
+ +

+3.3.2 -- November 20, 2000 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • Added generation of man pages. +
  • Added "make install" and "make uninstall". +
  • Added language option "-l plane". +
  • In other/showg added better support of comparison files: +
      +
    • printing of the comparison file legend; +
    • guessing of missing glyph names in a comparison file by code; +
    • bounding boxes of all comparison files are used for page layout. +
    +
  • Added ability to use external t1asm instead of compiling it in. +
  • Renamed the fonts installation guide from INSTALL*html to FONTS*html + to avoid confusion with installation of ttf2pt1 itself. +
+ +Bug fixes: +
    +
  • Removed erroneous extra fclose(pfa_file). +
  • Fixed random memory corruption that manifested with crash on Linux + when converting fonts not containing glyph names. +
  • Removed from the output file the comments that confused dvips. Changed + other/showg to work without them. +
  • In other/showg added better checks for missing glyphs, now it + gives warnings about them and the output file does not crash PostScript. +
+ +Other: +
    +
  • ttf2pfa is no longer included, people interested in history + should look for it in the older versions. +
+ +

+3.3.1 -- October 22, 2000 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • Added front-end parser based on the FreeType-2 library. See Makefile +for build instructions. +
  • Changed the handling of encodings to accomodate the FreeType model. +
  • Further cleaned up the front-end parser interface. +
+ +Bug fixes: +
    +
  • Fixed a bug that caused core dump on Alpha machines. +
  • Fixed a bug in the outline smoothing that occasionally caused core dump. +
  • Cleaned up warnings from picky compilers +
  • Fixed more bugs in the Windows port (by Stefan Bauer). +
  • Fixed the RPM spec file (suggested by Brian Armstrong). +
+

+ +

+3.3.0 -- September 22, 2000 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • Converted most of the outlines' processing to floating point +arithmetic. +
  • Added splitting of curves crossing the quadrant boundaries (no gross +damage is done any more to the Marvosym font and others like it). +
  • Added modular interface for front-end font parsers and option to control +their selection at run time. +
  • Grouped the outline processing control options into one to reduce the +options namespace pollution. +
  • Thomas moved the Chinese maps into a separate module, chinese-maps. +
  • Thomas added option -V to print version number. In addition, the version +number is put in the header of the font file. +
  • Added long option names (suggested by Thomas). +
  • Added support for multi-level composite glyphs. +
  • TH: Made <fontname> command-line argument optional; default to <ttf-file> +with suffix replaced. +
  • In other/showg added more ways to specify glyphs and the comparison option. +
+ +Bug fixes: +
    +
  • Fixed the VC++ batch file, added batch file for Cygnus GCC on Windows. +
  • Removed parentheses from the Version string in AFM files because it does +not help StarOffice anyway. StarOffice 5.2 has been reported to have this +bug fixed. Added paragraph on StarOffice in FONTS.html. +
  • Made messages on the '?' option parameter more meaningful (by Johan Vromans). +
  • Changed the latin1 encoding table to include the Euro sign, Z and z with +caron (by Thomas Henlich). +
  • Improved the smoothing code which occasionally had problems with +joining curves. Also fixed a few minor bugs in it. +
+ +

+3.22 -- May 23, 2000 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • Included windows support by Frank Siegert (somewhat amended) +
  • Added control over verbosity of warnings. +
  • Added arguments and initialization functions to the language +translation routines. +
  • Added support of planes determined by arguments to the external +maps. +
  • Added compact external maps format (primarily for Eastern fonts). +
  • Added external maps for Chinese GBK and Big5 encodings (converted +from ttf2pfb) as well as maps for other Chinese encodings by Wang Lei. +
  • Added the idea of buckets to speed up the search in external maps. +
  • Changed the grouping algorithm for substituted hints: now it creates +a bit bigger files but requires smaller hint stack when being rendered. +
  • Added maximal limit of hint stack depth, glyphs requiring bigger +stack get generation of substituted hints disabled. This makes substituted +hints safe to use, no more lost glyphs due to hint stack overflow. +
  • Added the font dump program other/dumpf. +
  • Changed the testing HTML generator other/lst.pl to use tables. +
  • Added debugging script other/cntstems.pl to count required hint +stack depth for the glyphs. +
+ +Bug fixes: +
    +
  • Fixed printing of UID in script/trans. Changed the auto-generated UID to +be in range 4000000-4999999 which is reserved by Adobe for private use. +
  • Fixed handling of "cleartomark" in built-in t1asm. +
  • Added handling of "can't happen" case in straighten() routine +which actually happened on strange fonts and caused failure on assertion. +
  • Made it always include the glyph .notdef in the resulting font. +
  • Placed the version string in AFM file in parentheses, hopefully +that would fix the problem with StarOffice. +
  • Improved the smoothing code which occasionally had problems with +joining curves. +
+ +

+3.21 -- March 1, 2000 +

+ + +Sergey Babkin: committed the changes by Petr Titera and +my bugfixes. +

+ +New features: +

    +
  • New Unicode map format with glyph names, by Petr Titera. +
  • Option to force the Unicode encoding by Petr Titera + (I changed it to work on any MS encoding, not only Symbol). +
  • Slightly tweaked the calculation of hints, should be better now. +
+ +Bug fixes: +
    +
  • The unicode-sample.map with description of the map formats + was lost in the release process, restored and enhanced. +
  • Renamed the table ISOLatin1Encoding to Fmt3Encoding to reflect + the way it is used. Saved the original one for reference + purposes. In the new table renamed "quoteright" to "quotesingle" + as Thomas Henlich suggested (and he were right). +
  • In the ISOLatinEncoding table renamed the glyph "grave" + at octal 0140 to "quoteleft", "quotesingle" at octal 047 to + "quoteright" to conform to the standard as suggested by + Martin Trautner). +
  • Fixed bug in scripts/trans that corrupted the UniqueID record + in the translated fonts. +
  • Fixed bug in interaction of substituted hints with BlueZones. + Now the fonts with hint substitution seem to be always at least + not worse than without it (well, when they fit in the X11 + file size limit). +
+ + +

+3.2 -- January 15, 2000 +

+ + +Sergey Babkin: combined my changes with the changes by +Thomas Henlich. The result deserves a not-so-minor version +increase. +

+ +New features: +

    +
  • Support of the external Unicode re-encoding maps + (by Thomas). +
  • Support for inclusion of all the glyphs from the + source file into the resulting file (inspired by + Thomas but I re-implemented it to remove the limitation + of his implementation: not more than 1024 glyphs). +
  • The hints substitution. It's an experimental feature + yet and needs further work. +
  • Support for UniqueID and its auto-generation. +
  • Support for the name-based conversions from Unicode + in general and the adobestd "language" in particular. +
  • Started the split of the source code into multiple + files. This needs more work to do it in a cleaner + way. +
  • Better framework for the debugging printout + in the converter. +
  • Utilities to install the fonts in Netscape + Navigator/Communicator 4.x. +
  • Patches for bigger font files in the X11 rasterizer. +
  • Linux RPM spec-file (by Johan Vromans). +
  • Added the COPYRIGHT file (BSD-style, as we discussed + on the mailing list earlier) and the CHANGES file. +
  • Creation of the .pfb files from the convert + script. +
  • Changed the .notdef-s in the built-in + ISOLatin1Encoding table to some valid names (by Thomas). + Thomas also suggested replacing `quoteright' by + `quotesingle' but this seems to be against the + Adobe ISOLatin1 table. +
  • New aliases windows-1251 and cp-866 for + the Russian encodings: those are expected by Netscape + navigator. +
  • The font comparison program other/cmpf. +
  • The "magnifying glass" program for glyph outlines: + other/showg. +
  • Other updates of the tools in the `other' subdirectory. +
  • Added a link to T1LIB in README. +
  • A few new options in convert.cfg. +
+ +Bux fixes: +
    +
  • A bug in the outline smoothing code that corrupted some + of the fonts (for example, Microsoft Verdana). +
  • Added explicit `cleartomark' to the end of file, + this seems to be compatible with both old and new version + of t1asm (suggested by Thomas). +
  • Added the FontEncoding statement to the AFM files + (techincally this was not a bug because this statement + is optional but some programs want it). +
  • A coredump when the converter tried to print a warning + (rather ironically) about a weird glyph width. +
  • Changed the underscores in the font names to dashes (this + has been proposed long time ago by Johan Vromans). +
  • No more glyph names of font names staring with a digit. +
  • The names of the fonts in font and AFM files are now the + same as in the generated Ghostscript Fontmap file.
    + Warning: the names in Fontmap have been + changed. +
  • The forceiso script does not corrupt the character + and kerning pairs counts any more, and is optional at all. +
  • Fix for a loop going to 254 instead of 255 (by Thomas). +
  • Added ':' in the font header (by Thomas). +
  • A coredump when wrong language name is given (this was + also fixed by Thomas but I noticed it too late, after + I already fixed it by myself). +
  • Fixed the links to the Adobe documents in README. +
+ + +

+3.13 -- October 18, 1999 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • New option -v for automatic re-scaling based on the vertical size of the font +
  • Changed the code to use getopt() instead of a home-made version of it. +
  • Latin2 language support by Szalay Tamas. +
+ +Bux fixes: +
    +
  • Fix for the bug that made possible calls of malloc(0). +
  • Refinement of the option -w to prevent extra wide spacing +
+ +

+3.12 -- October 2, 1999 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • Added support for the Bulgarian language (actually, for now just an alias +of Russian). +
  • Added option -w that tries to make sure that the character widths are not +too narrow. +
  • Added the concept of aliased encodings. +
  • Now the conversion scripts create and install the .afm files too. +
  • The conversion script removes the intermediate files after installation. +
  • Added tunables to the conversion script. +
  • Installation of the Ghostscript fonts can now be done automatically +together with the X11 fonts. +
+ +Bux fixes: +
    +
  • (FINALLY!!!) A correct fix for the infamous Red Hat 6.0 stdio "feature". +
  • A number of little bugs discovered by a picky SGI compiler (well, maybe +some day I'll try to run it through the UnixWare lint and see what happens). +
  • A diagnostic message about the empty encodings in the convert script was +made less cryptic and a bug in the awk sub-script was fixed. +
  • The .afm creation code now considers the option -t. +
+ +

+3.11 -- May 24, 1999 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • It includes the Turkish (Latin5, ISO8859/9) +language support by Turgut Uyar and Baltic (ISO8859/4) languages support by +Rihardas Hepas. +
  • Also the installation script got updated: the configuration parameters +are moved to a separate file and the generated fonts.dir files should now be +compatible with Xfsft. +
+ +

+3.1 -- March 28, 1999 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • Improved the interaction of the character-level hints and font-level hints +
+ + +

+3.0 -- March 6, 1999 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • Added HTML documents. +
+ +

+3.0beta2 -- February 14, 1999 +

+ + +Packaged by Sergey Babkin. +

+ +New features: +

    +
  • Added ability to print the .afm file instead of the font to STDOUT. +
  • Added the guessing of the /ForceBold parameter that proved to be useful. +
+ +Bux fixes: +
    +
  • Removed the force-fixed option that proved to be troublesome. +
+ +

+3.0beta1 -- December 11, 1998 +

+ + +By Andrew Weeks. +

+ +New features: +

    +
  • Added option (passed to t1asm) to create a compressed binary +version of the font (A PFB file). +
+ +Bux fixes: +
    +
  • Versions of handle_post and handle_cmap that deal with some +problems with buggy fonts. +
  • Minor Bug Fixes. +
+ +

+3.0beta-afm -- December 5, 1998 +

+ + +By Thomas Henlich. +

+ +New features: +

    +
  • Integration of AFM file creation. +
+ +

+3.0beta -- November 15, 1998 +

+ + +By Sergey Babkin. +

+ +New features: +

    +
  • Added the auto-calculation of the italic angle. +
+ +Bux fixes: +
    +
  • Fixed a couple of bugs. +
+ +

+3.0alpha -- October 19, 1998 +

+ + +By Sergey Babkin. +

+ +New features: +

    +
  • Improved (although still not perfect) handling of +scaling in composite glyphs +
  • Automatic correction of outlines to make them more +smooth (to correct both rounding errors introduced +during conversion and present in the original font) +
  • Automatic generation of hints (still has lots of +space for improvement) +
  • Automatic generation of BlueValues etc. +
+ +Bux fixes: +
    +
  • Scaling of fonts to 1000x1000 M-square required by +Type1 standard +
  • Printing out the contours in reverse direction, because +TTF directions are different from Type1 ones (that was +the major reason why the fonts generated by +version 2.2 were rendered so badly in small sizes) +
+ +

+June 22, 1998 (AKA 2.2) +

+ + +By Thomas Henlich. +

+ +Bux fixes: +

    +
  • "width" should be "short int" because otherwise: +characters with negative widths (e.g. -4) become *very* wide (65532) +
  • The number of /CharStrings is numglyphs and not numglyphs+1 +
+ +

+February 13, 1998 +

+ + +By Mark Heath. +

+ +Bux fixes: +

    +
  • An original Bug Reported by Frank, which was just incorrect syntax in the +Type 1 header, managed to creep back into the Feb 04 Version. This has been +Fixed in the Feb 13 Version. +
+ +

+February 4, 1998 +

+ + +By Mark Heath. +

+ +Bux fixes: +

    +
  • A workaround was implemented in ttf2pfa by altering the matrix. I suspect +I will have to calculate the correct values, as matrix ops are probably not +allowed in Type 1 format. +
+ + +

+The older history seems to be lost. +

+ + +(S.B.: The story how we got the version numbers is rather funny. Initially +there were no version umbers, the releases were marked by dates. The version +from June 22 1998 untarred itself into a directory "ttf2pt1-22". When I +made my changes to it I assumed that this was the version number meaning +version 2.2. Since Mark asked me to send him a complete archive I supposed +that I have to bump the version number. And I bumped it to 3.0 because the +changes were rather extensive. Mark silently agreed and released the new +version as 3.0. And that's the end of the story about how we got this +Microsoft-like high version number.) + + + + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/COPYRIGHT b/application/third_party/dompdf/lib/ttf2ufm/src/COPYRIGHT new file mode 100755 index 00000000..75e8f38e --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/COPYRIGHT @@ -0,0 +1,87 @@ +The following copyright notice applies to all the files provided +in this distribution unless explicitly noted otherwise +(the most notable exception being t1asm.c). + + Copyright (c) 1997-2003 by the AUTHORS: + Andrew Weeks + Frank M. Siegert + Mark Heath + Thomas Henlich + Sergey Babkin , + Turgut Uyar + Rihardas Hepas + Szalay Tamas + Johan Vromans + Petr Titera + Lei Wang + Chen Xiangyang + Zvezdan Petkovic + Rigel + 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. 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. All advertising materials mentioning features or use of this software + must display the following acknowledgement: + This product includes software developed by the TTF2PT1 Project + and its contributors. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS 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 AUTHORS 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. + +For the approximate list of the AUTHORS' responsibilities see the +project history. + +Other contributions to the project are: + +Turgut Uyar + The Unicode translation table for the Turkish language. + +Rihardas Hepas + The Unicode translation table for the Baltic languages. + +Szalay Tamas + The Unicode translation table for the Central European languages. + +Johan Vromans + The RPM file. + +Petr Titera + The Unicode map format with names, the forced Unicode option. + +Frank M. Siegert + Port to Windows + +Lei Wang +Chen Xiangyang + Translation maps for Chinese fonts. + +Zvezdan Petkovic + The Unicode translation tables for the Cyrillic alphabet. + +Rigel + Generation of the dvips encoding files, modification to the Chinese maps. + +I. Lee Hetherington + The Type1 assembler (from the package 't1utils'), its full copyright + notice: + Copyright (c) 1992 by I. Lee Hetherington, all rights reserved. + Permission is hereby granted to use, modify, and distribute this program + for any purpose provided this copyright notice and the one below remain + intact. + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/FONTS b/application/third_party/dompdf/lib/ttf2ufm/src/FONTS new file mode 100755 index 00000000..dc28cc0d --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/FONTS @@ -0,0 +1,462 @@ +Sergey A. Babkin + or +(Do not edit this file, it is generated from FONTS.html!!!) + +THE FONT INSTALLATION GUIDE +for the TTF to Type1 converter and fonts generated by it +======================================================== + +There is historically a number of problems with the support of the 8-bit +character encodings. This installation guide pays a lot of attention +to the 8-bit issues, because these issues are responsible for the +most of troubles during the installation of fonts. But they are +not the only things covered in this guide, so it's worth reading +even if all you need is plain ASCII. For convenience of reading +I have marked the paragraphs dealing solely with 8-bit problems +with characters *8*. + +To simplify this installation the distribution package of the +converter contains a number of scripts written in shell and +Perl. So, to run them you will need a shell interpreter (Bourne-shell, +POSIX-shell, Korn-shell are OK, ba-shell is probably also OK but not +tested yet). The Perl scripts were tested with Perl5 but probably +should work with Perl4 too. All the scripts are located in the +`scripts' subdirectory. + +This guide considers the following issues of installation of the +fonts: + +- X11 +- Ghostscript +- MS Windows +- Netscape Navigator/Communicator +- Linux RPM package +- FrameMaker +- StarOffice + +X11 +=== + +To simplify the conversion a set of scripts is provided with ttf2pt1. +They are collected in the `scripts' subdirectory. + +`Convert' is the master conversion script provided with ttf2pt1. +When installed into a public directory it's named `ttf2pt1_convert' +to avoid name collisions with the other programs. + +It's called as: + + convert [config-file] + +If the configuration file is not specified as an argument then the file +`convert.cfg' in the current directory is used. This file contains +a set of configuration variables. The distribution contains a sample file +file `convert.cfg.sample'. Please copy it to `convert.cfg', +look inside it and change the configuration variables. The more stable +configuration variables, such as the path names of the scripts and +encoding files are located in `convert' itself, they are +automatically updated when installing ttf2pt1. + +Put all the TTF fonts you want to convert into some directory (this +may be just the directory that already contains all the Windows +fonts on a mounted FAT filesystem). If you have fonts in different +source encoding then put the fonts in each of the encodings +into a separate directory. Up to 10 source directories are +supported. If you (in a rather unlikely case) have more source +directories then you can make two separate runs of the converter, +converting up to 10 directories at a time. + +The variables in the configuration file are: + +SRCDIRS - the list of directories (with absolute paths) with + TTF fonts. Each line contains at least 3 fields: the name of the directory, + the language of the fonts in it (if you have fonts for different + languages you have to put them into the separate directories) and the + encoding of the fonts. Again, if you have some of the TTF typefaces in + one encoding, and some in another (say, CP-1251 and KOI-8), you have + to put them into the separate source directories. Some lines may contain + 4 fields. Then the fourth field is the name of the external map to + convert the Unicode fonts into the desirable encoding. This map is + used instead of the built-in map for the specified language. + +*8* +An interesting thing is that some languages have more than one +widely used character encodings. For example, the widely used +encodings for Russian are IBM CP-866 (MS-DOS and Unix), KOI-8 +(Unix and VAX, also the standard Internet encoding), IBM CP-1251 (MS Windows). +That's why I have provided the means to generate the converted fonts +in more than one encoding. See the file encodings/README for +details about the encoding tables. Actually, if you plan to use +these fonts with Netscape Navigator better use the aliases +cp-866 instead of ibm-866 and windows-1251 instead of ibm-1251 +because that's what Netscape wants. + +DSTDIR - directory for the resulting Type1 fonts. Be careful! + This directory gets completely wiped out before conversion, + so don't use any already existing directory for this purpose. + +DSTENC{language} - the list of encodings in which the destination + fonts will be generated for each language. Each font of that + language will be generated in each of the specified + encodings. If you don't want any translation, just specify both + SRCENC and DSTENC as iso8859-1 (or if you want any other encoding + specified in the fonts.dir, copy the description of 8859-1 with + new name and use this new name for SRCENC and DSTENC). + +FOUNDRY - the foundry name to be used in the fonts.dir file. I have + set it to `fromttf' to avoid name conflicts with any existing font for + sure. But this foundry name is not registered in X11 standards and + if you want to get the full standard compliance or have a font server + that enforces such a compliance, use `misc'. + +The next few parameters control the general behavior of the converter. +They default values are set to something reasonable. + +CORRECTWIDTH - if the value is set to YES then use the + converter option -w, otherwise don't use it. See the description of + this option in the README file. + +REMOVET1A - if the value is set to YES then after + conversion remove the un-encoded .t1a font files and the + intermediate .xpfa font metric files. + +INSTALLFONTMAP - a Ghostscript parameter, if the value is set to + YES then install the entries for the new fonts + right into the main Fontmap file. Otherwise just leave + the file Fontmap.ttf in the Ghostscript configuration + directory. + +HINTSUBST - if the value is set to YES use the option + -H, otherwise don't use it. This option enables the + hint substitution technique. If you have not installed the X11 patch + described above, use this option with great caution. See further + description of this option in the README file. + +ENFORCEISO - if the value is set to YES then + disguise the resulting fonts as the fonts in ISOLatin1 encoding. Historically + this was neccessary due to the way the installer scripts created the + X11 font configuration files. It is not neccessary any more for this + purpose. But if you plan to use these fonts with some other application + that expects ISOLatin1 encoding then better enable this option. + +ALLGLYPHS - if the value is set to YES then + include all the glyphs from the source fonts into the resulting fonts, even + if these glyphs are inaccessible. If it's set to NO then + include only the glyphs which have codes assigned to them. The glyphs + without codes can not be used directly. But some clever programs, + such as the Type 1 library from XFree86 3.9 and higher can change + the encoding on the fly and use another set of glyphs. If you have not + installed the X11 patch described above, use this option with great + caution. See further description of the option option -a in the + README file. + +GENUID - if the value is set to YES then use + the option -uA of the converter to generate UniqueIDs for + the converted fonts. The standard X11 Type 1 library does not use + this ID, so it may only be neccessary for the other applications. + The script is clever enough to generate different UniqueID for the + same font converted to multiple encodings. Also after conversion it + checks all the fonts generacted during the session for duplicated + UniqueID and shows those. Still, this does not quarantee that these + UniqueIDs won't overlap with some other fonts. The UniqueIDs are + generated as hash values from the font names, so it's guaranteed + that if the `convert' script runs multiple times it will + generate the same UniqueIDs during each run. See further description + of this option in the README file. + +GENUID - if the value is set to YES then create + the .pfb files, otherwise the .pfa files. The .pfb + files are more compact but contain binary data, so you may experience some + troubles when transferring them through the network. + +The following parameters are used to locate the other scripts and +configuration files. By default the scripts do a bit of guessing for them: +they search in the ttf2pt1 installation directory if ttf2pt1 +was installed or otherwise suppose that you are running `convert' with +`scripts' subdirectory being the current directory. + +ENCDIR - directory containing the descriptions of encodings +MAPDIR - directory containing the external map files + +Besides that a few parameters are built into the `convert' script itself. +You probably won't need to change them: + +T1ASM, TTF2PT1, TRANS, T1FDIR, FORCEISO - paths to the other script + +Also there are a few parameters controlling the installation of +fonts for Ghostscript. Please look at their description in the +Ghostscript section of documentation or in the ttf2pt1_x2gs(1) +manual page before running `convert'. If these parameters are +set, `convert' will call the `x2gs' script automatically +to install the newly converted fonts in Ghostscript. + +After creating the configuration file run the `convert' script. Look at +the result and the log file in DSTDIR. + +Add the directory with newly converted fonts to the configuration +of X server or font server. For most of the systems this step is +very straightforward. For HP-UX it's rather tricky and poorly +documented, so the file FONTS.hpux gives a short description. + +If you don't have the privileges of the root user, you still can +configure your private font server. Just use some non-standard +port number (see FONTS.hpux for an example, exept that you won't +need all the HP-related stuff on any other system). + +Known Problems +-------------- + +- One catch is that the X11 Type 1 font library has a rather low limit + on the font size. Because of this the fonts with more complicated + outlines and the enabled hint substitution may not fit into + this limit. The same applies to the fonts with very complicated + outlines or with very many glyphs (especially the fonts with + over 256 glyphs). So you will need to excercise caution with + these options if you plan using these fonts with X11. Some vendors + such as HP provide the Type 1 implementation licensed from Adobe + which should have no such problem. + + But there is a solution even for the generic X11. A patch located + in the subdirectory `app/X11' fixes this problem as well + as some other minor problems. Its description is provided in + app/X11/README. + + To fix the X11 font library, you have to get the X11 sources. I + can recommend the ftp sites of the XFree86 project ftp://ftp.xfree86.org + or of the Open Group ftp://ftp.x.org. This patch was made on the sources + of XFree86 so you may have better success with applying it to the + XFree86 distribution. After you have got the sources, make sure + that you can compile them. Then apply the patch as described. + Make sure that it was applied properly. Compile the sources again + (actually, you need only the fonts library, the fonts server, and + possibly the X server). It would be prudent now to save your old + font library, font server and, possibly, X server. Then install + the new recently compiled versions of these files. Of course, + if you know someone who already has compiled these files for the + same OS as yours, you can just copy the binary fles from him. + + Alas, building the X11 system from the source code is not the + easiest thing in the world and if you have no experience it + can be quite difficult. In this case just avoid the aforementioned + features or check each converted font to make sure that it + works properly. + +- The Type1 font library from the standard X11 distribution + does not work on HP-UX (at least, up to 10.01). The font server + supplied with HP-UX up to 10.01 is also broken. Starting from + HP-UX 10.20 (I don't know about 10.10) they supply a proprietary font + library and the converted fonts work fine with it, provided that + they are configured properly (see the file FONTS.hpux). + +- The fonts.scale files created by the older versions of the + ttf2pt1 installation program (up to release 3.1) have conflicted + with the language definitions of the Xfsft font server and + parts of it included into XFree86. To overcome this incompatibility + the never versions creats the fonts.scale file describing all the + fonts as belonging to the adobe-fontspecific encoding and + the fonts.alias file with the proper names. The drawback of + this solution is that xlsfonts gives the list of twice more + fonts. But as a side effect the option ENFORCEISO in + `convert.cfg' is not required for X11 any more. + +- The conversion script has no support for Eastern multi-plane fonts. + Contribution of such a support would be welcome. + +Ghostscript +=========== + +The fonts generated with ttf2pt1 work fine with Ghostscript by +themselves. The script `x2gs' (or `ttf2pt1_x2gs' when installed +into a public directory, to avoid name conflicts with other +programs) links the font files from the X11 direcotry into the Ghostscript +directory and automatically creates the description file (Fontmap) +in Ghostscript format. + +It's called as: + + x2gs [config-file] + +If the configuration file is not specified as an argument then the file +`convert.cfg' in the current directory is used, just like the +`convert' script does. Indeed, this configuration file is used for +both scripts. + +The Ghostscript-related parameters in the configuration file are: + +DSTDIR - the X11 font directory used by `x2gs' as the + source of the fonts. This parameter is common with the X11 + configuration. + +GSDIR - the base directory of Ghostsript. If this + parameter is set to an empty string then `convert' won't + call `x2gs'. So if you want to get only the X11 fonts + installed then set this parameter to an empty string. This + directory may vary on various system, so please check your + system and set this value accordingly before running the script. + +GSFONTDIR - the font directory of Ghostscript. In the standard + Ghostscript installation it's a subdirectory of GSDIR + but some systems may use completely different directories. + +GSCONFDIR - the configuration subdirectory of Ghostscript + that contains the Fontmap file. + +INSTALLFONTMAP - if the value is set to YES then + install the entries for the new fonts right into the main + Fontmap file. Otherwise just leave the file Fontmap.ttf + in the Ghostscript configuration directory. + + +After preparing the configuration file run the script. It symbolicaly links +all the font files and creates the description file Fontmap.ttf in +GSCONDFIR. After that there are two choices. + +If the option INSTALLFONTMAP was set to YES then +the font descriptions are also automatically installed into the +master Fontmap file. The script is clever enough to +detect if it was run multiple times with the same directories +and if so it replaces the old Fontmap entries with +the new ones instead of just accumulating all of them. You +may also run it multiple times for multiple X11 directories +and all the results will be properly collected in the Fontmap. +But it's your responsibility to watch that the names of the +font files don't overlap. If the X11 font directory gets +renamed then you have to remove its font entries from the +Fontmap and only after that re-run `x2gs' +for the new directory. + +On the other hand if the option INSTALLFONTMAP was set to +NO then go to the GSCONFDIR directory and insert the +contents of Fontmap.ttf into the Fontmap file +manually. This step may be left manual to make the installation +a little bit more safe. + +After that you may also want to redefine some of the aliases in +Fontmap to refer to the newly installed fonts. +But the redefinition of the aliases may be dangerous if the width of +characters in the new font will be different from the old font. +Alas, there is no visible solution of this problem yet. + +MS Windows +=========== + +Ttf2pt1 can be built on Windows either with native compiler or in +POSIX emulation mode. + +Native MS Windows compilers require a different way to build the converter +instead of the Makefile (their make programs commonly are quite weird +and limited in capabilities). An example of batch file winbuild.bat +is provided for MS Visual C/C++. Probably it can be easily adapted for other +32-bit Windows and DOS compilers. The important part is to define the +preprocessor symbol WINDOWS during compilation. + +Cygnus make almost supports full Makefiles but not quite. Seems +like its POSIX support is also of the same quality "almost but not quite". +So another command file cygbuild.sh is provided for Cygnus GNU C, also +with the preprocessor symbol WINDOWS defined. It is intended to be run from +the Cygnus BASH shell. To run the programs produced by the Cygnus compiler +the Cygnus library file CYGWIN1.DLL should be copied first into +C:\WINDOWS. + +To run the accompanying scripts Perl for Windows will be required as well as +other tools from the Cygnus set. + +The Windows support was not particularly tested, so in case of problems with +building or running the converter please let us know. + +The pre-built code (possibly of an older version) of ttf2pt1 for MS Windows is +available from the GnuWin32 project from + +http://gnuwin32.sourceforge.net/packages/ttf2pt1.htm + +Netscape Navigator/Communicator +=============================== + +Basically, the biggest problem with Netscape Navigator is that +it has built-in fixed PostScript font names and built-in fixed +glyph tables for them. Oh, no, that's two! Let's start over: +basically the two biggest problems of Netscape Navigator are +that (one)it has built-in fixed PostScript font names and (two) +built-in fixed glyph tables for them and (three) it always +assumes that the fonts have ISOLatin1 encoding. OK, let's +start over again: basically the three biggest problems of Netscape +Navigator are that (one) it has built-in fixed PostScript font names, +(two) built-in fixed glyph tables for them and (three) it always +assumes that the fonts have ISOLatin1 encoding and (four) it +does not remember the scaled font size between the sessions. +You did not expect such a Spanish Inquisition, did you ? (*) + +Luckily, we have solutions for all of these problems. They are +located in the subdirectory `app/netscape' and described +in app/netscape/README. + + ------- + *) See Monty Python's Flying Circus, episode 15 + +*8* +Netscape and cyrillic fonts +--------------------------- +(courtesy of Zvezdan Petkovic) + +If you use TrueType fonts in your X, as I do, and you always get +KOI8-R encoded pages, then your Netscape does not recognise windows-1251 +encoding. Microsoft TrueType fonts simply declare all encodings they +can support including KOI8-R. For some reason, KOI8-R always wins over +ISO-8859-5 in Netscape under X. If you are reading other cyrillic +languages besides Russian, you might want to either erase KOI8-R entries +from the fonts.dir and fonts.scale files, or alternatively fix Netscape. +I put this line in my .Xdefaults. + + Netscape*documentFonts.charset*koi8-r: iso-8859-5 + +Notice that you can still read Russian sites without trouble because +Netscape translates KOI8-R to ISO-8859-5 on the fly. I read both Russian +and Serbian sites with no trouble. + +Note: If anybody knows the way to tell Netscape under Unix how to +recognise {windows,ibm,cp}-1251 encoded fonts, I'd like to hear about that. + +Linux RPM package +================= + +The spec file for the creation of a Linux RPM package is located in +app/RPM. It has been contributed by Johan Vromans. When +make all is ran in the main directory it among the other +things creates the version of itself adapted to Linux in app/RPM, +you may want to copy that version back to the main directory. + +Warning: Please note that the install section is incomplete, and +the installed scripts won't work until the paths inside them +are corrected. + +FrameMaker +========== + +The fonts and AFM files generated by the version 3.2 and higher +should work with Framemaker without problems. The AFM files +generated by the previous versions of the converter require a +line added to them: + + EncodingScheme FontSpecific + +And the underscores in the font names of the font and AFM files +generated by the older versions may need to be changed to dashes. + +NOTE by Jason Baietto: Ignore the directions in the Frame on-line docs +that say to put a "serverdict begin 0 exitserver" line in the pfa files. +Doing this caused both my printer and ghostscript to choke on the resulting +output from FrameMaker, so I would not advise doing this (though your +mileage may vary). + +StarOffice +========== + +StarOffice 5.1x has been reported to crash if the .afm file contains +spaces in the values of such statements as Version, Weight etc. +These spaces are permitted by the Adobe spec, so this is a problem of +StarOffice. The easiest way to fix these .afm files for StarOffice +is to remove spaces in these strings or remove these strings (in case if +they are optional) at all. This can be done automatically with a sed +script. It seems that StarOffice 5.2 has this problem fixed, so we decided to +spend no efforts on providing workarounds for 5.1 with ttf2pt1. + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/FONTS.hpux b/application/third_party/dompdf/lib/ttf2ufm/src/FONTS.hpux new file mode 100755 index 00000000..585f7943 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/FONTS.hpux @@ -0,0 +1,107 @@ +Sergey A. Babkin + or +(Do not edit this file, it is generated from FONTS.hpux.html!!!) + +How to install new Type1 fonts on an HP-UX 10.20 machine +-------------------------------------------------------- + +1. Add the font files to /usr/lib/X11/fonts/type1.st/typefaces. + +2. Add the font descriptions to +/usr/lib/X11/fonts/type1.st/typefaces/fonts.scale. Run `mkfontdir' +in /usr/lib/X11/fonts/type1.st/typefaces. In the descriptions +you have to specify the font manufacturer as `misc', like: + + -misc-courier-... + +3. Copy /usr/lib/X11/fonts/type1.st/typefaces/fonts.dir to +/usr/lib/X11/fonts/type1.st/licenses/STSYSTEM/DISPLAYS/fonts.dir. +Better yet, create a symbolic link. + +4. For each font encoding you are going to use create a description +file in /usr/lib/X11/fonts/stadmin/type1/charsets. Of course, if you +are going to use the same fonts in several encodings, the best way +would be to create fair descriptions of charsets and really store +only one encoding in typefaces, all the others will be produced +automatically. That's not difficult at all. +But the simplest way is to just copy the file cp.iso8859-1 +to cp., like cp.koi8-r. + +5. Restart you X server and/or font server. + +What if you don't have the `root' privileges ? +---------------------------------------------- + +You still can run the font server and configure your X server +to get the fonts from it. + +Further let's suppose that the name on which you are going +to run the font server is named `somehost'. Login to it +and configure the font server. + +First, choose some unused port. Numbers around 9000 are a good +choice. Verify that this port is not used by somebody else +by entering + + netstat -naf inet |grep 9000 + +and look what happens. If you get nothing, that's good, this +port is unused. If you get some lines of data, try abother port. + +Go to you home directory $HOME and create some directory for +your font server, say, $HOME/fs. Copy the directory structure +of /usr/lib/X11/fonts/type1.st into $HOME/fs, so that in result +you get $HOME/fs/type1.st/. Copy the directory +structure of /usr/lib/X11/fonts/stadmin/type1/charsets into $HOME/fs, +so that in result you get $HOME/fs/charsets/. +Install the new fonts in these directorues as described above. + +Then create the fontserver configuration file, say, $HOME/fs/xfs.cfg. +The sample contents (supposing that my $HOME is equal to /home/babkin) +is: + +--------------8<----------- cut here ----------------------------- +# font server configuration file +# $XConsortium: config.cpp,v 1.7 91/08/22 11:39:59 rws Exp $ + +rasterizers = /usr/lib/X11/fs/ufstrast.sl,/usr/lib/X11/fs/iforast.sl + +clone-self = off +use-syslog = off +catalogue = /home/babkin/fs/type1.st +# in decipoints +default-point-size = 120 +default-resolutions = 100,100,75,75 +port=9000 +error-file=/home/babkin/fs/fs.err +--------------8<----------- cut here ----------------------------- + +Then create the script to start your font server, say, $HOME/fs/runme: + +--------------8<----------- cut here ----------------------------- +TYPE1_CODEPAGE_DIR=$HOME/fs/charsets +export TYPE1_CODEPAGE_DIR +kill `ps -ef | grep $HOME/\[f\]s/xfs.cfg | awk '{print $2}'`; +nohup xfs -config $HOME/fs/xfs.cfg & +--------------8<----------- cut here ----------------------------- + +Don't forget to make $HOME/fs/runme executable. Then you can +execute it manually or from you .profile. + +After you get your font server running, just execute the following +command (with proper host name and port number) in your X session + + xset fp+ tcp/somehost:9000 + +to get the access to your private font server. You can add this +information to the configuration data of your X server or just +put it also into your .profile. In the latter case the best way +to do that would be like: + +--------------8<----------- cut here ----------------------------- +... +$HOME/fs/runme +sleep 2 # give it some time to start +xset fp+ tcp/somehost:9000 +... +--------------8<----------- cut here ----------------------------- diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/FONTS.hpux.html b/application/third_party/dompdf/lib/ttf2ufm/src/FONTS.hpux.html new file mode 100755 index 00000000..80889cae --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/FONTS.hpux.html @@ -0,0 +1,197 @@ + + + +How to install new Type1 fonts on an HP-UX 10.20 machine + + + +Sergey A. Babkin +
+ +<babkin@bellatlantic.net> or <sab123@hotmail.com> +

+ + +

+How to install new Type1 fonts on an HP-UX 10.20 machine +

+ + +1. Add the font files to /usr/lib/X11/fonts/type1.st/typefaces. +

+ +2. Add the font descriptions to +/usr/lib/X11/fonts/type1.st/typefaces/fonts.scale. Run `mkfontdir' +in /usr/lib/X11/fonts/type1.st/typefaces. In the descriptions +you have to specify the font manufacturer as `misc', like: +

+ + +  -misc-courier-... + +

+ +3. Copy /usr/lib/X11/fonts/type1.st/typefaces/fonts.dir to +/usr/lib/X11/fonts/type1.st/licenses/STSYSTEM/DISPLAYS/fonts.dir. +Better yet, create a symbolic link. +

+ +4. For each font encoding you are going to use create a description +file in /usr/lib/X11/fonts/stadmin/type1/charsets. Of course, if you +are going to use the same fonts in several encodings, the best way +would be to create fair descriptions of charsets and really store +only one encoding in typefaces, all the others will be produced +automatically. That's not difficult at all. +But the simplest way is to just copy the file cp.iso8859-1 +to cp.<your-encoding-name>, like cp.koi8-r. +

+ +5. Restart you X server and/or font server. +

+ +

+What if you don't have the `root' privileges ? +

+ + +You still can run the font server and configure your X server +to get the fonts from it. +

+ +Further let's suppose that the name on which you are going +to run the font server is named `somehost'. Login to it +and configure the font server. +

+ +First, choose some unused port. Numbers around 9000 are a good +choice. Verify that this port is not used by somebody else +by entering +

+ +

+ netstat -naf inet |grep 9000 +
+ +and look what happens. If you get nothing, that's good, this +port is unused. If you get some lines of data, try abother port. +

+ +Go to you home directory $HOME and create some directory for +your font server, say, $HOME/fs. Copy the directory structure +of /usr/lib/X11/fonts/type1.st into $HOME/fs, so that in result +you get $HOME/fs/type1.st/<whatever was there>. Copy the directory +structure of /usr/lib/X11/fonts/stadmin/type1/charsets into $HOME/fs, +so that in result you get $HOME/fs/charsets/<whatever was there>. +Install the new fonts in these directorues as described above. +

+ +Then create the fontserver configuration file, say, $HOME/fs/xfs.cfg. +The sample contents (supposing that my $HOME is equal to /home/babkin) +is: +

+ + +


+ +# font server configuration file +
+# $XConsortium: config.cpp,v 1.7 91/08/22 11:39:59 rws Exp $ +
+ +
+rasterizers = /usr/lib/X11/fs/ufstrast.sl,/usr/lib/X11/fs/iforast.sl +
+ +
+clone-self = off +
+use-syslog = off +
+catalogue = /home/babkin/fs/type1.st +
+# in decipoints +
+default-point-size = 120 +
+default-resolutions = 100,100,75,75 +
+port=9000 +
+error-file=/home/babkin/fs/fs.err +
+
+ +

+ +Then create the script to start your font server, say, $HOME/fs/runme: +

+ + +


+ +TYPE1_CODEPAGE_DIR=$HOME/fs/charsets +
+export TYPE1_CODEPAGE_DIR +
+kill `ps -ef | grep $HOME/\[f\]s/xfs.cfg | awk '{print $2}'`; +
+nohup xfs -config $HOME/fs/xfs.cfg & +
+
+ +

+ +Don't forget to make $HOME/fs/runme executable. Then you can +execute it manually or from you .profile. +

+ +After you get your font server running, just execute the following +command (with proper host name and port number) in your X session +

+ +

+ xset fp+ tcp/somehost:9000 +
+ +to get the access to your private font server. You can add this +information to the configuration data of your X server or just +put it also into your .profile. In the latter case the best way +to do that would be like: +

+ + +


+ +... +
+$HOME/fs/runme +
+sleep 2 # give it some time to start +
+xset fp+ tcp/somehost:9000 +
+... +
+
+ +

+ + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/FONTS.html b/application/third_party/dompdf/lib/ttf2ufm/src/FONTS.html new file mode 100755 index 00000000..352bd069 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/FONTS.html @@ -0,0 +1,708 @@ + + + +The ttf2pt1 font installation guide + + + +Sergey A. Babkin +
+ +<babkin@bellatlantic.net> or <sab123@hotmail.com> +

+ + + + +

+THE FONT INSTALLATION GUIDE +
+for the TTF to Type1 converter and fonts generated by it +

+ + +There is historically a number of problems with the support of the 8-bit +character encodings. This installation guide pays a lot of attention +to the 8-bit issues, because these issues are responsible for the +most of troubles during the installation of fonts. But they are +not the only things covered in this guide, so it's worth reading +even if all you need is plain ASCII. For convenience of reading +I have marked the paragraphs dealing solely with 8-bit problems +with characters *8*. +

+ +To simplify this installation the distribution package of the +converter contains a number of scripts written in shell and +Perl. So, to run them you will need a shell interpreter (Bourne-shell, +POSIX-shell, Korn-shell are OK, ba-shell is probably also OK but not +tested yet). The Perl scripts were tested with Perl5 but probably +should work with Perl4 too. All the scripts are located in the +`scripts' subdirectory. +

+ +This guide considers the following issues of installation of the +fonts: +

+ + +

+

+ + +

+X11 +

+ + + + + +To simplify the conversion a set of scripts is provided with ttf2pt1. +They are collected in the `scripts' subdirectory. +

+ + +`Convert' is the master conversion script provided with ttf2pt1. +When installed into a public directory it's named `ttf2pt1_convert' +to avoid name collisions with the other programs. +

+ + +It's called as: +

+ + + + +

+ convert [config-file] +
+ + +If the configuration file is not specified as an argument then the file +`convert.cfg' in the current directory is used. This file contains +a set of configuration variables. The distribution contains a sample file +file `convert.cfg.sample'. Please copy it to `convert.cfg', +look inside it and change the configuration variables. The more stable +configuration variables, such as the path names of the scripts and +encoding files are located in `convert' itself, they are +automatically updated when installing ttf2pt1. +

+ +Put all the TTF fonts you want to convert into some directory (this +may be just the directory that already contains all the Windows +fonts on a mounted FAT filesystem). If you have fonts in different +source encoding then put the fonts in each of the encodings +into a separate directory. Up to 10 source directories are +supported. If you (in a rather unlikely case) have more source +directories then you can make two separate runs of the converter, +converting up to 10 directories at a time. +

+ +The variables in the configuration file are: +

+ + + +SRCDIRS - the list of directories (with absolute paths) with + TTF fonts. Each line contains at least 3 fields: the name of the directory, + the language of the fonts in it (if you have fonts for different + languages you have to put them into the separate directories) and the + encoding of the fonts. Again, if you have some of the TTF typefaces in + one encoding, and some in another (say, CP-1251 and KOI-8), you have + to put them into the separate source directories. Some lines may contain + 4 fields. Then the fourth field is the name of the external map to + convert the Unicode fonts into the desirable encoding. This map is + used instead of the built-in map for the specified language. +

+ +*8* +An interesting thing is that some languages have more than one +widely used character encodings. For example, the widely used +encodings for Russian are IBM CP-866 (MS-DOS and Unix), KOI-8 +(Unix and VAX, also the standard Internet encoding), IBM CP-1251 (MS Windows). +That's why I have provided the means to generate the converted fonts +in more than one encoding. See the file encodings/README for +details about the encoding tables. Actually, if you plan to use +these fonts with Netscape Navigator better use the aliases +cp-866 instead of ibm-866 and windows-1251 instead of ibm-1251 +because that's what Netscape wants. +

+ + +DSTDIR - directory for the resulting Type1 fonts. Be careful! + This directory gets completely wiped out before conversion, + so don't use any already existing directory for this purpose. +

+ + +DSTENC{language} - the list of encodings in which the destination + fonts will be generated for each language. Each font of that + language will be generated in each of the specified + encodings. If you don't want any translation, just specify both + SRCENC and DSTENC as iso8859-1 (or if you want any other encoding + specified in the fonts.dir, copy the description of 8859-1 with + new name and use this new name for SRCENC and DSTENC). +

+ + +FOUNDRY - the foundry name to be used in the fonts.dir file. I have + set it to `fromttf' to avoid name conflicts with any existing font for + sure. But this foundry name is not registered in X11 standards and + if you want to get the full standard compliance or have a font server + that enforces such a compliance, use `misc'. +

+ + +The next few parameters control the general behavior of the converter. +They default values are set to something reasonable. +

+ + + +CORRECTWIDTH - if the value is set to YES then use the + converter option -w, otherwise don't use it. See the description of + this option in the README file. +

+ + +REMOVET1A - if the value is set to YES then after + conversion remove the un-encoded .t1a font files and the + intermediate .xpfa font metric files. +

+ + +INSTALLFONTMAP - a Ghostscript parameter, if the value is set to + YES then install the entries for the new fonts + right into the main Fontmap file. Otherwise just leave + the file Fontmap.ttf in the Ghostscript configuration + directory. +

+ + +HINTSUBST - if the value is set to YES use the option + -H, otherwise don't use it. This option enables the + hint substitution technique. If you have not installed the X11 patch + described above, use this option with great caution. See further + description of this option in the README file. +

+ + +ENFORCEISO - if the value is set to YES then + disguise the resulting fonts as the fonts in ISOLatin1 encoding. Historically + this was neccessary due to the way the installer scripts created the + X11 font configuration files. It is not neccessary any more for this + purpose. But if you plan to use these fonts with some other application + that expects ISOLatin1 encoding then better enable this option. +

+ + +ALLGLYPHS - if the value is set to YES then + include all the glyphs from the source fonts into the resulting fonts, even + if these glyphs are inaccessible. If it's set to NO then + include only the glyphs which have codes assigned to them. The glyphs + without codes can not be used directly. But some clever programs, + such as the Type 1 library from XFree86 3.9 and higher can change + the encoding on the fly and use another set of glyphs. If you have not + installed the X11 patch described above, use this option with great + caution. See further description of the option option -a in the + README file. +

+ + +GENUID - if the value is set to YES then use + the option -uA of the converter to generate UniqueIDs for + the converted fonts. The standard X11 Type 1 library does not use + this ID, so it may only be neccessary for the other applications. + The script is clever enough to generate different UniqueID for the + same font converted to multiple encodings. Also after conversion it + checks all the fonts generacted during the session for duplicated + UniqueID and shows those. Still, this does not quarantee that these + UniqueIDs won't overlap with some other fonts. The UniqueIDs are + generated as hash values from the font names, so it's guaranteed + that if the `convert' script runs multiple times it will + generate the same UniqueIDs during each run. See further description + of this option in the README file. +

+ + +GENUID - if the value is set to YES then create + the .pfb files, otherwise the .pfa files. The .pfb + files are more compact but contain binary data, so you may experience some + troubles when transferring them through the network. +

+ + +The following parameters are used to locate the other scripts and +configuration files. By default the scripts do a bit of guessing for them: +they search in the ttf2pt1 installation directory if ttf2pt1 +was installed or otherwise suppose that you are running `convert' with +`scripts' subdirectory being the current directory. +

+ + + +ENCDIR - directory containing the descriptions of encodings +
+ +MAPDIR - directory containing the external map files +

+ + +Besides that a few parameters are built into the `convert' script itself. +You probably won't need to change them: +

+ + + +T1ASM, TTF2PT1, TRANS, T1FDIR, FORCEISO - paths to the other script +

+ + +Also there are a few parameters controlling the installation of +fonts for Ghostscript. Please look at their description in the +Ghostscript section of documentation or in the ttf2pt1_x2gs(1) +manual page before running `convert'. If these parameters are +set, `convert' will call the `x2gs' script automatically +to install the newly converted fonts in Ghostscript. +

+ +After creating the configuration file run the `convert' script. Look at +the result and the log file in DSTDIR. +

+ +Add the directory with newly converted fonts to the configuration +of X server or font server. For most of the systems this step is +very straightforward. For HP-UX it's rather tricky and poorly +documented, so the file FONTS.hpux gives a short description. +

+ +If you don't have the privileges of the root user, you still can +configure your private font server. Just use some non-standard +port number (see FONTS.hpux for an example, exept that you won't +need all the HP-related stuff on any other system). +

+ + +

+Known Problems +

+ + + + +
    +
  • One catch is that the X11 Type 1 font library has a rather low limit + on the font size. Because of this the fonts with more complicated + outlines and the enabled hint substitution may not fit into + this limit. The same applies to the fonts with very complicated + outlines or with very many glyphs (especially the fonts with + over 256 glyphs). So you will need to excercise caution with + these options if you plan using these fonts with X11. Some vendors + such as HP provide the Type 1 implementation licensed from Adobe + which should have no such problem. +

    + + But there is a solution even for the generic X11. A patch located + in the subdirectory `app/X11' fixes this problem as well + as some other minor problems. Its description is provided in + app/X11/README. +

    + + To fix the X11 font library, you have to get the X11 sources. I + can recommend the ftp sites of the XFree86 project ftp://ftp.xfree86.org + or of the Open Group ftp://ftp.x.org. This patch was made on the sources + of XFree86 so you may have better success with applying it to the + XFree86 distribution. After you have got the sources, make sure + that you can compile them. Then apply the patch as described. + Make sure that it was applied properly. Compile the sources again + (actually, you need only the fonts library, the fonts server, and + possibly the X server). It would be prudent now to save your old + font library, font server and, possibly, X server. Then install + the new recently compiled versions of these files. Of course, + if you know someone who already has compiled these files for the + same OS as yours, you can just copy the binary fles from him. +

    + + Alas, building the X11 system from the source code is not the + easiest thing in the world and if you have no experience it + can be quite difficult. In this case just avoid the aforementioned + features or check each converted font to make sure that it + works properly. +

    + +

  • The Type1 font library from the standard X11 distribution + does not work on HP-UX (at least, up to 10.01). The font server + supplied with HP-UX up to 10.01 is also broken. Starting from + HP-UX 10.20 (I don't know about 10.10) they supply a proprietary font + library and the converted fonts work fine with it, provided that + they are configured properly (see the file FONTS.hpux). +

    + +

  • The fonts.scale files created by the older versions of the + ttf2pt1 installation program (up to release 3.1) have conflicted + with the language definitions of the Xfsft font server and + parts of it included into XFree86. To overcome this incompatibility + the never versions creats the fonts.scale file describing all the + fonts as belonging to the adobe-fontspecific encoding and + the fonts.alias file with the proper names. The drawback of + this solution is that xlsfonts gives the list of twice more + fonts. But as a side effect the option ENFORCEISO in + `convert.cfg' is not required for X11 any more. +

    + +

  • The conversion script has no support for Eastern multi-plane fonts. + Contribution of such a support would be welcome. +

    +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Ghostscript +

+ + + + + + +The fonts generated with ttf2pt1 work fine with Ghostscript by +themselves. The script `x2gs' (or `ttf2pt1_x2gs' when installed +into a public directory, to avoid name conflicts with other +programs) links the font files from the X11 direcotry into the Ghostscript +directory and automatically creates the description file (Fontmap) +in Ghostscript format. + + +It's called as: +

+ + + + +

+ x2gs [config-file] +
+ + +If the configuration file is not specified as an argument then the file +`convert.cfg' in the current directory is used, just like the +`convert' script does. Indeed, this configuration file is used for +both scripts. +

+ +The Ghostscript-related parameters in the configuration file are: +

+ +DSTDIR - the X11 font directory used by `x2gs' as the + source of the fonts. This parameter is common with the X11 + configuration. +

+ +GSDIR - the base directory of Ghostsript. If this + parameter is set to an empty string then `convert' won't + call `x2gs'. So if you want to get only the X11 fonts + installed then set this parameter to an empty string. This + directory may vary on various system, so please check your + system and set this value accordingly before running the script. +

+ +GSFONTDIR - the font directory of Ghostscript. In the standard + Ghostscript installation it's a subdirectory of GSDIR + but some systems may use completely different directories. +

+ +GSCONFDIR - the configuration subdirectory of Ghostscript + that contains the Fontmap file. +

+ +INSTALLFONTMAP - if the value is set to YES then + install the entries for the new fonts right into the main + Fontmap file. Otherwise just leave the file Fontmap.ttf + in the Ghostscript configuration directory. +

+ + +After preparing the configuration file run the script. It symbolicaly links +all the font files and creates the description file Fontmap.ttf in +GSCONDFIR. After that there are two choices. +

+ +If the option INSTALLFONTMAP was set to YES then +the font descriptions are also automatically installed into the +master Fontmap file. The script is clever enough to +detect if it was run multiple times with the same directories +and if so it replaces the old Fontmap entries with +the new ones instead of just accumulating all of them. You +may also run it multiple times for multiple X11 directories +and all the results will be properly collected in the Fontmap. +But it's your responsibility to watch that the names of the +font files don't overlap. If the X11 font directory gets +renamed then you have to remove its font entries from the +Fontmap and only after that re-run `x2gs' +for the new directory. +

+ +On the other hand if the option INSTALLFONTMAP was set to +NO then go to the GSCONFDIR directory and insert the +contents of Fontmap.ttf into the Fontmap file +manually. This step may be left manual to make the installation +a little bit more safe. +

+ +After that you may also want to redefine some of the aliases in +Fontmap to refer to the newly installed fonts. +But the redefinition of the aliases may be dangerous if the width of +characters in the new font will be different from the old font. +Alas, there is no visible solution of this problem yet. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+MS Windows +

+ + +Ttf2pt1 can be built on Windows either with native compiler or in +POSIX emulation mode. +

+ +Native MS Windows compilers require a different way to build the converter +instead of the Makefile (their make programs commonly are quite weird +and limited in capabilities). An example of batch file winbuild.bat +is provided for MS Visual C/C++. Probably it can be easily adapted for other +32-bit Windows and DOS compilers. The important part is to define the +preprocessor symbol WINDOWS during compilation. +

+ +Cygnus make almost supports full Makefiles but not quite. Seems +like its POSIX support is also of the same quality "almost but not quite". +So another command file cygbuild.sh is provided for Cygnus GNU C, also +with the preprocessor symbol WINDOWS defined. It is intended to be run from +the Cygnus BASH shell. To run the programs produced by the Cygnus compiler +the Cygnus library file CYGWIN1.DLL should be copied first into +C:\WINDOWS. +

+ +To run the accompanying scripts Perl for Windows will be required as well as +other tools from the Cygnus set. +

+ +The Windows support was not particularly tested, so in case of problems with +building or running the converter please let us know. +

+ +The pre-built code (possibly of an older version) of ttf2pt1 for MS Windows is +available from the GnuWin32 project from + +http://gnuwin32.sourceforge.net/packages/ttf2pt1.htm +

+ + +

+Netscape Navigator/Communicator +

+ + +Basically, the biggest problem with Netscape Navigator is that +it has built-in fixed PostScript font names and built-in fixed +glyph tables for them. Oh, no, that's two! Let's start over: +basically the two biggest problems of Netscape Navigator are +that (one)it has built-in fixed PostScript font names and (two) +built-in fixed glyph tables for them and (three) it always +assumes that the fonts have ISOLatin1 encoding. OK, let's +start over again: basically the three biggest problems of Netscape +Navigator are that (one) it has built-in fixed PostScript font names, +(two) built-in fixed glyph tables for them and (three) it always +assumes that the fonts have ISOLatin1 encoding and (four) it +does not remember the scaled font size between the sessions. +You did not expect such a Spanish Inquisition, did you ? (*) +

+ +Luckily, we have solutions for all of these problems. They are +located in the subdirectory `app/netscape' and described +in app/netscape/README. +

+ +*8* +

+Netscape and cyrillic fonts
+ +(courtesy of Zvezdan Petkovic) +

+ +If you use TrueType fonts in your X, as I do, and you always get +KOI8-R encoded pages, then your Netscape does not recognise windows-1251 +encoding. Microsoft TrueType fonts simply declare all encodings they +can support including KOI8-R. For some reason, KOI8-R always wins over +ISO-8859-5 in Netscape under X. If you are reading other cyrillic +languages besides Russian, you might want to either erase KOI8-R entries +from the fonts.dir and fonts.scale files, or alternatively fix Netscape. +I put this line in my .Xdefaults. +

+ +

+ Netscape*documentFonts.charset*koi8-r: iso-8859-5 +
+

+ +Notice that you can still read Russian sites without trouble because +Netscape translates KOI8-R to ISO-8859-5 on the fly. I read both Russian +and Serbian sites with no trouble. +

+ +Note: If anybody knows the way to tell Netscape under Unix how to +recognise {windows,ibm,cp}-1251 encoded fonts, I'd like to hear about that. +

+ + +

+Linux RPM package +

+ + +The spec file for the creation of a Linux RPM package is located in +app/RPM. It has been contributed by Johan Vromans. When +make all is ran in the main directory it among the other +things creates the version of itself adapted to Linux in app/RPM, +you may want to copy that version back to the main directory. +

+ +Warning: Please note that the install section is incomplete, and +the installed scripts won't work until the paths inside them +are corrected. +

+ + +

+FrameMaker +

+ + +The fonts and AFM files generated by the version 3.2 and higher +should work with Framemaker without problems. The AFM files +generated by the previous versions of the converter require a +line added to them: +

+ +  EncodingScheme FontSpecific +

+ +And the underscores in the font names of the font and AFM files +generated by the older versions may need to be changed to dashes. +

+ +NOTE by Jason Baietto: Ignore the directions in the Frame on-line docs +that say to put a "serverdict begin 0 exitserver" line in the pfa files. +Doing this caused both my printer and ghostscript to choke on the resulting +output from FrameMaker, so I would not advise doing this (though your +mileage may vary). +

+ + +

+StarOffice +

+ + +StarOffice 5.1x has been reported to crash if the .afm file contains +spaces in the values of such statements as Version, Weight etc. +These spaces are permitted by the Adobe spec, so this is a problem of +StarOffice. The easiest way to fix these .afm files for StarOffice +is to remove spaces in these strings or remove these strings (in case if +they are optional) at all. This can be done automatically with a sed +script. It seems that StarOffice 5.2 has this problem fixed, so we decided to +spend no efforts on providing workarounds for 5.1 with ttf2pt1. +

+ + + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/Makefile b/application/third_party/dompdf/lib/ttf2ufm/src/Makefile new file mode 100755 index 00000000..3a81cdc8 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/Makefile @@ -0,0 +1,279 @@ + +# This file should be configured before running `make'. +# Uncomment or change the values that are relevant for your OS. + +# The preferred C compiler (by default use the OS-specific default value). +# For BSD/OS, FreeBSD, Linux (all flavors), NetBSD, OpenBSD the default +# compiler is GNU C. +# (Note please the politically correct ordering by alphabet ! :-) +# +# Use GNU C even if it's not the default compiler +# +#CC=gcc +# +# Use the standard ANSI C compiler on HP-UX even if it's not default +# +#CC=c89 + +# +# The system-dependent flags for the C compiler +# +# Default + +CFLAGS_SYS= -g + +# For GNU C +# +#CFLAGS_SYS= -O2 +# +# For GNU C with long options support library (Linux etc.) +# +#CFLAGS_SYS= -O2 -D_GNU_SOURCE +# +# For GNU C on HP-UX/PA-RISC 1.1 +# +#CFLAGS_SYS= -O2 -Wa,-w +# +# For the standard ANSI C on HP-UX +# +#CFLAGS_SYS= +O2 -D_HPUX_SOURCE + +# +# The system-dependent libraries +# +# Defalut (for the BSD-style OSes) + +LIBS_SYS= -lm + +# For SystemV (such as SCO, UnixWare, Solaris, but _NOT_ Linux or HP-UX) +# +#LIBS_SYS= -lm -lsocket + +# +# The flags for C compiler for the FreeType-2 library (disabled by default). +# This WON'T BUILD with FT2-beta8, use the FreeType release 2.0.4 +# http://download.sourceforge.net/freetype/freetype-2.0.4.tar.gz + +#CFLAGS_FT= + +# To enable use of the FreeType-2 library +# (if the include and lib directory do not match your installation, +# modify them), also uncomment LIBS_FT +# +CFLAGS_FT = -DUSE_FREETYPE -I/usr/include/freetype2 -I/usr/include + +# +# The FreeType-2 library flags (disabled by default) + +#LIBS_FT= + +# To enable use of the FreeType-2 library +# (if the include and lib directory do not match your installation, +# modify them), also uncomment CFLAGS_FT +# +LIBS_FT= -L/usr/lib -lfreetype + +# +# The flags for C compiler for the Autotrace library (disabled by default). +# USE OF THIS FEATURE IS STRONGLY DISCOURAGED, THE BUILT-IN TRACING +# (AKA VECTORIZATION) PROVIDES MUCH BETTER RESULTS. +# The tested version is 0.29a (and the fonts produced with it are +# absolutely not usable). +# http://download.sourceforge.net/autotrace/autotrace-0.29.tar.gz + +CFLAGS_AT= + +# To enable use of the Autotrace library +# (if the include and lib directory do not match your installation, +# modify them), also uncomment LIBS_AT +# +#CFLAGS_AT = -DUSE_AUTOTRACE -I/usr/local/include + +# +# The Autotrace library flags (disabled by default) + +LIBS_AT= + +# To enable use of the Autotrace library +# (if the include and lib directory do not match your installation, +# modify them), also uncomment CFLAGS_AT +# +#LIBS_AT= -L/usr/local/lib -lautotrace + +# +# Preference of front-ends if multiple parsers match a file +# (by default the build-in front-end takes preference over FreeType) + +CFLAGS_PREF= + +# To prefer FreeType (if enabled): +# +#CFLAGS_PREF= -DPREFER_FREETYPE + +# Uncomment the second line to not compile t1asm into ttf2pt1 +CFLAGS_EXTT1ASM= +#CFLAGS_EXTT1ASM= -DEXTERNAL_T1ASM + +CFLAGS= $(CFLAGS_SYS) $(CFLAGS_FT) $(CFLAGS_AT) $(CFLAGS_PREF) +LIBS= $(LIBS_SYS) $(LIBS_FT) $(LIBS_AT) + +# Installation-related stuff +# +# The base dir for installation and subdirs in it +INSTDIR = /usr/local +# for binaries +BINDIR = $(INSTDIR)/bin +# for binaries of little general interest +LIBXDIR = $(INSTDIR)/libexec/ttf2pt1 +# for scripts, maps/encodings etc. +SHAREDIR = $(INSTDIR)/share/ttf2pt1 +MANDIR = $(INSTDIR)/man + +# owner and group of installed files +OWNER = root +GROUP = bin + +# After you have configured the Makefile, comment out the following +# definition: +warning: docs + @echo >&2 + @echo " You have to configure the Makefile before running make!" >&2 + @echo "(or if you are lazy and hope that it will work as is run \`make all')">&2 + @echo >&2 + +DOCS=CHANGES README FONTS FONTS.hpux encodings/README other/README \ + app/X11/README app/netscape/README app/TeX/README + +SUBDIRS = app encodings maps scripts other +TXTFILES = README* FONTS* CHANGES* COPYRIGHT + +MANS1=ttf2pt1.1 ttf2pt1_convert.1 ttf2pt1_x2gs.1 +MANS=$(MANS1) $(MANS5) + +all: t1asm ttf2pt1 docs mans rpm + +docs: $(DOCS) + +mans: $(MANS) + +clean: + rm -f t1asm ttf2pt1 *.o app/RPM/Makefile app/RPM/*.spec *.core core.* core + ( cd other && make clean; ) + ( cd app/netscape && make clean; ) + +veryclean: clean + rm -f $(DOCS) $(MANS) + +rpm: app/RPM/Makefile app/RPM/ttf2pt1.spec + +ttf2pt1.1: README.html + scripts/html2man . . app/RPM/Makefile + +app/RPM/ttf2pt1.spec: app/RPM/ttf2pt1.spec.src version.h + sed 's/^Version:.*/Version: '`grep TTF2PT1_VERSION version.h| cut -d\" -f2`'/' $@ + +t1asm: t1asm.c + $(CC) $(CFLAGS) -o t1asm -DSTANDALONE t1asm.c $(LIBS) + +ttf2pt1.o: ttf2pt1.c ttf.h pt1.h global.h version.h + $(CC) $(CFLAGS) -c ttf2pt1.c + +pt1.o: pt1.c ttf.h pt1.h global.h + $(CC) $(CFLAGS) -c pt1.c + +ttf.o: ttf.c ttf.h pt1.h global.h + $(CC) $(CFLAGS) -c ttf.c + +ft.o: ft.c pt1.h global.h + $(CC) $(CFLAGS) -c ft.c + +bdf.o: bdf.c pt1.h global.h + $(CC) $(CFLAGS) -c bdf.c + +bitmap.o: bitmap.c pt1.h global.h + $(CC) $(CFLAGS) -c bitmap.c + +runt1asm.o: runt1asm.c global.h + $(CC) $(CFLAGS) $(CFLAGS_EXTT1ASM) -c runt1asm.c + +ttf2pt1: ttf2pt1.o pt1.o runt1asm.o ttf.o ft.o bdf.o bitmap.o + $(CC) $(CFLAGS) -o ttf2pt1 ttf2pt1.o pt1.o runt1asm.o ttf.o ft.o bdf.o bitmap.o $(LIBS) + +CHANGES: CHANGES.html + scripts/unhtml CHANGES + +README: README.html + scripts/unhtml README + +encodings/README: encodings/README.html + scripts/unhtml encodings/README + +other/README: other/README.html + scripts/unhtml other/README + +app/X11/README: app/X11/README.html + scripts/unhtml app/X11/README + +app/netscape/README: app/netscape/README.html + scripts/unhtml app/netscape/README + +app/TeX/README: app/TeX/README.html + scripts/unhtml app/TeX/README + +FONTS: FONTS.html + scripts/unhtml FONTS + +FONTS.hpux: FONTS.hpux.html + scripts/unhtml FONTS.hpux + +install: all + scripts/inst_dir $(BINDIR) $(OWNER) $(GROUP) 0755 + scripts/inst_dir $(LIBXDIR) $(OWNER) $(GROUP) 0755 + scripts/inst_dir $(SHAREDIR) $(OWNER) $(GROUP) 0755 + scripts/inst_dir $(MANDIR)/man1 $(OWNER) $(GROUP) 0755 + scripts/inst_dir $(MANDIR)/man5 $(OWNER) $(GROUP) 0755 + cp -R $(TXTFILES) $(SUBDIRS) $(SHAREDIR) + chown -R $(OWNER) $(SHAREDIR) + chgrp -R $(GROUP) $(SHAREDIR) + chmod -R go-w $(SHAREDIR) + scripts/inst_file ttf2pt1 $(BINDIR)/ttf2pt1 $(OWNER) $(GROUP) 0755 + [ -f $(BINDIR)/t1asm ] || scripts/inst_file t1asm $(LIBXDIR)/t1asm $(OWNER) $(GROUP) 0755 + sed -e 's|^TTF2PT1_BINDIR=$$|TTF2PT1_BINDIR=$(BINDIR)|;' \ + -e 's|^TTF2PT1_LIBXDIR=$$|TTF2PT1_LIBXDIR=$(LIBXDIR)|;' \ + -e 's|^TTF2PT1_SHAREDIR=$$|TTF2PT1_SHAREDIR=$(SHAREDIR)|;' cvt.tmp + scripts/inst_file cvt.tmp $(BINDIR)/ttf2pt1_convert $(OWNER) $(GROUP) 0755 + scripts/inst_file cvt.tmp $(SHAREDIR)/scripts/convert $(OWNER) $(GROUP) 0755 + rm cvt.tmp + scripts/inst_file scripts/x2gs $(BINDIR)/ttf2pt1_x2gs $(OWNER) $(GROUP) 0755 + for i in $(MANS1); do { \ + sed -e 's|TTF2PT1_BINDIR|$(BINDIR)|;' \ + -e 's|TTF2PT1_LIBXDIR|$(LIBXDIR)|;' \ + -e 's|TTF2PT1_SHAREDIR|$(SHAREDIR)|;' <$$i >$(MANDIR)/man1/$$i \ + && chown $(OWNER) $(MANDIR)/man1/$$i \ + && chgrp $(GROUP) $(MANDIR)/man1/$$i \ + && chmod 0644 $(MANDIR)/man1/$$i \ + || exit 1; \ + } done + +uninstall: + rm -f $(BINDIR)/ttf2pt1 $(BINDIR)/ttf2pt1_convert $(BINDIR)/ttf2pt1_x2gs + rm -rf $(LIBXDIR) + rm -rf $(SHAREDIR) + for i in $(MANS1); do { \ + rm -f $(MANDIR)/man1/$$i $(MANDIR)/man1/$$i.gz; \ + } done + + +# targets for automatic generation of releases and snapshots + +snapshot: + scripts/mkrel snapshot + +release: + scripts/mkrel release diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/README b/application/third_party/dompdf/lib/ttf2ufm/src/README new file mode 100755 index 00000000..f1cf5b67 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/README @@ -0,0 +1,814 @@ +TTF2PT1 - A True Type to PostScript Type 1 Font Converter + +(Do not edit this file, it is generated from README.html!!!) +[ + Based on ttf2pfa by Andrew Weeks, and help from Frank Siegert. + Modification by Mark Heath. + Further modification by Sergey Babkin. + The Type1 assembler by I. Lee Hetherington with modifications by + Kai-Uwe Herbing. +] + +Ever wanted to install a particular font on your XServer but only could find +the font you are after in True Type Format? + +Ever asked comp.fonts for a True Type to Type 1 converter and got a List +of Commercial software that doesn't run on your Operating System? + +Well, this program should be the answer. This program is written in C (so it +should be portable) and therefore should run on any OS. The only limitation +is that the program requires some method of converting Big endian integers into +local host integers so the network functions ntohs and ntohl are used. These +can be replaced by macros if your platform doesn't have them. +Of course the target platform requires a C compiler and command line ability. + +Ttf2pt1 is a font converter from the True Type format (and some other formats +supported by the FreeType library as well) to the Adobe Type1 format. + +The versions 3.0 and later got rather extensive post-processing algorithm that +brings the converted fonts to the requirements of the Type1 standard, tries to +correct the rounding errors introduced during conversions and some simple +kinds of bugs that are typical for the public domain TTF fonts. It +also generates the hints that enable much better rendering of fonts in +small sizes that are typical for the computer displays. But everything +has its price, and some of the optimizations may not work well for certain +fonts. That's why the options were added to the converter, to control +the performed optimizations. + +The converter is simple to run, just: + + ttf2pt1 [-options] ttffont.ttf [Fontname] +or + ttf2pt1 [-options] ttffont.ttf - + +The first variant creates the file Fontname.pfa (or Fontname.pfb if the +option '-b' was used) with the converted font and Fontname.afm with the +font metrics, the second one prints the font or another file (if the option +'-G' was used) on the standard output from where it can be immediately +piped through some filter. If no Fontname is specified for the first +variant, the name is generated from ttffont by replacing the .ttf +filename suffix. + +Most of the time no options are neccessary (with a possible exception +of '-e'). But if there are some troubles with the resulting font, they +may be used to control the conversion. +The options are: + +-a - Include all the glyphs from the source file into the converted + file. If this option is not specified then only the glyphs that have + been assigned some encoding are included, because the rest of glyphs + would be inaccessible anyway and would only consume the disk space. + But some applications are clever enough to change the encoding on + the fly and thus use the other glyphs, in this case they could + benefit from using this option. But there is a catch: the X11 library + has rather low limit for the font size. Including more glyphs increases + the file size and thus increases the chance of hitting this limit. + See app/X11/README for the description of a + patch to X11 which fixes this problem. + +-b - Encode the resulting font to produce a ready .pfb file. + +-d suboptions - Debugging options. The suboptions are: + + a - Print out the absolute coordinates of dots in outlines. Such + a font can not be used by any program (that's why this option is + incompatible with '-e') but it has proven to be a valuable debuging + information. + + r - Do not reverse the direction of outlines. The TTF fonts have + the standard direction of outlines opposite to the Type1 fonts. So + they should be reversed during proper conversion. This option + may be used for debugging or to handle a TTF font with wrong + direction of outlines (possibly, converted in a broken way from + a Type1 font). The first signs of the wrong direction are the + letters like "P" or "B" without the unpainted "holes" inside. + +-e - Assemble the resulting font to produce a ready .pfa file. + [ S.B.: Personally I don't think that this option is particularly useful. + The same result may be achieved by piping the unassembled data + through t1asm, the Type 1 assembler. And, anyways, it's good to + have the t1utils package handy. But Mark and many users think that + this functionality is good and it took not much time to add this option. ] + +-F - Force the Unicode encoding: any type of MS encoding specified + in the font is ignored and the font is treated like it has Unicode + encoding. WARNING: this option is intended for buggy fonts + which actually are in Unicode but are marked as something else. The + effect on the other fonts is unpredictable. + +-G suboptions - File generation options. The suboptions may be lowercase + or uppercase, the lowercase ones disable the generation of particular + files, the corresponding uppercase suboptions enable the generation of the + same kind of files. If the result of ttf2pt1 is requested to be printed on + the standard output, the last enabling suboption of -G determines + which file will be written to the standard output and the rest of files + will be discarded. For example, -G A will request the AFM file. + The suboptions to disable/enable the generation of the files are: + + f/F - The font file. Depending on the other options this file + will have one of the suffixes .t1a, .pfa or .pfb. If the conversion result + is requested on the standard output ('-' is used as the output file name) + then the font file will also be written there by default, if not overwritten + by another suboption of -G. + Default: enabled + + a/A - The Adobe font metrics file (.afm). + Default: enabled + + e/E - The dvips encoding file (.enc). + Default: disabled + + +-l language[+argument] - Extract the fonts for the specified language from a + multi-language Unicode font. If this option is not used the converter + tries to guess the language by the values of the shell variable LANG. + If it is not able to guess the language by LANG it tries all the + languages in the order they are listed. + + After the plus sign an optional argument for the language extractor + may be specified. The format of the argument is absolutely up to + the particular language converter. The primary purpose of the + argument is to support selection of planes for the multi-plane + Eastern encodings but it can also be used in any other way. The + language extractor may decide to add the plane name in some form + to the name of the resulting font. None of the currently supported + languages make any use of the argument yet. + + As of now the following languages are supported: + latin1 - for all the languages using the Latin-1 encoding + latin2 - for the Central European languages + latin4 - for the Baltic languages + latin5 - for the Turkish language + cyrillic - for the languages with Cyrillic alphabet + russian - historic synonym for cyrillic + bulgarian - historic synonym for cyrillic + adobestd - for the AdobeStandard encoding used by TeX + plane+argument - to select one plane from a multi-byte encoding + + The argument of the "plane" language may be in one of three forms: + plane+pid=,eid= + plane+pid=,eid=, + plane+ + + Pid (TTF platform id) and eid (TTF encoding id) select a particular + TTF encoding table in the original font. They are specified as decimal + numbers. If this particular encoding table is not present in the font + file then the conversion fails. The native ("ttf") front-end parser supports + only pid=3 (Windows platform), the FreeType-based ("ft") front-end supports + any platform. If pid/eid is not specified then the TTF encoding table is + determined as usual: Unicode encoding if it's first or an 8-bit encoding + if not (and for an 8-bit encoding the plane number is silently ignored). + To prevent the converter from falling back to an 8-bit encoding, specify + the Unicode pid/eid value explicitly. + + Plane_number is a hexadecimal (if starts with "0x") or decimal number. + It gives the values of upper bytes for which 256 characters will be + selected. If not specified, defaults to 0. It is also used as a font + name suffix (the leading "0x" is not included into the suffix). + + NOTE: + It seems that many Eastern fonts use features of the TTF format that are + not supported by the ttf2pt1's built-in front-end parser. Because of + this for now we recommend using the FreeType-based parser (option + '-p ft') with the "plane" language. + + NOTE: + You may notice that the language names are not uniform: some are the + names of particular languages and some are names of encodings. This + is because of the different approaches. The original idea was to + implement a conversion from Unicode to the appropriate Windows + encoding for a given language. And then use the translation tables + to generate the fonts in whatever final encodings are needed. This + would allow to pile together the Unicode fonts and the non-Unicode + Windows fonts for that language and let the program to sort them out + automatically. And then generate fonts in all the possible encodings + for that language. An example of this approach is the Russian language + support. But if there is no multiplicity of encodings used for some + languages and if the non-Unicode fonts are not considered important + by the users, another way would be simpler to implement: just provide + only one table for extraction of the target encoding from Unicode + and don't bother with the translation tables. The latin* "languages" + are examples of this approach. If somebody feels that he needs the + Type1 fonts both in Latin-* and Windows encodings he or she is absolutely + welcome to submit the code to implement it. + + WARNING: + Some of the glyphs included into the AdobeStandard encoding are not + included into the Unicode standard. The most typical examples of such + glyphs are ligatures like 'fi', 'fl' etc. Because of this the font + designers may place them at various places. The converter tries to + do its best, if the glyphs have honest Adobe names and/or are + placed at the same codes as in the Microsoft fonts they will be + picked up. Otherwise a possible solution is to use the option '-L' + with an external map. + +-L file[+[pid=,eid=,][plane]] - Extract the fonts for the specified + language from a multi-language font using the map from this file. This is + rather like the option '-l' but the encoding map is not + compiled into the program, it's taken from that file, so it's + easy to edit. Examples of such files are provided in + maps/adobe-standard-encoding.map, CP1250.map. (NOTE: + the 'standard encoding' map does not include all the glyphs of the + AdobeStandard encoding, it's provided only as an example.) The + description of the supported map formats is in the file + maps/unicode-sample.map. + + Likewise to '-l', an argument may be specified after the map file + name. But in this case the argument has fixed meaning: it selects the + original TTF encoding table (the syntax is the same as in '-l plane') + and/or a plane of the map file. The plane name also gets added after dash + to the font name. The plane is a concept used in the Eastern fonts with big + number of glyphs: one TTF font gets divided into multiple Type1 fonts, + each containing one plane of up to 256 glyphs. But with a little + creativity this concept may be used for other purposes of combining + multiple translation maps into one file. To extract multiple planes + from a TTF font ttf2pt1 must be run multiple times, each time with + a different plane name specified. + + The default original TTF encoding table used for the option '-L' is + Unicode. The map files may include directives to specify different original + TTF encodings. However if the pid/eid pair is specified with + it overrides any original encoding specified in the map file. + +-m type=value - Set maximal or minimal limits of resources. + These limits control the the font generation by limiting the resources + that the font is permitted to require from the PostScript interpreter. + The currently supported types of limits are: + + h - the maximal hint stack depth for the substituted hints. + The default value is 128, according to the limitation in X11. This seems to + be the lowest (and thus the safest) widespread value. To display the + hint stack depth required by each glyph in a .t1a file use the script + scripts/cntstems.pl. + +-O suboptions - Outline processing options. The suboptions + may be lowercase or uppercase, the lowercase ones disable the features, + the corresponding uppercase suboptions enable the same features. + The suboptions to disable/enable features are: + + b/B - Guessing of the ForceBold parameter. This parameter helps + the Type1 engine to rasterize the bold fonts properly at small sizes. + But the algorithm used to guess the proper value of this flag makes + that guess based solely on the font name. In rare cases that may cause + errors, in these cases you may want to disable this guessing. + Default: enabled + + h/H - Autogeneration of hints. The really complex outlines + may confuse the algorithm, so theoretically it may be useful + sometimes to disable them. Although up to now it seems that + even bad hints are better than no hints at all. + Default: enabled + + u/U - Hint substitution. Hint substitution is a technique + permitting generation of more detailed hints for the rasterizer. It allows + to use different sets of hints for different parts of a glyph and change + these sets as neccessary during rasterization (that's why "substituted"). + So it should improve the quality of the fonts rendered at small sizes. + But there are two catches: First, the X11 library has rather low limit for + the font size. More detailed hints increase the file size and thus increase + the chance of hitting this limit (that does not mean that you shall hit it + but you may if your fonts are particularly big). This is especially + probable for Unicode fonts converted with option '-a', so you may want to + use '-a' together with '-Ou'. See app/X11/README for the description of + a patch to X11 which fixes this problem. Second, some rasterizers (again, + X11 is the typical example) have a limitation for total number of hints + used when drawing a glyph (also known as the hint stack depth). If that + stack overflows the glyph is ignored. Starting from version 3.22 ttf2pt1 + uses algorithms to minimizing this depth, with the trade-off of slightly + bigger font files. The glyphs which still exceed the limit set by option + '-mh' have all the substituted hints removed and only base hints left. + The algorithms seem to have been refined far enough to make the fonts with + substituted hints look better than the fonts without them or at least the + same. Still if the original fonts are not well-designed the detailed + hinting may emphasize the defects of the design, such as non-even thickness + of lines. So provided that you are not afraid of the X11 bug the best idea + would be to generate a font with this feature and without it, then compare + the results using the program other/cmpf (see the description + in other/README) and decide which one looks better. + Default: enabled + + o/O - Space optimization of the outlines' code. This kind of optimization + never hurts, and the only reason to disable this feature is for comparison + of the generated fonts with the fonts generated by the previous versions of + converter. Well, it _almost_ never hurts. As it turned out there exist + some brain-damaged printers which don't understand it. Actually this + feature does not change the outlines at all. The Type 1 font manual + provides a set of redundant operators that make font description shorter, + such as '10 hlineto' instead of '0 10 rlineto' to describe a horizontal + line. This feature enables use of these operators. + Default: enabled + + s/S - Smoothing of outlines. If the font is broken in some + way (even the ones that are not easily noticeable), such smoothing + may break it further. So disabling this feature is the first thing to be + tried if some font looks odd. But with smoothing off the hint generation + algorithms may not work properly too. + Default: enabled + + t/T - Auto-scaling to the 1000x1000 Type1 standard matrix. The + TTF fonts are described in terms of an arbitrary matrix up to + 4000x4000. The converted fonts must be scaled to conform to + the Type1 standard. But the scaling introduces additional rounding + errors, so it may be curious sometimes to look at the font in its + original scale. + Default: enabled + + v/V - Do vectorization on the bitmap fonts. Functionally + "vectorization" is the same thing as "autotracing", a different word is + used purely to differentiate it from the Autotrace library. It tries to + produce nice smooth outlines from bitmaps. This feature is still a work + in progress though the results are already mostly decent. + Default: disabled + + w/W - Glyphs' width corection. This option is designed to be + used on broken fonts which specify too narrow widths for the + letters. You can tell that a font can benefit from this option + if you see that the characters are smashed together without + any whitespace between them. This option causes the converter + to set the character widths to the actual width of this character + plus the width of a typical vertical stem. But on the other hand + the well-designed fonts may have characters that look better if + their widths are set slightly narrower. Such well-designed fonts + will benefit from disabling this feature. You may want to convert + a font with and without this feature, compare the results and + select the better one. This feature may be used only on proportional + fonts, it has no effect on the fixed-width fonts. + Default: disabled + + z/Z - Use the Autotrace library on the bitmap fonts. The results + are horrible and the use of this option is not recommended. This option is + present for experimental purposes. It may change or be removed in the + future. The working tracing can be achieved with option -OV. + Default: disabled + +-p parser_name - Use the specified front-end parser to read the font file. + If this option is not used, ttf2pt1 selects the parser automatically based + on the suffix of the font file name, it uses the first parser in its + list that supports this font type. Now two parsers are supported: + + ttf - built-in parser for the ttf files (suffix .ttf) + bdf - built-in parser for the BDF files (suffix .bdf) + ft - parser based on the FreeType-2 library (suffixes .ttf, + .otf, .pfa, .pfb) + + The parser ft is NOT linked in by default. See Makefile + for instructions how to enable it. We do no support this parser on + Windows: probably it will work but nobody tried and nobody knows how + to build it. + + The conversion of the bitmap fonts (such as BDF) is simplistic yet, + producing jagged outlines. When converting such fonts, it might be + a good idea to turn off the hint substitution (using option -Ou) + because the hints produced will be huge but not adding much to the + quality of the fonts. + +-u number - Mark the font with this value as its + UniqueID. The UniqueID is used by the printers with the hard disks + to cache the rasterized characters and thus significantly + speed-up the printing. Some of those printers just can't + store the fonts without UniqueID on their disk.The problem + is that the ID is supposed to be unique, as it name says. And + there is no easy way to create a guaranteed unique ID. Adobe specifies + the range 4000000-4999999 for private IDs but still it's difficult + to guarantee the uniqueness within it. So if you don't really need the + UniqueID don't use it, it's optional. Luckily there are a few millions of + possible IDs, so the chances of collision are rather low. + If instead of the number a special value 'A' is given + then the converter generates the value of UniqueID automatically, + as a hash of the font name. (NOTE: in the version 3.22 the + algorithm for autogeneration of UniqueID was changed to fit the values + into the Adobe-spacified range. This means that if UniqueIDs were used + then the printer's cache may need to be flushed before replacing the + fonts converted by an old version with fonts converted by a newer version). + A simple way to find if any of the fonts in a given directory have + duplicated UniqueIDs is to use the command: + + cat *.pf[ab] | grep UniqueID | sort | uniq -c | grep -v ' 1 ' + + Or if you use scripts/convert it will do that for you automatically + plus it will also give the exact list of files with duplicate UIDs. + +-v size - Re-scale the font to get the size of a typical uppercase + letter somewhere around the specified size. Actually, it re-scales + the whole font to get the size of one language-dependent letter to be + at least of the specified size. Now this letter is "A" in all the + supported languages. The size is specified in the points of the + Type 1 coordinate grids, the maximal value is 1000. This is an + experimental option and should be used with caution. It tries to + increase the visible font size for a given point size and thus make + the font more readable. But if overused it may cause the fonts to + look out of scale. As of now the interesting values of size for + this option seem to be located mostly between 600 and 850. This + re-scaling may be quite useful but needs more experience to + understand the balance of its effects. + +-W level - Select the verbosity level of the warnings. + Currently the levels from 0 to 4 are supported. Level 0 means no warnings + at all, level 4 means all the possible warnings. The default level is 3. + Other levels may be added in the future, so using the level number 99 is + recommended to get all the possible warnings. Going below level 2 is + not generally recommended because you may miss valuable information about + the problems with the fonts being converted. + +Obsolete option: +-A - Print the font metrics (.afm file) instead of the font on STDOUT. + Use -GA instead. + +Very obsolete option: + The algorithm that implemented the forced fixed width had major + flaws, so it was disabled. The code is still in the program and + some day it will be refined and returned back. Meanwhile the + option name '-f' was reused for another option. The old version was: +-f - Don't try to force the fixed width of font. Normally the converter + considers the fonts in which the glyph width deviates by not more + than 5% as buggy fixed width fonts and forces them to have really + fixed width. If this is undesirable, it can be disabled by this option. + +The .pfa font format supposes that the description of the characters +is binary encoded and encrypted. This converter does not encode or +encrypt the data by default, you have to specify the option '-e' +or use the t1asm program to assemble (that means, encode and +encrypt) the font program. The t1asm program that is included with +the converter is actually a part of the t1utils package, rather old +version of which may be obtained from + + http://ttf2pt1.sourceforge.net/t1utils.tar.gz + +Note that t1asm from the old version of that package won't work properly +with the files generated by ttf2pt1 version 3.20 and later. Please use +t1asm packaged with ttf2pt1 or from the new version t1utils +instead. For a newer version of t1utils please look at + + http://www.lcdf.org/~eddietwo/type/ + +So, the following command lines: + + ttf2pt1 -e ttffont.ttf t1font + ttf2pt1 ttffont.ttf - | t1asm >t1font.pfa + +represent two ways to get a working font. The benefit of the second form +is that other filters may be applied to the font between the converter +and assembler. + +Installation and deinstallation of the converter +------------------------------------------------ + +The converter may be easily installed systemwide with + + make install + +and uninstalled with + + make uninstall + +By default the Makefile is configured to install in the hierarchy +of directory /usr/local. This destination directory as well as +the structure of the hierarchy may be changed by editing the Makefile. + +Installation of the fonts +------------------------- + +Running the converter manually becomes somewhat boring if it has to +be applied to a few hundreds of fonts and then you have to generate the +fonts.scale and/or Fontmap files. The FONTS file describes how to use +the supplied scripts to handle such cases easily. It also discusses +the installation of the fonts for a few widespread programs. + +Other utilities +--------------- + +A few other small interesting programs that allow a cloase look at +the fonts are located in the subdirectory 'other'. They +are described shortly in others/README. + +Optional packages +----------------- + +Some auxiliary files are not needed by everyone and are big enough that +moving them to a separate package speeds up the downloads of the main +package significantly. As of now we have one such optional package: + + ttf2pt1-chinese - contains the Chinese conversion maps + +The general versioning policy for the optional packages is the following: +These packages may have no direct dependency on the ttf2pt1 version. +But they may be updated in future, as well as some versions of optional +packages may have dependencies on certain versions of ttf2pt1. +To avoid unneccessary extra releases on one hand and keep the updates in +sync with the ttf2pt1 itself on the other hand, a new version of an optional +package will be released only if there are any changes to it and it will be +given the same version number as ttf2pt1 released at the same time. So not +every release of ttf2pt1 would have a corresponding release of all optional +packages. For example, to get the correct version of optional packages for an +imaginary release 8.3.4 of ttf2pt1 you would need to look for optional +packages of the highest version not higher than (but possibly equal to) 8.3.4. + +TO DO: +------ + +- Improve hinting. +- Improve the auto-tracing of bitmaps. +- Implement the family-level hints. +- Add generation of CID-fonts. +- Handle the composite glyphs with relative base points. +- Preserve the relative width of stems during scaling to 1000x1000 matrix. +- Add support for bitmap TTF fonts. +- Implement better support of Asian encodings. +- Implement automatic creation of ligatures. + +TROUBLESHOOTING AND BUG REPORTS +------------------------------- + +Have problems with conversion of some font ? The converter dumps core ? Or your +printer refuses to understand the converted fonts ? Or some characters are +missing ? Or some characters look strange ? + +Send the bug reports to the ttf2pt1 development mailing list at +ttf2pt1-devel@lists.sourceforge.net. + +Try to collect more information about the problem and include it into +the bug report. (Of course, even better if you would provide a ready +fix, but just a detailed bug report is also good). Provide detailed +information about your problem, this will speed up the response greatly. +Don't just write "this font looks strange after conversion" but describe +what's exactly wrong with it: for example, what characters look wrong +and what exactly is wrong about their look. Providing a link to the +original font file would be also a good idea. Try to do a little +troublehooting and report its result. This not only would help with +the fix but may also give you a temporary work-around for the bug. + +First, enable full warnings with option '-W99', save them to +a file and read carefully. Sometimes the prolem is with a not implemented +feature which is reported in the warnings. Still, reporting about such +problems may be a good idea: some features were missed to cut corners, +in hope that no real font is using them. So a report about a font using +such a feature may motivate someone to implement it. Of course, you +may be the most motivated person: after all, you are the one wishing +to convert that font. ;-) Seriously, the philosophy "scrath your own itch" +seems to be the strongest moving force behind the Open Source software. + +The next step is playing with the options. This serves a dual purpose: +on one hand, it helps to localize the bug, on the other hand you may be +able to get a working version of the font for the meantime while the +bug is being fixed. The typical options to try out are: first '-Ou', if +it does not help then '-Os', then '-Oh', then '-Oo'. +They are described in a bit more detail above. Try them one by one +and in combinations. See if with them the resulting fonts look better. + +On some fonts ttf2pt1 just crashes. Commonly that happens because the +font being converted is highly defective (although sometimes the bug +is in ttf2pt1 itself). In any case it should not crash, so the reports +about such cases will help to handle these defects properly in future. + +We try to respond to the bug reports in a timely fashion but alas, this +may not always be possible, especially if the problem is complex. +This is a volunteer project and its resources are limited. Because +of this we would appreciate bug reports as detailed as possible, +and we would appreciate the ready fixes and contributions even more. + +CONTACTS +-------- + +ttf2pt1-announce@lists.sourceforge.net + The mailing list with announcements about ttf2pt1. It is a moderated mailing + with extremely low traffic. Everyone is encouraged to subscribe to keep in + touch with the current status of project. To subscribe use the Web interface + at http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-announce. + If you have only e-mail access to the Net then send a subscribe request to + the development mailing list ttf2pt1-devel@lists.sourceforge.net and somebody + will help you with subscription. + +ttf2pt1-devel@lists.sourceforge.net +ttf2pt1-users@lists.sourceforge.net + The ttf2pt1 mailing lists for development and users issues. They have not + that much traffic either. To subscribe use the Web interface at + http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-devel + and http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-users. + If you have only e-mail access to the Net then send a subscribe request to + the development mailing list ttf2pt1-devel@lists.sourceforge.net and somebody + will help you with subscription. + +mheath@netspace.net.au + Mark Heath + +A.Weeks@mcc.ac.uk + Andrew Weeks + +babkin@users.sourceforge.net (preferred) +sab123@hotmail.com +http://members.bellatlantic.net/~babkin + Sergey Babkin + +SEE ALSO +-------- + +http://ttf2pt1.sourceforge.net + The main page of the project. + +http://www.netspace.net.au/~mheath/ttf2pt1/ + The old main page of the project. + +http://sourceforge.net/projects/gnuwin32 + Precompiled binaries for Windows. + +http://www.lcdf.org/~eddietwo/type/ + The home page of the Type 1 utilities package. + +http://www.rightbrain.com/pages/books.html + The first book about PostScript on the Web, "Thinking in PostScript". + +http://fonts.apple.com/TTRefMan/index.html + The True Type reference manual. + +http://partners.adobe.com/asn/developer/PDFS/TN/PLRM.pdf + Adobe PostScript reference manual. + +http://partners.adobe.com/asn/developer/PDFS/TN/T1_SPEC.PDF + Specification of the Type 1 font format. + +http://partners.adobe.com/asn/developer/PDFS/TN/5015.Type1_Supp.pdf + The Type 1 font format supplement. + +http://partners.adobe.com/asn/developer/PDFS/TN/5004.AFM_Spec.pdf + Specification of the Adobe font metrics file format. + +http://www.cs.wpi.edu/~matt/courses/cs563/talks/surface/bez_surf.html +http://www.cs.wpi.edu/~matt/courses/cs563/talks/curves.html + Information about the Bezier curves. + +http://www.neuroinformatik.ruhr-uni-bochum.de/ini/PEOPLE/rmz/t1lib/t1lib.html + A stand-alone library supporting the Type1 fonts. Is neccessary + to compile the programs other/cmpf and other/dmpf. + +http://www.freetype.org + A library supporting the TTF fonts. Also many useful TTF programs + are included with it. + +http://heliotrope.homestead.com/files/printsoft.html + Moses Gold's collection of links to printing software. + +http://linuxartist.org/fonts/ + Collection of font-related links. + +---------------------------------------------------------------------- +---------------------------------------------------------------------- + +Following is the Readme of ttf2pfa (true type to type 3 font converter) It +covers other issues regarding the use of this software. Please note that +although ttf2pfa is a public domain software, ttf2pt1 +is instead covered by an Open Source license. See the COPYRIGHT +file for details. + +Please note also that ttf2pfa has not been maintained for a long time. +All of its functionality has been integrated into ttf2pt1 and all the +development moved to ttf2pt1, including Andrew Weeks, the author of +ttf2pfa. Ttf2pfa is provided for historical reasons only. Please use +ttf2pt1 instead. + +---------------------------------------------------------------------- + +True Type to Postscript Font converter +-------------------------------------- + +My mind is still reeling from the discovery that I was able to write +this program. What it does is it reads a Microsoft TrueType font and +creates a Postscript font. '_A_ postscript font', that is, not necessarily +the same font, you understand, but a fair imitation. + +Run it like this: + + ttf2pfa fontfile.ttf fontname + +The first parameter is the truetype filename, the second is a stem for +the output file names. The program will create a fontname.pfa containing +the Postscript font and a fontname.afm containing the metrics. + +The motivation behind this is that in Linux if you do not have a +Postscript printer, but only some other printer, you can only print +Postscript by using Ghostscript. But the fonts that come with +Ghostscript are very poor (they are converted from bitmaps and look +rather lumpy). This is rather frustrating as the PC running Linux +probably has MS-Windows as well and will therefore have truetype fonts, +but which are quite useless with Linux, X or Ghostscript. + +The program has been tested on over a hundred different TrueType fonts +from various sources, and seems to work fairly well. The converted +characters look OK, and the program doesn't seem to crash any more. I'm +not sure about the AFM files though, as I have no means to test them. + +The fonts generated will not work with X, as the font rasterizer that +comes with X only copes with Type 1 fonts. If I have the time I may +modify ttf2pfa to generate Type 1s. + +Copyright issues +---------------- + +I am putting this program into the public domain, so don't bother +sending me any money, I'd only have to declare it for income tax. + +Copyright on fonts, however, is a difficult legal question. Any +copyright statements found in a font will be preserved in the output. +Whether you are entitled to translate them at all I don't know. + +If you have a license to run a software package, like say MS-Windows, on +your PC, then you probably have a right to use any part of it, including +fonts, on that PC, even if not using that package for its intended +purpose. + +I am not a lawyer, however, so this is not a legal opinion, and may be +garbage. + +There shouldn't be a any problem with public domain fonts. + +About the Program +----------------- + +It was written in C on a IBM PC running Linux. + +The TrueType format was originally developed by Apple for the MAC, which +has opposite endianness to the PC, so to ensure compatibility 16 and 32 +bit fields are the wrong way round from the PC's point of view. This is +the reason for all the 'ntohs' and 'ntohl' calls. Doing it this way +means the program will also work on big-endian machines like Suns. + +I doubt whether it will work on a DOS-based PC though. + +The program produces what technically are Type 3 rather than Type 1 +fonts. They are not compressed or encrypted and are plain text. This is +so I (and you) can see what's going on, and (if you're a Postscript guru +and really want to) can alter the outlines. + +I only translate the outlines, not the 'instructions' that come with +them. This latter task is probably virtually impossible anyway. TrueType +outlines are B-splines rather than the Bezier curves that Postscript +uses. I believe that my conversion algorithm is reasonably correct, if +nothing else because the characters look right. + +Problems that may occur +----------------------- + +Most seriously, very complex characters (with lots of outline segments) +can make Ghostscript releases 2.x.x fail with a 'limitcheck' error. It +is possible that this may happen with some older Postscript printers as +well. Such characters will be flagged by the program and there are +basically two things you can do. First is to edit the .pfa file to +simplify or remove the offending character. This is not really +recommended. The second is to use Ghostscript release 3, if you can get +it. This has much larger limits and does not seem to have any problems +with complex characters. + +Then there are buggy fonts (yes, a font can have bugs). I try to deal +with these in as sane a manner as possible, but it's not always +possible. + +Encodings +--------- + +A postscript font must have a 256 element array, called an encoding, +each element of which is a name, which is also the name of a procedure +contained within the font. The 'BuildChar' command takes a byte and uses +it to index the encoding array to find a character name, and then looks +that up in the font's procedure table find the commands to draw the +glyph. However, not all characters need be in the encoding array. Those +that are not cannot be drawn (at least not using 'show'), however it is +possible to 're-encode' the font to enable these characters. There are +several standard encodings: Adobe's original, ISO-Latin1 and Symbol +being the most commonly encountered. + +TrueType fonts are organised differently. As well as the glyph +descriptions there are a number of tables. One of these is a mapping +from a character set into the glyph array, and another is a mapping from +the glyph array into a set of Postscript character names. The problems +are: + 1) Microsoft uses Unicode, a 16-bit system, to encode the font. + 2) that more than one glyph is given the same Postscript name. + +I deal with (1) by assuming a Latin1 encoding. The MS-Windows and +Unicode character sets are both supersets of ISO-8859-1. This usually +means that most characters will be properly encoded, but you should be +warned that some software may assume that fonts have an Adobe encoding. +Symbol, or Dingbat, fonts are in fact less of a problem, as they have +private encodings starting at 0xF000. It is easy to just lose the top +byte. + +Postscript fonts can be re-encoded, either manually, or by software. +Groff, for example, generates postscript that re-encodes fonts with the +Adobe encoding. The problem here is that not all characters in the Adobe +set are in the MS-Windows set. In particular there are no fi and fl +ligatures. This means that conversions of the versions of +Times-New-Roman and Arial that come with MS-Windows cannot be used +blindly as replacements for Adobe Times-Roman and Helvetica. You can get +expanded versions of MS fonts from Microsoft's web site which do contain +these ligatures (and a lot else besides). + +I deal with (2) by creating new character names. This can be error-prone +because I do not know which of them is the correct glyph to give the +name to. Some (buggy) fonts have large numbers of blank glyphs, all with +the same name. + +(almost every TrueType font has three glyphs called .notdef, one of them +is usually an empty square shape, one has no outline and has zero width, +and one has no outline and a positive width. This example is not really +a problem with well formed fonts since the .notdef characters are only +used for unprintable characters, which shouldn't occur in your documents +anyway). diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/README.FIRST b/application/third_party/dompdf/lib/ttf2ufm/src/README.FIRST new file mode 100755 index 00000000..f89db201 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/README.FIRST @@ -0,0 +1,4 @@ +To get the plain-text README and installation guides run: + + make docs + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/README.html b/application/third_party/dompdf/lib/ttf2ufm/src/README.html new file mode 100755 index 00000000..b1d6c9c2 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/README.html @@ -0,0 +1,1182 @@ + + + +TTF2PT1 - A True Type to PostScript Type 1 Converter + + + + +

+ +TTF2PT1 - A True Type to PostScript Type 1 Font Converter + +

+ + + +[ +
+ + Based on ttf2pfa by Andrew Weeks, and help from Frank Siegert. +
+ Modification by Mark Heath. +
+ Further modification by Sergey Babkin. +
+ The Type1 assembler by I. Lee Hetherington with modifications by + Kai-Uwe Herbing. + +
+] +
+

+ +Ever wanted to install a particular font on your XServer but only could find +the font you are after in True Type Format? +

+ +Ever asked comp.fonts for a True Type to Type 1 converter and got a List +of Commercial software that doesn't run on your Operating System? +

+ +Well, this program should be the answer. This program is written in C (so it +should be portable) and therefore should run on any OS. The only limitation +is that the program requires some method of converting Big endian integers into +local host integers so the network functions ntohs and ntohl are used. These +can be replaced by macros if your platform doesn't have them. +Of course the target platform requires a C compiler and command line ability. +

+ + +Ttf2pt1 is a font converter from the True Type format (and some other formats +supported by the FreeType library as well) to the Adobe Type1 format. +

+ +The versions 3.0 and later got rather extensive post-processing algorithm that +brings the converted fonts to the requirements of the Type1 standard, tries to +correct the rounding errors introduced during conversions and some simple +kinds of bugs that are typical for the public domain TTF fonts. It +also generates the hints that enable much better rendering of fonts in +small sizes that are typical for the computer displays. But everything +has its price, and some of the optimizations may not work well for certain +fonts. That's why the options were added to the converter, to control +the performed optimizations. +

+ + +The converter is simple to run, just: +

+ + +

+ ttf2pt1 [-options] ttffont.ttf [Fontname] +
+or +
+ ttf2pt1 [-options] ttffont.ttf - +
+ +

+ + +The first variant creates the file Fontname.pfa (or Fontname.pfb if the +option '-b' was used) with the converted font and Fontname.afm with the +font metrics, the second one prints the font or another file (if the option +'-G' was used) on the standard output from where it can be immediately +piped through some filter. If no Fontname is specified for the first +variant, the name is generated from ttffont by replacing the .ttf +filename suffix. +

+ +Most of the time no options are neccessary (with a possible exception +of '-e'). But if there are some troubles with the resulting font, they +may be used to control the conversion. +The options are: +

+ + + +-a - Include all the glyphs from the source file into the converted + file. If this option is not specified then only the glyphs that have + been assigned some encoding are included, because the rest of glyphs + would be inaccessible anyway and would only consume the disk space. + But some applications are clever enough to change the encoding on + the fly and thus use the other glyphs, in this case they could + benefit from using this option. But there is a catch: the X11 library + has rather low limit for the font size. Including more glyphs increases + the file size and thus increases the chance of hitting this limit. + See app/X11/README for the description of a + patch to X11 which fixes this problem. +

+ + +-b - Encode the resulting font to produce a ready .pfb file. +

+ + +-d suboptions - Debugging options. The suboptions are: +

+ +

+ a - Print out the absolute coordinates of dots in outlines. Such + a font can not be used by any program (that's why this option is + incompatible with '-e') but it has proven to be a valuable debuging + information. +

+ + r - Do not reverse the direction of outlines. The TTF fonts have + the standard direction of outlines opposite to the Type1 fonts. So + they should be reversed during proper conversion. This option + may be used for debugging or to handle a TTF font with wrong + direction of outlines (possibly, converted in a broken way from + a Type1 font). The first signs of the wrong direction are the + letters like "P" or "B" without the unpainted "holes" inside. +

+

+ + +-e - Assemble the resulting font to produce a ready .pfa file. + + [ S.B.: Personally I don't think that this option is particularly useful. + The same result may be achieved by piping the unassembled data + through t1asm, the Type 1 assembler. And, anyways, it's good to + have the t1utils package handy. But Mark and many users think that + this functionality is good and it took not much time to add this option. ] + +

+ + +-F - Force the Unicode encoding: any type of MS encoding specified + in the font is ignored and the font is treated like it has Unicode + encoding. WARNING: this option is intended for buggy fonts + which actually are in Unicode but are marked as something else. The + effect on the other fonts is unpredictable. +

+ + +-G suboptions - File generation options. The suboptions may be lowercase + or uppercase, the lowercase ones disable the generation of particular + files, the corresponding uppercase suboptions enable the generation of the + same kind of files. If the result of ttf2pt1 is requested to be printed on + the standard output, the last enabling suboption of -G determines + which file will be written to the standard output and the rest of files + will be discarded. For example, -G A will request the AFM file. + The suboptions to disable/enable the generation of the files are: +

+ +

+ f/F - The font file. Depending on the other options this file + will have one of the suffixes .t1a, .pfa or .pfb. If the conversion result + is requested on the standard output ('-' is used as the output file name) + then the font file will also be written there by default, if not overwritten + by another suboption of -G. + Default: enabled +

+ + a/A - The Adobe font metrics file (.afm). + Default: enabled +

+ + e/E - The dvips encoding file (.enc). + Default: disabled +

+ +

+ + +-l language[+argument] - Extract the fonts for the specified language from a + multi-language Unicode font. If this option is not used the converter + tries to guess the language by the values of the shell variable LANG. + If it is not able to guess the language by LANG it tries all the + languages in the order they are listed. +

+ + After the plus sign an optional argument for the language extractor + may be specified. The format of the argument is absolutely up to + the particular language converter. The primary purpose of the + argument is to support selection of planes for the multi-plane + Eastern encodings but it can also be used in any other way. The + language extractor may decide to add the plane name in some form + to the name of the resulting font. None of the currently supported + languages make any use of the argument yet. +

+ + As of now the following languages are supported: +
+   latin1 - for all the languages using the Latin-1 encoding +
+   latin2 - for the Central European languages +
+   latin4 - for the Baltic languages +
+   latin5 - for the Turkish language +
+   cyrillic - for the languages with Cyrillic alphabet +
+   russian - historic synonym for cyrillic +
+   bulgarian - historic synonym for cyrillic +
+   adobestd - for the AdobeStandard encoding used by TeX +
+   plane+argument - to select one plane from a multi-byte encoding +

+ + The argument of the "plane" language may be in one of three forms: +

+   plane+pid=<pid>,eid=<eid> +
+   plane+pid=<pid>,eid=<eid>,<plane_number> +
+   plane+<plane_number> +

+ + Pid (TTF platform id) and eid (TTF encoding id) select a particular + TTF encoding table in the original font. They are specified as decimal + numbers. If this particular encoding table is not present in the font + file then the conversion fails. The native ("ttf") front-end parser supports + only pid=3 (Windows platform), the FreeType-based ("ft") front-end supports + any platform. If pid/eid is not specified then the TTF encoding table is + determined as usual: Unicode encoding if it's first or an 8-bit encoding + if not (and for an 8-bit encoding the plane number is silently ignored). + To prevent the converter from falling back to an 8-bit encoding, specify + the Unicode pid/eid value explicitly. +

+ + Plane_number is a hexadecimal (if starts with "0x") or decimal number. + It gives the values of upper bytes for which 256 characters will be + selected. If not specified, defaults to 0. It is also used as a font + name suffix (the leading "0x" is not included into the suffix). +

+ + + NOTE: + + It seems that many Eastern fonts use features of the TTF format that are + not supported by the ttf2pt1's built-in front-end parser. Because of + this for now we recommend using the FreeType-based parser (option + '-p ft') with the "plane" language. +

+ + + + + NOTE: + You may notice that the language names are not uniform: some are the + names of particular languages and some are names of encodings. This + is because of the different approaches. The original idea was to + implement a conversion from Unicode to the appropriate Windows + encoding for a given language. And then use the translation tables + to generate the fonts in whatever final encodings are needed. This + would allow to pile together the Unicode fonts and the non-Unicode + Windows fonts for that language and let the program to sort them out + automatically. And then generate fonts in all the possible encodings + for that language. An example of this approach is the Russian language + support. But if there is no multiplicity of encodings used for some + languages and if the non-Unicode fonts are not considered important + by the users, another way would be simpler to implement: just provide + only one table for extraction of the target encoding from Unicode + and don't bother with the translation tables. The latin* "languages" + are examples of this approach. If somebody feels that he needs the + Type1 fonts both in Latin-* and Windows encodings he or she is absolutely + welcome to submit the code to implement it. +

+ + WARNING: + Some of the glyphs included into the AdobeStandard encoding are not + included into the Unicode standard. The most typical examples of such + glyphs are ligatures like 'fi', 'fl' etc. Because of this the font + designers may place them at various places. The converter tries to + do its best, if the glyphs have honest Adobe names and/or are + placed at the same codes as in the Microsoft fonts they will be + picked up. Otherwise a possible solution is to use the option '-L' + with an external map. +

+ + +-L file[+[pid=<pid>,eid=<eid>,][plane]] - Extract the fonts for the specified + language from a multi-language font using the map from this file. This is + rather like the option '-l' but the encoding map is not + compiled into the program, it's taken from that file, so it's + easy to edit. Examples of such files are provided in + maps/adobe-standard-encoding.map, CP1250.map. (NOTE: + the 'standard encoding' map does not include all the glyphs of the + AdobeStandard encoding, it's provided only as an example.) The + description of the supported map formats is in the file + maps/unicode-sample.map. +

+ + Likewise to '-l', an argument may be specified after the map file + name. But in this case the argument has fixed meaning: it selects the + original TTF encoding table (the syntax is the same as in '-l plane') + and/or a plane of the map file. The plane name also gets added after dash + to the font name. The plane is a concept used in the Eastern fonts with big + number of glyphs: one TTF font gets divided into multiple Type1 fonts, + each containing one plane of up to 256 glyphs. But with a little + creativity this concept may be used for other purposes of combining + multiple translation maps into one file. To extract multiple planes + from a TTF font ttf2pt1 must be run multiple times, each time with + a different plane name specified. +

+ + The default original TTF encoding table used for the option '-L' is + Unicode. The map files may include directives to specify different original + TTF encodings. However if the pid/eid pair is specified with + it overrides any original encoding specified in the map file. +

+ + +-m type=value - Set maximal or minimal limits of resources. + These limits control the the font generation by limiting the resources + that the font is permitted to require from the PostScript interpreter. + The currently supported types of limits are: +

+ +

+ h - the maximal hint stack depth for the substituted hints. + The default value is 128, according to the limitation in X11. This seems to + be the lowest (and thus the safest) widespread value. To display the + hint stack depth required by each glyph in a .t1a file use the script + scripts/cntstems.pl. +

+

+ + +-O suboptions - Outline processing options. The suboptions + may be lowercase or uppercase, the lowercase ones disable the features, + the corresponding uppercase suboptions enable the same features. + The suboptions to disable/enable features are: +

+ +

+ b/B - Guessing of the ForceBold parameter. This parameter helps + the Type1 engine to rasterize the bold fonts properly at small sizes. + But the algorithm used to guess the proper value of this flag makes + that guess based solely on the font name. In rare cases that may cause + errors, in these cases you may want to disable this guessing. + Default: enabled +

+ + h/H - Autogeneration of hints. The really complex outlines + may confuse the algorithm, so theoretically it may be useful + sometimes to disable them. Although up to now it seems that + even bad hints are better than no hints at all. + Default: enabled +

+ + u/U - Hint substitution. Hint substitution is a technique + permitting generation of more detailed hints for the rasterizer. It allows + to use different sets of hints for different parts of a glyph and change + these sets as neccessary during rasterization (that's why "substituted"). + So it should improve the quality of the fonts rendered at small sizes. + But there are two catches: First, the X11 library has rather low limit for + the font size. More detailed hints increase the file size and thus increase + the chance of hitting this limit (that does not mean that you shall hit it + but you may if your fonts are particularly big). This is especially + probable for Unicode fonts converted with option '-a', so you may want to + use '-a' together with '-Ou'. See app/X11/README for the description of + a patch to X11 which fixes this problem. Second, some rasterizers (again, + X11 is the typical example) have a limitation for total number of hints + used when drawing a glyph (also known as the hint stack depth). If that + stack overflows the glyph is ignored. Starting from version 3.22 ttf2pt1 + uses algorithms to minimizing this depth, with the trade-off of slightly + bigger font files. The glyphs which still exceed the limit set by option + '-mh' have all the substituted hints removed and only base hints left. + The algorithms seem to have been refined far enough to make the fonts with + substituted hints look better than the fonts without them or at least the + same. Still if the original fonts are not well-designed the detailed + hinting may emphasize the defects of the design, such as non-even thickness + of lines. So provided that you are not afraid of the X11 bug the best idea + would be to generate a font with this feature and without it, then compare + the results using the program other/cmpf (see the description + in other/README) and decide which one looks better. + Default: enabled +

+ + o/O - Space optimization of the outlines' code. This kind of optimization + never hurts, and the only reason to disable this feature is for comparison + of the generated fonts with the fonts generated by the previous versions of + converter. Well, it _almost_ never hurts. As it turned out there exist + some brain-damaged printers which don't understand it. Actually this + feature does not change the outlines at all. The Type 1 font manual + provides a set of redundant operators that make font description shorter, + such as '10 hlineto' instead of '0 10 rlineto' to describe a horizontal + line. This feature enables use of these operators. + Default: enabled +

+ + s/S - Smoothing of outlines. If the font is broken in some + way (even the ones that are not easily noticeable), such smoothing + may break it further. So disabling this feature is the first thing to be + tried if some font looks odd. But with smoothing off the hint generation + algorithms may not work properly too. + Default: enabled +

+ + t/T - Auto-scaling to the 1000x1000 Type1 standard matrix. The + TTF fonts are described in terms of an arbitrary matrix up to + 4000x4000. The converted fonts must be scaled to conform to + the Type1 standard. But the scaling introduces additional rounding + errors, so it may be curious sometimes to look at the font in its + original scale. + Default: enabled +

+ + v/V - Do vectorization on the bitmap fonts. Functionally + "vectorization" is the same thing as "autotracing", a different word is + used purely to differentiate it from the Autotrace library. It tries to + produce nice smooth outlines from bitmaps. This feature is still a work + in progress though the results are already mostly decent. + Default: disabled +

+ + w/W - Glyphs' width corection. This option is designed to be + used on broken fonts which specify too narrow widths for the + letters. You can tell that a font can benefit from this option + if you see that the characters are smashed together without + any whitespace between them. This option causes the converter + to set the character widths to the actual width of this character + plus the width of a typical vertical stem. But on the other hand + the well-designed fonts may have characters that look better if + their widths are set slightly narrower. Such well-designed fonts + will benefit from disabling this feature. You may want to convert + a font with and without this feature, compare the results and + select the better one. This feature may be used only on proportional + fonts, it has no effect on the fixed-width fonts. + Default: disabled +

+ + z/Z - Use the Autotrace library on the bitmap fonts. The results + are horrible and the use of this option is not recommended. This option is + present for experimental purposes. It may change or be removed in the + future. The working tracing can be achieved with option -OV. + Default: disabled +

+

+ + +-p parser_name - Use the specified front-end parser to read the font file. + If this option is not used, ttf2pt1 selects the parser automatically based + on the suffix of the font file name, it uses the first parser in its + list that supports this font type. Now two parsers are supported: +

+ +   ttf - built-in parser for the ttf files (suffix .ttf) +
+   bdf - built-in parser for the BDF files (suffix .bdf) +
+   ft - parser based on the FreeType-2 library (suffixes .ttf, + .otf, .pfa, .pfb) +

+ + The parser ft is NOT linked in by default. See Makefile + for instructions how to enable it. We do no support this parser on + Windows: probably it will work but nobody tried and nobody knows how + to build it. +

+ + The conversion of the bitmap fonts (such as BDF) is simplistic yet, + producing jagged outlines. When converting such fonts, it might be + a good idea to turn off the hint substitution (using option -Ou) + because the hints produced will be huge but not adding much to the + quality of the fonts. +

+ + +-u number - Mark the font with this value as its + UniqueID. The UniqueID is used by the printers with the hard disks + to cache the rasterized characters and thus significantly + speed-up the printing. Some of those printers just can't + store the fonts without UniqueID on their disk.The problem + is that the ID is supposed to be unique, as it name says. And + there is no easy way to create a guaranteed unique ID. Adobe specifies + the range 4000000-4999999 for private IDs but still it's difficult + to guarantee the uniqueness within it. So if you don't really need the + UniqueID don't use it, it's optional. Luckily there are a few millions of + possible IDs, so the chances of collision are rather low. + If instead of the number a special value 'A' is given + then the converter generates the value of UniqueID automatically, + as a hash of the font name. (NOTE: in the version 3.22 the + algorithm for autogeneration of UniqueID was changed to fit the values + into the Adobe-spacified range. This means that if UniqueIDs were used + then the printer's cache may need to be flushed before replacing the + fonts converted by an old version with fonts converted by a newer version). + A simple way to find if any of the fonts in a given directory have + duplicated UniqueIDs is to use the command: +

+ +   cat *.pf[ab] | grep UniqueID | sort | uniq -c | grep -v ' 1 ' +

+ + Or if you use scripts/convert it will do that for you automatically + plus it will also give the exact list of files with duplicate UIDs. +

+ + +-v size - Re-scale the font to get the size of a typical uppercase + letter somewhere around the specified size. Actually, it re-scales + the whole font to get the size of one language-dependent letter to be + at least of the specified size. Now this letter is "A" in all the + supported languages. The size is specified in the points of the + Type 1 coordinate grids, the maximal value is 1000. This is an + experimental option and should be used with caution. It tries to + increase the visible font size for a given point size and thus make + the font more readable. But if overused it may cause the fonts to + look out of scale. As of now the interesting values of size for + this option seem to be located mostly between 600 and 850. This + re-scaling may be quite useful but needs more experience to + understand the balance of its effects. +

+ + +-W level - Select the verbosity level of the warnings. + Currently the levels from 0 to 4 are supported. Level 0 means no warnings + at all, level 4 means all the possible warnings. The default level is 3. + Other levels may be added in the future, so using the level number 99 is + recommended to get all the possible warnings. Going below level 2 is + not generally recommended because you may miss valuable information about + the problems with the fonts being converted. +

+ + +Obsolete option: +-A - Print the font metrics (.afm file) instead of the font on STDOUT. + Use -GA instead. +

+ + +Very obsolete option: +
+ The algorithm that implemented the forced fixed width had major + flaws, so it was disabled. The code is still in the program and + some day it will be refined and returned back. Meanwhile the + option name '-f' was reused for another option. The old version was: +
+-f - Don't try to force the fixed width of font. Normally the converter + considers the fonts in which the glyph width deviates by not more + than 5% as buggy fixed width fonts and forces them to have really + fixed width. If this is undesirable, it can be disabled by this option. +

+ + +The .pfa font format supposes that the description of the characters +is binary encoded and encrypted. This converter does not encode or +encrypt the data by default, you have to specify the option '-e' +or use the t1asm program to assemble (that means, encode and +encrypt) the font program. The t1asm program that is included with +the converter is actually a part of the t1utils package, rather old +version of which may be obtained from +

+ +

+ + http://ttf2pt1.sourceforge.net/t1utils.tar.gz + +
+

+ +Note that t1asm from the old version of that package won't work properly +with the files generated by ttf2pt1 version 3.20 and later. Please use +t1asm packaged with ttf2pt1 or from the new version t1utils +instead. For a newer version of t1utils please look at +

+ +

+ + http://www.lcdf.org/~eddietwo/type/ + +
+

+ + + +So, the following command lines: +

+ +

+ ttf2pt1 -e ttffont.ttf t1font +
+ ttf2pt1 ttffont.ttf - | t1asm >t1font.pfa +
+

+ +represent two ways to get a working font. The benefit of the second form +is that other filters may be applied to the font between the converter +and assembler. +

+ + +

+Installation and deinstallation of the converter +

+ + +The converter may be easily installed systemwide with + +
+ make install +
+ +and uninstalled with + +
+ make uninstall +
+ +By default the Makefile is configured to install in the hierarchy +of directory /usr/local. This destination directory as well as +the structure of the hierarchy may be changed by editing the Makefile. + +

+Installation of the fonts +

+ + +Running the converter manually becomes somewhat boring if it has to +be applied to a few hundreds of fonts and then you have to generate the +fonts.scale and/or Fontmap files. The FONTS file describes how to use +the supplied scripts to handle such cases easily. It also discusses +the installation of the fonts for a few widespread programs. +

+ +

+Other utilities +

+ + +A few other small interesting programs that allow a cloase look at +the fonts are located in the subdirectory 'other'. They +are described shortly in others/README. +

+ +

+Optional packages +

+ + +Some auxiliary files are not needed by everyone and are big enough that +moving them to a separate package speeds up the downloads of the main +package significantly. As of now we have one such optional package: +

+ +  ttf2pt1-chinese - contains the Chinese conversion maps +

+ +The general versioning policy for the optional packages is the following: +These packages may have no direct dependency on the ttf2pt1 version. +But they may be updated in future, as well as some versions of optional +packages may have dependencies on certain versions of ttf2pt1. +To avoid unneccessary extra releases on one hand and keep the updates in +sync with the ttf2pt1 itself on the other hand, a new version of an optional +package will be released only if there are any changes to it and it will be +given the same version number as ttf2pt1 released at the same time. So not +every release of ttf2pt1 would have a corresponding release of all optional +packages. For example, to get the correct version of optional packages for an +imaginary release 8.3.4 of ttf2pt1 you would need to look for optional +packages of the highest version not higher than (but possibly equal to) 8.3.4. +

+ +

+TO DO: +

+ + +
    +
  • Improve hinting. +
  • Improve the auto-tracing of bitmaps. +
  • Implement the family-level hints. +
  • Add generation of CID-fonts. +
  • Handle the composite glyphs with relative base points. +
  • Preserve the relative width of stems during scaling to 1000x1000 matrix. +
  • Add support for bitmap TTF fonts. +
  • Implement better support of Asian encodings. +
  • Implement automatic creation of ligatures. +
+ +

+TROUBLESHOOTING AND BUG REPORTS +

+ + + + +Have problems with conversion of some font ? The converter dumps core ? Or your +printer refuses to understand the converted fonts ? Or some characters are +missing ? Or some characters look strange ? +

+ +Send the bug reports to the ttf2pt1 development mailing list at +ttf2pt1-devel@lists.sourceforge.net. +

+ +Try to collect more information about the problem and include it into +the bug report. (Of course, even better if you would provide a ready +fix, but just a detailed bug report is also good). Provide detailed +information about your problem, this will speed up the response greatly. +Don't just write "this font looks strange after conversion" but describe +what's exactly wrong with it: for example, what characters look wrong +and what exactly is wrong about their look. Providing a link to the +original font file would be also a good idea. Try to do a little +troublehooting and report its result. This not only would help with +the fix but may also give you a temporary work-around for the bug. +

+ +First, enable full warnings with option '-W99', save them to +a file and read carefully. Sometimes the prolem is with a not implemented +feature which is reported in the warnings. Still, reporting about such +problems may be a good idea: some features were missed to cut corners, +in hope that no real font is using them. So a report about a font using +such a feature may motivate someone to implement it. Of course, you +may be the most motivated person: after all, you are the one wishing +to convert that font. ;-) Seriously, the philosophy "scrath your own itch" +seems to be the strongest moving force behind the Open Source software. +

+ +The next step is playing with the options. This serves a dual purpose: +on one hand, it helps to localize the bug, on the other hand you may be +able to get a working version of the font for the meantime while the +bug is being fixed. The typical options to try out are: first '-Ou', if +it does not help then '-Os', then '-Oh', then '-Oo'. +They are described in a bit more detail above. Try them one by one +and in combinations. See if with them the resulting fonts look better. +

+ +On some fonts ttf2pt1 just crashes. Commonly that happens because the +font being converted is highly defective (although sometimes the bug +is in ttf2pt1 itself). In any case it should not crash, so the reports +about such cases will help to handle these defects properly in future. +

+ +We try to respond to the bug reports in a timely fashion but alas, this +may not always be possible, especially if the problem is complex. +This is a volunteer project and its resources are limited. Because +of this we would appreciate bug reports as detailed as possible, +and we would appreciate the ready fixes and contributions even more. +

+ + + + + + + + + + + + + + + + + + +

+CONTACTS +

+ + + + + + + + + + + + +ttf2pt1-announce@lists.sourceforge.net +
+ The mailing list with announcements about ttf2pt1. It is a moderated mailing + with extremely low traffic. Everyone is encouraged to subscribe to keep in + touch with the current status of project. To subscribe use the Web interface + at http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-announce. + If you have only e-mail access to the Net then send a subscribe request to + the development mailing list ttf2pt1-devel@lists.sourceforge.net and somebody + will help you with subscription. +

+ + + +ttf2pt1-devel@lists.sourceforge.net +
+ +ttf2pt1-users@lists.sourceforge.net +
+ The ttf2pt1 mailing lists for development and users issues. They have not + that much traffic either. To subscribe use the Web interface at + http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-devel + and http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-users. + If you have only e-mail access to the Net then send a subscribe request to + the development mailing list ttf2pt1-devel@lists.sourceforge.net and somebody + will help you with subscription. +

+ + + +mheath@netspace.net.au +
+ Mark Heath +

+ + +A.Weeks@mcc.ac.uk +
+ Andrew Weeks +

+ + +babkin@users.sourceforge.net (preferred)
+ +sab123@hotmail.com +
+ +http://members.bellatlantic.net/~babkin +
+ Sergey Babkin +

+ +

+SEE ALSO +

+ + + + + +http://ttf2pt1.sourceforge.net +
+ The main page of the project. +

+ + +http://www.netspace.net.au/~mheath/ttf2pt1/ +
+ The old main page of the project. +

+ + + + +http://sourceforge.net/projects/gnuwin32 +
+ Precompiled binaries for Windows. +

+ + +http://www.lcdf.org/~eddietwo/type/ +
+ The home page of the Type 1 utilities package. +

+ + +http://www.rightbrain.com/pages/books.html +
+ The first book about PostScript on the Web, "Thinking in PostScript". +

+ + +http://fonts.apple.com/TTRefMan/index.html +
+ The True Type reference manual. +

+ + +http://partners.adobe.com/asn/developer/PDFS/TN/PLRM.pdf +
+ Adobe PostScript reference manual. +

+ + +http://partners.adobe.com/asn/developer/PDFS/TN/T1_SPEC.PDF +
+ Specification of the Type 1 font format. +

+ + +http://partners.adobe.com/asn/developer/PDFS/TN/5015.Type1_Supp.pdf +
+ The Type 1 font format supplement. +

+ + +http://partners.adobe.com/asn/developer/PDFS/TN/5004.AFM_Spec.pdf +
+ Specification of the Adobe font metrics file format. +

+ + +http://www.cs.wpi.edu/~matt/courses/cs563/talks/surface/bez_surf.html +
+ +http://www.cs.wpi.edu/~matt/courses/cs563/talks/curves.html +
+ Information about the Bezier curves. +

+ + +http://www.neuroinformatik.ruhr-uni-bochum.de/ini/PEOPLE/rmz/t1lib/t1lib.html +
+ A stand-alone library supporting the Type1 fonts. Is neccessary + to compile the programs other/cmpf and other/dmpf. +

+ + +http://www.freetype.org +
+ A library supporting the TTF fonts. Also many useful TTF programs + are included with it. +

+ + +http://heliotrope.homestead.com/files/printsoft.html +
+ Moses Gold's collection of links to printing software. +

+ + +http://linuxartist.org/fonts/ +
+ Collection of font-related links. +

+ +


+
+ + +Following is the Readme of ttf2pfa (true type to type 3 font converter) It +covers other issues regarding the use of this software. Please note that +although ttf2pfa is a public domain software, ttf2pt1 +is instead covered by an Open Source license. See the COPYRIGHT +file for details. +

+ +Please note also that ttf2pfa has not been maintained for a long time. +All of its functionality has been integrated into ttf2pt1 and all the +development moved to ttf2pt1, including Andrew Weeks, the author of +ttf2pfa. Ttf2pfa is provided for historical reasons only. Please use +ttf2pt1 instead. + +


+ + +

+True Type to Postscript Font converter +

+ + +My mind is still reeling from the discovery that I was able to write +this program. What it does is it reads a Microsoft TrueType font and +creates a Postscript font. '_A_ postscript font', that is, not necessarily +the same font, you understand, but a fair imitation. +

+ +Run it like this: +

+ +

+ ttf2pfa fontfile.ttf fontname +
+

+ +The first parameter is the truetype filename, the second is a stem for +the output file names. The program will create a fontname.pfa containing +the Postscript font and a fontname.afm containing the metrics. +

+ +The motivation behind this is that in Linux if you do not have a +Postscript printer, but only some other printer, you can only print +Postscript by using Ghostscript. But the fonts that come with +Ghostscript are very poor (they are converted from bitmaps and look +rather lumpy). This is rather frustrating as the PC running Linux +probably has MS-Windows as well and will therefore have truetype fonts, +but which are quite useless with Linux, X or Ghostscript. +

+ +The program has been tested on over a hundred different TrueType fonts +from various sources, and seems to work fairly well. The converted +characters look OK, and the program doesn't seem to crash any more. I'm +not sure about the AFM files though, as I have no means to test them. +

+ +The fonts generated will not work with X, as the font rasterizer that +comes with X only copes with Type 1 fonts. If I have the time I may +modify ttf2pfa to generate Type 1s. +

+ +

+Copyright issues +

+ + +I am putting this program into the public domain, so don't bother +sending me any money, I'd only have to declare it for income tax. +

+ +Copyright on fonts, however, is a difficult legal question. Any +copyright statements found in a font will be preserved in the output. +Whether you are entitled to translate them at all I don't know. +

+ +If you have a license to run a software package, like say MS-Windows, on +your PC, then you probably have a right to use any part of it, including +fonts, on that PC, even if not using that package for its intended +purpose. +

+ +I am not a lawyer, however, so this is not a legal opinion, and may be +garbage. +

+ +There shouldn't be a any problem with public domain fonts. +

+ +

+About the Program +

+ + +It was written in C on a IBM PC running Linux. +

+ +The TrueType format was originally developed by Apple for the MAC, which +has opposite endianness to the PC, so to ensure compatibility 16 and 32 +bit fields are the wrong way round from the PC's point of view. This is +the reason for all the 'ntohs' and 'ntohl' calls. Doing it this way +means the program will also work on big-endian machines like Suns. +

+ +I doubt whether it will work on a DOS-based PC though. +

+ +The program produces what technically are Type 3 rather than Type 1 +fonts. They are not compressed or encrypted and are plain text. This is +so I (and you) can see what's going on, and (if you're a Postscript guru +and really want to) can alter the outlines. +

+ +I only translate the outlines, not the 'instructions' that come with +them. This latter task is probably virtually impossible anyway. TrueType +outlines are B-splines rather than the Bezier curves that Postscript +uses. I believe that my conversion algorithm is reasonably correct, if +nothing else because the characters look right. +

+ +

+Problems that may occur +

+ + +Most seriously, very complex characters (with lots of outline segments) +can make Ghostscript releases 2.x.x fail with a 'limitcheck' error. It +is possible that this may happen with some older Postscript printers as +well. Such characters will be flagged by the program and there are +basically two things you can do. First is to edit the .pfa file to +simplify or remove the offending character. This is not really +recommended. The second is to use Ghostscript release 3, if you can get +it. This has much larger limits and does not seem to have any problems +with complex characters. +

+ +Then there are buggy fonts (yes, a font can have bugs). I try to deal +with these in as sane a manner as possible, but it's not always +possible. +

+ +

+Encodings +

+ + +A postscript font must have a 256 element array, called an encoding, +each element of which is a name, which is also the name of a procedure +contained within the font. The 'BuildChar' command takes a byte and uses +it to index the encoding array to find a character name, and then looks +that up in the font's procedure table find the commands to draw the +glyph. However, not all characters need be in the encoding array. Those +that are not cannot be drawn (at least not using 'show'), however it is +possible to 're-encode' the font to enable these characters. There are +several standard encodings: Adobe's original, ISO-Latin1 and Symbol +being the most commonly encountered. +

+ +TrueType fonts are organised differently. As well as the glyph +descriptions there are a number of tables. One of these is a mapping +from a character set into the glyph array, and another is a mapping from +the glyph array into a set of Postscript character names. The problems +are: +

+ 1) Microsoft uses Unicode, a 16-bit system, to encode the font. +
+ 2) that more than one glyph is given the same Postscript name. +

+ +I deal with (1) by assuming a Latin1 encoding. The MS-Windows and +Unicode character sets are both supersets of ISO-8859-1. This usually +means that most characters will be properly encoded, but you should be +warned that some software may assume that fonts have an Adobe encoding. +Symbol, or Dingbat, fonts are in fact less of a problem, as they have +private encodings starting at 0xF000. It is easy to just lose the top +byte. +

+ +Postscript fonts can be re-encoded, either manually, or by software. +Groff, for example, generates postscript that re-encodes fonts with the +Adobe encoding. The problem here is that not all characters in the Adobe +set are in the MS-Windows set. In particular there are no fi and fl +ligatures. This means that conversions of the versions of +Times-New-Roman and Arial that come with MS-Windows cannot be used +blindly as replacements for Adobe Times-Roman and Helvetica. You can get +expanded versions of MS fonts from Microsoft's web site which do contain +these ligatures (and a lot else besides). +

+ +I deal with (2) by creating new character names. This can be error-prone +because I do not know which of them is the correct glyph to give the +name to. Some (buggy) fonts have large numbers of blank glyphs, all with +the same name. +

+ +(almost every TrueType font has three glyphs called .notdef, one of them +is usually an empty square shape, one has no outline and has zero width, +and one has no outline and a positive width. This example is not really +a problem with well formed fonts since the .notdef characters are only +used for unprintable characters, which shouldn't occur in your documents +anyway). +

+ + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/Makefile b/application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/Makefile new file mode 100755 index 00000000..02a33b4d --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/Makefile @@ -0,0 +1,279 @@ + +# This file should be configured before running `make'. +# Uncomment or change the values that are relevant for your OS. + +# The preferred C compiler (by default use the OS-specific default value). +# For BSD/OS, FreeBSD, Linux (all flavors), NetBSD, OpenBSD the default +# compiler is GNU C. +# (Note please the politically correct ordering by alphabet ! :-) +# +# Use GNU C even if it's not the default compiler +# +CC=gcc +# +# Use the standard ANSI C compiler on HP-UX even if it's not default +# +#CC=c89 + +# +# The system-dependent flags for the C compiler +# +# Default + +CFLAGS_SYS= -O2 -D_GNU_SOURCE + +# For GNU C +# +CFLAGS_SYS= -O2 -D_GNU_SOURCE +# +# For GNU C with long options support library (Linux etc.) +# +CFLAGS_SYS= -O2 -D_GNU_SOURCE +# +# For GNU C on HP-UX/PA-RISC 1.1 +# +#CFLAGS_SYS= -O2 -Wa,-w +# +# For the standard ANSI C on HP-UX +# +#CFLAGS_SYS= +O2 -D_HPUX_SOURCE + +# +# The system-dependent libraries +# +# Defalut (for the BSD-style OSes) + +LIBS_SYS= -lm + +# For SystemV (such as SCO, UnixWare, Solaris, but _NOT_ Linux or HP-UX) +# +#LIBS_SYS= -lm -lsocket + +# +# The flags for C compiler for the FreeType-2 library (disabled by default). +# This WON'T BUILD with FT2-beta8, use the FreeType release 2.0.4 +# http://download.sourceforge.net/freetype/freetype-2.0.4.tar.gz + +CFLAGS_FT= + +# To enable use of the FreeType-2 library +# (if the include and lib directory do not match your installation, +# modify them), also uncomment LIBS_FT +# +#CFLAGS_FT = -DUSE_FREETYPE -I/usr/include/freetype2 -I/usr/include + +# +# The FreeType-2 library flags (disabled by default) + +LIBS_FT= + +# To enable use of the FreeType-2 library +# (if the include and lib directory do not match your installation, +# modify them), also uncomment CFLAGS_FT +# +#LIBS_FT= -L/usr/lib -lfreetype + +# +# The flags for C compiler for the Autotrace library (disabled by default). +# USE OF THIS FEATURE IS STRONGLY DISCOURAGED, THE BUILT-IN TRACING +# (AKA VECTORIZATION) PROVIDES MUCH BETTER RESULTS. +# The tested version is 0.29a (and the fonts produced with it are +# absolutely not usable). +# http://download.sourceforge.net/autotrace/autotrace-0.29.tar.gz + +CFLAGS_AT= + +# To enable use of the Autotrace library +# (if the include and lib directory do not match your installation, +# modify them), also uncomment LIBS_AT +# +#CFLAGS_AT = -DUSE_AUTOTRACE -I/usr/local/include + +# +# The Autotrace library flags (disabled by default) + +LIBS_AT= + +# To enable use of the Autotrace library +# (if the include and lib directory do not match your installation, +# modify them), also uncomment CFLAGS_AT +# +#LIBS_AT= -L/usr/local/lib -lautotrace + +# +# Preference of front-ends if multiple parsers match a file +# (by default the build-in front-end takes preference over FreeType) + +CFLAGS_PREF= + +# To prefer FreeType (if enabled): +# +#CFLAGS_PREF= -DPREFER_FREETYPE + +# Uncomment the second line to not compile t1asm into ttf2pt1 +CFLAGS_EXTT1ASM= +#CFLAGS_EXTT1ASM= -DEXTERNAL_T1ASM + +CFLAGS= $(CFLAGS_SYS) $(CFLAGS_FT) $(CFLAGS_AT) $(CFLAGS_PREF) +LIBS= $(LIBS_SYS) $(LIBS_FT) $(LIBS_AT) + +# Installation-related stuff +# +# The base dir for installation and subdirs in it +INSTDIR = /home/eclecticgeek/apps +# for binaries +BINDIR = $(INSTDIR)/bin +# for binaries of little general interest +LIBXDIR = $(INSTDIR)/libexec/ttf2pt1 +# for scripts, maps/encodings etc. +SHAREDIR = $(INSTDIR)/share/ttf2pt1 +MANDIR = $(INSTDIR)/man + +# owner and group of installed files +OWNER = eclecticgeek +GROUP = pg1755828 + +# After you have configured the Makefile, comment out the following +# definition: +##warning: docs +## @echo >&2 +## @echo " You have to configure the Makefile before running make!" >&2 +## @echo "(or if you are lazy and hope that it will work as is run \`make all')">&2 +## @echo >&2 +# +DOCS=CHANGES README FONTS FONTS.hpux encodings/README other/README \ + app/X11/README app/netscape/README app/TeX/README + +SUBDIRS = app encodings maps scripts other +TXTFILES = README* FONTS* CHANGES* COPYRIGHT + +MANS1=ttf2pt1.1 ttf2pt1_convert.1 ttf2pt1_x2gs.1 +MANS=$(MANS1) $(MANS5) + +all: t1asm ttf2pt1 docs mans rpm + +docs: $(DOCS) + +mans: $(MANS) + +clean: + rm -f t1asm ttf2pt1 *.o app/RPM/Makefile app/RPM/*.spec *.core core.* core + ( cd other && make clean; ) + ( cd app/netscape && make clean; ) + +veryclean: clean + rm -f $(DOCS) $(MANS) + +rpm: app/RPM/Makefile app/RPM/ttf2pt1.spec + +ttf2pt1.1: README.html + scripts/html2man . . app/RPM/Makefile +# +app/RPM/ttf2pt1.spec: app/RPM/ttf2pt1.spec.src version.h + sed 's/^Version:.*/Version: '`grep TTF2PT1_VERSION version.h| cut -d\" -f2`'/' $@ + +t1asm: t1asm.c + $(CC) $(CFLAGS) -o t1asm -DSTANDALONE t1asm.c $(LIBS) + +ttf2pt1.o: ttf2pt1.c ttf.h pt1.h global.h version.h + $(CC) $(CFLAGS) -c ttf2pt1.c + +pt1.o: pt1.c ttf.h pt1.h global.h + $(CC) $(CFLAGS) -c pt1.c + +ttf.o: ttf.c ttf.h pt1.h global.h + $(CC) $(CFLAGS) -c ttf.c + +ft.o: ft.c pt1.h global.h + $(CC) $(CFLAGS) -c ft.c + +bdf.o: bdf.c pt1.h global.h + $(CC) $(CFLAGS) -c bdf.c + +bitmap.o: bitmap.c pt1.h global.h + $(CC) $(CFLAGS) -c bitmap.c + +runt1asm.o: runt1asm.c global.h + $(CC) $(CFLAGS) $(CFLAGS_EXTT1ASM) -c runt1asm.c + +ttf2pt1: ttf2pt1.o pt1.o runt1asm.o ttf.o ft.o bdf.o bitmap.o + $(CC) $(CFLAGS) -o ttf2pt1 ttf2pt1.o pt1.o runt1asm.o ttf.o ft.o bdf.o bitmap.o $(LIBS) + +CHANGES: CHANGES.html + scripts/unhtml CHANGES + +README: README.html + scripts/unhtml README + +encodings/README: encodings/README.html + scripts/unhtml encodings/README + +other/README: other/README.html + scripts/unhtml other/README + +app/X11/README: app/X11/README.html + scripts/unhtml app/X11/README + +app/netscape/README: app/netscape/README.html + scripts/unhtml app/netscape/README + +app/TeX/README: app/TeX/README.html + scripts/unhtml app/TeX/README + +FONTS: FONTS.html + scripts/unhtml FONTS + +FONTS.hpux: FONTS.hpux.html + scripts/unhtml FONTS.hpux + +install: all + scripts/inst_dir $(BINDIR) $(OWNER) $(GROUP) 0755 + scripts/inst_dir $(LIBXDIR) $(OWNER) $(GROUP) 0755 + scripts/inst_dir $(SHAREDIR) $(OWNER) $(GROUP) 0755 + scripts/inst_dir $(MANDIR)/man1 $(OWNER) $(GROUP) 0755 + scripts/inst_dir $(MANDIR)/man5 $(OWNER) $(GROUP) 0755 + cp -R $(TXTFILES) $(SUBDIRS) $(SHAREDIR) + chown -R $(OWNER) $(SHAREDIR) + chgrp -R $(GROUP) $(SHAREDIR) + chmod -R go-w $(SHAREDIR) + scripts/inst_file ttf2pt1 $(BINDIR)/ttf2pt1 $(OWNER) $(GROUP) 0755 + [ -f $(BINDIR)/t1asm ] || scripts/inst_file t1asm $(LIBXDIR)/t1asm $(OWNER) $(GROUP) 0755 + sed -e 's|^TTF2PT1_BINDIR=$$|TTF2PT1_BINDIR=$(BINDIR)|;' \ + -e 's|^TTF2PT1_LIBXDIR=$$|TTF2PT1_LIBXDIR=$(LIBXDIR)|;' \ + -e 's|^TTF2PT1_SHAREDIR=$$|TTF2PT1_SHAREDIR=$(SHAREDIR)|;' cvt.tmp + scripts/inst_file cvt.tmp $(BINDIR)/ttf2pt1_convert $(OWNER) $(GROUP) 0755 + scripts/inst_file cvt.tmp $(SHAREDIR)/scripts/convert $(OWNER) $(GROUP) 0755 + rm cvt.tmp + scripts/inst_file scripts/x2gs $(BINDIR)/ttf2pt1_x2gs $(OWNER) $(GROUP) 0755 + for i in $(MANS1); do { \ + sed -e 's|TTF2PT1_BINDIR|$(BINDIR)|;' \ + -e 's|TTF2PT1_LIBXDIR|$(LIBXDIR)|;' \ + -e 's|TTF2PT1_SHAREDIR|$(SHAREDIR)|;' <$$i >$(MANDIR)/man1/$$i \ + && chown $(OWNER) $(MANDIR)/man1/$$i \ + && chgrp $(GROUP) $(MANDIR)/man1/$$i \ + && chmod 0644 $(MANDIR)/man1/$$i \ + || exit 1; \ + } done + +uninstall: + rm -f $(BINDIR)/ttf2pt1 $(BINDIR)/ttf2pt1_convert $(BINDIR)/ttf2pt1_x2gs + rm -rf $(LIBXDIR) + rm -rf $(SHAREDIR) + for i in $(MANS1); do { \ + rm -f $(MANDIR)/man1/$$i $(MANDIR)/man1/$$i.gz; \ + } done + + +# targets for automatic generation of releases and snapshots + +snapshot: + scripts/mkrel snapshot + +release: + scripts/mkrel release diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/ttf2pt1.spec b/application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/ttf2pt1.spec new file mode 100755 index 00000000..73a658d5 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/ttf2pt1.spec @@ -0,0 +1,40 @@ +Summary: TrueType to Adobe Type 1 font converter +Name: ttf2pt1 +Version: 3.4.4 +Release: 1jv +Source: %{name}-%{version}.tgz +Copyright: Distributable +Group: Utilities/Printing +BuildRoot: /var/tmp/ttf2pt1 + +%description + * True Type Font to Adobe Type 1 font converter + * By Mark Heath + * Based on ttf2pfa by Andrew Weeks + * With help from Frank M. Siegert + +%prep +%setup + +%build +make all + +%install +rm -fr $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT/usr/local/bin +mkdir -p $RPM_BUILD_ROOT/usr/local/share/%{name} +mkdir -p $RPM_BUILD_ROOT/usr/local/doc + +install -s -m 0555 ttf2pt1 $RPM_BUILD_ROOT/usr/local/bin +install -m 0555 scripts/* $RPM_BUILD_ROOT/usr/local/share/%{name} +chmod 0444 $RPM_BUILD_ROOT/usr/local/share/%{name}/convert.cfg.sample + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(644, root, root, 755) +%doc README README.html INSTALL INSTALL.html +/usr/local/bin/ttf2pt1 +/usr/local/share/%{name} + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/ttf2pt1.spec.src b/application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/ttf2pt1.spec.src new file mode 100755 index 00000000..31fc9843 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/RPM/ttf2pt1.spec.src @@ -0,0 +1,40 @@ +Summary: TrueType to Adobe Type 1 font converter +Name: ttf2pt1 +Version: XXX +Release: 1jv +Source: %{name}-%{version}.tgz +Copyright: Distributable +Group: Utilities/Printing +BuildRoot: /var/tmp/ttf2pt1 + +%description + * True Type Font to Adobe Type 1 font converter + * By Mark Heath + * Based on ttf2pfa by Andrew Weeks + * With help from Frank M. Siegert + +%prep +%setup + +%build +make all + +%install +rm -fr $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT/usr/local/bin +mkdir -p $RPM_BUILD_ROOT/usr/local/share/%{name} +mkdir -p $RPM_BUILD_ROOT/usr/local/doc + +install -s -m 0555 ttf2pt1 $RPM_BUILD_ROOT/usr/local/bin +install -m 0555 scripts/* $RPM_BUILD_ROOT/usr/local/share/%{name} +chmod 0444 $RPM_BUILD_ROOT/usr/local/share/%{name}/convert.cfg.sample + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(644, root, root, 755) +%doc README README.html INSTALL INSTALL.html +/usr/local/bin/ttf2pt1 +/usr/local/share/%{name} + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/README b/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/README new file mode 100755 index 00000000..cffad647 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/README @@ -0,0 +1,51 @@ +Scripts to support CJK-LaTeX + +by Mike Fabian + + +The tiny Perl-script 'sfd2map' converts .sfd files (as used by +CJK-LaTeX) to .map files (as used by ttf2pt1). + +Actually I currently don't use that script stand-alone for performance +reasons. + +Currently I use such a conversion in another small script 'cjk-latex-config' +(attached as well) which creates .tfm files usable with CJK-LaTeX +from TrueType fonts as listed in /etc/ttf2pk/ttfonts.map. When called like + cjk-latex-config --type1 +this script will use ttf2pt1 to generate .pfb files as well from these TrueType +fonts to be used with CJK-LaTeX. + +The .sfd files cannot be directly used as input to ttf2pt1 because the +format of the .map files which ttf2pt1 expects is slightly different, +therefore I made the 'sfd2map' converter script. + +But then I noticed that I would have to parse the generated map file +*again* to get a list of the plane numbers to use. That seemed to be a +bit wastful because I had just parsed the .sfd file to convert it to +.map, therefore I included sfd2map as a function in 'cjk-latex-config' +as well and collected the plane numbers during the conversion. + +But 'cjk-latex-config' is maybe a little bit SuSE specific, therefore +I kept 'sfd2map' also as a standalong script. Use it if you like. + +'cjk-latex-config' calls another small script 'cjk-latex-t1mapgen' +to generate a cjk-latex.map file containing something like + cyberb00 BitstreamCyberbit-Roman-00 + + +Scripts to support CJK-LaTeX + + + +

+Scripts to support CJK-LaTeX +

+ +by Mike Fabian +<mfabian@suse.de> +

+ +The tiny Perl-script 'sfd2map' converts .sfd files (as used by +CJK-LaTeX) to .map files (as used by ttf2pt1). +

+ +Actually I currently don't use that script stand-alone for performance +reasons. +

+ +Currently I use such a conversion in another small script 'cjk-latex-config' +(attached as well) which creates .tfm files usable with CJK-LaTeX +from TrueType fonts as listed in /etc/ttf2pk/ttfonts.map. When called like +
+  cjk-latex-config --type1 +
+this script will use ttf2pt1 to generate .pfb files as well from these TrueType +fonts to be used with CJK-LaTeX. +

+ +The .sfd files cannot be directly used as input to ttf2pt1 because the +format of the .map files which ttf2pt1 expects is slightly different, +therefore I made the 'sfd2map' converter script. +

+ +But then I noticed that I would have to parse the generated map file +*again* to get a list of the plane numbers to use. That seemed to be a +bit wastful because I had just parsed the .sfd file to convert it to +.map, therefore I included sfd2map as a function in 'cjk-latex-config' +as well and collected the plane numbers during the conversion. +

+ +But 'cjk-latex-config' is maybe a little bit SuSE specific, therefore +I kept 'sfd2map' also as a standalong script. Use it if you like. +

+ +'cjk-latex-config' calls another small script 'cjk-latex-t1mapgen' +to generate a cjk-latex.map file containing something like +
+  cyberb00 BitstreamCyberbit-Roman-00 <cyberb00.pfb +
+  cyberb01 BitstreamCyberbit-Roman-01 <cyberb01.pfb +
+  cyberb02 BitstreamCyberbit-Roman-02 <cyberb02.pfb +
+  [...] +
+after all .pfb files have been generated. +

+ +Maybe this is also SuSE specific, I'm not sure about in what +directories the relevant files are stored on other Linux-like systems. +

+ +I'm not yet sure whether they work on other systems beside SuSE Linux. +They have hard coded path names where to find the TrueType fonts, +ttfonts.map, the TeX fonts etc and cjk-latex-config checks +whether freetype-tools.rpm is installed. freetype-tools.rpm might +have another name for other distributions and for distributions +which don't use rpm this check can't work anyway. +

+ +These are small details and it should not be difficult to adapt the +scripts for other Linux-like systems though. +

+ + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/cjk-latex-config b/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/cjk-latex-config new file mode 100755 index 00000000..4ee30e28 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/cjk-latex-config @@ -0,0 +1,352 @@ +#!/usr/bin/perl -w +# +# Copyright (c) 2002 SuSE Linux AG, Nuernberg, Germany. All rights reserved. +# +# Author: Mike Fabian , 2002 +# + +use English; +use Getopt::Long; + +# check if we are started as root +# only one of UID and USER must be set correctly + +if ($UID != 0 && $ENV{USER} !~ /root/) { + print "You must be root to start $0\n"; + exit 1; +} + +if (system ("rpm -q freetype-tools >/dev/null 2>&1") != 0) { + print "freetype-tools package missing, exiting.\n"; + exit 1; +} + + +sub usage { + print "Usage: cjk-latex-config [--verbose|v] [--force|f] [--type1|t]\n"; + exit 1; +} + +# Process command line options +my %opt; +unless (GetOptions(\%opt, + 'verbose|v', \$OPT_VERBOSE, + 'force|f', \$OPT_FORCE, + 'type1|t', \$OPT_TYPE1, + )) { + &usage(); + exit 1; +} + +# to make sure ttf2tfm finds the .sdf files: +system("texhash"); + +$tfm_created = 0; +$type1_created = 0; + +system("mkdir -p /usr/share/texmf/fonts/truetype/"); + +open (TTFONTS_MAP, "/etc/ttf2pk/ttfonts.map"); + +while () { + + chomp($ARG); + + if ($ARG =~ /\@[a-zA-Z0-9\/]+\@/) { + + if($OPT_VERBOSE) { + print "----------------------------------------------------------------------\n"; + print "$ARG\n"; + } + + @fields = split(/\s+/, $ARG); + + $tt_dir = "/usr/X11R6/lib/X11/fonts/truetype/"; + $tt_basename = $fields[1]; + + if ($fields[0] =~ /([^\s]+)\@[a-zA-Z0-9\/]+\@/) { + $latex_font_name = $1; + } else { + print "can't find latex font name.\n"; + exit 1 + } + + if ($fields[0] =~ /\@([a-zA-Z0-9\/]+)\@/) { + $sfd_name = $1; + $sfd_name =~ /.*\/([a-zA-Z0-9]+)/; + $sfd_basename = $1; + } else { + print "can't find sfd_name.\n"; + exit 1 + } + + if ($ARG =~ /Pid=([0-9]+)/) { + $pid = "$1"; + } else { + $pid = "3"; + } + + if ($ARG =~ /Eid=([0-9]+)/) { + $eid = "$1"; + } else { + $eid = "1"; + } + + if ($ARG =~ /Slant=([0-9.]+)/) { + $slant = $1; + $slant_opt = "-s $1"; + } else { + $slant = 0; + $slant_opt = "-s 0"; + } + + if ($ARG =~ /Rotate=(Yes)/) { + $rotate = 1; + $rotate_opt = "-x"; + } else { + $rotate = 0; + $rotate_opt = ""; + } + + if (-e "$tt_dir/$tt_basename") { + symlink("$tt_dir/$tt_basename", + "/usr/share/texmf/fonts/truetype/$tt_basename"); + $tfm_dir = "/usr/share/texmf/fonts/tfm/cjk-latex/"; + $type1_dir = "/usr/share/texmf/fonts/type1/cjk-latex/"; + + if (0 != create_or_update_tfm ()) { + print "creating .tfm failed.\n"; + } + if ($OPT_TYPE1 && $slant == 0 && $rotate == 0) { + if (0 != create_or_update_type1 ()) { + print "creating type1 font failed.\n"; + } + } + } + } +} + +if ($type1_created) { + $command = "cjk-latex-t1mapgen $type1_dir"; + if (0 != system ($command)) { + print "$command failed.\n"; + exit 1; + } +} + +if ($tfm_created || $type1_created) { + system("texhash"); +} + + +exit 0; + + +###################################################################### + +sub create_or_update_tfm { + + if ($OPT_FORCE || + mtime_differs_or_missing ("$tt_dir/$tt_basename", + "$tfm_dir/$sfd_basename/$latex_font_name/")) { + + if (0 != system ("mkdir -p $tfm_dir/$sfd_basename/$latex_font_name/")) { + print "mkdir -p $tfm_dir/$sfd_basename/$latex_font_name/ failed.\n"; + exit 1; + } + if (! chdir ("$tfm_dir/$sfd_basename/$latex_font_name/")) { + print "can't chdir to $tfm_dir/$sfd_basename/$latex_font_name/\n"; + exit 1; + } + + $command = "ttf2tfm $tt_dir/$tt_basename "; + unless ($OPT_VERBOSE) { + $command .= " -q"; + } + $command .= " -P $pid -E $eid $rotate_opt $slant_opt $latex_font_name\@$sfd_name\@"; + if ($OPT_VERBOSE) { + print "$command\n"; + } else { + $command .= " > /dev/null 2>&1"; + print "$latex_font_name\@$sfd_name\@: calling ttf2tfm ...\n"; + } + if (0 != system($command)) { + print "$command failed.\n"; + return 1; + } + + # success, mark this by giving the created directory the same time stamp + # as the TT-font: + system("touch -r $tt_dir/$tt_basename $tfm_dir/$sfd_basename/$latex_font_name/"); + $tfm_created = 1; + return 0; + } + +} + +###################################################################### + +sub create_or_update_type1 { + + if ($OPT_FORCE || + mtime_differs_or_missing ("$tt_dir/$tt_basename", + "$type1_dir/$sfd_basename/$latex_font_name/")) { + + if (0 != system ("mkdir -p $type1_dir/$sfd_basename/$latex_font_name/")) { + print "mkdir -p $type1_dir/$sfd_basename/$latex_font_name/ failed.\n"; + exit 1; + } + if (! chdir ("$type1_dir/$sfd_basename/$latex_font_name/")) { + print "can't chdir to $type1_dir/$sfd_basename/$latex_font_name/\n"; + exit 1; + } + + if (grep(/$tt_basename/,("wadalab-gothic.ttf","watanabe-mincho.ttf"))) { + print "$tt_basename does not work with ttf2pt1, skipping ...\n"; + return 0; + } + + # disable smoothing of outlines for broken fonts + # (for details see 'man ttf2pt1'): + my $smoothing_opt = " "; + if (grep(/$tt_basename/,("kochi-gothic.ttf"))) { + print "$tt_basename broken, disabling smoothing of outlines.\n"; + $smoothing_opt = " -O s "; + } + + $sfd_file = "/usr/share/texmf/ttf2tfm/$sfd_basename.sfd"; + $map_file = `mktemp /tmp/cjk-latex-config-map.XXXXXX`; + chomp $map_file; + if ($map_file eq "") { + print "mktemp /tmp/cjk-latex-config-map.XXXXXX failed.\n"; + } + + @planes = sfd2map($sfd_file,$map_file); + if ($#planes == -1) { + print "sfd2map($sfd_file,$map_file) failed.\n"; + return 1; + } + + for my $plane (@planes) { + if ($OPT_VERBOSE) { + $command = "ttf2pt1 -W 99 "; + } else { + $command = "ttf2pt1 -W 0 "; + } + $command .= $smoothing_opt; + $command .= " -p ft -b -G a -m h=5000 "; + $command .= " -L $map_file+pid=$pid,eid=$eid,$plane "; + $command .= " $tt_dir/$tt_basename $latex_font_name$plane"; + if ($OPT_VERBOSE) { + print "$command\n"; + } else { + $command .= " > /dev/null 2>&1"; + print "$latex_font_name\@$sfd_name\@, plane=$plane: calling ttf2pt1 ...\n"; + } + if (0 != system($command)) { + print "$command failed.\n"; + return 1; + } + } + + unlink $map_file; + + # success, mark this by giving the created directory the same time stamp + # as the TT-font: + system("touch -r $tt_dir/$tt_basename $type1_dir/$sfd_basename/$latex_font_name/"); + $type1_created = 1; + return 0; + } +} + +###################################################################### + +sub sfd2map { + my($sfd_file,$map_file) = @_; + if (! open (SFD, "<$sfd_file")) { + print "cannot open $sfd_file\n"; + return (); + } + if (! open (MAP, ">$map_file")) { + print "cannot open $map_file\n"; + close (SFD); + return (); + } + + my(@planes) = (); + + while () { + + if ( ! ($ARG =~ /^[[:space:]]*\#/)) { # skip comment lines + + # handle plane numbers: + if ( $ARG =~ /^([[:xdigit:]]{2})[[:space:]]*/ ) { + $ARG =~ s/^([[:xdigit:]]{2})[[:space:]]*/ /; + print MAP "plane $1\n"; + print MAP "at 0x00\n"; + $planes[$#planes + 1] = $1; + } + + # remove continuation chars '\': + $ARG =~ s/\\$//; + + $ARG =~ s/(0x[[:xdigit:]]{1,4})/$1,/g; + # handle ranges like 0xF800_0xF8FF + $ARG =~ s/(0x[[:xdigit:]]{1,4}),_/$1-/g; + } + + print MAP $ARG; + + } + + close (MAP); + close (SFD); + return @planes; +} + + +# Returns true if the modification time of $f1 differs from +# the modification time of $f2 +sub mtime_differs { + my($f1,$f2) = @_; + if( -e $f1 && -e $f2) { + local (@f1s) = stat ($f1); + local (@f2s) = stat ($f2); + return ($f1s[9] != $f2s[9]); + } else { + return 0; + } +} + +# Returns true if the modification time of $f1 differs from +# the modification time of $f2 or if one of the files is missing +sub mtime_differs_or_missing { + my($f1,$f2) = @_; + if (! -e $f1 || ! -e $f2 || mtime_differs($f1,$f2)) { + return 1; + } else { + return 0; + } +} + +# Returns true if $f1 is newer than $f2 +sub newer { + my($f1,$f2) = @_; + if( -e $f1 && -e $f2) { + local (@f1s) = stat ($f1); + local (@f2s) = stat ($f2); + return ($f1s[9] > $f2s[9]); + } else { + return 0; + } +} + +# Returns true if $f1 is newer than $f2 or if one of the files is missing +sub newer_or_missing { + my($f1,$f2) = @_; + if (! -e $f1 || ! -e $f2 || newer($f1,$f2)) { + return 1; + } else { + return 0; + } +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/cjk-latex-t1mapgen b/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/cjk-latex-t1mapgen new file mode 100755 index 00000000..5b79b45e --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/cjk-latex-t1mapgen @@ -0,0 +1,60 @@ +#!/bin/sh +# +# Copyright (c) 2002 SuSE Linux AG, Nuernberg, Germany. All rights reserved. +# +# Author: Mike Fabian , 2002 +# + +TYPE1_DIR=$1 +if [ -z $TYPE1_DIR ] ; then + TYPE1_DIR=/usr/share/texmf/fonts/type1/cjk-latex/ +fi + +CJK_LATEX_TYPE1_MAP_FILE=/var/lib/texmf/dvips/config/cjk-latex.map + +echo "creating $CJK_LATEX_TYPE1_MAP_FILE ..." + +TMPFILE=`mktemp /tmp/cjk-latex-t1mapgen.XXXXXX` + +if [ -d $TYPE1_DIR ] ; then + for FILE in $( find $TYPE1_DIR -name "*.pfb" ) + do + BASENAME_WITHOUT_EXT=$( basename $FILE ) + BASENAME_WITHOUT_EXT=${BASENAME_WITHOUT_EXT%.pfb} + FONT_NAME=$( grep -a "/FontName.*def" ${FILE} | perl -pe "s%/FontName /([^ ]+) def%\1%" ) + echo "${BASENAME_WITHOUT_EXT} ${FONT_NAME} <${BASENAME_WITHOUT_EXT}.pfb" >> $TMPFILE + done +fi + +mv $TMPFILE $CJK_LATEX_TYPE1_MAP_FILE +chmod 644 $CJK_LATEX_TYPE1_MAP_FILE + +# add entries for PostScript font map files used by CJK-LaTeX +# to 'pdftex.cfg' and 'config.ps': + +PDFTEX_CFG=/var/lib/texmf/pdftex/config/pdftex.cfg +CONFIG_PS=/var/lib/texmf/dvips/config/config.ps + +for MAP in cjk-latex.map +do + if [ -f /var/lib/texmf/dvips/config/$MAP ] ; then + egrep "^p \+$MAP" $CONFIG_PS > /dev/null + if [ $? = 1 ] ; then + echo "p +$MAP" >> $CONFIG_PS + fi + egrep "^map \+$MAP" $PDFTEX_CFG > /dev/null + if [ $? = 1 ] ; then + echo "map +$MAP" >> $PDFTEX_CFG + fi + fi +done + +# pdflatex seems to prefer pk fonts if they exist. That seems strange +# but I couldn't find out how to change this. +# Deleting all the pk fonts from /var/cache/fonts/pk/* is probably a bit overkill +# but it helps. 'dvips' will regenerate the pk fonts as needed but will not +# regenerate pk fonts for the pfb fonts listed in the map file generated above. +# Therefore, deleting /var/cache/fonts/pk/* makes sure that all available pfb +# fonts are used: + +rm -rf /var/cache/fonts/pk/* \ No newline at end of file diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/sfd2map b/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/sfd2map new file mode 100755 index 00000000..671a7fb8 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/TeX/sfd2map @@ -0,0 +1,68 @@ +#!/usr/bin/perl -w +# +# Copyright (c) 2002 Mike Fabian +# +# This program is free software; you can 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. + +use English; +use Getopt::Long; + +sub usage { + print "Usage: sfd2map [-debug|d]\n\n"; + print "Converts a .sfd files in the format used by ttf2pk and ttf2tfm\n"; + print "into .map files in the format expected by ttf2pt1. For example:\n\n"; + print " sfd2map < UJIS.sfd > UJIS.map \n\n"; + exit 1; +} + +# Process command line options +my %opt; +unless (GetOptions(\%opt, + '-debug|d' , \$OPT_DEBUG + )) { + &usage(); + exit 1; +} + +if($OPT_DEBUG) { +} + +open (MAP, ">&STDOUT"); +open (SFD, "<&STDIN"); + +print MAP "# generated from a .sfd file by sfd2map to make it usable with ttf2pt1\n"; +print MAP "#\n"; + +while () { + + if ( ! ($ARG =~ /^[[:space:]]*\#/)) { # skip comment lines + + # handle plane numbers: + if ( $ARG =~ /^([[:xdigit:]]{2})[[:space:]]*/ ) { + $ARG =~ s/^([[:xdigit:]]{2})[[:space:]]*/ /; + print MAP "plane $1\n"; + print MAP "at 0x00\n"; + } + + # remove continuation chars '\': + $ARG =~ s/\\$//; + + $ARG =~ s/(0x[[:xdigit:]]{1,4})/$1,/g; + # handle ranges like 0xF800_0xF8FF + $ARG =~ s/(0x[[:xdigit:]]{1,4}),_/$1-/g; + + } + + print MAP $ARG; + +} + + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/README b/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/README new file mode 100755 index 00000000..c07c7998 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/README @@ -0,0 +1,24 @@ +Recommended patches for the X11 font library + +by Sergey Babkin +, + +These are patches for XFree86 versions 3.3.4 and 3.9 +to fix a few known problems with big Type1 fonts and +with strange handling of the standard stem width table. +The patch for XFree86 3.3.4 probably may be easily +installed on any other distribution of X11. +They are supposed to be installed in the subdirectory + + xc/lib/font/Type1 + +of the X11 source tree and after that the font library, +font server and X server should be rebuilt. + +Sorry that the description has so little details but if +you know how to build X11 then this is enough, otherwise +any more details won't help much. + +The patches have been submitted to the XFree86 project, +hope they will be included in some next release of XFree86 +and X11. diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/README.html b/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/README.html new file mode 100755 index 00000000..322a01e9 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/README.html @@ -0,0 +1,41 @@ + + + +Recommended patches for the X11 font library + + + +

+Recommended patches for the X11 font library +

+ +by Sergey Babkin +<babkin@bellatlantic.net>, <sab123@hotmail.com> +

+ +These are patches for XFree86 versions 3.3.4 and 3.9 +to fix a few known problems with big Type1 fonts and +with strange handling of the standard stem width table. +The patch for XFree86 3.3.4 probably may be easily +installed on any other distribution of X11. +They are supposed to be installed in the subdirectory +
+ +  xc/lib/font/Type1 +
+ +of the X11 source tree and after that the font library, +font server and X server should be rebuilt. +

+ +Sorry that the description has so little details but if +you know how to build X11 then this is enough, otherwise +any more details won't help much. +

+ +The patches have been submitted to the XFree86 project, +hope they will be included in some next release of XFree86 +and X11. +

+ + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/t1-xf86.334.patch b/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/t1-xf86.334.patch new file mode 100755 index 00000000..31e98e2d --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/t1-xf86.334.patch @@ -0,0 +1,199 @@ +*** fontfcn.c 2000/01/02 18:55:56 1.1 +--- fontfcn.c 2000/01/02 19:00:17 +*************** +*** 33,38 **** +--- 33,39 ---- + #include + #include "t1imager.h" + #include "util.h" ++ #include "t1stdio.h" + #include "fontfcn.h" + #include "fontmisc.h" + +*************** +*** 117,132 **** + resetFont(env); + /* This will load the font into the FontP */ + rcode = scan_font(FontP); +! if (rcode == SCAN_OUT_OF_MEMORY) { + /* free the memory and start again */ + xfree(vm_base); + if (!(initFont(vm_size * 2))) { + /* we are really out of memory */ + return(SCAN_OUT_OF_MEMORY); + } + resetFont(env); + rcode = scan_font(FontP); +- /* only double the memory once, then report error */ + } + return(rcode); + } +--- 118,151 ---- + resetFont(env); + /* This will load the font into the FontP */ + rcode = scan_font(FontP); +! if (rcode != SCAN_OUT_OF_MEMORY) +! return rcode; +! +! if (T1FileSize > VM_SIZE) { +! /* use the file size as estimation */ +! + /* free the memory and start again */ + xfree(vm_base); ++ if (!(initFont(T1FileSize))) { ++ /* we are really out of memory */ ++ return(SCAN_OUT_OF_MEMORY); ++ } ++ resetFont(env); ++ rcode = scan_font(FontP); ++ if (rcode != SCAN_OUT_OF_MEMORY) ++ return rcode; ++ } ++ ++ /* if still not enough, increase up to maximum */ ++ while (rcode == SCAN_OUT_OF_MEMORY ++ && vm_size <= VM_SIZE_MAX/2 ) { ++ xfree(vm_base); + if (!(initFont(vm_size * 2))) { + /* we are really out of memory */ + return(SCAN_OUT_OF_MEMORY); + } + resetFont(env); + rcode = scan_font(FontP); + } + return(rcode); + } +*** paths.c 2000/01/02 18:55:56 1.1 +--- paths.c 2000/01/02 18:56:27 +*************** +*** 584,590 **** + CONCAT(before, r); + r = before; + } +! else + r->context = after->context; + if (after != NULL) + CONCAT(r, after); +--- 584,590 ---- + CONCAT(before, r); + r = before; + } +! else if (after != NULL) + r->context = after->context; + if (after != NULL) + CONCAT(r, after); +*** scanfont.c 2000/01/02 18:55:56 1.1 +--- scanfont.c 2000/01/02 18:56:26 +*************** +*** 1383,1388 **** +--- 1383,1390 ---- + /* point to name and search for leading blanks */ + nameP= FontP->FontFileName.data.nameP; + namelen = FontP->FontFileName.len; ++ if (namelen > (128-1) ) /* prevent getting out of filename[] */ ++ namelen = (128-1); + while (nameP[0] == ' ') { + nameP++; + namelen--; +*** t1io.c 2000/01/02 18:55:56 1.1 +--- t1io.c 2000/01/02 18:56:32 +*************** +*** 54,59 **** +--- 54,62 ---- + /* Our single FILE structure and buffer for this package */ + STATIC F_FILE TheFile; + STATIC unsigned char TheBuffer[F_BUFSIZ]; ++ ++ /* the size of the file we read */ ++ int T1FileSize; + + /* Our routines */ + F_FILE *T1Open(), *T1Eexec(); +*************** +*** 87,92 **** +--- 90,96 ---- + of->flags = 0; + of->error = 0; + haveextrach = 0; ++ T1FileSize = 0; + return &TheFile; + } /* end Open */ + +*************** +*** 165,171 **** +--- 169,181 ---- + int T1Close(f) /* Close the file */ + F_FILE *f; /* Stream descriptor */ + { ++ int rc; ++ + if (f->b_base == NULL) return 0; /* already closed */ ++ ++ while ( (rc = read(f->fd, f->b_base, F_BUFSIZ)) >0) ++ T1FileSize += rc; /* count the rest of the file */ ++ + f->b_base = NULL; /* no valid stream */ + return close(f->fd); + } /* end Close */ +*************** +*** 289,294 **** +--- 299,305 ---- + } + } + f->b_ptr = f->b_base; ++ T1FileSize += rc; /* remember how many bytes we have */ + if (Decrypt) rc = T1Decrypt(f->b_base, rc); + return rc; + } /* end Fill */ +*** type1.c 2000/01/02 18:55:56 1.1 +--- type1.c 2000/01/02 18:56:27 +*************** +*** 365,378 **** + /* ADJUST STEM WIDTHS */ + /**********************/ + +! widthdiff = 0.0; + + /* Find standard stem with smallest width difference from this stem */ + if (stems[stemno].vertical) { /* vertical stem */ + if (blues->StdVW != 0) /* there is an entry for StdVW */ + widthdiff = blues->StdVW - stemwidth; + for (i = 0; i < blues->numStemSnapV; ++i) { /* now look at StemSnapV */ +! if (blues->StemSnapV[i] - stemwidth < widthdiff) + /* this standard width is the best match so far for this stem */ + widthdiff = blues->StemSnapV[i] - stemwidth; + } +--- 365,380 ---- + /* ADJUST STEM WIDTHS */ + /**********************/ + +! /* a big value to not compete with StemSnap */ +! /* if there is no StemSnap it will be caught later */ +! widthdiff = onepixel*2; + + /* Find standard stem with smallest width difference from this stem */ + if (stems[stemno].vertical) { /* vertical stem */ + if (blues->StdVW != 0) /* there is an entry for StdVW */ + widthdiff = blues->StdVW - stemwidth; + for (i = 0; i < blues->numStemSnapV; ++i) { /* now look at StemSnapV */ +! if ( FABS(blues->StemSnapV[i] - stemwidth) < FABS(widthdiff) ) + /* this standard width is the best match so far for this stem */ + widthdiff = blues->StemSnapV[i] - stemwidth; + } +*************** +*** 380,386 **** + if (blues->StdHW != 0) /* there is an entry for StdHW */ + widthdiff = blues->StdHW - stemwidth; + for (i = 0; i < blues->numStemSnapH; ++i) { /* now look at StemSnapH */ +! if (blues->StemSnapH[i] - stemwidth < widthdiff) + /* this standard width is the best match so far for this stem */ + widthdiff = blues->StemSnapH[i] - stemwidth; + } +--- 382,388 ---- + if (blues->StdHW != 0) /* there is an entry for StdHW */ + widthdiff = blues->StdHW - stemwidth; + for (i = 0; i < blues->numStemSnapH; ++i) { /* now look at StemSnapH */ +! if ( FABS(blues->StemSnapH[i] - stemwidth) < FABS(widthdiff) ) + /* this standard width is the best match so far for this stem */ + widthdiff = blues->StemSnapH[i] - stemwidth; + } diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/t1-xf86.39.patch b/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/t1-xf86.39.patch new file mode 100755 index 00000000..44d32ce5 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/X11/t1-xf86.39.patch @@ -0,0 +1,252 @@ +*** scanfont.c 1999/12/27 00:34:02 1.1 +--- scanfont.c 1999/12/27 00:35:34 +*************** +*** 2234,2239 **** +--- 2234,2241 ---- + /* point to name and search for leading blanks */ + nameP= FontP->FontFileName.data.nameP; + namelen = FontP->FontFileName.len; ++ if (namelen > (128-1) ) /* prevent getting out of filename[] */ ++ namelen = (128-1); + while (nameP[0] == ' ') { + nameP++; + namelen--; +*** paths.c 1999/12/27 00:37:01 1.1 +--- paths.c 1999/12/27 00:37:43 +*************** +*** 583,589 **** + CONCAT(before, r); + r = before; + } +! else + r->context = after->context; + if (after != NULL) + CONCAT(r, after); +--- 583,589 ---- + CONCAT(before, r); + r = before; + } +! else if (after != NULL) + r->context = after->context; + if (after != NULL) + CONCAT(r, after); +*** type1.c 1999/12/27 00:38:16 1.1 +--- type1.c 1999/12/27 01:08:02 +*************** +*** 399,412 **** + /* ADJUST STEM WIDTHS */ + /**********************/ + +! widthdiff = 0.0; + + /* Find standard stem with smallest width difference from this stem */ + if (stems[stemno].vertical) { /* vertical stem */ + if (blues->StdVW != 0) /* there is an entry for StdVW */ + widthdiff = blues->StdVW - stemwidth; + for (i = 0; i < blues->numStemSnapV; ++i) { /* now look at StemSnapV */ +! if (blues->StemSnapV[i] - stemwidth < widthdiff) + /* this standard width is the best match so far for this stem */ + widthdiff = blues->StemSnapV[i] - stemwidth; + } +--- 399,414 ---- + /* ADJUST STEM WIDTHS */ + /**********************/ + +! /* a big value to not compete with StemSnap */ +! /* if there is no StemSnap it will be caught later */ +! widthdiff = onepixel*2; + + /* Find standard stem with smallest width difference from this stem */ + if (stems[stemno].vertical) { /* vertical stem */ + if (blues->StdVW != 0) /* there is an entry for StdVW */ + widthdiff = blues->StdVW - stemwidth; + for (i = 0; i < blues->numStemSnapV; ++i) { /* now look at StemSnapV */ +! if ( FABS(blues->StemSnapV[i] - stemwidth) < FABS(widthdiff) ) + /* this standard width is the best match so far for this stem */ + widthdiff = blues->StemSnapV[i] - stemwidth; + } +*************** +*** 414,420 **** + if (blues->StdHW != 0) /* there is an entry for StdHW */ + widthdiff = blues->StdHW - stemwidth; + for (i = 0; i < blues->numStemSnapH; ++i) { /* now look at StemSnapH */ +! if (blues->StemSnapH[i] - stemwidth < widthdiff) + /* this standard width is the best match so far for this stem */ + widthdiff = blues->StemSnapH[i] - stemwidth; + } +--- 416,422 ---- + if (blues->StdHW != 0) /* there is an entry for StdHW */ + widthdiff = blues->StdHW - stemwidth; + for (i = 0; i < blues->numStemSnapH; ++i) { /* now look at StemSnapH */ +! if ( FABS(blues->StemSnapH[i] - stemwidth) < FABS(widthdiff) ) + /* this standard width is the best match so far for this stem */ + widthdiff = blues->StemSnapH[i] - stemwidth; + } +*** t1io.c 2000/01/01 00:41:44 1.1 +--- t1io.c 2000/01/01 01:23:38 +*************** +*** 78,83 **** +--- 78,86 ---- + /* Our single FILE structure and buffer for this package */ + STATIC F_FILE TheFile; + STATIC unsigned char TheBuffer[F_BUFSIZ]; ++ ++ /* the size of the file we read */ ++ int T1FileSize; + + /* Our routines */ + F_FILE *T1Open(), *T1Eexec(); +*************** +*** 118,123 **** +--- 121,127 ---- + of->flags = 0; + of->error = 0; + haveextrach = 0; ++ T1FileSize = 0; + return &TheFile; + } /* end Open */ + +*************** +*** 196,202 **** +--- 200,212 ---- + int T1Close(f) /* Close the file */ + F_FILE *f; /* Stream descriptor */ + { ++ int rc; ++ + if (f->b_base == NULL) return 0; /* already closed */ ++ ++ while ( (rc = read(f->fd, f->b_base, F_BUFSIZ)) >0) ++ T1FileSize += rc; /* count the rest of the file */ ++ + f->b_base = NULL; /* no valid stream */ + return close(f->fd); + } /* end Close */ +*************** +*** 381,386 **** +--- 391,397 ---- + } + } + f->b_ptr = f->b_base; ++ T1FileSize += rc; /* remember how many bytes we have */ + if (Decrypt) rc = T1Decrypt(f->b_base, rc); + return rc; + } /* end Fill */ +*** t1stdio.h 2000/01/01 00:43:38 1.1 +--- t1stdio.h 2000/01/01 01:24:19 +*************** +*** 73,78 **** +--- 73,79 ---- + + extern FILE *T1Open(), *T1eexec(); + extern int T1Close(), T1Ungetc(), T1Read(); ++ extern int T1FileSize; + + #undef fclose + #undef fopen +*** fontfcn.c 2000/01/01 00:07:54 1.1 +--- fontfcn.c 2000/01/01 01:36:02 +*************** +*** 57,62 **** +--- 57,63 ---- + #endif + #include "t1imager.h" + #include "util.h" ++ #include "t1stdio.h" + #ifdef BUILDCID + #include "range.h" + #include "fontmisc.h" +*************** +*** 300,333 **** + resetFont(env); + /* This will load the font into the FontP */ + rcode = scan_font(FontP); +! if (rcode == SCAN_OUT_OF_MEMORY) { + /* free the memory and start again */ + #ifdef BUILDCID + /* xfree(vm_base); */ + #else + xfree(vm_base); + #endif + if (!(initFont(vm_size * 2))) { + /* we are really out of memory */ + return(SCAN_OUT_OF_MEMORY); + } + resetFont(env); + rcode = scan_font(FontP); +- #ifdef BUILDCID +- /* only double the memory twice, then report error */ +- if (rcode == SCAN_OUT_OF_MEMORY) { +- /* free the memory and start again */ +- /* xfree(vm_base) */ +- if (!(initFont(vm_size * 2))) { +- /* we are really out of memory */ +- return(SCAN_OUT_OF_MEMORY); +- } +- resetFont(env); +- rcode = scan_font(FontP); +- } +- #else +- /* only double the memory once, then report error */ +- #endif + } + return(rcode); + } +--- 301,342 ---- + resetFont(env); + /* This will load the font into the FontP */ + rcode = scan_font(FontP); +! if (rcode != SCAN_OUT_OF_MEMORY) +! return rcode; +! +! if (T1FileSize > VM_SIZE) { +! /* use the file size as estimation */ +! + /* free the memory and start again */ + #ifdef BUILDCID + /* xfree(vm_base); */ + #else + xfree(vm_base); + #endif ++ if (!(initFont(T1FileSize))) { ++ /* we are really out of memory */ ++ return(SCAN_OUT_OF_MEMORY); ++ } ++ resetFont(env); ++ rcode = scan_font(FontP); ++ if (rcode != SCAN_OUT_OF_MEMORY) ++ return rcode; ++ } ++ ++ /* if still not enough, increase up to maximum */ ++ while (rcode == SCAN_OUT_OF_MEMORY ++ && vm_size <= VM_SIZE_MAX/2 ) { ++ #ifdef BUILDCID ++ /* xfree(vm_base); */ ++ #else ++ xfree(vm_base); ++ #endif + if (!(initFont(vm_size * 2))) { + /* we are really out of memory */ + return(SCAN_OUT_OF_MEMORY); + } + resetFont(env); + rcode = scan_font(FontP); + } + return(rcode); + } +*** util.h 2000/01/01 00:40:11 1.1 +--- util.h 2000/01/01 01:29:18 +*************** +*** 83,88 **** +--- 83,92 ---- + #else + #define VM_SIZE (50*1024) + #endif ++ ++ /* this is the maximal permitted memory size */ ++ #define VM_SIZE_MAX (1024*1024) ++ + /***================================================================***/ + + #ifndef MIN diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/Makefile b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/Makefile new file mode 100755 index 00000000..2c69599b --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/Makefile @@ -0,0 +1,5 @@ +nsfix: nsfix.c + $(CC) $(CFLAGS) -o nsfix nsfix.c $(LDFLAGS) + +clean: + rm -f *.o core *.core core.* nsfix diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/README b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/README new file mode 100755 index 00000000..d57c1cd5 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/README @@ -0,0 +1,180 @@ +Installing the fonts in Netscape Navigator + +by Sergey Babkin +, + +This is a collection of supplements to Netscape 4.x on +Unix. Probably they will also work with Netscape 3.x, +possilby with minor modifications. + + Makefile + nsfix.c + psfonts.cf + +This is a program that allows to substitute the font metrics +of any PostScript font in Netscape. + +When Netscape prints the files to PostScript format it uses a +built-in table of character widths. It prints all the fixed-width +characters in the typeface "Courier" and all the variable-width +characters in the typeface "Times". And if the PostScript printer +has these fonts by Adobe then everything goes fine because +the tables inside Netscape are generated from the Adobe fonts. +But if the fonts are different (say, those supplied with Ghostscripts +or the fonts with non-latin characters) then the result is quite +ugly. This program allows to replace the width tables inside +the Netscape executable with the tables for any given font. +The only problem is that Netscape can hold only one set of tables +at once. So if you want to print with different fonts (say, +for different languages or encodings) you will have to make +multiple copies of the executable, tune each of them for its +font and then run them separately. + +I tried to make the program as machine-independent as possible. +But because it patches the binary files it still has the dependencies +on hardware. The default version as supplied was designed for +Intel x86 machines but it should work OK on any machine +with 32-bit CPU and 4Kbyte (or less) page size. If it can't +find the tables matching the font names on some other architecture +the first thing to try would be reduce the `PAGEBITS' definition +in the source code. On the machines with non-page-aligned structure +of executables it won't work at all. I don't know whether would +it work on the 64-bit machines. This may depend on whether the +Netscape executable was compiled in 32-bit or 64-bit mode. For +the 64-bit executables it may be neccessary to change the definition +of the type `tptr' to an 8-byte integer type (probably `long' +or `long long'). Also must be re-compiled for patching of the +Netscape binary for each particular machine architecture because +it assumes the byte order of the current machine. + +It might be possible to create a program that would patch +a running Netscape binary on the fly, that would allow +changing the printing fonts as neccessary when Netscape is +running. But this would be even more platform-dependent, +so I don't feel any enthusiasm about doing that. + +I have tested the program on the Intel machines, Netscape +4.08 and 4.7, OS FreeBSD (both a.out and ELF formats of the +Netscape binary) and UnixWare. + +After all these scary issues are resolved the compiling +is easy: just run `make'. + +To command to patch the Netscape is: + ./nsfix + +Please make a copy of the original Netscape binary before +patching in case anything goes wrong. Patch the copy, test +that it works OK and only then install it. The configuration +file describes the fonts that are to be used. An example +is provided in the file psfonts.cf. + +Each line in the configuration file consists of 4 +columns: + + + +For example, the following line from my configuration file: + +Courier /usr/lib/X11/fonts/ttf/cokoi8n.koi8-r .afm .pfa + +says that the font `Courier' will be replaced with the +font taken from the file `/usr/lib/X11/fonts/ttf/cokoi8n.koi8-r.pfa' +and the metrics for that font will be taken from the file +`/usr/lib/X11/fonts/ttf/cokoi8n.koi8-r.afm' . + +One more caveat: the new font must have a proper encoding +table. Some fonts contain characters for multiple encodings +hoping that the program wil re-encode them as neccessary. +This won't work in this case, only the primary encoding table +of the font will be used. + + nsfilter + nsprint + psfonts.cf + +These are the filters for printing from Netscape. + +Changing the metrics is not the end of the story. This will +provide proper placement of the characters but not the +characters themselves. There are a few ways to provide +the characters: + +First, if you use GhostScript you may configure proper +aliases in the GhostScript configuration file. We will +consider this variant trivial and won't discuss it furter +except for one caveat: Netscape tries to re-encode the +fonts per the ISO Latin-1 encoding. If the primary encoding +of the font is different this cause unexpected effects. +So you still may consider using the filters (at least in a +simplified form) to solve this problem. + +Second, load the fonts right into your printer. This is +very much like configuring GhostScript. + +Third, use the provided filters. The script `nsfilter' +reads the output of Netscape on its standard input and +puts the result to its standard output. It uses the same +configuration file `psfonts.cf' as `nsfix'. First it +looks for the configuration file in the user's home +directory ($HOME/.netscape/psfonts.cf) and if the +file it not there then the second guess is the system-wide +configuration file /usr/local/etc/psfonts.cf. The +script inserts the fonts into the output and also +removes the Netscape's experiments with the encodings. + +`nsfilter' is generally intended to be ran by user, not by the +printing subsystem. The reason is that the user may have +changed fonts in his Netscape and the printing subsystem +would have no way to access user's configuration file. +But if all the users are using the same fonts then it +may be incorporated into the printing subsystem and use +the system-wide configuration file. + +The script `nsprint' is purely for convenience, to type it +as a printing command in the Netscape printing window. +It just pipelines the data through `nsfilter' to the +printing program which also gets all the arguments. Please +note that the SystemV-style and BSD-style systems use different +printing programs (although they commonly provide compatibility +with the other style too). The script tries to guess the +type of system and use its native print program, `lp' or +`lpr'. But in case it guesses wrong you may want +to change this in the script. Also if the printer does not support +PostScript directly this script may be a good place to +insert a call to GhostScript. + + notscape + fontsz.cf + +Netscape on Unix has a very annoying "feature", it does +not remember the desired base size of the scalable screen +fonts and always resets it to 12.0 points. Even if the size +is changed manually in its preferences file, Netscape +forgets it after it exits. + +So my solution was to write a program which would change +the size to my favorite one every time right before +starting Netscape. `notscape' is exactly such a program, +it sets the font sizes an then transparently executes +netscape. It takes the font sizes from the file +`$HOME/.netscape/fontsz.cf' . An example of such file +is provided. The format of the file is quite self-explanatory, +for example the lines + +fixed-koi8-r 140 +prop-koi8-r 150 + +mean "set the size of the fixed-width screen font in the +encoding koi8-r to 14.0 points; set the size of the proportional +(variable-width) font in the encoding koi8-r to 15.0 points". + + + nspr +by Zvezdan Petkovic + +To print from Netscape, I usually print to the Postscript file first. +Then I use this small script to change the names of Times and Courier fonts +in the file and remove `/Encoding' lines. After that the file can be +sent to printer. + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/README.html b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/README.html new file mode 100755 index 00000000..1e8961bb --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/README.html @@ -0,0 +1,242 @@ + + + +Installing the fonts in Netscape Navigator + + + +

+Installing the fonts in Netscape Navigator +

+ + +by Sergey Babkin +<babkin@bellatlantic.net>, <sab123@hotmail.com> + +

+ +This is a collection of supplements to Netscape 4.x on +Unix. Probably they will also work with Netscape 3.x, +possilby with minor modifications. +

+ +

+  Makefile
+  nsfix.c
+  psfonts.cf +

+

+ +This is a program that allows to substitute the font metrics +of any PostScript font in Netscape. +

+ +When Netscape prints the files to PostScript format it uses a +built-in table of character widths. It prints all the fixed-width +characters in the typeface "Courier" and all the variable-width +characters in the typeface "Times". And if the PostScript printer +has these fonts by Adobe then everything goes fine because +the tables inside Netscape are generated from the Adobe fonts. +But if the fonts are different (say, those supplied with Ghostscripts +or the fonts with non-latin characters) then the result is quite +ugly. This program allows to replace the width tables inside +the Netscape executable with the tables for any given font. +The only problem is that Netscape can hold only one set of tables +at once. So if you want to print with different fonts (say, +for different languages or encodings) you will have to make +multiple copies of the executable, tune each of them for its +font and then run them separately. +

+ +I tried to make the program as machine-independent as possible. +But because it patches the binary files it still has the dependencies +on hardware. The default version as supplied was designed for +Intel x86 machines but it should work OK on any machine +with 32-bit CPU and 4Kbyte (or less) page size. If it can't +find the tables matching the font names on some other architecture +the first thing to try would be reduce the `PAGEBITS' definition +in the source code. On the machines with non-page-aligned structure +of executables it won't work at all. I don't know whether would +it work on the 64-bit machines. This may depend on whether the +Netscape executable was compiled in 32-bit or 64-bit mode. For +the 64-bit executables it may be neccessary to change the definition +of the type `tptr' to an 8-byte integer type (probably `long' +or `long long'). Also must be re-compiled for patching of the +Netscape binary for each particular machine architecture because +it assumes the byte order of the current machine. +

+ +It might be possible to create a program that would patch +a running Netscape binary on the fly, that would allow +changing the printing fonts as neccessary when Netscape is +running. But this would be even more platform-dependent, +so I don't feel any enthusiasm about doing that. +

+ +I have tested the program on the Intel machines, Netscape +4.08 and 4.7, OS FreeBSD (both a.out and ELF formats of the +Netscape binary) and UnixWare. +

+ +After all these scary issues are resolved the compiling +is easy: just run `make'. +

+ +To command to patch the Netscape is: +

+ +  ./nsfix <netscape-binary> <config-file> + +

+ +Please make a copy of the original Netscape binary before +patching in case anything goes wrong. Patch the copy, test +that it works OK and only then install it. The configuration +file describes the fonts that are to be used. An example +is provided in the file psfonts.cf. +

+ +Each line in the configuration file consists of 4 +columns: +

+ + +<PS_font_name> <font_base_file> <suffix_afm> <suffix_font> + +

+ +For example, the following line from my configuration file: +

+ + +Courier /usr/lib/X11/fonts/ttf/cokoi8n.koi8-r .afm .pfa + +

+ +says that the font `Courier' will be replaced with the +font taken from the file `/usr/lib/X11/fonts/ttf/cokoi8n.koi8-r.pfa' +and the metrics for that font will be taken from the file +`/usr/lib/X11/fonts/ttf/cokoi8n.koi8-r.afm' . +

+ +One more caveat: the new font must have a proper encoding +table. Some fonts contain characters for multiple encodings +hoping that the program wil re-encode them as neccessary. +This won't work in this case, only the primary encoding table +of the font will be used. +

+ +

+  nsfilter
+  nsprint
+  psfonts.cf +

+

+ +These are the filters for printing from Netscape. +

+ +Changing the metrics is not the end of the story. This will +provide proper placement of the characters but not the +characters themselves. There are a few ways to provide +the characters: +

+ +First, if you use GhostScript you may configure proper +aliases in the GhostScript configuration file. We will +consider this variant trivial and won't discuss it furter +except for one caveat: Netscape tries to re-encode the +fonts per the ISO Latin-1 encoding. If the primary encoding +of the font is different this cause unexpected effects. +So you still may consider using the filters (at least in a +simplified form) to solve this problem. +

+ +Second, load the fonts right into your printer. This is +very much like configuring GhostScript. +

+ +Third, use the provided filters. The script `nsfilter' +reads the output of Netscape on its standard input and +puts the result to its standard output. It uses the same +configuration file `psfonts.cf' as `nsfix'. First it +looks for the configuration file in the user's home +directory ($HOME/.netscape/psfonts.cf) and if the +file it not there then the second guess is the system-wide +configuration file /usr/local/etc/psfonts.cf. The +script inserts the fonts into the output and also +removes the Netscape's experiments with the encodings. +

+ +`nsfilter' is generally intended to be ran by user, not by the +printing subsystem. The reason is that the user may have +changed fonts in his Netscape and the printing subsystem +would have no way to access user's configuration file. +But if all the users are using the same fonts then it +may be incorporated into the printing subsystem and use +the system-wide configuration file. +

+ +The script `nsprint' is purely for convenience, to type it +as a printing command in the Netscape printing window. +It just pipelines the data through `nsfilter' to the +printing program which also gets all the arguments. Please +note that the SystemV-style and BSD-style systems use different +printing programs (although they commonly provide compatibility +with the other style too). The script tries to guess the +type of system and use its native print program, `lp' or +`lpr'. But in case it guesses wrong you may want +to change this in the script. Also if the printer does not support +PostScript directly this script may be a good place to +insert a call to GhostScript. +

+ +

+  notscape
+  fontsz.cf +

+

+ +Netscape on Unix has a very annoying "feature", it does +not remember the desired base size of the scalable screen +fonts and always resets it to 12.0 points. Even if the size +is changed manually in its preferences file, Netscape +forgets it after it exits. +

+ +So my solution was to write a program which would change +the size to my favorite one every time right before +starting Netscape. `notscape' is exactly such a program, +it sets the font sizes an then transparently executes +netscape. It takes the font sizes from the file +`$HOME/.netscape/fontsz.cf' . An example of such file +is provided. The format of the file is quite self-explanatory, +for example the lines +

+ + +fixed-koi8-r 140
+prop-koi8-r 150 +
+

+ +mean "set the size of the fixed-width screen font in the +encoding koi8-r to 14.0 points; set the size of the proportional +(variable-width) font in the encoding koi8-r to 15.0 points". +

+ + +

+  nspr +
+by Zvezdan Petkovic

+

+ +To print from Netscape, I usually print to the Postscript file first. +Then I use this small script to change the names of Times and Courier fonts +in the file and remove `/Encoding' lines. After that the file can be +sent to printer. +

+ + + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/fontsz.cf b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/fontsz.cf new file mode 100755 index 00000000..acce79c2 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/fontsz.cf @@ -0,0 +1,8 @@ +fixed-koi8-r 150 +prop-koi8-r 150 +fixed-iso-8859-5 150 +prop-iso-8859-5 150 +fixed-iso-8859-1 150 +prop-iso-8859-1 150 +fixed-x-user-defined 150 +prop-x-user-defined 150 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/notscape b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/notscape new file mode 100755 index 00000000..67d87bcb --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/notscape @@ -0,0 +1,25 @@ +#!/bin/sh + +NDIR=$HOME/.netscape +PFILE=$NDIR/preferences.js +CFFILE=$NDIR/fontsz.cf +TMPFILE=$NDIR/fontsz.sed + +die() { + echo "notscape: can't $*" >&2 + exit 1 +} + +[ -r $CFFILE ] && { +awk '{ printf("/intl.font_spec_list/s/-[^-]*-\\([^-]*\\)-%s,/-%s-\\1-%s,/\n", \ + $1, $2, $1); }' <$CFFILE >$TMPFILE + +cp $PFILE $PFILE.old || die "save old pref file" +sed -f $TMPFILE <$PFILE.old >$PFILE.new || die "create new pref file" +[ -s $PFILE.new ] || die "create new pref file" + +mv $PFILE.new $PFILE || die "install new pref file" + +} + +exec netscape -no-about-splash "$@" diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/nsfilter b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/nsfilter new file mode 100755 index 00000000..77b5b64b --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/nsfilter @@ -0,0 +1,24 @@ +#!/bin/sh +CONFLOCAL=$HOME/.netscape/psfonts.cf +CONFGLOBAL=/usr/local/etc/nspsfonts.cf + +if [ -r "$CONFLOCAL" ] +then + CONF="$CONFLOCAL" +else + CONF="$CONFGLOBAL" +fi + +grep -v "^#" <$CONF | grep -v "^$" | while : +do { + read nsname base afm pfa x + [ -z "$nsname" ] && break; + + fname=`awk '/^FontName/ {print $2;}' <$base$afm` + + cat $base$pfa + echo "/$nsname /$fname findfont definefont" + +} done + +grep -v "^ /Encoding isolatin1encoding def$" | egrep -v '^newpath .* closepath clip newpath$' diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/nsfix.c b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/nsfix.c new file mode 100755 index 00000000..6aa47c91 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/nsfix.c @@ -0,0 +1,469 @@ +/* + * Fix the Netscape executable for specified font widths + * + * (c) 1999 Copyright by Sergey Babkin + * see COPYRIGHT + */ + +#include +#include +#include +#include +#include + +/************************** DEFINES *************************/ + +#undef DEBUG + +/* we can handle at most this many fonts */ +#define MAXFONTS 20 + +/* maximal line buffer size */ +#define MAXLINE 512 + +/* there may be multiple strings with the same contents */ +#define MAXDUPS 10 + +/* file read buffer size */ +#define FILEBF 40960 + +/* bits in the hardware page offset */ +#define BITSPERPAGE 12 + +/* size of page in bytes */ +#define PAGESIZE (1< \n"); +} + + +/************************** readconfig **********************/ + +void +readconfig(fn) + char *fn; +{ + char s[MAXLINE]; + char afmsuffix[MAXLINE], pfasuffix[MAXLINE]; + int lineno=0; + FILE *f; + + if(( f=fopen(fn, "r") )==NULL) { + sprintf(msg,"nsfix: open %s",fn); + perror(msg); + exit(1); + } + + while( fgets(s, MAXLINE, f) ) { + lineno++; + if(s[0]=='#' || s[0]=='\n') + continue; + + if(nfonts>=MAXFONTS) { + fprintf(stderr, "nsfix: only %d fonts are supported at once\n", + MAXFONTS); + exit(1); + } + + if( sscanf(s, "%s %s %s %s", font[nfonts].nsname, + font[nfonts].afmname, afmsuffix, pfasuffix) != 4 ) { + fprintf(stderr, "nsfix: syntax error at line %d of %s\n", + lineno, fn); + exit(1); + } + strcpy(font[nfonts].pfaname, font[nfonts].afmname); + strcat(font[nfonts].afmname, afmsuffix); + strcat(font[nfonts].pfaname, pfasuffix); + nfonts++; + } + + if(nfonts==0) { + fprintf(stderr, "nsfix: no fonts are defined in %s\n", fn); + exit(1); + } + fclose(f); +} + +/************************** readmetrics *********************/ + +void +readmetrics(void) +{ + int i; + char s[MAXLINE]; + FILE *f; + int n; + int lineno; + int code, width, llx, lly, urx, ury; + char gn[MAXLINE]; + struct glyphmetrics *gm; + + for(i=0; i=32 && code<=255) { + font[i].metrics.glyphs[code].width=width; + font[i].metrics.glyphs[code].bbox.llx=llx; + font[i].metrics.glyphs[code].bbox.lly=lly; + font[i].metrics.glyphs[code].bbox.urx=urx; + font[i].metrics.glyphs[code].bbox.ury=ury; + } + } + } + fclose(f); + } + +#ifdef DEBUG + for(i=0; iwidth, + gm->bbox.llx, gm->bbox.lly, gm->bbox.urx, gm->bbox.ury); + printf(" w=0x%04x [0x%04x 0x%04x 0x%04x 0x%04x]\n", gm->width & 0xffff, + gm->bbox.llx & 0xffff, gm->bbox.lly & 0xffff, gm->bbox.urx & 0xffff, gm->bbox.ury & 0xffff); + } + } + + exit(0); +#endif + +} + +/************************** replacefonts ********************/ + +void +replacefonts(fn) + char *fn; +{ + int f; /* don't use stdio */ + char bf[FILEBF]; + char *bfend, *p; + int len; + off_t pos; + + off_t zerooff[MAXFONTS*MAXDUPS]; /* offset of zero strings */ + tptr nameaddr[MAXFONTS*MAXDUPS]; /* name pointers before these zero strings */ + int zeroid[MAXFONTS*MAXDUPS]; /* font number for this zero block */ + int nzeroes; + short matched[MAXFONTS]; /* counters how many matches we have for each requested font */ + struct fontmetrics *fp; + + struct { + int noff; + int nz; + off_t off[MAXDUPS]; /* there may be multiple strings with the same contents */ + } o[MAXFONTS]; + int maxnlen; + int i, j, k, n; + + static struct glyphmetrics gm[32]; /* 0-initialized */ + + + if(( f=open(fn, O_RDWR) )<0) { + sprintf(msg,"nsfix: open %s",fn); + perror(msg); + exit(1); + } + + + /* get the maximal font name length */ + maxnlen=0; + for(i=0; imaxnlen) + maxnlen=len; + } + + /* fprintf(stderr,"maxnlen= 0x%x\n", maxnlen); /* */ + /* try to find the literal strings of the font names */ + pos=0; bfend=bf; + while(( len=read(f, bfend, FILEBF-(bfend-bf)) )>=0 ) { + /* fprintf(stderr,"looking at 0x%lx\n", (long)pos); /* */ + /* the last position to check */ + if(len>=maxnlen) + /* leave the rest with the next block */ + bfend+= len-maxnlen; + else { + /* we are very near to the end of file, check + * up to the very last byte */ + bfend+= len-2; + memset(bfend+2, 0, maxnlen); + } + + for(p=bf; p<=bfend; p++) + for(i=0; i pos + PAGESIZE/2) { /* bad */ + fprintf(stderr, "eliminated %s at 0x%lx\n", font[j].nsname, (long)o[j].off[k] ); + for(n=k+1; n=0 ) { + /* fprintf(stderr,"looking at 0x%lx\n", (long)pos); /* */ + /* the last position to check */ + bfend+= len-maxnlen; /* don't look beyond the EOF */ + + for(p=bf; p<=bfend; p+=4 /* 4-byte aligned */ ) { + fp=(struct fontmetrics *)p; + if(fp->name==0) + continue; + if( memcmp(gm, fp->glyphs, sizeof gm) ) + continue; + + /* OK, looks like it, see if we can match it to any name */ + n= fp->name & PAGEMASK; + for(i=0; iname; + zeroid[nzeroes]=i; + o[i].nz++; + fprintf(stderr, "matched %s at 0x%lx\n", + font[i].nsname, (long) zerooff[nzeroes]); + nzeroes++; + matched[i]++; + break; + } + } + + } + + if(len==0) + break; + + memmove(bf, bfend, maxnlen); + pos+= (bfend-bf); + bfend= (bf+maxnlen); + } + if(len<0) { + sprintf(msg,"nsfix: read %s",fn); + perror(msg); + exit(1); + } + fprintf(stderr,"---\n"); + + /* make sure that all the fonts got one match */ + k=0; /* flag: have non-matched fonts */ n=0; /* flag: have ambiguities */ + for(i=0; i1) + n=1; + + if(k) { + fprintf(stderr,"nsfix: can't find match for some of the fonts\n"); + fprintf(stderr,"nsfix: maybe wrong byte order, aborting\n"); + exit(1); + } + if(n) { + fprintf(stderr,"nsfix: got multiple matches for some of the fonts\n"); + fprintf(stderr,"nsfix: can't resolve, aborting\n"); + exit(1); + } + + /* now finally write the updated tables */ + for(i=0; i/dev/null +then + LPR=lpr +else + LPR=lp +fi + +nsfilter | $LPR "$@" diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/psfonts.cf b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/psfonts.cf new file mode 100755 index 00000000..19b4d712 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/app/netscape/psfonts.cf @@ -0,0 +1,11 @@ +# PS_font_name font_base_file suffix_afm suffix_font + +Courier /usr/lib/X11/fonts/ttf/cokoi8n.koi8-r .afm .pfa +Courier-Bold /usr/lib/X11/fonts/ttf/cokoi8b.koi8-r .afm .pfa +Courier-Oblique /usr/lib/X11/fonts/ttf/cokoi8i.koi8-r .afm .pfa +Courier-BoldOblique /usr/lib/X11/fonts/ttf/cokoi8bi.koi8-r .afm .pfa + +Times-Roman /usr/lib/X11/fonts/ttf/kudriash.koi8-r .afm .pfa +Times-Bold /usr/lib/X11/fonts/ttf/kudrias1.koi8-r .afm .pfa +Times-Italic /usr/lib/X11/fonts/ttf/kudrias3.koi8-r .afm .pfa +Times-BoldItalic /usr/lib/X11/fonts/ttf/kudrias2.koi8-r .afm .pfa diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/bdf.c b/application/third_party/dompdf/lib/ttf2ufm/src/bdf.c new file mode 100755 index 00000000..a27fc911 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/bdf.c @@ -0,0 +1,661 @@ +/* + * The font parser for the BDF files + * + * Copyright (c) 2001 by the TTF2PT1 project + * Copyright (c) 2001 by Sergey Babkin + * + * see COPYRIGHT for the full copyright notice + */ + +#include +#include +#include +#include +#include "pt1.h" +#include "global.h" + +/* prototypes of call entries */ +static void openfont(char *fname, char *arg); +static void closefont( void); +static int getnglyphs ( void); +static int glnames( GLYPH *glyph_list); +static void readglyphs( GLYPH *glyph_list); +static int glenc( GLYPH *glyph_list, int *encoding, int *unimap); +static void fnmetrics( struct font_metrics *fm); +static void glpath( int glyphno, GLYPH *glyph_list); +static void kerning( GLYPH *glyph_list); + +/* globals */ + +/* front-end descriptor */ +struct frontsw bdf_sw = { + /*name*/ "bdf", + /*descr*/ "BDF bitmapped fonts", + /*suffix*/ { "bdf" }, + /*open*/ openfont, + /*close*/ closefont, + /*nglyphs*/ getnglyphs, + /*glnames*/ glnames, + /*glmetrics*/ readglyphs, + /*glenc*/ glenc, + /*fnmetrics*/ fnmetrics, + /*glpath*/ glpath, + /*kerning*/ kerning, +}; + +/* statics */ + +#define MAXLINE 10240 /* maximal line length in the input file */ + +static int lineno; /* line number */ + +#define GETLEN(s) s, (sizeof(s)-1) +#define LENCMP(str, txt) strncmp(str, txt, sizeof(txt)-1) + +static FILE *bdf_file; +static int nglyphs; +static struct font_metrics fmet; + +/* many BDF fonts are of small pixel size, so we better try + * to scale them by an integer to keep the dimensions in + * whole pixels. However if the size is too big and a non- + * integer scaling is needed, we use the standard ttf2pt1's + * scaling abilities. + */ +static int pixel_size; +static int scale; +static int scale_external; + +static char *slant; +static char xlfdname[201]; +static char *spacing; +static char *charset_reg; +static char *charset_enc; +static char *fnwidth; +static int is_unicode = 0; + +/* tempoary storage for returning data to ttf2pt1 later on request */ +static int maxenc = 0; +static int *fontenc; +static GENTRY **glpaths; + +static int got_glyphs = 0; +static GLYPH *glyphs; +static int curgl; + +static int readfile(FILE *f, int (*strfunc)(int len, char *str)); + +/* + * Read the file and parse each string with strfunc(), + * until strfunc() returns !=0 or the end of file happens. + * Returns -1 on EOF or strfunc() returning <0, else 0 + */ + +static int +readfile( + FILE *f, + int (*strfunc)(int len, char *str) +) +{ + static char str[MAXLINE]; /* input line, maybe should be dynamic ? */ + char *s; + int len, c, res; + + len=0; + while(( c=getc(f) )!=EOF) { + if(c=='\n') { + str[len]=0; + + res = strfunc(len, str); + lineno++; + if(res<0) + return -1; + else if(res!=0) + return 0; + + len=0; + } else if(len%d)\n", lineno, MAXLINE-1); + exit(1); + } + } + return -1; /* EOF */ +} + +/* + * Parse the header of the font file. + * Stop after the line CHARS is encountered. Ignore the unknown lines. + */ + +struct line { + char *name; /* property name with trailing space */ + int namelen; /* length of the name string */ + enum { + ALLOW_REPEAT = 0x01, /* this property may be repeated in multiple lines */ + IS_SEEN = 0x02, /* this property has been seen already */ + MUST_SEE = 0x04, /* this property must be seen */ + IS_LAST = 0x08 /* this is the last property to be read */ + } flags; + char *fmt; /* format string for the arguments, NULL means a string arg */ + int nvals; /* number of values to be read by sscanf */ + void *vp[4]; /* pointers to values to be read */ +}; + +static struct line header[] = { + { GETLEN("FONT "), 0, " %200s", 1, {&xlfdname} }, + { GETLEN("SIZE "), MUST_SEE, " %d", 1, {&pixel_size} }, + { GETLEN("FONTBOUNDINGBOX "), MUST_SEE, " %hd %hd %hd %hd", 4, + {&fmet.bbox[2], &fmet.bbox[3], &fmet.bbox[0], &fmet.bbox[1]} }, + { GETLEN("FAMILY_NAME "), MUST_SEE, NULL, 1, {&fmet.name_family} }, + { GETLEN("WEIGHT_NAME "), MUST_SEE, NULL, 1, {&fmet.name_style} }, + { GETLEN("COPYRIGHT "), 0, NULL, 1, {&fmet.name_copyright} }, + { GETLEN("SLANT "), MUST_SEE, NULL, 1, {&slant} }, + { GETLEN("SPACING "), 0, NULL, 1, {&spacing} }, + { GETLEN("SETWIDTH_NAME "), 0, NULL, 1, {&fnwidth} }, + { GETLEN("CHARSET_REGISTRY "), 0, NULL, 1, {&charset_reg} }, + { GETLEN("CHARSET_ENCODING "), 0, NULL, 1, {&charset_enc} }, + { GETLEN("FONT_ASCENT "), 0, " %hd", 1, {&fmet.ascender} }, + { GETLEN("FONT_DESCENT "), 0, " %hd", 1, {&fmet.descender} }, + + /* these 2 must go in this order for post-processing */ + { GETLEN("UNDERLINE_THICKNESS "), 0, " %hd", 1, {&fmet.underline_thickness} }, + { GETLEN("UNDERLINE_POSITION "), 0, " %hd", 1, {&fmet.underline_position} }, + + { GETLEN("CHARS "), MUST_SEE|IS_LAST, " %d", 1, {&nglyphs} }, + { NULL, 0, 0 } /* end mark: name==NULL */ +}; + +static int +handle_header( + int len, + char *str +) +{ + struct line *cl; + char *s, *p; + char bf[2000]; + int c; + +#if 0 + fprintf(stderr, "line: %s\n", str); +#endif + for(cl = header; cl->name != 0; cl++) { + if(strncmp(str, cl->name, cl->namelen)) + continue; +#if 0 + fprintf(stderr, "match: %s\n", cl->name); +#endif + if(cl->flags & IS_SEEN) { + if(cl->flags & ALLOW_REPEAT) + continue; + + fprintf(stderr, "**** input line %d redefines the property %s\n", lineno, cl->name); + exit(1); + } + cl->flags |= IS_SEEN; + if(cl->fmt == 0) { + if(len - cl->namelen + 1 > sizeof bf) + len = sizeof bf; /* cut it down */ + + s = bf; /* a temporary buffer to extract the value */ + + /* skip until a quote */ + for(p = str+cl->namelen; len!=0 && (c = *p)!=0; p++, len--) { + if(c == '"') { + p++; + break; + } + } + for(; len!=0 && (c = *p)!=0; p++, len--) { + if(c == '"') { + c = *++p; + if(c == '"') + *s++ = c; + else + break; + } else + *s++ = c; + } + *s = 0; /* end of line */ + + *((char **)(cl->vp[0])) = dupcnstring(bf, s-bf); + } else { + c = sscanf(str+cl->namelen, cl->fmt, cl->vp[0], cl->vp[1], cl->vp[2], cl->vp[3]); + if(c != cl->nvals) { + fprintf(stderr, "**** property %s at input line %d must have %d arguments\n", + cl->name, lineno, cl->nvals); + exit(1); + } + } + if(cl->flags & IS_LAST) + return 1; + else + return 0; + } + return 0; +} + +/* + * Parse the description of the glyphs + */ + +static int +handle_glyphs( + int len, + char *str +) +{ + static int inbmap=0; + static char *bmap; + static int xsz, ysz, xoff, yoff; + static int curln; + int i, c; + char *p, *plim, *psz; + + if(!LENCMP(str, "ENDFONT")) { + if(curgl < nglyphs) { + fprintf(stderr, "**** unexpected end of font file after %d glyphs\n", curgl); + exit(1); + } else + return 1; + } + if(curgl >= nglyphs) { + fprintf(stderr, "**** file contains more glyphs than advertised (%d)\n", nglyphs); + exit(1); + } + if(!LENCMP(str, "STARTCHAR")) { + /* sizeof will count \0 instead of ' ' */ + for(i=sizeof("STARTCHAR"); str[i] == ' '; i++) + {} + + glyphs[curgl].name = strdup(str + i); + if(glyphs[curgl].name == 0) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + } else if(!LENCMP(str, "ENCODING")) { + if(sscanf(str, "ENCODING %d", &fontenc[curgl])!=1) { + fprintf(stderr,"**** weird ENCODING statement at line %d\n", lineno); + exit(1); + } + if(fontenc[curgl] == -1) /* compatibility format */ + sscanf(str, "ENCODING -1 %d", &fontenc[curgl]); + if(fontenc[curgl] > maxenc) + maxenc = fontenc[curgl]; + } else if(!LENCMP(str, "DWIDTH")) { + if(sscanf(str, "DWIDTH %d %d", &xsz, &ysz)!=2) { + fprintf(stderr,"**** weird DWIDTH statement at line %d\n", lineno); + exit(1); + } + glyphs[curgl].width = xsz*scale; + } else if(!LENCMP(str, "BBX")) { + if(sscanf(str, "BBX %d %d %d %d", &xsz, &ysz, &xoff, &yoff)!=4) { + fprintf(stderr,"**** weird BBX statement at line %d\n", lineno); + exit(1); + } + bmap=malloc(xsz*ysz); + if(bmap==0) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + glyphs[curgl].lsb = -xoff*scale; + glyphs[curgl].xMin = -xoff*scale; + glyphs[curgl].xMax = (xsz-xoff)*scale; + glyphs[curgl].yMin = -yoff*scale; + glyphs[curgl].yMax = (ysz-xoff)*scale; + } else if(!LENCMP(str, "BITMAP")) { + inbmap=1; + curln=ysz-1; /* the lowest line has index 0 */ + } else if(!LENCMP(str, "ENDCHAR")) { + inbmap=0; + if(bmap) { + glyphs[curgl].lastentry = 0; + glyphs[curgl].path = 0; + glyphs[curgl].entries = 0; + bmp_outline(&glyphs[curgl], scale, bmap, xsz, ysz, xoff, yoff); + free(bmap); + /* remember in a static table or it will be erased */ + glpaths[curgl] = glyphs[curgl].entries; + glyphs[curgl].entries = 0; + + if(glpaths[curgl]) + glyphs[curgl].ttf_pathlen = 1; + else + glyphs[curgl].ttf_pathlen = 0; + } + curgl++; + } else if(inbmap) { + if(curln<0) { + fprintf(stderr,"**** bitmap is longer than %d lines at line %d\n", ysz, lineno); + exit(1); + } + + i=0; + p=&bmap[curln*xsz]; psz=p+xsz; + while(ilsb = 0; + g->width = fmet.bbox[2]; + g->xMin = 0; + g->yMin = 0; + } + g = &glyphs[0]; + g->name = ".notdef"; + g->xMax = fmet.bbox[2]*4/5; + g->yMax = fmet.bbox[3]*4/5; + g->entries = g->path = g->lastentry = 0; + /* make it look as a black square */ + fg_rmoveto(g, 0.0, 0.0); + fg_rlineto(g, 0.0, (double)g->yMax); + fg_rlineto(g, (double)g->xMax, (double)g->yMax); + fg_rlineto(g, (double)g->xMax, 0.0); + fg_rlineto(g, 0.0, 0.0); + g_closepath(g); + glpaths[0] = g->entries; + g->entries = 0; + g->ttf_pathlen = 4; + + g = &glyphs[1]; + g->name = ".null"; + g->xMax = g->yMax = 0; + g->ttf_pathlen = 0; + + if(readfile(bdf_file, handle_glyphs) < 0) { + fprintf(stderr, "**** file does not contain the ENDFONT line\n"); + exit(1); + } + got_glyphs = 1; +} + +/* + * Open font and prepare to return information to the main driver. + * May print error and warning messages. + * Exit on error. + */ + +static void +openfont( + char *fname, + char *arg /* unused now */ +) +{ + struct line *cl; + int i, l; + + if ((bdf_file = fopen(fname, "r")) == NULL) { + fprintf(stderr, "**** Cannot open file '%s'\n", fname); + exit(1); + } else { + WARNING_2 fprintf(stderr, "Processing file %s\n", fname); + } + + lineno = 1; + + for(cl = header; cl->name != 0; cl++) + cl->flags &= ~IS_SEEN; + if(readfile(bdf_file, handle_header) < 0) { + fprintf(stderr, "**** file does not contain the CHARS definition\n"); + exit(1); + } + for(cl = header; cl->name != 0; cl++) { + if( (cl->flags & MUST_SEE) && !(cl->flags & IS_SEEN) ) { + fprintf(stderr, "**** mandatory property %sis not found in the input line\n", + cl->name); /* cl->name has a space at the end */ + exit(1); + } + + /* set a few defaults */ + if( !(cl->flags & IS_SEEN) ) { + if(cl->vp[0] == &fmet.underline_thickness) { + fmet.underline_thickness = 1; + } else if(cl->vp[0] == &fmet.underline_position) { + fmet.underline_position = fmet.bbox[1] + fmet.underline_thickness + - (pixel_size - fmet.bbox[3]); + } else if(cl->vp[0] == &fmet.ascender) { + fmet.ascender = fmet.bbox[2] + fmet.bbox[0]; + } else if(cl->vp[0] == &fmet.descender) { + fmet.descender = fmet.bbox[0]; + } + } + } + + nglyphs += 2; /* add empty glyph and .notdef */ + + /* postprocessing to compensate for the differences in the metric formats */ + fmet.bbox[2] += fmet.bbox[0]; + fmet.bbox[3] += fmet.bbox[1]; + + scale = 1000/pixel_size; /* XXX ? */ + if(scale*pixel_size < 950) { + scale = 1; + scale_external = 1; + fmet.units_per_em = pixel_size; + } else { + scale_external = 0; + fmet.units_per_em = scale*pixel_size; + + fmet.underline_position *= scale; + fmet.underline_thickness *= scale; + fmet.ascender *= scale; + fmet.descender *= scale; + for(i=0; i<4; i++) + fmet.bbox[i] *= scale; + } + + fmet.italic_angle = 0.0; + if(spacing == 0 /* possibly an old font */ + || toupper(spacing[0]) != 'P') /* or anything non-proportional */ + fmet.is_fixed_pitch = 1; + else + fmet.is_fixed_pitch = 0; + + if(fmet.name_copyright==NULL) + fmet.name_copyright = ""; + + /* create the full name */ + l = strlen(fmet.name_family) + + (fmet.name_style? strlen(fmet.name_style) : 0) + + (fnwidth? strlen(fnwidth) : 0) + + strlen("Oblique") + 1; + + if(( fmet.name_full = malloc(l) )==NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + strcpy(fmet.name_full, fmet.name_family); + if(fnwidth && strcmp(fnwidth, "Normal")) { + strcat(fmet.name_full, fnwidth); + } + if(fmet.name_style && strcmp(fmet.name_style, "Medium")) { + strcat(fmet.name_full, fmet.name_style); + } + switch(toupper(slant[0])) { + case 'O': + strcat(fmet.name_full, "Oblique"); + break; + case 'I': + strcat(fmet.name_full, "Italic"); + break; + } + + fmet.name_ps = fmet.name_full; + fmet.name_version = "1.0"; + + if(charset_reg && charset_enc + && !strcmp(charset_reg, "iso10646") && !strcmp(charset_enc, "1")) + is_unicode = 1; + + if(( fontenc = calloc(nglyphs, sizeof *fontenc) )==NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + for(i=0; i=0 && e 255) + return 2; + else + return 0; +} + +/* + * Get the font metrics + */ +static void +fnmetrics( + struct font_metrics *fm +) +{ + *fm = fmet; +} + +/* + * Get the path of contrours for a glyph. + */ + +static void +glpath( + int glyphno, + GLYPH *glyf_list +) +{ + readglyphs(glyf_list); + glyf_list[glyphno].entries = glpaths[glyphno]; + glpaths[glyphno] = 0; +} + +/* + * Get the kerning data. + */ + +static void +kerning( + GLYPH *glyph_list +) +{ + return; /* no kerning in BDF */ +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/bitmap.c b/application/third_party/dompdf/lib/ttf2ufm/src/bitmap.c new file mode 100755 index 00000000..d2334e43 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/bitmap.c @@ -0,0 +1,2633 @@ +/* + * Handling of the bitmapped glyphs + * + * Copyright (c) 2001 by the TTF2PT1 project + * Copyright (c) 2001 by Sergey Babkin + * + * see COPYRIGHT for the full copyright notice + */ + +#include +#include +#include +#include "pt1.h" +#include "global.h" + +/* possible values of limits */ +#define L_NONE 0 /* nothing here */ +#define L_ON 1 /* black is on up/right */ +#define L_OFF 2 /* black is on down/left */ + +static int warnedhints = 0; + + +#ifdef USE_AUTOTRACE +#include + +/* + * Produce an autotraced outline from a bitmap. + * scale - factor to scale the sizes + * bmap - array of dots by lines, xsz * ysz + * xoff, yoff - offset of the bitmap's lower left corner + * from the logical position (0,0) + */ + +static void +autotraced_bmp_outline( + GLYPH *g, + int scale, + char *bmap, + int xsz, + int ysz, + int xoff, + int yoff +) +{ + at_bitmap_type atb; + at_splines_type *atsp; + at_fitting_opts_type *atoptsp; + at_spline_list_type *slp; + at_spline_type *sp; + int i, j, k; + double lastx, lasty; + double fscale; + char *xbmap; + + fscale = (double)scale; + + /* provide a white margin around the bitmap */ + xbmap = malloc((ysz+2)*(xsz+2)); + if(xbmap == 0) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + memset(xbmap, 0, xsz+2); /* top margin */ + for(i=0, j=xsz+2; ilength; i++) { + slp = &atsp->data[i]; +#if 0 + fprintf(stderr, "%s: contour %d: %d entries clockwise=%d color=%02X%02X%02X\n", + g->name, i, slp->length, slp->clockwise, slp->color.r, slp->color.g, slp->color.b); +#endif + if(slp->length == 0) + continue; +#if 0 + if(slp->color.r + slp->color.g + slp->color.b == 0) + continue; +#endif + fg_rmoveto(g, fscale*(slp->data[0].v[0].x+xoff), fscale*(slp->data[0].v[0].y+yoff)); + for(j=0; jlength; j++) { +#if 0 + fprintf(stderr, " "); + for(k=0; k<4; k++) + fprintf(stderr, "(%g %g) ", + fscale*(slp->data[j].v[k].x+xoff), + fscale*(ysz-slp->data[j].v[k].y+yoff) + ); + fprintf(stderr, "\n"); +#endif + fg_rrcurveto(g, + fscale*(slp->data[j].v[1].x+xoff), fscale*(slp->data[j].v[1].y+yoff), + fscale*(slp->data[j].v[2].x+xoff), fscale*(slp->data[j].v[2].y+yoff), + fscale*(slp->data[j].v[3].x+xoff), fscale*(slp->data[j].v[3].y+yoff) ); + } + g_closepath(g); + } + + at_splines_free(atsp); + at_fitting_opts_free(atoptsp); + free(xbmap); +} + +#endif /*USE_AUTOTRACE*/ + +/* an extension of gentry for description of the fragments */ +typedef struct gex_frag GEX_FRAG; +struct gex_frag { + /* indexes to len, the exact values and order are important */ +#define GEXFI_NONE -1 +#define GEXFI_CONVEX 0 +#define GEXFI_CONCAVE 1 +#define GEXFI_LINE 2 /* a line with steps varying by +-1 pixel */ +#define GEXFI_EXACTLINE 3 /* a line with exactly the same steps */ +#define GEXFI_SERIF 4 /* small serifs at the ends of stemsi - must be last */ +#define GEXFI_COUNT 5 /* maximal index + 1 */ + unsigned short len[GEXFI_COUNT]; /* length of various fragment types starting here */ + unsigned short lenback[GEXFI_COUNT]; /* length back to the start of curve */ + + signed char ixstart; /* index of the frag type that starts here */ + signed char ixcont; /* index of the frag type that continues here */ + + short flags; +#define GEXFF_HLINE 0x0001 /* the exact line is longer in "horizontal" dimension */ +#define GEXFF_EXTR 0x0002 /* this gentry is an extremum in some direction */ +#define GEXFF_CIRC 0x0004 /* the joint at this gentry is for a circular curve */ +#define GEXFF_DRAWCURVE 0x0008 /* vect[] describes a curve to draw */ +#define GEXFF_DRAWLINE 0x0010 /* vect[] describes a line to draw */ +#define GEXFF_SPLIT 0x0020 /* is a result of splitting a line */ +#define GEXFF_SYMNEXT 0x0040 /* this subfrag is symmetric with next one */ +#define GEXFF_DONE 0x0080 /* this subfrag has been vectorized */ +#define GEXFF_LONG 0x0100 /* this gentry is longer than 1 pixel */ + + unsigned short aidx; /* index of gentry in the array representing the contour */ + + unsigned short vectlen; /* number of gentries represented by vect[] */ + + /* coordinates for vectored replacement of this fragment */ + /* (already scaled because it's needed for curve approximation) */ + double vect[4 /*ref.points*/][2 /*X,Y*/]; + + double bbox[2 /*X,Y*/]; /* absolute sizes of bounding box of a subfragment */ + + /* used when splitting the curved frags into subfrags */ + GENTRY *prevsub; /* to gentries describing neighboring subfrags */ + GENTRY *nextsub; + GENTRY *ordersub; /* single-linked list describing the order of calculation */ + + int sublen; /* length of this subfrag */ + /* the symmetry across the subfrags */ + int symaxis; /* the symmetry axis, with next subfrag */ + int symxlen; /* min length of adjacent symmetric frags */ + /* the symmetry within this subfrag (the axis is always diagonal) */ + GENTRY *symge; /* symge->i{x,y}3 is the symmetry point of symge==0 if none */ + +}; +#define X_FRAG(ge) ((GEX_FRAG *)((ge)->ext)) + +/* various interesting tables related to GEX_FRAG */ +static char *gxf_name[GEXFI_COUNT] = {"Convex", "Concave", "Line", "ExLine", "Serif"}; +static int gxf_cvk[2] = {-1, 1}; /* coefficients of concaveness */ + +/* + * Dump the contents of X_EXT()->len and ->lenback for a contour + */ +static void +gex_dump_contour( + GENTRY *ge, + int clen +) +{ + int i, j; + + for(j = 0; j < GEXFI_COUNT; j++) { + fprintf(stderr, "%-8s", gxf_name[j]); + for(i = 0; i < clen; i++, ge = ge->frwd) + fprintf(stderr, " %2d", X_FRAG(ge)->len[j]); + fprintf(stderr, " %p\n (back) ", ge); + for(i = 0; i < clen; i++, ge = ge->frwd) + fprintf(stderr, " %2d", X_FRAG(ge)->lenback[j]); + fprintf(stderr, "\n"); + } +} + +/* + * Calculate values of X_EXT()->lenback[] for all entries in + * a contour. The contour is identified by: + * ge - any gentry of the contour + * clen - contour length + */ + +static void +gex_calc_lenback( + GENTRY *ge, + int clen +) +{ + int i, j; + int end; + GEX_FRAG *f; + int len[GEXFI_COUNT]; /* length of the most recent fragment */ + int count[GEXFI_COUNT]; /* steps since beginning of the fragment */ + + for(j = 0; j < GEXFI_COUNT; j++) + len[j] = count[j] = 0; + + end = clen; + for(i = 0; i < end; i++, ge = ge->frwd) { + f = X_FRAG(ge); + for(j = 0; j < GEXFI_COUNT; j++) { + if(len[j] != count[j]) { + f->lenback[j] = count[j]++; + } else + f->lenback[j] = 0; + if(f->len[j] != 0) { + len[j] = f->len[j]; + count[j] = 1; /* start with the next gentry */ + /* if the fragment will wrap over the start, process to its end */ + if(i < clen && i + len[j] > end) + end = i + len[j]; + } + } + } + gex_dump_contour(ge, clen); +} + +/* Limit a curve to not exceed the given coordinates + * at its given side + */ + +static void +limcurve( + double curve[4][2 /*X,Y*/], + double lim[2 /*X,Y*/], + int where /* 0 - start, 3 - end */ +) +{ + int other = 3-where; /* the other end */ + int sgn[2 /*X,Y*/]; /* sign for comparison */ + double t, from, to, nt, t2, nt2, tt[4]; + double val[2 /*X,Y*/]; + int i; + + for(i=0; i<2; i++) + sgn[i] = fsign(curve[other][i] - curve[where][i]); + +#if 0 + fprintf(stderr, " limit (%g,%g)-(%g,%g) at %d by (%g,%g), sgn(%d,%d)\n", + curve[0][0], curve[0][1], curve[3][0], curve[3][1], + where, lim[0], lim[1], sgn[0], sgn[1]); +#endif + /* a common special case */ + if( sgn[0]*(curve[where][0] - lim[0]) >= 0. + && sgn[1]*(curve[where][1] - lim[1]) >= 0. ) + return; /* nothing to do */ + + if(other==0) { + from = 0.; + to = 1.; + } else { + from = 1.; + to = 0.; + } +#if 0 + fprintf(stderr, "t="); +#endif + while( fabs(from-to) > 0.00001 ) { + t = 0.5 * (from+to); + t2 = t*t; + nt = 1.-t; + nt2 = nt*nt; + tt[0] = nt2*nt; + tt[1] = 3*nt2*t; + tt[2] = 3*nt*t2; + tt[3] = t*t2; + for(i=0; i<2; i++) + val[i] = curve[0][i]*tt[0] + curve[1][i]*tt[1] + + curve[2][i]*tt[2] + curve[3][i]*tt[3]; +#if 0 + fprintf(stderr, "%g(%g,%g) ", t, val[0], val[1]); +#endif + if(fabs(val[0] - lim[0]) < 0.1 + || fabs(val[1] - lim[1]) < 0.1) + break; + + if(sgn[0] * (val[0] - lim[0]) < 0. + || sgn[1] * (val[1] - lim[1]) < 0.) + to = t; + else + from = t; + } + /* now t is the point of splitting */ +#define SPLIT(pt1, pt2) ( (pt1) + t*((pt2)-(pt1)) ) /* order is important! */ + for(i=0; i<2; i++) { + double v11, v12, v13, v21, v22, v31; /* intermediate points */ + + v11 = SPLIT(curve[0][i], curve[1][i]); + v12 = SPLIT(curve[1][i], curve[2][i]); + v13 = SPLIT(curve[2][i], curve[3][i]); + v21 = SPLIT(v11, v12); + v22 = SPLIT(v12, v13); + v31 = SPLIT(v21, v22); + if(other==0) { + curve[1][i] = v11; + curve[2][i] = v21; + curve[3][i] = fabs(v31 - lim[i]) < 0.1 ? lim[i] : v31; + } else { + curve[0][i] = fabs(v31 - lim[i]) < 0.1 ? lim[i] : v31; + curve[1][i] = v22; + curve[2][i] = v13; + } + } +#undef SPLIT +#if 0 + fprintf(stderr, "\n"); +#endif +} + +/* + * Vectorize a subfragment of a curve fragment. All the data has been already + * collected by this time + */ + +static void +dosubfrag( + GLYPH *g, + int fti, /* fragment type index */ + GENTRY *firstge, /* first gentry of fragment */ + GENTRY *ge, /* first gentry of subfragment */ + double fscale +) +{ + GENTRY *gel, *gei; /* last gentry of this subfrag */ + GEX_FRAG *f, *ff, *lf, *pf, *xf; + /* maximal amount of space that can be used at the beginning and the end */ + double fixfront[2], fixend[2]; /* fixed points - used to show direction */ + double mvfront[2], mvend[2]; /* movable points */ + double limfront[2], limend[2]; /* limit of movement for movabel points */ + double sympt; + int outfront, outend; /* the beginning/end is going outwards */ + int symfront, symend; /* a ready symmetric fragment is present at front/end */ + int drnd[2 /*X,Y*/]; /* size of the round part */ + int i, j, a1, a2, ndots; + double avg2, max2; /* squared distances */ + struct dot_dist *dots, *usedots; + + ff = X_FRAG(firstge); + f = X_FRAG(ge); + gel = f->nextsub; + lf = X_FRAG(gel); + if(f->prevsub != 0) + pf = X_FRAG(f->prevsub); + else + pf = 0; + + for(i=0; i<2; i++) + drnd[i] = gel->bkwd->ipoints[i][2] - ge->ipoints[i][2]; + + if(f->prevsub==0 && f->ixcont == GEXFI_NONE) { + /* nothing to join with : may use the whole length */ + for(i = 0; i < 2; i++) + limfront[i] = ge->bkwd->ipoints[i][2]; + } else { + /* limit to a half */ + for(i = 0; i < 2; i++) + limfront[i] = 0.5 * (ge->ipoints[i][2] + ge->bkwd->ipoints[i][2]); + } + if( (ge->ix3 == ge->bkwd->ix3) /* vert */ + ^ (isign(ge->bkwd->ix3 - ge->frwd->ix3)==isign(ge->bkwd->iy3 - ge->frwd->iy3)) + ^ (fti == GEXFI_CONCAVE) /* counter-clockwise */ ) { + /* the beginning is not a flat 90-degree end */ + outfront = 1; + for(i = 0; i < 2; i++) + fixfront[i] = ge->frwd->ipoints[i][2]; + } else { + outfront = 0; + for(i = 0; i < 2; i++) + fixfront[i] = ge->ipoints[i][2]; + } + + if(lf->nextsub==0 && lf->ixstart == GEXFI_NONE) { + /* nothing to join with : may use the whole length */ + for(i = 0; i < 2; i++) + limend[i] = gel->ipoints[i][2]; + } else { + /* limit to a half */ + for(i = 0; i < 2; i++) + limend[i] = 0.5 * (gel->ipoints[i][2] + gel->bkwd->ipoints[i][2]); + } + gei = gel->bkwd->bkwd; + if( (gel->ix3 == gel->bkwd->ix3) /* vert */ + ^ (isign(gel->ix3 - gei->ix3)==isign(gel->iy3 - gei->iy3)) + ^ (fti == GEXFI_CONVEX) /* clockwise */ ) { + /* the end is not a flat 90-degree end */ + outend = 1; + for(i = 0; i < 2; i++) + fixend[i] = gel->bkwd->bkwd->ipoints[i][2]; + } else { + outend = 0; + for(i = 0; i < 2; i++) + fixend[i] = gel->bkwd->ipoints[i][2]; + } + + for(i = 0; i < 2; i++) { + fixfront[i] *= fscale; + limfront[i] *= fscale; + fixend[i] *= fscale; + limend[i] *= fscale; + } + + fprintf(stderr, " %d out(%d[%d %d %d],%d[%d %d %d]) drnd(%d, %d)\n", + fti, + outfront, + (ge->ix3 == ge->bkwd->ix3), + (isign(ge->bkwd->ix3 - ge->frwd->ix3)==isign(ge->bkwd->iy3 - ge->frwd->iy3)), + (fti == GEXFI_CONCAVE), + outend, + (gel->ix3 == gel->bkwd->ix3), + (isign(gel->ix3 - gei->ix3)==isign(gel->iy3 - gei->iy3)), + (fti == GEXFI_CONVEX), + drnd[0], drnd[1]); + + /* prepare to calculate the distances */ + ndots = f->sublen - 1; + dots = malloc(sizeof(*dots) * ndots); + if(dots == 0) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + for(i = 0, gei = ge; i < ndots; i++, gei = gei->frwd) { + for(a1 = 0; a1 < 2; a1++) + dots[i].p[a1] = fscale * gei->ipoints[a1][2]; + } + + /* see if we can mirror a ready symmetric curve */ + + /* check symmetry with the fragment before this */ + symfront = (pf != 0 && (pf->flags & GEXFF_SYMNEXT) && (pf->flags & GEXFF_DONE) + && ( outend && f->sublen <= pf->sublen + || ( pf->sublen == f->sublen + && (lf->sublen == 0 + || ( abs(limfront[0]-limend[0]) >= abs(pf->vect[0][0]-pf->vect[3][0]) + && abs(limfront[1]-limend[1]) >= abs(pf->vect[0][1]-pf->vect[3][1]) )) + ) + ) + ); + /* check symmetry with the fragment after this */ + symend = ( (f->flags & GEXFF_SYMNEXT) && (lf->flags & GEXFF_DONE) + && ( outfront && f->sublen <= lf->sublen + || ( lf->sublen == f->sublen + && (pf == 0 + || ( abs(limfront[0]-limend[0]) >= abs(lf->vect[0][0]-lf->vect[3][0]) + && abs(limfront[1]-limend[1]) >= abs(lf->vect[0][1]-lf->vect[3][1]) )) + ) + ) + ); + if(symfront || symend) { + /* mirror the symmetric neighbour subfrag */ + if(symfront) { + a1 = (ge->ix3 != ge->bkwd->ix3); /* the symmetry axis */ + a2 = !a1; /* the other axis (goes along the extremum gentry) */ + + /* the symmetry point on a2 */ + sympt = fscale * 0.5 * (ge->ipoints[a2][2] + ge->bkwd->ipoints[a2][2]); + xf = pf; /* the symmetric fragment */ + } else { + a1 = (gel->ix3 != gel->bkwd->ix3); /* the symmetry axis */ + a2 = !a1; /* the other axis (goes along the extremum gentry) */ + + /* the symmetry point on a2 */ + sympt = fscale * 0.5 * (gel->ipoints[a2][2] + gel->bkwd->ipoints[a2][2]); + xf = lf; /* the symmetric fragment */ + } + fprintf(stderr, " sym with %p f=%d(%p) e=%d(%p) a1=%c a2=%c sympt=%g\n", + xf, symfront, pf, symend, lf, + a1 ? 'Y': 'X', a2 ? 'Y': 'X', sympt + ); + for(i=0; i<4; i++) { + f->vect[3-i][a1] = xf->vect[i][a1]; + f->vect[3-i][a2] = sympt - (xf->vect[i][a2]-sympt); + } + if(symfront) { + if(outend || lf->sublen==0) + limcurve(f->vect, limend, 3); + } else { + if(outfront || pf == 0) + limcurve(f->vect, limfront, 0); + } + avg2 = fdotcurvdist2(f->vect, dots, ndots, &max2); + fprintf(stderr, " avg=%g max=%g fscale=%g\n", sqrt(avg2), sqrt(max2), fscale); + if(max2 <= fscale*fscale) { + f->flags |= (GEXFF_DONE | GEXFF_DRAWCURVE); + f->vectlen = f->sublen; + free(dots); + return; + } + } + + if( !outfront && !outend && f->symge != 0) { + /* a special case: try a circle segment as an approximation */ + double lenfront, lenend, len, maxlen; + + /* coefficient for a Bezier approximation of a circle */ +#define CIRCLE_FRAC 0.55 + + a1 = (ge->ix3 == ge->bkwd->ix3); /* get the axis along the front */ + a2 = !a1; /* axis along the end */ + + lenfront = fixfront[a1] - limfront[a1]; + lenend = fixend[a2] - limend[a2]; + if(fabs(lenfront) < fabs(lenend)) + len = fabs(lenfront); + else + len = fabs(lenend); + + /* make it go close to the round shape */ + switch(f->sublen) { + case 2: + maxlen = fscale; + break; + case 4: + case 6: + maxlen = fscale * 2.; + break; + default: + maxlen = fscale * abs(ge->frwd->frwd->ipoints[a1][2] + - ge->ipoints[a1][2]); + break; + } + if(len > maxlen) + len = maxlen; + + mvfront[a1] = fixfront[a1] - fsign(lenfront) * len; + mvfront[a2] = limfront[a2]; + mvend[a2] = fixend[a2] - fsign(lenend) * len; + mvend[a1] = limend[a1]; + + for(i=0; i<2; i++) { + f->vect[0][i] = mvfront[i]; + f->vect[3][i] = mvend[i]; + } + f->vect[1][a1] = mvfront[a1] + CIRCLE_FRAC*(mvend[a1]-mvfront[a1]); + f->vect[1][a2] = mvfront[a2]; + f->vect[2][a1] = mvend[a1]; + f->vect[2][a2] = mvend[a2] + CIRCLE_FRAC*(mvfront[a2]-mvend[a2]); + + avg2 = fdotcurvdist2(f->vect, dots, ndots, &max2); + fprintf(stderr, " avg=%g max=%g fscale=%g\n", sqrt(avg2), sqrt(max2), fscale); + if(max2 <= fscale*fscale) { + f->flags |= (GEXFF_DONE | GEXFF_DRAWCURVE); + f->vectlen = f->sublen; + free(dots); + return; + } +#undef CIRCLE_FRAC + } + for(i=0; i<2; i++) { + f->vect[0][i] = limfront[i]; + f->vect[1][i] = fixfront[i]; + f->vect[2][i] = fixend[i]; + f->vect[3][i] = limend[i]; + } + usedots = dots; + if(outfront) { + usedots++; ndots--; + } + if(outend) + ndots--; + if( fcrossrayscv(f->vect, NULL, NULL) == 0) { + fprintf(stderr, "**** Internal error: rays must cross but don't at %p-%p\n", + ge, gel); + fprintf(stderr, " (%g, %g) (%g, %g) (%g, %g) (%g, %g)\n", + limfront[0], limfront[1], + fixfront[0], fixfront[1], + fixend[0], fixend[1], + limend[0], limend[1] + ); + dumppaths(g, NULL, NULL); + exit(1); + } else { + if(ndots != 0) + fapproxcurve(f->vect, usedots, ndots); + f->flags |= (GEXFF_DONE | GEXFF_DRAWCURVE); + f->vectlen = f->sublen; + } + free(dots); +} + +/* + * Subtract a list of gentries (covered by a fragment of higher + * priority) from the set of fragments of a given + * type. + * + * An example is subtraction of the long exact line fragments + * from the curve fragments which get overridden. + */ + +static void +frag_subtract( + GLYPH *g, + GENTRY **age, /* array of gentries for this contour */ + int clen, /* length of the contour */ + GENTRY *ge, /* first gentry to be subtracted */ + int slen, /* number of gentries in the list to be subtracted */ + int d /* type of fragments from which to subtract, as in GEXFI_... */ +) +{ + GENTRY *pge; + GEX_FRAG *f, *pf; + int len, i, j; + + f = X_FRAG(ge); + len = slen; + + /* check if we overlap the end of some fragment */ + if(f->lenback[d]) { + /* chop off the end of conflicting fragment */ + len = f->lenback[d]; + pge = age[(f->aidx + clen - len)%clen]; + pf = X_FRAG(pge); + if(pf->len[d] == clen+1 && pf->flags & GEXFF_CIRC) { + /* the conflicting fragment is self-connected */ + + pf->len[d] = 0; + /* calculate the new value for lenback */ + len = clen+1 - slen; + for(pge = ge; len > 0; pge = pge->bkwd, len--) + X_FRAG(pge)->lenback[d] = len; + /* now pge points to the last entry of the line, + * which is also the new first entry of the curve + */ + X_FRAG(pge)->len[d] = clen+2 - slen; + /* clean lenback of gentries covered by the line */ + for(pge = ge->frwd, j = slen-1; j > 0; pge = pge->frwd, j--) + X_FRAG(pge)->lenback[d] = 0; + fprintf(stderr, " cut %s circular frag to %p-%p\n", + gxf_name[d], pge, ge); + gex_dump_contour(ge, clen); + } else { + /* when we chop off a piece of fragment, we leave the remaining + * piece(s) overlapping with the beginning and possibly the end + * of the line fragment under consideration + */ + fprintf(stderr, " cut %s frag at %p from len=%d to len=%d (end %p)\n", + gxf_name[d], pge, pf->len[d], len+1, ge); + j = pf->len[d] - len - 1; /* how many gentries are chopped off */ + pf->len[d] = len + 1; + i = slen - 1; + for(pge = ge->frwd; j > 0 && i > 0; j--, i--, pge = pge->frwd) + X_FRAG(pge)->lenback[d] = 0; + gex_dump_contour(ge, clen); + + if(j != 0) { + /* the conflicting fragment is split in two by this line + * fragment, fix up its tail + */ + + fprintf(stderr, " end of %s frag len=%d %p-", + gxf_name[d], j+1, pge->bkwd); + X_FRAG(pge->bkwd)->len[d] = j+1; /* the overlapping */ + for(i = 1; j > 0; j--, i++, pge = pge->frwd) + X_FRAG(pge)->lenback[d] = i; + fprintf(stderr, "%p\n", pge->bkwd); + gex_dump_contour(ge, clen); + } + } + } + /* check if we overlap the beginning of some fragments */ + i = slen-1; /* getntries remaining to consider */ + j = 0; /* gentries remaining in the overlapping fragment */ + for(pge = ge; i > 0; i--, pge = pge->frwd) { + if(j > 0) { + X_FRAG(pge)->lenback[d] = 0; + j--; + } + /* the beginning of one fragment may be the end of another + * fragment, in this case if j-- above results in 0, that will + * cause it to check the same gentry for the beginning + */ + if(j == 0) { + pf = X_FRAG(pge); + j = pf->len[d]; + if(j != 0) { + fprintf(stderr, " removed %s frag at %p len=%d\n", + gxf_name[d], pge, j); + gex_dump_contour(ge, clen); + pf->len[d] = 0; + j--; + } + } + } + /* pge points at the last gentry of the line fragment */ + if(j > 1) { /* we have the tail of a fragment left */ + fprintf(stderr, " end of %s frag len=%d %p-", + gxf_name[d], j, pge); + X_FRAG(pge)->len[d] = j; /* the overlapping */ + for(i = 0; j > 0; j--, i++, pge = pge->frwd) + X_FRAG(pge)->lenback[d] = i; + fprintf(stderr, "%p\n", pge->bkwd); + gex_dump_contour(ge, clen); + } else if(j == 1) { + X_FRAG(pge)->lenback[d] = 0; + } +} + +/* + * Produce an outline from a bitmap. + * scale - factor to scale the sizes + * bmap - array of dots by lines, xsz * ysz + * xoff, yoff - offset of the bitmap's lower left corner + * from the logical position (0,0) + */ + +void +bmp_outline( + GLYPH *g, + int scale, + char *bmap, + int xsz, + int ysz, + int xoff, + int yoff +) +{ + char *hlm, *vlm; /* arrays of the limits of outlines */ + char *amp; /* map of ambiguous points */ + int x, y; + char *ip, *op; + double fscale; + + if(xsz==0 || ysz==0) + return; + +#ifdef USE_AUTOTRACE + if(use_autotrace) { + autotraced_bmp_outline(g, scale, bmap, xsz, ysz, xoff, yoff); + return; + } +#endif /*USE_AUTOTRACE*/ + + fscale = (double)scale; + g->flags &= ~GF_FLOAT; /* build it as int first */ + + if(!warnedhints) { + warnedhints = 1; + if(hints && subhints) { + WARNING_2 fprintf(stderr, + "Use of hint substitution on bitmap fonts is not recommended\n"); + } + } + +#if 0 + printbmap(bmap, xsz, ysz, xoff, yoff); +#endif + + /* now find the outlines */ + hlm=calloc( xsz, ysz+1 ); /* horizontal limits */ + vlm=calloc( xsz+1, ysz ); /* vertical limits */ + amp=calloc( xsz, ysz ); /* ambiguous points */ + + if(hlm==0 || vlm==0 || amp==0) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + + /* + * hlm and vlm represent a grid of horisontal and + * vertical lines. Each pixel is surrounded by the grid + * from all the sides. The values of [hv]lm mark the + * parts of grid where the pixel value switches from white + * to black and back. + */ + + /* find the horizontal limits */ + ip=bmap; op=hlm; + /* 1st row */ + for(x=0; x0; y--) + for(x=xsz-1; x>0; x--) { + if(bmap[y*xsz+x]) { + if( !bmap[y*xsz+x-1] && !bmap[y*xsz-xsz+x] && bmap[y*xsz-xsz+x-1] ) + amp[y*xsz+x]=1; + } else { + if( bmap[y*xsz+x-1] && bmap[y*xsz-xsz+x] && !bmap[y*xsz-xsz+x-1] ) + amp[y*xsz+x]=1; + } + } + +#if 0 + printlimits(hlm, vlm, amp, xsz, ysz); +#endif + + /* generate the vectored (stepping) outline */ + + while(1) { + int found = 0; + int outer; /* flag: this is an outer contour */ + int hor, newhor; /* flag: the current contour direction is horizontal */ + int dir; /* previous direction of the coordinate, 1 - L_ON, 0 - L_OFF */ + int startx, starty; /* start of a contour */ + int firstx, firsty; /* start of the current line */ + int newx, newy; /* new coordinates to try */ + char *lm, val; + int maxx, maxy, xor; + + for(y=ysz; !found && y>0; y--) + for(x=0; x L_NONE) + goto foundcontour; + break; /* have no contours left */ + + foundcontour: + ig_rmoveto(g, x+xoff, y+yoff); /* intermediate as int */ + + startx = firstx = x; + starty = firsty = y; + + if(hlm[y*xsz+x] == L_OFF) { + outer = 1; dir = 0; + hlm[y*xsz+x] = -hlm[y*xsz+x]; /* mark as seen */ + hor = 1; x++; + } else { + outer = 0; dir = 0; + hor = 0; y--; + vlm[y*(xsz+1)+x] = -vlm[y*(xsz+1)+x]; /* mark as seen */ + } + + while(x!=startx || y!=starty) { +#if 0 + printf("trace (%d, %d) outer=%d hor=%d dir=%d\n", x, y, outer, hor, dir); +#endif + + /* initialization common for try1 and try2 */ + if(hor) { + lm = vlm; maxx = xsz+1; maxy = ysz; newhor = 0; + } else { + lm = hlm; maxx = xsz; maxy = ysz+1; newhor = 1; + } + xor = (outer ^ hor ^ dir); + + try1: + /* first we try to change axis, to keep the + * contour as long as possible + */ + + newx = x; newy = y; + if(!hor && (!outer ^ dir)) + newx--; + if(hor && (!outer ^ dir)) + newy--; + + if(newx < 0 || newx >= maxx || newy < 0 || newy >= maxy) + goto try2; + + if(!xor) + val = L_ON; + else + val = L_OFF; +#if 0 + printf("try 1, want %d have %d at %c(%d, %d)\n", val, lm[newy*maxx + newx], + (newhor ? 'h':'v'), newx, newy); +#endif + if( lm[newy*maxx + newx] == val ) + goto gotit; + + try2: + /* try to change the axis anyway */ + + newx = x; newy = y; + if(!hor && (outer ^ dir)) + newx--; + if(hor && (outer ^ dir)) + newy--; + + if(newx < 0 || newx >= maxx || newy < 0 || newy >= maxy) + goto try3; + + if(xor) + val = L_ON; + else + val = L_OFF; +#if 0 + printf("try 2, want %d have %d at %c(%d, %d)\n", val, lm[newy*maxx + newx], + (newhor ? 'h':'v'), newx, newy); +#endif + if( lm[newy*maxx + newx] == val ) + goto gotit; + + try3: + /* try to continue in the old direction */ + + if(hor) { + lm = hlm; maxx = xsz; maxy = ysz+1; + } else { + lm = vlm; maxx = xsz+1; maxy = ysz; + } + newhor = hor; + newx = x; newy = y; + if(hor && dir) + newx--; + if(!hor && !dir) + newy--; + + if(newx < 0 || newx >= maxx || newy < 0 || newy >= maxy) + goto badtry; + + if(dir) + val = L_ON; + else + val = L_OFF; +#if 0 + printf("try 3, want %d have %d at %c(%d, %d)\n", val, lm[newy*maxx + newx], + (newhor ? 'h':'v'), newx, newy); +#endif + if( lm[newy*maxx + newx] == val ) + goto gotit; + + badtry: + fprintf(stderr, "**** Internal error in the contour detection code at (%d, %d)\n", x, y); + fprintf(stderr, "glyph='%s' outer=%d hor=%d dir=%d\n", g->name, outer, hor, dir); + fflush(stdout); + exit(1); + + gotit: + if(hor != newhor) { /* changed direction, end the previous line */ + ig_rlineto(g, x+xoff, y+yoff); /* intermediate as int */ + firstx = x; firsty = y; + } + lm[newy*maxx + newx] = -lm[newy*maxx + newx]; + hor = newhor; + dir = (val == L_ON); + if(newhor) + x -= (dir<<1)-1; + else + y += (dir<<1)-1; + } +#if 0 + printf("trace (%d, %d) outer=%d hor=%d dir=%d\n", x, y, outer, hor, dir); +#endif + ig_rlineto(g, x+xoff, y+yoff); /* intermediate as int */ + g_closepath(g); + } + + + /* try to vectorize the curves and sloped lines in the bitmap */ + if(vectorize) { + GENTRY *ge, *pge, *cge, *loopge; + int i; + int skip; + + dumppaths(g, NULL, NULL); + + /* allocate the extensions */ + for(cge=g->entries; cge!=0; cge=cge->next) { + cge->ext = calloc(1, sizeof(GEX_FRAG) ); + if(cge->ext == 0) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + } + + for(cge=g->entries; cge!=0; cge=cge->next) { + if(cge->type != GE_MOVE) + continue; + + /* we've found the beginning of a contour */ + { + int d, vert, count, stepmore, delaystop; + int vdir, hdir, fullvdir, fullhdir, len; + int dx, dy, lastdx, lastdy; + int k1, k2, reversal, smooth, good; + int line[2 /*H,V*/], maxlen[2 /*H,V*/], minlen[2 /*H,V*/]; + GENTRY **age; /* array of gentries in a contour */ + int clen; /* contour length, size of ths array */ + int i, j; + GEX_FRAG *f; + + /* we know that all the contours start at the top-left corner, + * so at most it might be before/after the last element of + * the last/first fragment + */ + + ge = cge->next; + pge = ge->bkwd; + if(ge->ix3 == pge->ix3) { /* a vertical line */ + /* we want to start always from a horizontal line because + * then we always start from top and that is quaranteed to be a + * fragment boundary, so move the start point of the contour + */ + pge->prev->next = pge->next; + pge->next->prev = pge->prev; + cge->next = pge; + pge->prev = cge; + pge->next = ge; + ge->prev = pge; + ge = pge; pge = ge->bkwd; + cge->ix3 = pge->ix3; cge->iy3 = pge->iy3; + } + + /* fill the array of gentries */ + clen = 1; + for(ge = cge->next->frwd; ge != cge->next; ge = ge->frwd) + clen++; + age = (GENTRY **)malloc(sizeof(*age) * clen); + ge = cge->next; + count = 0; + do { + age[count] = ge; + X_FRAG(ge)->aidx = count++; + + /* and by the way find the extremums */ + for(i=0; i<2; i++) { + if( isign(ge->frwd->ipoints[i][2] - ge->ipoints[i][2]) + * isign(ge->bkwd->bkwd->ipoints[i][2] - ge->bkwd->ipoints[i][2]) == 1) { + X_FRAG(ge)->flags |= GEXFF_EXTR; + fprintf(stderr, " %s extremum at %p\n", (i?"vert":"hor"), ge); + } + if(abs(ge->ipoints[i][2] - ge->bkwd->ipoints[i][2]) > 1) + X_FRAG(ge)->flags |= GEXFF_LONG; + } + + ge = ge->frwd; + } while(ge != cge->next); + + /* Find the serif fragments, looking as either of: + * -+ | + * | | + * +-+ +-+ + * | | + * +--... +--... + * with the thickness of serifs being 1 pixel. We make no + * difference between serifs on vertical and horizontal stems. + */ + + ge = cge->next; + do { + GENTRY *nge; + int pdx, pdy, ndx, ndy; + + /* two gentries of length 1 mean a potential serif */ + pge = ge->bkwd; + nge = ge->frwd; + + dx = nge->ix3 - pge->ix3; + dy = nge->iy3 - pge->iy3; + + if(abs(dx) != 1 || abs(dy) != 1) /* 2 small ones */ + continue; + + if( + (!(X_FRAG(ge)->flags & GEXFF_EXTR) + || !(X_FRAG(ge->bkwd)->flags & GEXFF_EXTR)) + && (!(X_FRAG(ge->frwd)->flags & GEXFF_EXTR) + || !(X_FRAG(ge->frwd->frwd)->flags & GEXFF_EXTR)) + ) + continue; /* either side must be a couple of extremums */ + + pdx = pge->ix3 - pge->bkwd->ix3; + pdy = pge->iy3 - pge->bkwd->iy3; + ndx = nge->frwd->ix3 - nge->ix3; + ndy = nge->frwd->iy3 - nge->iy3; + + if(pdx*dx + pdy*dy > 0 && ndx*dx + ndy*dy > 0) + continue; /* definitely not a serif but a round corner */ + + if(abs(pdx) + abs(pdy) == 1 || abs(ndx) + abs(ndy) == 1) + continue; + + /* we've found a serif including this and next gentry */ + X_FRAG(ge)->len[GEXFI_SERIF] = 2; + + } while( (ge = ge->frwd) != cge->next ); + + + /* Find the convex and concave fragments, defined as: + * convex (clockwise): dy/dx <= dy0/dx0, + * or a reversal: dy/dx == - dy0/dx0 && abs(dxthis) == 1 && dy/dx > 0 + * concave (counter-clockwise): dy/dx >= dy0/dx0, + * or a reversal: dy/dx == - dy0/dx0 && abs(dxthis) == 1 && dy/dx < 0 + * + * Where dx and dy are measured between the end of this gentry + * and the start of the previous one (dx0 and dy0 are the same + * thing calculated for the previous gentry and its previous one), + * dxthis is between the end and begginning of this gentry. + * + * A reversal is a situation when the curve changes its direction + * along the x axis, so it passes through a momentary vertical + * direction. + */ + for(d = GEXFI_CONVEX; d<= GEXFI_CONCAVE; d++) { + ge = cge->next; + pge = ge->bkwd; /* the beginning of the fragment */ + count = 1; + lastdx = pge->ix3 - pge->bkwd->bkwd->ix3; + lastdy = pge->iy3 - pge->bkwd->bkwd->iy3; + +#define CHKCURVCONN(ge, msg) do { \ + dx = (ge)->ix3 - (ge)->bkwd->bkwd->ix3; \ + dy = (ge)->iy3 - (ge)->bkwd->bkwd->iy3; \ + if(0 && msg) { \ + fprintf(stderr, " %p: dx=%d dy=%d dx0=%d dy0=%d ", \ + (ge), dx, dy, lastdx, lastdy); \ + } \ + k1 = X_FRAG(ge)->flags; \ + k2 = X_FRAG((ge)->bkwd)->flags; \ + if(0 && msg) { \ + fprintf(stderr, "fl=%c%c%c%c ", \ + (k1 & GEXFF_EXTR) ? 'X' : '-', \ + (k1 & GEXFF_LONG) ? 'L' : '-', \ + (k2 & GEXFF_EXTR) ? 'X' : '-', \ + (k2 & GEXFF_LONG) ? 'L' : '-' \ + ); \ + } \ + if( (k1 & GEXFF_EXTR) && (k2 & GEXFF_LONG) \ + || (k2 & GEXFF_EXTR) && (k1 & GEXFF_LONG) ) { \ + smooth = 0; \ + good = reversal = -1; /* for debugging */ \ + } else { \ + k1 = dy * lastdx; \ + k2 = lastdy * dx; \ + smooth = (abs(dx)==1 || abs(dy)==1); \ + good = (k1 - k2)*gxf_cvk[d] >= 0; \ + if(smooth && !good) { \ + reversal = (k1 == -k2 && abs((ge)->ix3 - (ge)->bkwd->ix3)==1 \ + && dy*dx*gxf_cvk[d] < 0); \ + } else \ + reversal = 0; \ + } \ + if(0 && msg) { \ + fprintf(stderr, "k1=%d k2=%d pge=%p count=%d %s good=%d rev=%d\n", \ + k1, k2, pge, count, gxf_name[d], good, reversal); \ + } \ + } while(0) + + do { + CHKCURVCONN(ge, 1); + + if(smooth && (good || reversal) ) + count++; + else { + /* can't continue */ +#if 0 + if(count >= 4) { /* worth remembering */ + fprintf(stderr, " %s frag %p-%p count=%d\n", gxf_name[d], pge, ge->bkwd, count); + } +#endif + X_FRAG(pge)->len[d] = count; + if(smooth) { + pge = ge->bkwd; + count = 2; + } else { + pge = ge; + count = 1; + } + } + lastdx = dx; lastdy = dy; + ge = ge->frwd; + } while(ge != cge->next); + + /* see if we can connect the last fragment to the first */ + CHKCURVCONN(ge, 1); + + if(smooth && (good || reversal) ) { + /* -1 to avoid ge->bkwd being counted twice */ + if( X_FRAG(ge->bkwd)->len[d] >= 2 ) + count += X_FRAG(ge->bkwd)->len[d] - 1; + else if(count == clen+1) { + /* we are joining a circular (closed) curve, check whether it + * can be joined at any point or whether it has a discontinuity + * at the point where we join it now + */ + lastdx = dx; lastdy = dy; + CHKCURVCONN(ge->frwd, 0); + + if(smooth && (good || reversal) ) { + /* yes, the curve is truly a circular one and can be + * joined at any point + */ + +#if 0 + fprintf(stderr, " found a circular joint point at %p\n", pge); +#endif + /* make sure that in a circular fragment we start from an extremum */ + while( ! (X_FRAG(pge)->flags & GEXFF_EXTR) ) + pge = pge->frwd; + X_FRAG(pge)->flags |= GEXFF_CIRC; + } + } +#if 0 + fprintf(stderr, " %s joined %p to %p count=%d bk_count=%d\n", gxf_name[d], pge, ge->bkwd, + count, X_FRAG(ge->bkwd)->len[d] ); +#endif + X_FRAG(ge->bkwd)->len[d] = 0; + } + X_FRAG(pge)->len[d] = count; +#if 0 + if(count >= 4) { /* worth remembering */ + fprintf(stderr, " %s last frag %p-%p count=%d\n", gxf_name[d], pge, ge->bkwd, count); + } +#endif +#undef CHKCURVCONN + + /* do postprocessing */ + ge = cge->next; + do { + f = X_FRAG(ge); + len = f->len[d]; +#if 0 + fprintf(stderr, " %p %s len=%d clen=%d\n", ge, gxf_name[d], len, clen); +#endif + if(len < 3) /* get rid of the fragments that are too short */ + f->len[d] = 0; + else if(len == 3) { + /* _ + * drop the |_| - shaped fragments, leave alone the _| - shaped + * (and even those only if not too short in pixels), + * those left alone are further filtered later + */ + k1 = (ge->ix3 == ge->bkwd->ix3); /* axis of the start */ + if(isign(ge->ipoints[k1][2] - ge->bkwd->ipoints[k1][2]) + != isign(ge->frwd->ipoints[k1][2] - ge->frwd->frwd->ipoints[k1][2]) + && abs(ge->frwd->frwd->ipoints[k1][2] - ge->bkwd->ipoints[k1][2]) > 2) { +#if 0 + fprintf(stderr, " %s frag %p count=%d good shape\n", + gxf_name[d], ge, count); +#endif + } else + f->len[d] = 0; + } else if(len == clen+1) + break; /* a closed fragment, nothing else interesting */ + else { /* only for open fragments */ + GENTRY *gem, *gex, *gei, *ges; + + ges = ge; /* the start entry */ + gem = age[(f->aidx + f->len[d])%clen]; /* entry past the end of the fragment */ + + gei = ge->frwd; + if( (ge->ix3 == ge->bkwd->ix3) /* vert */ + ^ (isign(ge->bkwd->ix3 - gei->ix3)==isign(ge->bkwd->iy3 - gei->iy3)) + ^ !(d == GEXFI_CONVEX) /* counter-clockwise */ ) { + +#if 0 + fprintf(stderr, " %p: %s potential spurious start\n", ge, gxf_name[d]); +#endif + /* the beginning may be a spurious entry */ + + gex = 0; /* the extremum closest to the beginning - to be found */ + for(gei = ge->frwd; gei != gem; gei = gei->frwd) { + if(X_FRAG(gei)->flags & GEXFF_EXTR) { + gex = gei; + break; + } + } + if(gex == 0) + gex = gem->bkwd; + + /* A special case: ignore the spurious ends on small curves that + * either enclose an 1-pixel-wide extremum or are 1-pixel deep. + * Any 5-or-less-pixel-long curve with extremum 2 steps away + * qualifies for that. + */ + + if(len <= 5 && gex == ge->frwd->frwd) { + good = 0; +#if 0 + fprintf(stderr, " E"); +#endif + } else { + good = 1; /* assume that ge is not spurious */ + + /* gei goes backwards, gex goes forwards from the extremum */ + gei = gex; + /* i is the symmetry axis, j is the other axis (X=0 Y=1) */ + i = (gex->ix3 != gex->bkwd->ix3); + j = !i; + for( ; gei!=ge && gex!=gem; gei=gei->bkwd, gex=gex->frwd) { + if( gei->bkwd->ipoints[i][2] != gex->ipoints[i][2] + || gei->bkwd->ipoints[j][2] - gei->ipoints[j][2] + != gex->bkwd->ipoints[j][2] - gex->ipoints[j][2] + ) { + good = 0; /* no symmetry - must be spurious */ +#if 0 + fprintf(stderr, " M(%p,%p)(%d %d,%d)(%d %d,%d)", + gei, gex, + i, gei->bkwd->ipoints[i][2], gex->ipoints[i][2], + j, gei->bkwd->ipoints[j][2] - gei->ipoints[j][2], + gex->bkwd->ipoints[j][2] - gex->ipoints[j][2] ); +#endif + break; + } + } + if(gex == gem) { /* oops, the other side is too short */ + good = 0; +#if 0 + fprintf(stderr, " X"); +#endif + } + if(good && gei == ge) { + if( isign(gei->bkwd->ipoints[j][2] - gei->ipoints[j][2]) + != isign(gex->bkwd->ipoints[j][2] - gex->ipoints[j][2]) ) { + good = 0; /* oops, goes into another direction */ +#if 0 + fprintf(stderr, " D"); +#endif + } + } + } + if(!good) { /* it is spurious, drop it */ +#if 0 + fprintf(stderr, " %p: %s spurious start\n", ge, gxf_name[d]); +#endif + f->len[d] = 0; + ges = ge->frwd; + len--; + X_FRAG(ges)->len[d] = len; + } + } + + gei = gem->bkwd->bkwd->bkwd; + if( (gem->ix3 != gem->bkwd->ix3) /* gem->bkwd is vert */ + ^ (isign(gem->bkwd->ix3 - gei->ix3)==isign(gem->bkwd->iy3 - gei->iy3)) + ^ (d == GEXFI_CONVEX) /* clockwise */ ) { + +#if 0 + fprintf(stderr, " %p: %s potential spurious end\n", gem->bkwd, gxf_name[d]); +#endif + /* the end may be a spurious entry */ + + gex = 0; /* the extremum closest to the end - to be found */ + for(gei = gem->bkwd->bkwd; gei != ges->bkwd; gei = gei->bkwd) { + if(X_FRAG(gei)->flags & GEXFF_EXTR) { + gex = gei; + break; + } + } + if(gex == 0) + gex = ges; + + good = 1; /* assume that gem->bkwd is not spurious */ + /* gei goes backwards, gex goes forwards from the extremum */ + gei = gex; + /* i is the symmetry axis, j is the other axis (X=0 Y=1) */ + i = (gex->ix3 != gex->bkwd->ix3); + j = !i; + for( ; gei!=ges->bkwd && gex!=gem->bkwd; gei=gei->bkwd, gex=gex->frwd) { + if( gei->bkwd->ipoints[i][2] != gex->ipoints[i][2] + || gei->bkwd->ipoints[j][2] - gei->ipoints[j][2] + != gex->bkwd->ipoints[j][2] - gex->ipoints[j][2] + ) { + good = 0; /* no symmetry - must be spurious */ +#if 0 + fprintf(stderr, " M(%p,%p)(%d %d,%d)(%d %d,%d)", + gei, gex, + i, gei->bkwd->ipoints[i][2], gex->ipoints[i][2], + j, gei->bkwd->ipoints[j][2] - gei->ipoints[j][2], + gex->bkwd->ipoints[j][2] - gex->ipoints[j][2] ); +#endif + break; + } + } + if(gei == ges->bkwd) { /* oops, the other side is too short */ + good = 0; +#if 0 + fprintf(stderr, " X"); +#endif + } + if(good && gex == gem->bkwd) { + if( isign(gei->bkwd->ipoints[j][2] - gei->ipoints[j][2]) + != isign(gex->bkwd->ipoints[j][2] - gex->ipoints[j][2]) ) { + good = 0; /* oops, goes into another direction */ +#if 0 + fprintf(stderr, " D"); +#endif + } + } + if(!good) { /* it is spurious, drop it */ +#if 0 + fprintf(stderr, " %p: %s spurious end\n", gem->bkwd, gxf_name[d]); +#endif + X_FRAG(ges)->len[d] = --len; + } + } + if(len < 4) { + X_FRAG(ges)->len[d] = 0; +#if 0 + fprintf(stderr, " %p: %s frag discarded, too small now\n", ge, gxf_name[d]); +#endif + } + if(ges != ge) { + if(ges == cge->next) + break; /* went around the loop */ + else { + ge = ges->frwd; /* don't look at this fragment twice */ + continue; + } + } + } + + ge = ge->frwd; + } while(ge != cge->next); + } + + /* Find the straight line fragments. + * Even though the lines are sloped, they are called + * "vertical" or "horizontal" according to their longer + * dimension. All the steps in the shother dimension must + * be 1 pixel long, all the steps in the longer dimension + * must be within the difference of 1 pixel. + */ + for(d = GEXFI_LINE; d<= GEXFI_EXACTLINE; d++) { + ge = cge->next; + pge = ge->bkwd; /* the beginning of the fragment */ + count = 1; + delaystop = 0; + do { + int h; + + stepmore = 0; + hdir = isign(ge->ix3 - ge->bkwd->ix3); + vdir = isign(ge->iy3 - ge->bkwd->iy3); + vert = (hdir == 0); + if(count==1) { + /* at this point pge==ge->bkwd */ + /* account for the previous gentry, which was !vert */ + if(!vert) { /* prev was vertical */ + maxlen[0] = minlen[0] = 0; + maxlen[1] = minlen[1] = abs(pge->iy3 - pge->bkwd->iy3); + line[0] = (maxlen[1] == 1); + line[1] = 1; + fullhdir = hdir; + fullvdir = isign(pge->iy3 - pge->bkwd->iy3); + } else { + maxlen[0] = minlen[0] = abs(pge->ix3 - pge->bkwd->ix3); + maxlen[1] = minlen[1] = 0; + line[0] = 1; + line[1] = (maxlen[0] == 1); + fullhdir = isign(pge->ix3 - pge->bkwd->ix3); + fullvdir = vdir; + } + } + h = line[0]; /* remember the prevalent direction */ +#if 0 + fprintf(stderr, " %p: v=%d(%d) h=%d(%d) vl(%d,%d,%d) hl=(%d,%d,%d) %s count=%d ", + ge, vdir, fullvdir, hdir, fullhdir, + line[1], minlen[1], maxlen[1], + line[0], minlen[0], maxlen[0], + gxf_name[d], count); +#endif + if(vert) { + if(vdir != fullvdir) + line[0] = line[1] = 0; + len = abs(ge->iy3 - ge->bkwd->iy3); + } else { + if(hdir != fullhdir) + line[0] = line[1] = 0; + len = abs(ge->ix3 - ge->bkwd->ix3); + } +#if 0 + fprintf(stderr, "len=%d\n", len); +#endif + if(len != 1) /* this is not a continuation in the short dimension */ + line[!vert] = 0; + + /* can it be a continuation in the long dimension ? */ + if( line[vert] ) { + if(maxlen[vert]==0) + maxlen[vert] = minlen[vert] = len; + else if(maxlen[vert]==minlen[vert]) { + if(d == GEXFI_EXACTLINE) { + if(len != maxlen[vert]) + line[vert] = 0; /* it can't */ + } else if(len < maxlen[vert]) { + if(len < minlen[vert]-1) + line[vert] = 0; /* it can't */ + else + minlen[vert] = len; + } else { + if(len > maxlen[vert]+1) + line[vert] = 0; /* it can't */ + else + maxlen[vert] = len; + } + } else if(len < minlen[vert] || len > maxlen[vert]) + line[vert] = 0; /* it can't */ + } + + if(line[0] == 0 && line[1] == 0) { +#if 0 + if(count >= 3) + fprintf(stderr, " %s frag %p-%p count=%d\n", gxf_name[d], pge, ge->bkwd, count); +#endif + X_FRAG(pge)->len[d] = count; + if(d == GEXFI_EXACTLINE && h) { + X_FRAG(pge)->flags |= GEXFF_HLINE; + } + if(count == 1) + pge = ge; + else { + stepmore = 1; /* may reconsider the 1st gentry */ + pge = ge = ge->bkwd; + count = 1; + } + } else + count++; + + ge = ge->frwd; + if(ge == cge->next && !stepmore) + delaystop = 1; /* consider the first gentry again */ + } while(stepmore || ge != cge->next ^ delaystop); + /* see if there is an unfinished line left */ + if(count != 1) { +#if 0 + if(count >= 3) + fprintf(stderr, " %s frag %p-%p count=%d\n", gxf_name[d], pge, ge->bkwd, count); +#endif + X_FRAG(ge->bkwd->bkwd)->len[d] = 0; + X_FRAG(pge)->len[d] = count; + } + } + + /* do postprocessing of the lines */ +#if 0 + fprintf(stderr, "Line postprocessing\n"); + gex_dump_contour(cge->next, clen); +#endif + + /* the non-exact line frags are related to exact line frags sort + * of like to individual gentries: two kinds of exact frags + * must be interleaved, with one kind having the size of 3 + * and the other kind having the size varying within +-2. + */ + + ge = cge->next; + do { + GEX_FRAG *pf, *lastf1, *lastf2; + int len1, len2, fraglen; + + f = X_FRAG(ge); + + fraglen = f->len[GEXFI_LINE]; + if(fraglen >= 4) { + + vert = 0; /* vert is a pseudo-directon */ + line[0] = line[1] = 1; + maxlen[0] = minlen[0] = maxlen[1] = minlen[1] = 0; + lastf2 = lastf1 = f; + len2 = len1 = 0; + for(pge = ge, i = 1; i < fraglen; i++, pge=pge->frwd) { + pf = X_FRAG(pge); + len = pf->len[GEXFI_EXACTLINE]; +#if 0 + fprintf(stderr, " pge=%p i=%d of %d ge=%p exLen=%d\n", pge, i, + f->len[GEXFI_LINE], ge, len); +#endif + len1++; len2++; + if(len==0) { + continue; + } + vert = !vert; /* alternate the pseudo-direction */ + if(len > 3) + line[!vert] = 0; + if(maxlen[vert] == 0) + maxlen[vert] = minlen[vert] = len; + else if(maxlen[vert]-2 >= len && minlen[vert]+2 <= len) { + if(len > maxlen[vert]) + maxlen[vert] = len; + else if(len < minlen[vert]) + minlen[vert] = len; + } else + line[vert] = 0; + if(line[0] == 0 && line[1] == 0) { +#if 0 + fprintf(stderr, " Line breaks at %p %c(%d, %d) %c(%d, %d) len=%d fl=%d l2=%d l1=%d\n", + pge, (!vert)?'*':' ', minlen[0], maxlen[0], + vert?'*':' ', minlen[1], maxlen[1], len, fraglen, len2, len1); +#endif + if(lastf2 != lastf1) { + lastf2->len[GEXFI_LINE] = len2-len1; + } + lastf1->len[GEXFI_LINE] = len1+1; + pf->len[GEXFI_LINE] = fraglen+1 - i; +#if 0 + gex_dump_contour(pge, clen); +#endif + + /* continue with the line */ + vert = 0; /* vert is a pseudo-directon */ + line[0] = line[1] = 1; + maxlen[0] = minlen[0] = maxlen[1] = minlen[1] = 0; + lastf2 = lastf1 = f; + len2 = len1 = 0; + } else { + lastf1 = pf; + len1 = 0; + } + } + } + + ge = ge->frwd; + } while(ge != cge->next); +#if 0 + fprintf(stderr, "Line postprocessing part 2\n"); + gex_dump_contour(cge->next, clen); +#endif + + ge = cge->next; + do { + f = X_FRAG(ge); + + if(f->len[GEXFI_LINE] >= 4) { + len = f->len[GEXFI_EXACTLINE]; + /* if a non-exact line covers precisely two exact lines, + * split it + */ + if(len > 0 && f->len[GEXFI_LINE] >= len+1) { + GEX_FRAG *pf; + pge = age[(f->aidx + len - 1)%clen]; /* last gentry of exact line */ + pf = X_FRAG(pge); + if(f->len[GEXFI_LINE] + 1 == len + pf->len[GEXFI_EXACTLINE]) { + f->len[GEXFI_LINE] = len; + f->flags |= GEXFF_SPLIT; + pf->len[GEXFI_LINE] = pf->len[GEXFI_EXACTLINE]; + pf->flags |= GEXFF_SPLIT; + } + } + } + + ge = ge->frwd; + } while(ge != cge->next); +#if 0 + fprintf(stderr, "Line postprocessing part 2a\n"); + gex_dump_contour(cge->next, clen); +#endif + ge = cge->next; + do { + f = X_FRAG(ge); + + /* too small lines are of no interest */ + if( (f->flags & GEXFF_SPLIT)==0 && f->len[GEXFI_LINE] < 4) + f->len[GEXFI_LINE] = 0; + + len = f->len[GEXFI_EXACTLINE]; + /* too small exact lines are of no interest */ + if(len < 3) /* exact lines may be shorter */ + f->len[GEXFI_EXACTLINE] = 0; + /* get rid of inexact additions to the end of the exact lines */ + else if(f->len[GEXFI_LINE] == len+1) + f->len[GEXFI_LINE] = len; + /* same at the beginning */ + else { + int diff = X_FRAG(ge->bkwd)->len[GEXFI_LINE] - len; + + if(diff == 1 || diff == 2) { + X_FRAG(ge->bkwd)->len[GEXFI_LINE] = 0; + f->len[GEXFI_LINE] = len; + } + } + + ge = ge->frwd; + } while(ge != cge->next); +#if 0 + fprintf(stderr, "Line postprocessing is completed\n"); + gex_dump_contour(cge->next, clen); +#endif + + gex_calc_lenback(cge->next, clen); /* prepare data */ + + /* resolve conflicts between lines and curves */ + + /* + * the short (3-gentry) curve frags must have one of the ends + * coinciding with another curve frag of the same type + */ + + for(d = GEXFI_CONVEX; d<= GEXFI_CONCAVE; d++) { + ge = cge->next; + do { + f = X_FRAG(ge); + + if(f->len[d] == 3) { + pge = age[(f->aidx + 2)%clen]; /* last gentry of this frag */ + if(f->lenback[d] == 0 && X_FRAG(pge)->len[d] == 0) { + fprintf(stderr, " discarded small %s at %p-%p\n", gxf_name[d], ge, pge); + f->len[d] = 0; + X_FRAG(ge->frwd)->lenback[d] = 0; + X_FRAG(ge->frwd->frwd)->lenback[d] = 0; + } + } + ge = ge->frwd; + } while(ge != cge->next); + } + + /* the serifs take priority over everything else */ + ge = cge->next; + do { + f = X_FRAG(ge); + + len = f->len[GEXFI_SERIF]; + if(len == 0) + continue; + + if(len != 2) { /* this is used in the code below */ + fprintf(stderr, "Internal error at %s line %d: serif frags len is %d\n", + __FILE__, __LINE__, len); + exit(1); + } + + for(d = 0; d < GEXFI_SERIF; d++) { + /* serifs may not have common ends with the other fragments, + * this is expressed as extending them by 1 gentry on each side + */ + frag_subtract(g, age, clen, ge->bkwd, len+2, d); + } + } while( (ge = ge->frwd) != cge->next); + + /* + * longer exact lines take priority over curves; shorter lines + * and inexact lines are resolved with convex/concave conflicts + */ + ge = cge->next; + do { + f = X_FRAG(ge); + + len = f->len[GEXFI_EXACTLINE]; + + if(len < 6) { /* line is short */ + ge = ge->frwd; + continue; + } + + fprintf(stderr, " line at %p len=%d\n", ge, f->len[GEXFI_EXACTLINE]); + for(d = GEXFI_CONVEX; d<= GEXFI_CONCAVE; d++) { + frag_subtract(g, age, clen, ge, len, d); + } + + ge = ge->frwd; + } while(ge != cge->next); + + /* + * The exact lines take priority over curves that coincide + * with them or extend by only one gentry on either side + * (but not both sides). By this time it applies only to the + * small exact lines. + * + * An interesting general case is when a curve matches more + * than one exact line going diamond-like. + */ + + ge = cge->next; + do { + int done, len2; + int sharpness; + GEX_FRAG *pf; + + f = X_FRAG(ge); + + /* "sharpness" shows how a group of exact line frags is connected: if the gentries + * of some of them overlap, the curve matching requirement is loosened: it may + * extend up to 1 gentry beyond each end of the group of exact line frags + * (sharpness=2); otherwise it may extend to only one end (sharpness=1) + */ + sharpness = 1; + + len = f->len[GEXFI_EXACTLINE]; + if(len >= 4) { + while(len < clen) { + done = 0; + pf = X_FRAG(ge->bkwd); + for(d = GEXFI_CONVEX; d<= GEXFI_CONCAVE; d++) { + if(f->len[d] == len || f->len[d] == len+1) { + + fprintf(stderr, " removed %s frag at %p len=%d linelen=%d\n", + gxf_name[d], ge, f->len[d], len); + pge = ge->frwd; + for(i = f->len[d]; i > 1; i--, pge = pge->frwd) + X_FRAG(pge)->lenback[d] = 0; + f->len[d] = 0; + gex_dump_contour(ge, clen); + done = 1; + } else if(pf->len[d] == len+1 || pf->len[d] == len+sharpness) { + fprintf(stderr, " removed %s frag at %p len=%d next linelen=%d\n", + gxf_name[d], ge->bkwd, pf->len[d], len); + pge = ge; + for(i = pf->len[d]; i > 1; i--, pge = pge->frwd) + X_FRAG(pge)->lenback[d] = 0; + pf->len[d] = 0; + gex_dump_contour(ge, clen); + done = 1; + } + } + if(done) + break; + + /* is there any chance to match a sequence of exect lines ? */ + if(f->len[GEXFI_CONVEX] < len && f->len[GEXFI_CONCAVE] < len + && pf->len[GEXFI_CONVEX] < len && pf->len[GEXFI_CONCAVE] < len) + break; + + done = 1; + /* check whether the line is connected to another exact line at an extremum */ + pge = age[(f->aidx + len - 1)%clen]; /* last gentry of exact line */ + len2 = X_FRAG(pge)->len[GEXFI_EXACTLINE]; + if(len2 > 0) { + if( len2 >= 4 && (X_FRAG(pge)->flags & GEXFF_EXTR) ) { + len += len2 - 1; + sharpness = 2; + done = 0; + } + } else { + /* see if the extremum is between two exact lines */ + pge = pge->frwd; + if(X_FRAG(pge)->flags & GEXFF_EXTR) { + pge = pge->frwd; + len2 = X_FRAG(pge)->len[GEXFI_EXACTLINE]; + if(len2 >= 4) { + len += len2 + 1; + done = 0; + } + } + } + if(done) + break; + } + } + + ge = ge->frwd; + } while(ge != cge->next); + + /* + * The lines may cover only whole curves (or otherwise empty space), + * so cut them where they overlap parts of the curves. If 2 or less + * gentries are left in the line, remove the line. + * If a line and a curve fully coincide, remove the line. Otherwise + * remove the curves that are completely covered by the lines. + */ + + ge = cge->next; + do { + f = X_FRAG(ge); + + reconsider_line: + len = f->len[GEXFI_LINE]; + + if(len == 0) { + ge = ge->frwd; + continue; + } + + if(f->len[GEXFI_CONVEX] >= len + || f->len[GEXFI_CONCAVE] >= len) { + line_completely_covered: + fprintf(stderr, " removed covered Line frag at %p len=%d\n", + ge, len); + f->len[GEXFI_LINE] = 0; + for(pge = ge->frwd; len > 1; len--, pge = pge->frwd) + X_FRAG(pge)->lenback[GEXFI_LINE] = 0; + gex_dump_contour(ge, clen); + ge = ge->frwd; + continue; + } + + k1 = 0; /* how much to cut at the front */ + for(d = GEXFI_CONVEX; d<= GEXFI_CONCAVE; d++) { + if(f->lenback[d]) { + pge = age[(f->aidx + clen - f->lenback[d])%clen]; + i = X_FRAG(pge)->len[d] - f->lenback[d] - 1; + if(i > k1) + k1 = i; + } + } + + k2 = 0; /* how much to cut at the end */ + pge = age[(f->aidx + len)%clen]; /* gentry after the end */ + for(d = GEXFI_CONVEX; d<= GEXFI_CONCAVE; d++) { + i = X_FRAG(pge)->lenback[d] - 1; + if(i > k2) + k2 = i; + } + + if(k1+k2 > 0 && k1+k2 >= len-3) { + fprintf(stderr, " k1=%d k2=%d\n", k1, k2); + goto line_completely_covered; + } + + + if(k2 != 0) { /* cut the end */ + len -= k2; + f->len[GEXFI_LINE] = len; + /* pge still points after the end */ + for(i = k2, pge = pge->bkwd; i > 0; i--, pge = pge->bkwd) + X_FRAG(pge)->lenback[GEXFI_LINE] = 0; + } + if(k1 != 0) { /* cut the beginning */ + len -= k1; + f->len[GEXFI_LINE] = 0; + for(i = 1, pge = ge->frwd; i < k1; i++, pge = pge->frwd) + X_FRAG(pge)->lenback[GEXFI_LINE] = 0; + X_FRAG(pge)->len[GEXFI_LINE] = len; + for(i = 0; i < len; i++, pge = pge->frwd) + X_FRAG(pge)->lenback[GEXFI_LINE] = i; + } + if(k1 != 0 || k2 != 0) { + fprintf(stderr, " cut Line frag at %p by (%d,%d) to len=%d\n", + ge, k1, k2, len); + gex_dump_contour(ge, clen); + + goto reconsider_line; /* the line may have to be cut again */ + } + pge = age[(f->aidx + k1)%clen]; /* new beginning */ + good = 1; /* flag: no need do do a debugging dump */ + for(i=1; ifrwd) + for(d = GEXFI_CONVEX; d<= GEXFI_CONCAVE; d++) { + if(X_FRAG(pge)->len[d]) { + fprintf(stderr, " removed %s frag at %p len=%d covered by line\n", + gxf_name[d], pge, X_FRAG(pge)->len[d], len); + good = 0; + } + X_FRAG(pge)->len[d] = 0; + } + pge = age[(f->aidx + k1 + 1)%clen]; /* next after new beginning */ + for(i=1; ifrwd) + for(d = GEXFI_CONVEX; d<= GEXFI_CONCAVE; d++) + X_FRAG(pge)->lenback[d] = 0; + if(!good) + gex_dump_contour(ge, clen); + + ge = ge->frwd; + } while(ge != cge->next); + + /* Resolve conflicts between curves */ + for(d = GEXFI_CONVEX; d<= GEXFI_CONCAVE; d++) { + dx = (GEXFI_CONVEX + GEXFI_CONCAVE) - d; /* the other type */ + ge = cge->next; + do { + GENTRY *sge; + + f = X_FRAG(ge); + len = f->len[d]; + if(len < 2) { + ge = ge->frwd; + continue; + } + sge = ge; /* the start of fragment */ + + i = f->len[dx]; + if(i != 0) { /* two curved frags starting here */ + /* should be i!=len because otherwise they would be + * covered by an exact line + */ + if(i > len) { + curve_completely_covered: + /* remove the convex frag */ + fprintf(stderr, " removed %s frag at %p len=%d covered by %s\n", + gxf_name[d], ge, len, gxf_name[dx]); + f->len[d] = 0; + for(pge = ge->frwd, j = 1; j < len; j++, pge = pge->frwd) + X_FRAG(pge)->lenback[d] = 0; + gex_dump_contour(ge, clen); + + ge = ge->frwd; /* the frag is gone, nothing more to do */ + continue; + } else { + /* remove the concave frag */ + fprintf(stderr, " removed %s frag at %p len=%d covered by %s\n", + gxf_name[dx], ge, i, gxf_name[d]); + f->len[dx] = 0; + for(pge = ge->frwd, j = 1; j < i; j++, pge = pge->frwd) + X_FRAG(pge)->lenback[dx] = 0; + gex_dump_contour(ge, clen); + } + } + + + k1 = X_FRAG(ge->frwd)->lenback[dx]; + if(k1 != 0) { /* conflict at the front */ + GENTRY *gels, *gele, *gei; + + pge = age[(f->aidx + clen - (k1-1))%clen]; /* first gentry of concave frag */ + k2 = X_FRAG(pge)->len[dx]; /* its length */ + + i = k2 - (k1-1); /* amount of overlap */ + if(i > len) + i = len; + /* i >= 2 by definition */ + if(i >= k2-1) { /* covers the other frag - maybe with 1 gentry showing */ + fprintf(stderr, " removed %s frag at %p len=%d covered by %s\n", + gxf_name[dx], pge, k2, gxf_name[d]); + X_FRAG(pge)->len[dx] = 0; + for(pge = pge->frwd, j = 1; j < k2; j++, pge = pge->frwd) + X_FRAG(pge)->lenback[dx] = 0; + if(i >= len-1) { /* covers our frag too - maybe with 1 gentry showing */ + /* our frag will be removed as well, prepare a line to replace it */ + gels = ge; + gele = age[(f->aidx + i - 1)%clen]; + fprintf(stderr, " new Line frag at %p-%p len=%d\n", gels, gele, i); + X_FRAG(gels)->len[GEXFI_LINE] = i; + for(gei = gels->frwd, j = 1; j < i; gei = gei->frwd, j++) + X_FRAG(gei)->lenback[GEXFI_LINE] = j; + } else { + gex_dump_contour(ge, clen); + ge = ge->frwd; + continue; + } + } + if(i >= len-1) /* covers our frag - maybe with 1 gentry showing */ + goto curve_completely_covered; + + /* XXX need to do something better for the case when a curve frag + * is actually nothing but an artifact of two other curves of + * the opposite type touching each other, like on the back of "3" + */ + + /* change the overlapping part to a line */ + gels = ge; + gele = age[(f->aidx + i - 1)%clen]; + /* give preference to local extremums */ + if(X_FRAG(gels)->flags & GEXFF_EXTR) { + gels = gels->frwd; + i--; + } + if(X_FRAG(gele)->flags & GEXFF_EXTR) { + gele = gele->bkwd; + i--; + } + if(gels->bkwd == gele) { + /* Oops the line became negative. Probably should + * never happen but I can't think of any formal reasoning + * leading to that, so check just in case. Restore + * the previous state. + */ + gels = gele; gele = gels->frwd; i = 2; + } + + j = X_FRAG(gels)->lenback[dx] + 1; /* new length */ + if(j != k2) { + X_FRAG(pge)->len[dx] = j; + fprintf(stderr, " cut %s frag at %p len=%d to %p len=%d end overlap with %s\n", + gxf_name[dx], pge, k2, gels, j, gxf_name[d]); + for(gei = gels->frwd; j < k2; gei = gei->frwd, j++) + X_FRAG(gei)->lenback[dx] = 0; + } + + if(gele != ge) { + sge = gele; + f->len[d] = 0; + fprintf(stderr, " cut %s frag at %p len=%d ", gxf_name[d], ge, len); + len--; + for(gei = ge->frwd; gei != gele; gei = gei->frwd, len--) + X_FRAG(gei)->lenback[d] = 0; + X_FRAG(gele)->len[d] = len; + X_FRAG(gele)->lenback[d] = 0; + fprintf(stderr, "to %p len=%d start overlap with %s\n", + sge, len, gxf_name[dx]); + for(gei = gei->frwd, j = 1; j < len; gei = gei->frwd, j++) + X_FRAG(gei)->lenback[d] = j; + + } + if(i > 1) { + fprintf(stderr, " new Line frag at %p-%p len=%d\n", gels, gele, i); + X_FRAG(gels)->len[GEXFI_LINE] = i; + for(gei = gels->frwd, j = 1; j < i; gei = gei->frwd, j++) + X_FRAG(gei)->lenback[GEXFI_LINE] = j; + } + gex_dump_contour(ge, clen); + } + + ge = ge->frwd; + } while(ge != cge->next); + } + + /* + * Assert that there are no conflicts any more and + * for each gentry find the fragment types that start + * and continue here. + */ + ge = cge->next; + do { + f = X_FRAG(ge); + dx = GEXFI_NONE; /* type that starts here */ + dy = GEXFI_NONE; /* type that goes through here */ + /* GEXFI_EXACTLINE and GEXFI_SERIF are auxiliary and don't + * generate any actual lines/curves in the result + */ + for(d = GEXFI_CONVEX; d<= GEXFI_LINE; d++) { + if(f->len[d]) { + if(dx >= 0) { + fprintf(stderr, "**** Internal error in vectorization\n"); + fprintf(stderr, "CONFLICT in %s at %p between %s and %s\n", + g->name, ge, gxf_name[dx], gxf_name[d]); + dumppaths(g, cge->next, cge->next->bkwd); + gex_dump_contour(ge, clen); + exit(1); + } + dx = d; + } + if(f->lenback[d]) { + if(dy >= 0) { + fprintf(stderr, "**** Internal error in vectorization\n"); + fprintf(stderr, "CONFLICT in %s at %p between %s and %s\n", + g->name, ge, gxf_name[dy], gxf_name[d]); + dumppaths(g, cge->next, cge->next->bkwd); + gex_dump_contour(ge, clen); + exit(1); + } + dy = d; + } + } + f->ixstart = dx; + f->ixcont = dy; + ge = ge->frwd; + } while(ge != cge->next); + + /* + * make sure that the contour does not start in the + * middle of a fragment + */ + ge = cge->next; /* old start of the contour */ + f = X_FRAG(ge); + if(f->ixstart == GEXFI_NONE && f->ixcont != GEXFI_NONE) { + /* oops, it's mid-fragment, move the start */ + GENTRY *xge; + + xge = ge->bkwd->next; /* entry following the contour */ + + /* find the first gentry of this frag */ + pge = age[(f->aidx + clen - f->lenback[f->ixcont])%clen]; + + ge->prev = ge->bkwd; + ge->bkwd->next = ge; + + cge->next = pge; + pge->prev = cge; + + pge->bkwd->next = xge; + if(xge) + xge->prev = pge->bkwd; + + cge->ix3 = pge->bkwd->ix3; cge->iy3 = pge->bkwd->iy3; + } + + /* vectorize each fragment separately + * make 2 passes: first handle the straight lines, then + * the curves to allow the curver to be connected smoothly + * to the straights + */ + ge = cge->next; + do { /* pass 1 */ + f = X_FRAG(ge); + switch(f->ixstart) { + case GEXFI_LINE: + len = f->len[GEXFI_LINE]; + pge = age[(f->aidx + len - 1)%clen]; /* last gentry */ + + if(ge->iy3 == ge->bkwd->iy3) { /* frag starts and ends horizontally */ + k1 = 1/*Y*/ ; /* across the direction of start */ + k2 = 0/*X*/ ; /* along the direction of start */ + } else { /* frag starts and ends vertically */ + k1 = 0/*X*/ ; /* across the direction of start */ + k2 = 1/*Y*/ ; /* along the direction of start */ + } + + if(len % 2) { + /* odd number of entries in the frag */ + double halfstep, halfend; + + f->vect[0][k1] = fscale * ge->ipoints[k1][2]; + f->vect[3][k1] = fscale * pge->ipoints[k1][2]; + + halfstep = (pge->ipoints[k2][2] - ge->bkwd->ipoints[k2][2]) + * 0.5 / ((len+1)/2); + if(f->ixcont != GEXFI_NONE) { + halfend = (ge->ipoints[k2][2] - ge->bkwd->ipoints[k2][2]) * 0.5; + if(fabs(halfstep) < fabs(halfend)) /* must be at least half gentry away */ + halfstep = halfend; + } + if(X_FRAG(pge)->ixstart != GEXFI_NONE) { + halfend = (pge->ipoints[k2][2] - pge->bkwd->ipoints[k2][2]) * 0.5; + if(fabs(halfstep) < fabs(halfend)) /* must be at least half gentry away */ + halfstep = halfend; + } + f->vect[0][k2] = fscale * (ge->bkwd->ipoints[k2][2] + halfstep); + f->vect[3][k2] = fscale * (pge->ipoints[k2][2] - halfstep); + } else { + /* even number of entries */ + double halfstep, halfend; + + f->vect[0][k1] = fscale * ge->ipoints[k1][2]; + halfstep = (pge->ipoints[k2][2] - ge->bkwd->ipoints[k2][2]) + * 0.5 / (len/2); + if(f->ixcont != GEXFI_NONE) { + halfend = (ge->ipoints[k2][2] - ge->bkwd->ipoints[k2][2]) * 0.5; + if(fabs(halfstep) < fabs(halfend)) /* must be at least half gentry away */ + halfstep = halfend; + } + f->vect[0][k2] = fscale * (ge->bkwd->ipoints[k2][2] + halfstep); + + halfstep = (pge->ipoints[k1][2] - ge->bkwd->ipoints[k1][2]) + * 0.5 / (len/2); + if(X_FRAG(pge)->ixstart != GEXFI_NONE) { + halfend = (pge->ipoints[k1][2] - pge->bkwd->ipoints[k1][2]) * 0.5; + if(fabs(halfstep) < fabs(halfend)) /* must be at least half gentry away */ + halfstep = halfend; + } + f->vect[3][k1] = fscale * (pge->ipoints[k1][2] - halfstep); + f->vect[3][k2] = fscale * pge->ipoints[k2][2]; + } + f->vectlen = len; + f->flags |= GEXFF_DRAWLINE; + break; + } + } while((ge = ge->frwd) != cge->next); + + ge = cge->next; + do { /* pass 2 */ + /* data for curves */ + GENTRY *firstge, *lastge, *gef, *gel, *gei, *gex; + GENTRY *ordhd; /* head of the order list */ + GENTRY **ordlast; + int nsub; /* number of subfrags */ + GEX_FRAG *ff, *lf, *xf; + + f = X_FRAG(ge); + switch(f->ixstart) { + case GEXFI_CONVEX: + case GEXFI_CONCAVE: + len = f->len[f->ixstart]; + firstge = ge; + lastge = age[(f->aidx + len - 1)%clen]; /* last gentry */ + + nsub = 0; + gex = firstge; + xf = X_FRAG(gex); + xf->prevsub = 0; + xf->sublen = 1; + xf->flags &= ~GEXFF_DONE; + for(gei = firstge->frwd; gei != lastge; gei = gei->frwd) { + xf->sublen++; + if(X_FRAG(gei)->flags & GEXFF_EXTR) { + xf->nextsub = gei; + for(i=0; i<2; i++) + xf->bbox[i] = abs(gei->ipoints[i][2] - gex->bkwd->ipoints[i][2]); + nsub++; + xf = X_FRAG(gei); + xf->prevsub = gex; + xf->sublen = 1; + xf->flags &= ~GEXFF_DONE; + gex = gei; + } + } + xf->sublen++; + xf->nextsub = gei; + for(i=0; i<2; i++) + xf->bbox[i] = abs(gei->ipoints[i][2] - gex->bkwd->ipoints[i][2]); + nsub++; + ff = xf; /* remember the beginning of the last subfrag */ + xf = X_FRAG(gei); + xf->prevsub = gex; + if(firstge != lastge) { + xf->nextsub = 0; + xf->sublen = 0; + + /* correct the bounding box of the last and first subfrags for + * intersections with other fragments + */ + if(xf->ixstart != GEXFI_NONE) { + /* ff points to the beginning of the last subfrag */ + for(i=0; i<2; i++) + ff->bbox[i] -= 0.5 * abs(lastge->ipoints[i][2] - lastge->bkwd->ipoints[i][2]); + } + ff = X_FRAG(firstge); + if(ff->ixcont != GEXFI_NONE) { + for(i=0; i<2; i++) + ff->bbox[i] -= 0.5 * abs(firstge->ipoints[i][2] - firstge->bkwd->ipoints[i][2]); + } + } + + fprintf(stderr, " %s frag %p%s nsub=%d\n", gxf_name[f->ixstart], + ge, (f->flags&GEXFF_CIRC)?" circular":"", nsub); + + /* find the symmetry between the subfragments */ + for(gef = firstge, count=0; count < nsub; gef = ff->nextsub, count++) { + ff = X_FRAG(gef); + gex = ff->nextsub; + xf = X_FRAG(gex); + gel = xf->nextsub; + if(gel == 0) { + ff->flags &= ~GEXFF_SYMNEXT; + break; /* not a circular frag */ + } + good = 1; /* assume that we have symmetry */ + /* gei goes backwards, gex goes forwards from the extremum */ + gei = gex; + /* i is the symmetry axis, j is the other axis (X=0 Y=1) */ + ff->symaxis = i = (gex->ix3 != gex->bkwd->ix3); + j = !i; + for( ; gei!=gef && gex!=gel; gei=gei->bkwd, gex=gex->frwd) { + if( gei->bkwd->ipoints[i][2] != gex->ipoints[i][2] + || gei->bkwd->ipoints[j][2] - gei->ipoints[j][2] + != gex->bkwd->ipoints[j][2] - gex->ipoints[j][2] + ) { + good = 0; /* no symmetry */ + break; + } + } + if(good) { + if( isign(gei->bkwd->ipoints[j][2] - gei->ipoints[j][2]) + != isign(gex->bkwd->ipoints[j][2] - gex->ipoints[j][2]) ) { + good = 0; /* oops, goes into another direction */ + } + } + if(good) + ff->flags |= GEXFF_SYMNEXT; + else + ff->flags &= ~GEXFF_SYMNEXT; + } + + for(gef = firstge, count=0; count < nsub; gef = ff->nextsub, count++) { + ff = X_FRAG(gef); + if((ff->flags & GEXFF_SYMNEXT)==0) { + ff->symxlen = 0; + continue; + } + gex = ff->prevsub; + if(gex == 0 || (X_FRAG(gex)->flags & GEXFF_SYMNEXT)==0) { + ff->symxlen = 0; + continue; + } + ff->symxlen = X_FRAG(gex)->sublen; + xf = X_FRAG(ff->nextsub); + if(xf->sublen < ff->symxlen) + ff->symxlen = xf->sublen; + } + + /* find the symmetry inside the subfragments */ + for(gef = firstge, count=0; count < nsub; gef = ff->nextsub, count++) { + ff = X_FRAG(gef); + + if(ff->sublen % 2) { + /* we must have an even number of gentries for diagonal symmetry */ + ff->symge = 0; + continue; + } + + /* gei goes forwards from the front */ + gei = gef->frwd; + /* gex goes backwards from the back */ + gex = ff->nextsub->bkwd; + + /* i is the direction of gei, j is the direction of gex */ + i = (gei->iy3 != gei->bkwd->iy3); + j = !i; + for( ; gei->bkwd != gex; gei=gei->frwd, gex=gex->bkwd) { + if( abs(gei->bkwd->ipoints[i][2] - gei->ipoints[i][2]) + != abs(gex->bkwd->ipoints[j][2] - gex->ipoints[j][2]) ) + break; /* no symmetry */ + i = j; + j = !j; + } + if(gei->bkwd == gex) + ff->symge = gex; + else + ff->symge = 0; /* no symmetry */ + } + + /* find the order of calculation: + * prefer to start from long fragments that have the longest + * neighbours symmetric with them, with all being equal prefer + * the fragments that have smaller physical size + */ + ordhd = 0; + for(gef = firstge, count=0; count < nsub; gef = ff->nextsub, count++) { + ff = X_FRAG(gef); + + for(ordlast = &ordhd; *ordlast != 0; ordlast = &xf->ordersub) { + xf = X_FRAG(*ordlast); + if(ff->sublen > xf->sublen) + break; + if(ff->sublen < xf->sublen) + continue; + if(ff->symxlen > xf->symxlen) + break; + if(ff->symxlen < xf->symxlen) + continue; + if(ff->bbox[0] < xf->bbox[0] || ff->bbox[1] < xf->bbox[1]) + break; + } + + ff->ordersub = *ordlast; + *ordlast = gef; + } + + /* vectorize the subfragments */ + for(gef = ordhd; gef != 0; gef = ff->ordersub) { + + /* debugging stuff */ + ff = X_FRAG(gef); + fprintf(stderr, " %p-%p bbox[%g,%g] sym=%p %s len=%d xlen=%d\n", + gef, ff->nextsub, ff->bbox[0], ff->bbox[1], ff->symge, + (ff->flags & GEXFF_SYMNEXT) ? "symnext" : "", + ff->sublen, ff->symxlen); + + dosubfrag(g, f->ixstart, firstge, gef, fscale); + } + + break; + } + } while((ge = ge->frwd) != cge->next); + + free(age); + + } + + } + + /* all the fragments are found, extract the vectorization */ + pge = g->entries; + g->entries = g->lastentry = 0; + g->flags |= GF_FLOAT; + loopge = 0; + skip = 0; + + for(ge = pge; ge != 0; ge = ge->next) { + GEX_FRAG *f, *pf; + + switch(ge->type) { + case GE_LINE: + f = X_FRAG(ge); + if(skip == 0) { + if(f->flags & (GEXFF_DRAWLINE|GEXFF_DRAWCURVE)) { + /* draw a line to the start point */ + fg_rlineto(g, f->vect[0][0], f->vect[0][1]); + /* draw the fragment */ + if(f->flags & GEXFF_DRAWCURVE) + fg_rrcurveto(g, + f->vect[1][0], f->vect[1][1], + f->vect[2][0], f->vect[2][1], + f->vect[3][0], f->vect[3][1]); + else + fg_rlineto(g, f->vect[3][0], f->vect[3][1]); + skip = f->vectlen - 2; + } else { + fg_rlineto(g, fscale * ge->ix3, fscale * ge->iy3); + } + } else + skip--; + break; + case GE_MOVE: + fg_rmoveto(g, -1e6, -1e6); /* will be fixed by GE_PATH */ + skip = 0; + /* remember the reference to update it later */ + loopge = g->lastentry; + break; + case GE_PATH: + /* update the first MOVE of this contour */ + if(loopge) { + loopge->fx3 = g->lastentry->fx3; + loopge->fy3 = g->lastentry->fy3; + loopge = 0; + } + g_closepath(g); + break; + } + } + for(ge = pge; ge != 0; ge = cge) { + cge = ge->next; + free(ge->ext); + free(ge); + } + dumppaths(g, NULL, NULL); + + /* end of vectorization logic */ + } else { + /* convert the data to float */ + GENTRY *ge; + double x, y; + + for(ge = g->entries; ge != 0; ge = ge->next) { + ge->flags |= GEF_FLOAT; + if(ge->type != GE_MOVE && ge->type != GE_LINE) + continue; + + x = fscale * ge->ix3; + y = fscale * ge->iy3; + + ge->fx3 = x; + ge->fy3 = y; + } + g->flags |= GF_FLOAT; + } + + free(hlm); free(vlm); free(amp); +} + +#if 0 +/* print out the bitmap */ +printbmap(bmap, xsz, ysz, xoff, yoff) + char *bmap; + int xsz, ysz, xoff, yoff; +{ + int x, y; + + for(y=ysz-1; y>=0; y--) { + putchar( (y%10==0) ? y/10+'0' : ' ' ); + putchar( y%10+'0' ); + for(x=0; x=0; y--) { + for(x=0; x> 8))) +#define ntohl(x) \ + ((ULONG)((((ULONG)(x) & 0x000000ffU) << 24) | \ + (((ULONG)(x) & 0x0000ff00U) << 8) | \ + (((ULONG)(x) & 0x00ff0000U) >> 8) | \ + (((ULONG)(x) & 0xff000000U) >> 24))) +#endif diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/cygbuild.sh b/application/third_party/dompdf/lib/ttf2ufm/src/cygbuild.sh new file mode 100755 index 00000000..262c76d7 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/cygbuild.sh @@ -0,0 +1,8 @@ +: +# this file should be run from Cygnus BASH +# file to build ttf2pt1 with Cygnus GCC on Windows +# don't forget to copy CYGWIN1.DLL into C:\WINDOWS + +gcc -o ttf2pt1 -DWINDOWS ttf2pt1.c pt1.c t1asm.c ttf.c -lm +gcc -o t1asm -DWINDOWS -DSTANDALONE t1asm.c + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/README b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/README new file mode 100755 index 00000000..cdcf6e4e --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/README @@ -0,0 +1,47 @@ +Sergey A. Babkin + or +(Do not edit this file, it is generated from README.html!!!) + +The Translation Tables +---------------------- + +These translation tables are used to translate the Type 1 fonts between +different encodings of the same language. + +The file names are supposed to have the suffix .tbl. Each file +describes one encoding, and all the tables for a given language +are stored in the same directory. + +The file format is quite simple: just a sequence of rows in +format + + + +The names do not have to conform to any standard, just the same +glyph must have the same name in all the files for a given language. + +Not all the codes need to be described in the tables, the codes that +are not mentioned in the tables are left untranslated. So a file +of zero length may be used in case when no translation is neccessary. + +The translation changes only the encoding table of the font and does not +rename the glyphs in the font file. + +Examples +-------- + +The directory `russian' contains the tables for some encodings of the +Russian language: KOI-8, IBM CP-866, IBM CP-1251 and just for fun +ISO-8859/5 (nobody uses it anyways). The tables describe both russian +letters and table graphics characters (except for CP-1251 for which +the table graphics is not defined, so the table graphics portion for +it is just copied from KOI-8). + +The file for ISO-8859/1 is just a copy of file for KOI-8. It is neccessary +because Netscape has rather weird ideas about the documents in +KOI-8 encoding. The common way to fool Netscape is to set the KOI-8 +fonts for the ISO-8859/1 encoding and set the default encoding +in Netscape to 8859/1. + +The directory `latin1' contains an empty table for ISO-8859/1 +because it does not need any translation. diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/README.html b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/README.html new file mode 100755 index 00000000..9a7c40c7 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/README.html @@ -0,0 +1,81 @@ + + + +The INSTALLATION GUIDE + + + +Sergey A. Babkin +
+ +<babkin@bellatlantic.net> or <sab123@hotmail.com> +

+ + +

+The Translation Tables +

+ + +These translation tables are used to translate the Type 1 fonts between +different encodings of the same language. +

+ +The file names are supposed to have the suffix .tbl. Each file +describes one encoding, and all the tables for a given language +are stored in the same directory. +

+ +The file format is quite simple: just a sequence of rows in +format +

+ + +<name> <decimal code> + +

+ +The names do not have to conform to any standard, just the same +glyph must have the same name in all the files for a given language. +

+ +Not all the codes need to be described in the tables, the codes that +are not mentioned in the tables are left untranslated. So a file +of zero length may be used in case when no translation is neccessary. +

+ +The translation changes only the encoding table of the font and does not +rename the glyphs in the font file. +

+ +

+Examples +

+ + +The directory `russian' contains the tables for some encodings of the +Russian language: KOI-8, IBM CP-866, IBM CP-1251 and just for fun +ISO-8859/5 (nobody uses it anyways). The tables describe both russian +letters and table graphics characters (except for CP-1251 for which +the table graphics is not defined, so the table graphics portion for +it is just copied from KOI-8). +

+ +The file for ISO-8859/1 is just a copy of file for KOI-8. It is neccessary +because Netscape has rather weird ideas about the documents in +KOI-8 encoding. The common way to fool Netscape is to set the KOI-8 +fonts for the ISO-8859/1 encoding and set the default encoding +in Netscape to 8859/1. +

+ +The directory `latin1' contains an empty table for ISO-8859/1 +because it does not need any translation. +

+ + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/adobestd/adobe-std.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/adobestd/adobe-std.tbl new file mode 100755 index 00000000..e69de29b diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/README b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/README new file mode 100755 index 00000000..08f8ce36 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/README @@ -0,0 +1,3 @@ +These files are copies of thos provided for the language "cyrillic" +and are provided for compatibility purposes only, please +use the language "cyrillic" instead. diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/encodings.alias b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/encodings.alias new file mode 100755 index 00000000..e1f29063 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/encodings.alias @@ -0,0 +1,4 @@ +# alias real-name +iso8859-1 koi8-r +windows-1251 ibm-1251 +cp-866 ibm-866 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/ibm-1251.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/ibm-1251.tbl new file mode 100755 index 00000000..3fd17bd2 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/ibm-1251.tbl @@ -0,0 +1,127 @@ +cyr_DJE 128 +cyr_GJE 129 +quotesinglbase 130 +cyr_gje 131 +quotedblbase 132 +ellipsis 133 +dagger 134 +daggerdbl 135 +Euro 136 +perthousand 137 +cyr_LJE 138 +guilsinglleft 139 +cyr_NJE 140 +cyr_KJE 141 +cyr_TSHE 142 +cyr_DZHE 143 +cyr_dje 144 +quotesinglleft 145 +quotesinglright 146 +quotedblleft 147 +quotedblright 148 +bullet 149 +endash 150 +emdash 151 +trademark 153 +cyr_lje 154 +guilsinglright 155 +cyr_nje 156 +cyr_kje 157 +cyr_tshe 158 +cyr_dzhe 159 +nbspace 160 +cyr_SHORT_U 161 +cyr_short_u 162 +cyr_JE 163 +currency 164 +cyr_GHE_UPTURN 165 +brokenbar 166 +section 167 +cyr_IO 168 +copyright 169 +cyr_UKRAINIAN_IE 170 +guillemotleft 171 +notsign 172 +hyphen 173 +registered 174 +cyr_YI 175 +degree 176 +plusminus 177 +cyr_BYELORUSSIAN_UKRAINIAN_I 178 +cyr_byelorussian_ukrainian_i 179 +cyr_ghe_upturn 180 +mu 181 +paragraph 182 +periodcentered 183 +cyr_io 184 +numero 185 +cyr_ukrainian_ie 186 +guillemotright 187 +cyr_je 188 +cyr_DZE 189 +cyr_dze 190 +cyr_yi 191 +cyr_A 192 +cyr_BE 193 +cyr_VE 194 +cyr_GHE 195 +cyr_DE 196 +cyr_IE 197 +cyr_ZHE 198 +cyr_ZE 199 +cyr_I 200 +cyr_SHORT_I 201 +cyr_KA 202 +cyr_EL 203 +cyr_EM 204 +cyr_EN 205 +cyr_O 206 +cyr_PE 207 +cyr_ER 208 +cyr_ES 209 +cyr_TE 210 +cyr_U 211 +cyr_EF 212 +cyr_HA 213 +cyr_TSE 214 +cyr_CHE 215 +cyr_SHA 216 +cyr_SHCHA 217 +cyr_HARD_SIGN 218 +cyr_YERU 219 +cyr_SOFT_SIGN 220 +cyr_E 221 +cyr_YU 222 +cyr_YA 223 +cyr_a 224 +cyr_be 225 +cyr_ve 226 +cyr_ghe 227 +cyr_de 228 +cyr_ie 229 +cyr_zhe 230 +cyr_ze 231 +cyr_i 232 +cyr_short_i 233 +cyr_ka 234 +cyr_el 235 +cyr_em 236 +cyr_en 237 +cyr_o 238 +cyr_pe 239 +cyr_er 240 +cyr_es 241 +cyr_te 242 +cyr_u 243 +cyr_ef 244 +cyr_ha 245 +cyr_tse 246 +cyr_che 247 +cyr_sha 248 +cyr_shcha 249 +cyr_hard_sign 250 +cyr_yeru 251 +cyr_soft_sign 252 +cyr_e 253 +cyr_yu 254 +cyr_ya 255 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/ibm-866.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/ibm-866.tbl new file mode 100755 index 00000000..b0451ae9 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/ibm-866.tbl @@ -0,0 +1,128 @@ +cyr_A 128 +cyr_BE 129 +cyr_CHE 151 +cyr_DE 132 +cyr_E 157 +cyr_EF 148 +cyr_EL 139 +cyr_EM 140 +cyr_EN 141 +cyr_ER 144 +cyr_ES 145 +cyr_GHE 131 +cyr_HA 149 +cyr_HARD_SIGN 154 +cyr_I 136 +cyr_IE 133 +cyr_KA 138 +cyr_O 142 +cyr_PE 143 +cyr_SHA 152 +cyr_SHCHA 153 +cyr_SHORT_I 137 +cyr_SOFT_SIGN 156 +cyr_TE 146 +cyr_TSE 150 +cyr_U 147 +cyr_VE 130 +cyr_YA 159 +cyr_YERU 155 +cyr_IO 240 +cyr_YU 158 +cyr_ZE 135 +cyr_ZHE 134 +cyr_a 160 +cyr_be 161 +cyr_che 231 +cyr_de 164 +cyr_e 237 +cyr_ef 228 +cyr_el 171 +cyr_em 172 +cyr_en 173 +cyr_er 224 +cyr_es 225 +graphic_100pc 219 +graphic_25pc 178 +graphic_50pc 177 +graphic_75pc 176 +graphic_LD 187 +graphic_LR 205 +graphic_LRD 203 +graphic_LRT 202 +graphic_LRTD 206 +graphic_LRd 209 +graphic_LRt 207 +graphic_LRtd 216 +graphic_LT 188 +graphic_LTD 185 +graphic_Ld 184 +graphic_Lt 190 +graphic_Ltd 181 +graphic_RD 201 +graphic_RT 200 +graphic_RTD 204 +graphic_Rd 213 +graphic_Rt 212 +graphic_Rtd 198 +graphic_TD 186 +copyright 252 +degree 248 +graphic_dintegral 245 +graphic_divide 246 +graphic_equal 247 +graphic_fatdot 249 +graphic_ge 242 +graphic_lD 183 +graphic_lT 189 +graphic_lTD 182 +graphic_ld 191 +graphic_le 243 +graphic_leandot 250 +graphic_lefthalf 221 +graphic_lowerhalf 220 +graphic_lr 196 +graphic_lrD 210 +graphic_lrT 208 +graphic_lrTD 215 +graphic_lrd 194 +graphic_lrt 193 +graphic_lrtd 197 +graphic_lt 217 +graphic_ltd 180 +graphic_power2 253 +graphic_rD 214 +graphic_rT 211 +graphic_rTD 199 +graphic_rd 218 +graphic_righthalf 222 +graphic_root 251 +graphic_rt 192 +graphic_rtd 195 +nbspace 255 +graphic_square 254 +graphic_td 179 +graphic_tintegral 244 +graphic_upperhalf 223 +cyr_ghe 163 +cyr_ha 229 +cyr_hard_sign 234 +cyr_i 168 +cyr_ie 165 +cyr_ka 170 +cyr_o 174 +cyr_pe 175 +cyr_sha 232 +cyr_shcha 233 +cyr_short_i 169 +cyr_soft_sign 236 +cyr_te 226 +cyr_tse 230 +cyr_u 227 +cyr_ve 162 +cyr_ya 239 +cyr_yeru 235 +cyr_io 241 +cyr_yu 238 +cyr_ze 167 +cyr_zhe 166 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/iso8859-5.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/iso8859-5.tbl new file mode 100755 index 00000000..8e60e18f --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/iso8859-5.tbl @@ -0,0 +1,127 @@ +cyr_GHE_UPTURN 128 +cyr_ghe_upturn 129 +quotesinglbase 130 +currency 131 +quotedblbase 132 +ellipsis 133 +dagger 134 +daggerdbl 135 +Euro 136 +perthousand 137 +brokenbar 138 +guilsinglleft 139 +copyright 140 +guillemotleft 141 +notsign 142 +registered 143 +degree 144 +quotesinglleft 145 +quotesinglright 146 +quotedblleft 147 +quotedblright 148 +bullet 149 +endash 150 +emdash 151 +trademark 153 +plusminus 154 +guilsinglright 155 +mu 156 +paragraph 157 +periodcentered 158 +guillemotright 159 +nbspace 160 +cyr_IO 161 +cyr_DJE 162 +cyr_GJE 163 +cyr_UKRAINIAN_IE 164 +cyr_DZE 165 +cyr_BYELORUSSIAN_UKRAINIAN_I 166 +cyr_YI 167 +cyr_JE 168 +cyr_LJE 169 +cyr_NJE 170 +cyr_TSHE 171 +cyr_KJE 172 +hyphen 173 +cyr_SHORT_U 174 +cyr_DZHE 175 +cyr_A 176 +cyr_BE 177 +cyr_VE 178 +cyr_GHE 179 +cyr_DE 180 +cyr_IE 181 +cyr_ZHE 182 +cyr_ZE 183 +cyr_I 184 +cyr_SHORT_I 185 +cyr_KA 186 +cyr_EL 187 +cyr_EM 188 +cyr_EN 189 +cyr_O 190 +cyr_PE 191 +cyr_ER 192 +cyr_ES 193 +cyr_TE 194 +cyr_U 195 +cyr_EF 196 +cyr_HA 197 +cyr_TSE 198 +cyr_CHE 199 +cyr_SHA 200 +cyr_SHCHA 201 +cyr_HARD_SIGN 202 +cyr_YERU 203 +cyr_SOFT_SIGN 204 +cyr_E 205 +cyr_YU 206 +cyr_YA 207 +cyr_a 208 +cyr_be 209 +cyr_ve 210 +cyr_ghe 211 +cyr_de 212 +cyr_ie 213 +cyr_zhe 214 +cyr_ze 215 +cyr_i 216 +cyr_short_i 217 +cyr_ka 218 +cyr_el 219 +cyr_em 220 +cyr_en 221 +cyr_o 222 +cyr_pe 223 +cyr_er 224 +cyr_es 225 +cyr_te 226 +cyr_u 227 +cyr_ef 228 +cyr_ha 229 +cyr_tse 230 +cyr_che 231 +cyr_sha 232 +cyr_shcha 233 +cyr_hard_sign 234 +cyr_yeru 235 +cyr_soft_sign 236 +cyr_e 237 +cyr_yu 238 +cyr_ya 239 +numero 240 +cyr_io 241 +cyr_dje 242 +cyr_gje 243 +cyr_ukrainian_ie 244 +cyr_dze 245 +cyr_byelorussian_ukrainian_i 246 +cyr_yi 247 +cyr_je 248 +cyr_lje 249 +cyr_nje 250 +cyr_tshe 251 +cyr_kje 252 +section 253 +cyr_short_u 254 +cyr_dzhe 255 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/koi8-r.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/koi8-r.tbl new file mode 100755 index 00000000..e22775a2 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/bulgarian/koi8-r.tbl @@ -0,0 +1,128 @@ +cyr_A 225 +cyr_BE 226 +cyr_CHE 254 +cyr_DE 228 +cyr_E 252 +cyr_EF 230 +cyr_EL 236 +cyr_EM 237 +cyr_EN 238 +cyr_ER 242 +cyr_ES 243 +cyr_GHE 231 +cyr_HA 232 +cyr_HARD_SIGN 255 +cyr_I 233 +cyr_IE 229 +cyr_KA 235 +cyr_O 239 +cyr_PE 240 +cyr_SHA 251 +cyr_SHCHA 253 +cyr_SHORT_I 234 +cyr_SOFT_SIGN 248 +cyr_TE 244 +cyr_TSE 227 +cyr_U 245 +cyr_VE 247 +cyr_YA 241 +cyr_YERU 249 +cyr_IO 179 +cyr_YU 224 +cyr_ZE 250 +cyr_ZHE 246 +cyr_a 193 +cyr_be 194 +cyr_che 222 +cyr_de 196 +cyr_e 220 +cyr_ef 198 +cyr_el 204 +cyr_em 205 +cyr_en 206 +cyr_er 210 +cyr_es 211 +graphic_100pc 141 +graphic_25pc 144 +graphic_50pc 145 +graphic_75pc 146 +graphic_LD 168 +graphic_LR 160 +graphic_LRD 184 +graphic_LRT 187 +graphic_LRTD 190 +graphic_LRd 182 +graphic_LRt 185 +graphic_LRtd 188 +graphic_LT 174 +graphic_LTD 181 +graphic_Ld 166 +graphic_Lt 172 +graphic_Ltd 178 +graphic_RD 165 +graphic_RT 171 +graphic_RTD 177 +graphic_Rd 162 +graphic_Rt 170 +graphic_Rtd 175 +graphic_TD 161 +copyright 191 +degree 156 +graphic_dintegral 155 +graphic_divide 159 +graphic_equal 151 +graphic_fatdot 149 +graphic_ge 153 +graphic_lD 167 +graphic_lT 173 +graphic_lTD 180 +graphic_ld 131 +graphic_le 152 +graphic_leandot 158 +graphic_lefthalf 142 +graphic_lowerhalf 140 +graphic_lr 128 +graphic_lrD 183 +graphic_lrT 186 +graphic_lrTD 189 +graphic_lrd 136 +graphic_lrt 137 +graphic_lrtd 138 +graphic_lt 133 +graphic_ltd 135 +graphic_power2 157 +graphic_rD 164 +graphic_rT 169 +graphic_rTD 176 +graphic_rd 130 +graphic_righthalf 143 +graphic_root 150 +graphic_rt 132 +graphic_rtd 134 +nbspace 154 +graphic_square 148 +graphic_td 129 +graphic_tintegral 147 +graphic_upperhalf 139 +cyr_ghe 199 +cyr_ha 200 +cyr_hard_sign 223 +cyr_i 201 +cyr_ie 197 +cyr_ka 203 +cyr_o 207 +cyr_pe 208 +cyr_sha 219 +cyr_shcha 221 +cyr_short_i 202 +cyr_soft_sign 216 +cyr_te 212 +cyr_tse 195 +cyr_u 213 +cyr_ve 215 +cyr_ya 209 +cyr_yeru 217 +cyr_io 163 +cyr_yu 192 +cyr_ze 218 +cyr_zhe 214 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/encodings.alias b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/encodings.alias new file mode 100755 index 00000000..e1f29063 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/encodings.alias @@ -0,0 +1,4 @@ +# alias real-name +iso8859-1 koi8-r +windows-1251 ibm-1251 +cp-866 ibm-866 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/ibm-1251.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/ibm-1251.tbl new file mode 100755 index 00000000..3fd17bd2 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/ibm-1251.tbl @@ -0,0 +1,127 @@ +cyr_DJE 128 +cyr_GJE 129 +quotesinglbase 130 +cyr_gje 131 +quotedblbase 132 +ellipsis 133 +dagger 134 +daggerdbl 135 +Euro 136 +perthousand 137 +cyr_LJE 138 +guilsinglleft 139 +cyr_NJE 140 +cyr_KJE 141 +cyr_TSHE 142 +cyr_DZHE 143 +cyr_dje 144 +quotesinglleft 145 +quotesinglright 146 +quotedblleft 147 +quotedblright 148 +bullet 149 +endash 150 +emdash 151 +trademark 153 +cyr_lje 154 +guilsinglright 155 +cyr_nje 156 +cyr_kje 157 +cyr_tshe 158 +cyr_dzhe 159 +nbspace 160 +cyr_SHORT_U 161 +cyr_short_u 162 +cyr_JE 163 +currency 164 +cyr_GHE_UPTURN 165 +brokenbar 166 +section 167 +cyr_IO 168 +copyright 169 +cyr_UKRAINIAN_IE 170 +guillemotleft 171 +notsign 172 +hyphen 173 +registered 174 +cyr_YI 175 +degree 176 +plusminus 177 +cyr_BYELORUSSIAN_UKRAINIAN_I 178 +cyr_byelorussian_ukrainian_i 179 +cyr_ghe_upturn 180 +mu 181 +paragraph 182 +periodcentered 183 +cyr_io 184 +numero 185 +cyr_ukrainian_ie 186 +guillemotright 187 +cyr_je 188 +cyr_DZE 189 +cyr_dze 190 +cyr_yi 191 +cyr_A 192 +cyr_BE 193 +cyr_VE 194 +cyr_GHE 195 +cyr_DE 196 +cyr_IE 197 +cyr_ZHE 198 +cyr_ZE 199 +cyr_I 200 +cyr_SHORT_I 201 +cyr_KA 202 +cyr_EL 203 +cyr_EM 204 +cyr_EN 205 +cyr_O 206 +cyr_PE 207 +cyr_ER 208 +cyr_ES 209 +cyr_TE 210 +cyr_U 211 +cyr_EF 212 +cyr_HA 213 +cyr_TSE 214 +cyr_CHE 215 +cyr_SHA 216 +cyr_SHCHA 217 +cyr_HARD_SIGN 218 +cyr_YERU 219 +cyr_SOFT_SIGN 220 +cyr_E 221 +cyr_YU 222 +cyr_YA 223 +cyr_a 224 +cyr_be 225 +cyr_ve 226 +cyr_ghe 227 +cyr_de 228 +cyr_ie 229 +cyr_zhe 230 +cyr_ze 231 +cyr_i 232 +cyr_short_i 233 +cyr_ka 234 +cyr_el 235 +cyr_em 236 +cyr_en 237 +cyr_o 238 +cyr_pe 239 +cyr_er 240 +cyr_es 241 +cyr_te 242 +cyr_u 243 +cyr_ef 244 +cyr_ha 245 +cyr_tse 246 +cyr_che 247 +cyr_sha 248 +cyr_shcha 249 +cyr_hard_sign 250 +cyr_yeru 251 +cyr_soft_sign 252 +cyr_e 253 +cyr_yu 254 +cyr_ya 255 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/ibm-866.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/ibm-866.tbl new file mode 100755 index 00000000..b0451ae9 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/ibm-866.tbl @@ -0,0 +1,128 @@ +cyr_A 128 +cyr_BE 129 +cyr_CHE 151 +cyr_DE 132 +cyr_E 157 +cyr_EF 148 +cyr_EL 139 +cyr_EM 140 +cyr_EN 141 +cyr_ER 144 +cyr_ES 145 +cyr_GHE 131 +cyr_HA 149 +cyr_HARD_SIGN 154 +cyr_I 136 +cyr_IE 133 +cyr_KA 138 +cyr_O 142 +cyr_PE 143 +cyr_SHA 152 +cyr_SHCHA 153 +cyr_SHORT_I 137 +cyr_SOFT_SIGN 156 +cyr_TE 146 +cyr_TSE 150 +cyr_U 147 +cyr_VE 130 +cyr_YA 159 +cyr_YERU 155 +cyr_IO 240 +cyr_YU 158 +cyr_ZE 135 +cyr_ZHE 134 +cyr_a 160 +cyr_be 161 +cyr_che 231 +cyr_de 164 +cyr_e 237 +cyr_ef 228 +cyr_el 171 +cyr_em 172 +cyr_en 173 +cyr_er 224 +cyr_es 225 +graphic_100pc 219 +graphic_25pc 178 +graphic_50pc 177 +graphic_75pc 176 +graphic_LD 187 +graphic_LR 205 +graphic_LRD 203 +graphic_LRT 202 +graphic_LRTD 206 +graphic_LRd 209 +graphic_LRt 207 +graphic_LRtd 216 +graphic_LT 188 +graphic_LTD 185 +graphic_Ld 184 +graphic_Lt 190 +graphic_Ltd 181 +graphic_RD 201 +graphic_RT 200 +graphic_RTD 204 +graphic_Rd 213 +graphic_Rt 212 +graphic_Rtd 198 +graphic_TD 186 +copyright 252 +degree 248 +graphic_dintegral 245 +graphic_divide 246 +graphic_equal 247 +graphic_fatdot 249 +graphic_ge 242 +graphic_lD 183 +graphic_lT 189 +graphic_lTD 182 +graphic_ld 191 +graphic_le 243 +graphic_leandot 250 +graphic_lefthalf 221 +graphic_lowerhalf 220 +graphic_lr 196 +graphic_lrD 210 +graphic_lrT 208 +graphic_lrTD 215 +graphic_lrd 194 +graphic_lrt 193 +graphic_lrtd 197 +graphic_lt 217 +graphic_ltd 180 +graphic_power2 253 +graphic_rD 214 +graphic_rT 211 +graphic_rTD 199 +graphic_rd 218 +graphic_righthalf 222 +graphic_root 251 +graphic_rt 192 +graphic_rtd 195 +nbspace 255 +graphic_square 254 +graphic_td 179 +graphic_tintegral 244 +graphic_upperhalf 223 +cyr_ghe 163 +cyr_ha 229 +cyr_hard_sign 234 +cyr_i 168 +cyr_ie 165 +cyr_ka 170 +cyr_o 174 +cyr_pe 175 +cyr_sha 232 +cyr_shcha 233 +cyr_short_i 169 +cyr_soft_sign 236 +cyr_te 226 +cyr_tse 230 +cyr_u 227 +cyr_ve 162 +cyr_ya 239 +cyr_yeru 235 +cyr_io 241 +cyr_yu 238 +cyr_ze 167 +cyr_zhe 166 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/iso8859-5.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/iso8859-5.tbl new file mode 100755 index 00000000..8e60e18f --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/iso8859-5.tbl @@ -0,0 +1,127 @@ +cyr_GHE_UPTURN 128 +cyr_ghe_upturn 129 +quotesinglbase 130 +currency 131 +quotedblbase 132 +ellipsis 133 +dagger 134 +daggerdbl 135 +Euro 136 +perthousand 137 +brokenbar 138 +guilsinglleft 139 +copyright 140 +guillemotleft 141 +notsign 142 +registered 143 +degree 144 +quotesinglleft 145 +quotesinglright 146 +quotedblleft 147 +quotedblright 148 +bullet 149 +endash 150 +emdash 151 +trademark 153 +plusminus 154 +guilsinglright 155 +mu 156 +paragraph 157 +periodcentered 158 +guillemotright 159 +nbspace 160 +cyr_IO 161 +cyr_DJE 162 +cyr_GJE 163 +cyr_UKRAINIAN_IE 164 +cyr_DZE 165 +cyr_BYELORUSSIAN_UKRAINIAN_I 166 +cyr_YI 167 +cyr_JE 168 +cyr_LJE 169 +cyr_NJE 170 +cyr_TSHE 171 +cyr_KJE 172 +hyphen 173 +cyr_SHORT_U 174 +cyr_DZHE 175 +cyr_A 176 +cyr_BE 177 +cyr_VE 178 +cyr_GHE 179 +cyr_DE 180 +cyr_IE 181 +cyr_ZHE 182 +cyr_ZE 183 +cyr_I 184 +cyr_SHORT_I 185 +cyr_KA 186 +cyr_EL 187 +cyr_EM 188 +cyr_EN 189 +cyr_O 190 +cyr_PE 191 +cyr_ER 192 +cyr_ES 193 +cyr_TE 194 +cyr_U 195 +cyr_EF 196 +cyr_HA 197 +cyr_TSE 198 +cyr_CHE 199 +cyr_SHA 200 +cyr_SHCHA 201 +cyr_HARD_SIGN 202 +cyr_YERU 203 +cyr_SOFT_SIGN 204 +cyr_E 205 +cyr_YU 206 +cyr_YA 207 +cyr_a 208 +cyr_be 209 +cyr_ve 210 +cyr_ghe 211 +cyr_de 212 +cyr_ie 213 +cyr_zhe 214 +cyr_ze 215 +cyr_i 216 +cyr_short_i 217 +cyr_ka 218 +cyr_el 219 +cyr_em 220 +cyr_en 221 +cyr_o 222 +cyr_pe 223 +cyr_er 224 +cyr_es 225 +cyr_te 226 +cyr_u 227 +cyr_ef 228 +cyr_ha 229 +cyr_tse 230 +cyr_che 231 +cyr_sha 232 +cyr_shcha 233 +cyr_hard_sign 234 +cyr_yeru 235 +cyr_soft_sign 236 +cyr_e 237 +cyr_yu 238 +cyr_ya 239 +numero 240 +cyr_io 241 +cyr_dje 242 +cyr_gje 243 +cyr_ukrainian_ie 244 +cyr_dze 245 +cyr_byelorussian_ukrainian_i 246 +cyr_yi 247 +cyr_je 248 +cyr_lje 249 +cyr_nje 250 +cyr_tshe 251 +cyr_kje 252 +section 253 +cyr_short_u 254 +cyr_dzhe 255 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/koi8-r.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/koi8-r.tbl new file mode 100755 index 00000000..e22775a2 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/cyrillic/koi8-r.tbl @@ -0,0 +1,128 @@ +cyr_A 225 +cyr_BE 226 +cyr_CHE 254 +cyr_DE 228 +cyr_E 252 +cyr_EF 230 +cyr_EL 236 +cyr_EM 237 +cyr_EN 238 +cyr_ER 242 +cyr_ES 243 +cyr_GHE 231 +cyr_HA 232 +cyr_HARD_SIGN 255 +cyr_I 233 +cyr_IE 229 +cyr_KA 235 +cyr_O 239 +cyr_PE 240 +cyr_SHA 251 +cyr_SHCHA 253 +cyr_SHORT_I 234 +cyr_SOFT_SIGN 248 +cyr_TE 244 +cyr_TSE 227 +cyr_U 245 +cyr_VE 247 +cyr_YA 241 +cyr_YERU 249 +cyr_IO 179 +cyr_YU 224 +cyr_ZE 250 +cyr_ZHE 246 +cyr_a 193 +cyr_be 194 +cyr_che 222 +cyr_de 196 +cyr_e 220 +cyr_ef 198 +cyr_el 204 +cyr_em 205 +cyr_en 206 +cyr_er 210 +cyr_es 211 +graphic_100pc 141 +graphic_25pc 144 +graphic_50pc 145 +graphic_75pc 146 +graphic_LD 168 +graphic_LR 160 +graphic_LRD 184 +graphic_LRT 187 +graphic_LRTD 190 +graphic_LRd 182 +graphic_LRt 185 +graphic_LRtd 188 +graphic_LT 174 +graphic_LTD 181 +graphic_Ld 166 +graphic_Lt 172 +graphic_Ltd 178 +graphic_RD 165 +graphic_RT 171 +graphic_RTD 177 +graphic_Rd 162 +graphic_Rt 170 +graphic_Rtd 175 +graphic_TD 161 +copyright 191 +degree 156 +graphic_dintegral 155 +graphic_divide 159 +graphic_equal 151 +graphic_fatdot 149 +graphic_ge 153 +graphic_lD 167 +graphic_lT 173 +graphic_lTD 180 +graphic_ld 131 +graphic_le 152 +graphic_leandot 158 +graphic_lefthalf 142 +graphic_lowerhalf 140 +graphic_lr 128 +graphic_lrD 183 +graphic_lrT 186 +graphic_lrTD 189 +graphic_lrd 136 +graphic_lrt 137 +graphic_lrtd 138 +graphic_lt 133 +graphic_ltd 135 +graphic_power2 157 +graphic_rD 164 +graphic_rT 169 +graphic_rTD 176 +graphic_rd 130 +graphic_righthalf 143 +graphic_root 150 +graphic_rt 132 +graphic_rtd 134 +nbspace 154 +graphic_square 148 +graphic_td 129 +graphic_tintegral 147 +graphic_upperhalf 139 +cyr_ghe 199 +cyr_ha 200 +cyr_hard_sign 223 +cyr_i 201 +cyr_ie 197 +cyr_ka 203 +cyr_o 207 +cyr_pe 208 +cyr_sha 219 +cyr_shcha 221 +cyr_short_i 202 +cyr_soft_sign 216 +cyr_te 212 +cyr_tse 195 +cyr_u 213 +cyr_ve 215 +cyr_ya 209 +cyr_yeru 217 +cyr_io 163 +cyr_yu 192 +cyr_ze 218 +cyr_zhe 214 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin1/iso8859-1.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin1/iso8859-1.tbl new file mode 100755 index 00000000..e69de29b diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin2/iso8859-2.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin2/iso8859-2.tbl new file mode 100755 index 00000000..e69de29b diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin4/iso8859-4 b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin4/iso8859-4 new file mode 100755 index 00000000..e69de29b diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin4/iso8859-4.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin4/iso8859-4.tbl new file mode 100755 index 00000000..e69de29b diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin5/iso8859-9 b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/latin5/iso8859-9 new file mode 100755 index 00000000..e69de29b diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/README b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/README new file mode 100755 index 00000000..08f8ce36 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/README @@ -0,0 +1,3 @@ +These files are copies of thos provided for the language "cyrillic" +and are provided for compatibility purposes only, please +use the language "cyrillic" instead. diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/encodings.alias b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/encodings.alias new file mode 100755 index 00000000..e1f29063 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/encodings.alias @@ -0,0 +1,4 @@ +# alias real-name +iso8859-1 koi8-r +windows-1251 ibm-1251 +cp-866 ibm-866 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/ibm-1251.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/ibm-1251.tbl new file mode 100755 index 00000000..3fd17bd2 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/ibm-1251.tbl @@ -0,0 +1,127 @@ +cyr_DJE 128 +cyr_GJE 129 +quotesinglbase 130 +cyr_gje 131 +quotedblbase 132 +ellipsis 133 +dagger 134 +daggerdbl 135 +Euro 136 +perthousand 137 +cyr_LJE 138 +guilsinglleft 139 +cyr_NJE 140 +cyr_KJE 141 +cyr_TSHE 142 +cyr_DZHE 143 +cyr_dje 144 +quotesinglleft 145 +quotesinglright 146 +quotedblleft 147 +quotedblright 148 +bullet 149 +endash 150 +emdash 151 +trademark 153 +cyr_lje 154 +guilsinglright 155 +cyr_nje 156 +cyr_kje 157 +cyr_tshe 158 +cyr_dzhe 159 +nbspace 160 +cyr_SHORT_U 161 +cyr_short_u 162 +cyr_JE 163 +currency 164 +cyr_GHE_UPTURN 165 +brokenbar 166 +section 167 +cyr_IO 168 +copyright 169 +cyr_UKRAINIAN_IE 170 +guillemotleft 171 +notsign 172 +hyphen 173 +registered 174 +cyr_YI 175 +degree 176 +plusminus 177 +cyr_BYELORUSSIAN_UKRAINIAN_I 178 +cyr_byelorussian_ukrainian_i 179 +cyr_ghe_upturn 180 +mu 181 +paragraph 182 +periodcentered 183 +cyr_io 184 +numero 185 +cyr_ukrainian_ie 186 +guillemotright 187 +cyr_je 188 +cyr_DZE 189 +cyr_dze 190 +cyr_yi 191 +cyr_A 192 +cyr_BE 193 +cyr_VE 194 +cyr_GHE 195 +cyr_DE 196 +cyr_IE 197 +cyr_ZHE 198 +cyr_ZE 199 +cyr_I 200 +cyr_SHORT_I 201 +cyr_KA 202 +cyr_EL 203 +cyr_EM 204 +cyr_EN 205 +cyr_O 206 +cyr_PE 207 +cyr_ER 208 +cyr_ES 209 +cyr_TE 210 +cyr_U 211 +cyr_EF 212 +cyr_HA 213 +cyr_TSE 214 +cyr_CHE 215 +cyr_SHA 216 +cyr_SHCHA 217 +cyr_HARD_SIGN 218 +cyr_YERU 219 +cyr_SOFT_SIGN 220 +cyr_E 221 +cyr_YU 222 +cyr_YA 223 +cyr_a 224 +cyr_be 225 +cyr_ve 226 +cyr_ghe 227 +cyr_de 228 +cyr_ie 229 +cyr_zhe 230 +cyr_ze 231 +cyr_i 232 +cyr_short_i 233 +cyr_ka 234 +cyr_el 235 +cyr_em 236 +cyr_en 237 +cyr_o 238 +cyr_pe 239 +cyr_er 240 +cyr_es 241 +cyr_te 242 +cyr_u 243 +cyr_ef 244 +cyr_ha 245 +cyr_tse 246 +cyr_che 247 +cyr_sha 248 +cyr_shcha 249 +cyr_hard_sign 250 +cyr_yeru 251 +cyr_soft_sign 252 +cyr_e 253 +cyr_yu 254 +cyr_ya 255 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/ibm-866.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/ibm-866.tbl new file mode 100755 index 00000000..b0451ae9 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/ibm-866.tbl @@ -0,0 +1,128 @@ +cyr_A 128 +cyr_BE 129 +cyr_CHE 151 +cyr_DE 132 +cyr_E 157 +cyr_EF 148 +cyr_EL 139 +cyr_EM 140 +cyr_EN 141 +cyr_ER 144 +cyr_ES 145 +cyr_GHE 131 +cyr_HA 149 +cyr_HARD_SIGN 154 +cyr_I 136 +cyr_IE 133 +cyr_KA 138 +cyr_O 142 +cyr_PE 143 +cyr_SHA 152 +cyr_SHCHA 153 +cyr_SHORT_I 137 +cyr_SOFT_SIGN 156 +cyr_TE 146 +cyr_TSE 150 +cyr_U 147 +cyr_VE 130 +cyr_YA 159 +cyr_YERU 155 +cyr_IO 240 +cyr_YU 158 +cyr_ZE 135 +cyr_ZHE 134 +cyr_a 160 +cyr_be 161 +cyr_che 231 +cyr_de 164 +cyr_e 237 +cyr_ef 228 +cyr_el 171 +cyr_em 172 +cyr_en 173 +cyr_er 224 +cyr_es 225 +graphic_100pc 219 +graphic_25pc 178 +graphic_50pc 177 +graphic_75pc 176 +graphic_LD 187 +graphic_LR 205 +graphic_LRD 203 +graphic_LRT 202 +graphic_LRTD 206 +graphic_LRd 209 +graphic_LRt 207 +graphic_LRtd 216 +graphic_LT 188 +graphic_LTD 185 +graphic_Ld 184 +graphic_Lt 190 +graphic_Ltd 181 +graphic_RD 201 +graphic_RT 200 +graphic_RTD 204 +graphic_Rd 213 +graphic_Rt 212 +graphic_Rtd 198 +graphic_TD 186 +copyright 252 +degree 248 +graphic_dintegral 245 +graphic_divide 246 +graphic_equal 247 +graphic_fatdot 249 +graphic_ge 242 +graphic_lD 183 +graphic_lT 189 +graphic_lTD 182 +graphic_ld 191 +graphic_le 243 +graphic_leandot 250 +graphic_lefthalf 221 +graphic_lowerhalf 220 +graphic_lr 196 +graphic_lrD 210 +graphic_lrT 208 +graphic_lrTD 215 +graphic_lrd 194 +graphic_lrt 193 +graphic_lrtd 197 +graphic_lt 217 +graphic_ltd 180 +graphic_power2 253 +graphic_rD 214 +graphic_rT 211 +graphic_rTD 199 +graphic_rd 218 +graphic_righthalf 222 +graphic_root 251 +graphic_rt 192 +graphic_rtd 195 +nbspace 255 +graphic_square 254 +graphic_td 179 +graphic_tintegral 244 +graphic_upperhalf 223 +cyr_ghe 163 +cyr_ha 229 +cyr_hard_sign 234 +cyr_i 168 +cyr_ie 165 +cyr_ka 170 +cyr_o 174 +cyr_pe 175 +cyr_sha 232 +cyr_shcha 233 +cyr_short_i 169 +cyr_soft_sign 236 +cyr_te 226 +cyr_tse 230 +cyr_u 227 +cyr_ve 162 +cyr_ya 239 +cyr_yeru 235 +cyr_io 241 +cyr_yu 238 +cyr_ze 167 +cyr_zhe 166 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/iso8859-5.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/iso8859-5.tbl new file mode 100755 index 00000000..8e60e18f --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/iso8859-5.tbl @@ -0,0 +1,127 @@ +cyr_GHE_UPTURN 128 +cyr_ghe_upturn 129 +quotesinglbase 130 +currency 131 +quotedblbase 132 +ellipsis 133 +dagger 134 +daggerdbl 135 +Euro 136 +perthousand 137 +brokenbar 138 +guilsinglleft 139 +copyright 140 +guillemotleft 141 +notsign 142 +registered 143 +degree 144 +quotesinglleft 145 +quotesinglright 146 +quotedblleft 147 +quotedblright 148 +bullet 149 +endash 150 +emdash 151 +trademark 153 +plusminus 154 +guilsinglright 155 +mu 156 +paragraph 157 +periodcentered 158 +guillemotright 159 +nbspace 160 +cyr_IO 161 +cyr_DJE 162 +cyr_GJE 163 +cyr_UKRAINIAN_IE 164 +cyr_DZE 165 +cyr_BYELORUSSIAN_UKRAINIAN_I 166 +cyr_YI 167 +cyr_JE 168 +cyr_LJE 169 +cyr_NJE 170 +cyr_TSHE 171 +cyr_KJE 172 +hyphen 173 +cyr_SHORT_U 174 +cyr_DZHE 175 +cyr_A 176 +cyr_BE 177 +cyr_VE 178 +cyr_GHE 179 +cyr_DE 180 +cyr_IE 181 +cyr_ZHE 182 +cyr_ZE 183 +cyr_I 184 +cyr_SHORT_I 185 +cyr_KA 186 +cyr_EL 187 +cyr_EM 188 +cyr_EN 189 +cyr_O 190 +cyr_PE 191 +cyr_ER 192 +cyr_ES 193 +cyr_TE 194 +cyr_U 195 +cyr_EF 196 +cyr_HA 197 +cyr_TSE 198 +cyr_CHE 199 +cyr_SHA 200 +cyr_SHCHA 201 +cyr_HARD_SIGN 202 +cyr_YERU 203 +cyr_SOFT_SIGN 204 +cyr_E 205 +cyr_YU 206 +cyr_YA 207 +cyr_a 208 +cyr_be 209 +cyr_ve 210 +cyr_ghe 211 +cyr_de 212 +cyr_ie 213 +cyr_zhe 214 +cyr_ze 215 +cyr_i 216 +cyr_short_i 217 +cyr_ka 218 +cyr_el 219 +cyr_em 220 +cyr_en 221 +cyr_o 222 +cyr_pe 223 +cyr_er 224 +cyr_es 225 +cyr_te 226 +cyr_u 227 +cyr_ef 228 +cyr_ha 229 +cyr_tse 230 +cyr_che 231 +cyr_sha 232 +cyr_shcha 233 +cyr_hard_sign 234 +cyr_yeru 235 +cyr_soft_sign 236 +cyr_e 237 +cyr_yu 238 +cyr_ya 239 +numero 240 +cyr_io 241 +cyr_dje 242 +cyr_gje 243 +cyr_ukrainian_ie 244 +cyr_dze 245 +cyr_byelorussian_ukrainian_i 246 +cyr_yi 247 +cyr_je 248 +cyr_lje 249 +cyr_nje 250 +cyr_tshe 251 +cyr_kje 252 +section 253 +cyr_short_u 254 +cyr_dzhe 255 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/koi8-r.tbl b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/koi8-r.tbl new file mode 100755 index 00000000..e22775a2 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/encodings/russian/koi8-r.tbl @@ -0,0 +1,128 @@ +cyr_A 225 +cyr_BE 226 +cyr_CHE 254 +cyr_DE 228 +cyr_E 252 +cyr_EF 230 +cyr_EL 236 +cyr_EM 237 +cyr_EN 238 +cyr_ER 242 +cyr_ES 243 +cyr_GHE 231 +cyr_HA 232 +cyr_HARD_SIGN 255 +cyr_I 233 +cyr_IE 229 +cyr_KA 235 +cyr_O 239 +cyr_PE 240 +cyr_SHA 251 +cyr_SHCHA 253 +cyr_SHORT_I 234 +cyr_SOFT_SIGN 248 +cyr_TE 244 +cyr_TSE 227 +cyr_U 245 +cyr_VE 247 +cyr_YA 241 +cyr_YERU 249 +cyr_IO 179 +cyr_YU 224 +cyr_ZE 250 +cyr_ZHE 246 +cyr_a 193 +cyr_be 194 +cyr_che 222 +cyr_de 196 +cyr_e 220 +cyr_ef 198 +cyr_el 204 +cyr_em 205 +cyr_en 206 +cyr_er 210 +cyr_es 211 +graphic_100pc 141 +graphic_25pc 144 +graphic_50pc 145 +graphic_75pc 146 +graphic_LD 168 +graphic_LR 160 +graphic_LRD 184 +graphic_LRT 187 +graphic_LRTD 190 +graphic_LRd 182 +graphic_LRt 185 +graphic_LRtd 188 +graphic_LT 174 +graphic_LTD 181 +graphic_Ld 166 +graphic_Lt 172 +graphic_Ltd 178 +graphic_RD 165 +graphic_RT 171 +graphic_RTD 177 +graphic_Rd 162 +graphic_Rt 170 +graphic_Rtd 175 +graphic_TD 161 +copyright 191 +degree 156 +graphic_dintegral 155 +graphic_divide 159 +graphic_equal 151 +graphic_fatdot 149 +graphic_ge 153 +graphic_lD 167 +graphic_lT 173 +graphic_lTD 180 +graphic_ld 131 +graphic_le 152 +graphic_leandot 158 +graphic_lefthalf 142 +graphic_lowerhalf 140 +graphic_lr 128 +graphic_lrD 183 +graphic_lrT 186 +graphic_lrTD 189 +graphic_lrd 136 +graphic_lrt 137 +graphic_lrtd 138 +graphic_lt 133 +graphic_ltd 135 +graphic_power2 157 +graphic_rD 164 +graphic_rT 169 +graphic_rTD 176 +graphic_rd 130 +graphic_righthalf 143 +graphic_root 150 +graphic_rt 132 +graphic_rtd 134 +nbspace 154 +graphic_square 148 +graphic_td 129 +graphic_tintegral 147 +graphic_upperhalf 139 +cyr_ghe 199 +cyr_ha 200 +cyr_hard_sign 223 +cyr_i 201 +cyr_ie 197 +cyr_ka 203 +cyr_o 207 +cyr_pe 208 +cyr_sha 219 +cyr_shcha 221 +cyr_short_i 202 +cyr_soft_sign 216 +cyr_te 212 +cyr_tse 195 +cyr_u 213 +cyr_ve 215 +cyr_ya 209 +cyr_yeru 217 +cyr_io 163 +cyr_yu 192 +cyr_ze 218 +cyr_zhe 214 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/ft.c b/application/third_party/dompdf/lib/ttf2ufm/src/ft.c new file mode 100755 index 00000000..3bbcb896 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/ft.c @@ -0,0 +1,649 @@ +/* + * The font parser using the FreeType library version 2. + * + * see COPYRIGHT + * + */ + +#ifdef USE_FREETYPE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pt1.h" +#include "global.h" + +/* prototypes of call entries */ +static void openfont(char *fname, char *arg); +static void closefont( void); +static int getnglyphs ( void); +static int glnames( GLYPH *glyph_list); +static void glmetrics( GLYPH *glyph_list); +static int glenc( GLYPH *glyph_list, int *encoding, int *unimap); +static void fnmetrics( struct font_metrics *fm); +static void glpath( int glyphno, GLYPH *glyph_list); +static void kerning( GLYPH *glyph_list); + +/* globals */ + +/* front-end descriptor */ +struct frontsw freetype_sw = { + /*name*/ "ft", + /*descr*/ "based on the FreeType library", + /*suffix*/ { "ttf", "otf", "pfa", "pfb" }, + /*open*/ openfont, + /*close*/ closefont, + /*nglyphs*/ getnglyphs, + /*glnames*/ glnames, + /*glmetrics*/ glmetrics, + /*glenc*/ glenc, + /*fnmetrics*/ fnmetrics, + /*glpath*/ glpath, + /*kerning*/ kerning, +}; + +/* statics */ + +static FT_Library library; +static FT_Face face; + +static int enc_type, enc_found; + +/* SFNT functions do not seem to be included by default in FT2beta8 */ +#define ENABLE_SFNT + +/* + * Open font and prepare to return information to the main driver. + * May print error and warning messages. + * Exit on error. + */ + +static void +openfont( + char *fname, + char *arg /* unused now */ +) +{ + FT_Error error; + + if( FT_Init_FreeType( &library ) ) { + fprintf(stderr, "** FreeType initialization failed\n"); + exit(1); + } + + if( error = FT_New_Face( library, fname, 0, &face ) ) { + if ( error == FT_Err_Unknown_File_Format ) + fprintf(stderr, "**** %s has format unknown to FreeType\n", fname); + else + fprintf(stderr, "**** Cannot access %s ****\n", fname); + exit(1); + } + + if(FT_HAS_FIXED_SIZES(face)) { + WARNING_1 fprintf(stderr, "Font contains bitmaps\n"); + } + if(FT_HAS_MULTIPLE_MASTERS(face)) { + WARNING_1 fprintf(stderr, "Font contains multiple masters, using default\n"); + } + + if(ISDBG(FT)) fprintf(stderr," %d units per EM\n", face->units_per_EM); + + enc_found = 0; +} + +/* + * Close font. + * Exit on error. + */ + +static void +closefont( + void +) +{ + if( FT_Done_Face(face) ) { + WARNING_1 fprintf(stderr, "Errors when closing the font file, ignored\n"); + } + if( FT_Done_FreeType(library) ) { + WARNING_1 fprintf(stderr, "Errors when stopping FreeType, ignored\n"); + } +} + +/* + * Get the number of glyphs in font. + */ + +static int +getnglyphs ( + void +) +{ + if(ISDBG(FT)) fprintf(stderr, "%d glyphs in font\n", face->num_glyphs); + return (int)face->num_glyphs; +} + +/* + * Get the names of the glyphs. + * Returns 0 if the names were assigned, non-zero if the font + * provides no glyph names. + */ + +static int +glnames( + GLYPH *glyph_list +) +{ +#define MAX_NAMELEN 1024 + unsigned char bf[1024]; + int i; + + if( ! FT_HAS_GLYPH_NAMES(face) ) { + WARNING_1 fprintf(stderr, "Font has no glyph names\n"); + return 1; + } + + for(i=0; i < face->num_glyphs; i++) { + if( FT_Get_Glyph_Name(face, i, bf, MAX_NAMELEN) || bf[0]==0 ) { + sprintf(bf, "_g_%d", i); + WARNING_2 fprintf(stderr, + "Glyph No. %d has no postscript name, becomes %s\n", i, bf); + } + glyph_list[i].name = strdup(bf); + if(ISDBG(FT)) fprintf(stderr, "%d has name %s\n", i, bf); + if (glyph_list[i].name == NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + } + return 0; +} + +/* + * Get the metrics of the glyphs. + */ + +static void +glmetrics( + GLYPH *glyph_list +) +{ + GLYPH *g; + int i; + FT_Glyph_Metrics *met; + FT_BBox bbox; + FT_Glyph gly; + FT_ULong charcode; + FT_UInt index; + + for(i=0; i < face->num_glyphs; i++) { + g = &(glyph_list[i]); + + if( FT_Load_Glyph(face, i, FT_LOAD_NO_BITMAP|FT_LOAD_NO_SCALE) ) { + fprintf(stderr, "Can't load glyph %s, skipped\n", g->name); + continue; + } + + met = &face->glyph->metrics; + + if(FT_HAS_HORIZONTAL(face)) { + g->width = met->horiAdvance; + g->lsb = met->horiBearingX; + } else { + WARNING_2 fprintf(stderr, "Glyph %s has no horizontal metrics, guessed them\n", g->name); + g->width = met->width; + g->lsb = 0; + } + + if( FT_Get_Glyph(face->glyph, &gly) ) { + fprintf(stderr, "Can't access glyph %s bbox, skipped\n", g->name); + continue; + } + + FT_Glyph_Get_CBox(gly, ft_glyph_bbox_unscaled, &bbox); + g->xMin = bbox.xMin; + g->yMin = bbox.yMin; + g->xMax = bbox.xMax; + g->yMax = bbox.yMax; + + g->ttf_pathlen = face->glyph->outline.n_points; + + } + + charcode = FT_Get_First_Char(face, &index); + while ( index != 0 ) { + if ( index >= face->num_glyphs ) { + break; + } + for ( i = 0; i < GLYPH_MAX_ENCODINGS; i++ ) { + if ( glyph_list[index].orig_code[i] == -1 ) + break; + } + + if ( i == GLYPH_MAX_ENCODINGS ) { + if (strcmp(glyph_list[index].name, ".notdef") != 0) { + WARNING_2 fprintf(stderr, + "Glyph %s has >= %d encodings (A), %4.4x & %4.4x\n", + GLYPH_MAX_ENCODINGS, + glyph_list[index].name, + glyph_list[index].orig_code[i], + charcode); + } + } else { + glyph_list[index].orig_code[i] = charcode; + } + + charcode = FT_Get_Next_Char(face, charcode, &index); + } +} + +/* + * Get the original encoding of the font. + * Returns 1 for if the original encoding is Unicode, 2 if the + * original encoding is other 16-bit, 0 if 8-bit. + */ + +static int +glenc( + GLYPH *glyph_list, + int *encoding, + int *unimap +) +{ + int i, e; + unsigned code, index; + + if(ISDBG(FT)) + for(e=0; e < face->num_charmaps; e++) { + fprintf(stderr, "found encoding pid=%d eid=%d\n", + face->charmaps[e]->platform_id, + face->charmaps[e]->encoding_id); + } + + if(enc_found) + goto populate_map; + + enc_type = 0; + + /* first check for an explicit PID/EID */ + + if(force_pid != -1) { + for(e=0; e < face->num_charmaps; e++) { + if(face->charmaps[e]->platform_id == force_pid + && face->charmaps[e]->encoding_id == force_eid) { + WARNING_1 fprintf(stderr, "Found Encoding PID=%d/EID=%d\n", + force_pid, force_eid); + if( !face->charmaps || FT_Set_Charmap(face, face->charmaps[e]) ) { + fprintf(stderr, "**** Cannot set charmap in FreeType ****\n"); + exit(1); + } + enc_type = 1; + goto populate_map; + } + } + fprintf(stderr, "*** TTF encoding table PID=%d/EID=%d not found\n", + force_pid, force_eid); + exit(1); + } + + /* next check for a direct Adobe mapping */ + + if(!forcemap) { + for(e=0; e < face->num_charmaps; e++) { + if(face->charmaps[e]->encoding == ft_encoding_adobe_custom) { + WARNING_1 fputs("Found Adobe Custom Encoding\n", stderr); + if( FT_Set_Charmap(face, face->charmaps[e]) ) { + fprintf(stderr, "**** Cannot set charmap in FreeType ****\n"); + exit(1); + } + goto populate_map; + } + } + } + + for(e=0; e < face->num_charmaps; e++) { + if(face->charmaps[e]->platform_id == 3) { + switch(face->charmaps[e]->encoding_id) { + case 0: + WARNING_1 fputs("Found Symbol Encoding\n", stderr); + break; + case 1: + WARNING_1 fputs("Found Unicode Encoding\n", stderr); + enc_type = 1; + break; + default: + WARNING_1 { + fprintf(stderr, + "****MS Encoding ID %d not supported****\n", + face->charmaps[e]->encoding_id); + fputs("Treating it like Symbol encoding\n", stderr); + } + break; + } + break; + } + } + if(e >= face->num_charmaps) { + WARNING_1 fputs("No Microsoft encoding, using first encoding available\n", stderr); + e = 0; + } + + if( FT_Set_Charmap(face, face->charmaps[e]) ) { + fprintf(stderr, "**** Cannot set charmap in FreeType ****\n"); + exit(1); + } + +populate_map: + enc_found = 1; + + for(i=0; iitalic_angle = 0.0; /* FreeType hides the angle */ + fm->underline_position = face->underline_position; + fm->underline_thickness = face->underline_thickness; + fm->is_fixed_pitch = FT_IS_FIXED_WIDTH(face); + + fm->ascender = face->ascender; + fm->descender = face->descender; + + fm->units_per_em = face->units_per_EM; + + fm->bbox[0] = face->bbox.xMin; + fm->bbox[1] = face->bbox.yMin; + fm->bbox[2] = face->bbox.xMax; + fm->bbox[3] = face->bbox.yMax; + +#ifdef ENABLE_SFNT + if( FT_Get_Sfnt_Name(face, TT_NAME_ID_COPYRIGHT, &sn) ) +#endif /* ENABLE_SFNT */ + fm->name_copyright = ""; +#ifdef ENABLE_SFNT + else + fm->name_copyright = dupcnstring(sn.string, sn.string_len); +#endif /* ENABLE_SFNT */ + + fm->name_family = face->family_name; + + fm->name_style = face->style_name; + if(fm->name_style == NULL) + fm->name_style = ""; + +#ifdef ENABLE_SFNT + if( FT_Get_Sfnt_Name(face, TT_NAME_ID_FULL_NAME, &sn) ) +#endif /* ENABLE_SFNT */ + { + int len; + + len = strlen(fm->name_family) + strlen(fm->name_style) + 2; + if(( fm->name_full = malloc(len) )==NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + strcpy(fm->name_full, fm->name_family); + if(strlen(fm->name_style) != 0) { + strcat(fm->name_full, " "); + strcat(fm->name_full, fm->name_style); + } + } +#ifdef ENABLE_SFNT + else + fm->name_full = dupcnstring(sn.string, sn.string_len); +#endif /* ENABLE_SFNT */ + +#ifdef ENABLE_SFNT + if( FT_Get_Sfnt_Name(face, TT_NAME_ID_VERSION_STRING, &sn) ) +#endif /* ENABLE_SFNT */ + fm->name_version = "1.0"; +#ifdef ENABLE_SFNT + else + fm->name_version = dupcnstring(sn.string, sn.string_len); +#endif /* ENABLE_SFNT */ + +#ifdef ENABLE_SFNT + if( FT_Get_Sfnt_Name(face, TT_NAME_ID_PS_NAME , &sn) ) { +#endif /* ENABLE_SFNT */ + if(( fm->name_ps = strdup(fm->name_full) )==NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } +#ifdef ENABLE_SFNT + } else + fm->name_ps = dupcnstring(sn.string, sn.string_len); +#endif /* ENABLE_SFNT */ + for(i=0; fm->name_ps[i]!=0; i++) + if(fm->name_ps[i] == ' ') + fm->name_ps[i] = '_'; /* no spaces in the Postscript name *m + + /* guess the boldness from the font names */ + fm->force_bold=0; + + fieldstocheck[0] = fm->name_style; + fieldstocheck[1] = fm->name_full; + fieldstocheck[2] = fm->name_ps; + + for(i=0; !fm->force_bold && i= len || !islower(str[j+4])) + ) { + fm->force_bold=1; + break; + } + } + } +} + +/* + * Functions to decompose the outlines + */ + +static GLYPH *curg; +static double lastx, lasty; + +static int +outl_moveto( + FT_Vector *to, + void *unused +) +{ + double tox, toy; + + tox = fscale((double)to->x); toy = fscale((double)to->y); + + /* FreeType does not do explicit closepath() */ + if(curg->lastentry) { + g_closepath(curg); + } + fg_rmoveto(curg, tox, toy); + lastx = tox; lasty = toy; + + return 0; +} + +static int +outl_lineto( + FT_Vector *to, + void *unused +) +{ + double tox, toy; + + tox = fscale((double)to->x); toy = fscale((double)to->y); + + fg_rlineto(curg, tox, toy); + lastx = tox; lasty = toy; + + return 0; +} + +static int +outl_conicto( + FT_Vector *control1, + FT_Vector *to, + void *unused +) +{ + double c1x, c1y, tox, toy; + + c1x = fscale((double)control1->x); c1y = fscale((double)control1->y); + tox = fscale((double)to->x); toy = fscale((double)to->y); + + fg_rrcurveto(curg, + (lastx + 2.0 * c1x) / 3.0, (lasty + 2.0 * c1y) / 3.0, + (2.0 * c1x + tox) / 3.0, (2.0 * c1y + toy) / 3.0, + tox, toy ); + lastx = tox; lasty = toy; + + return 0; +} + +static int +outl_cubicto( + FT_Vector *control1, + FT_Vector *control2, + FT_Vector *to, + void *unused +) +{ + double c1x, c1y, c2x, c2y, tox, toy; + + c1x = fscale((double)control1->x); c1y = fscale((double)control1->y); + c2x = fscale((double)control2->x); c2y = fscale((double)control2->y); + tox = fscale((double)to->x); toy = fscale((double)to->y); + + fg_rrcurveto(curg, c1x, c1y, c2x, c2y, tox, toy); + lastx = tox; lasty = toy; + + return 0; +} + +static FT_Outline_Funcs ft_outl_funcs = { + outl_moveto, + outl_lineto, + outl_conicto, + outl_cubicto, + 0, + 0 +}; + +/* + * Get the path of contrours for a glyph. + */ + +static void +glpath( + int glyphno, + GLYPH *glyf_list +) +{ + FT_Outline *ol; + + curg = &glyf_list[glyphno]; + + if( FT_Load_Glyph(face, glyphno, FT_LOAD_NO_BITMAP|FT_LOAD_NO_SCALE|FT_LOAD_NO_HINTING) + || face->glyph->format != ft_glyph_format_outline ) { + fprintf(stderr, "Can't load glyph %s, skipped\n", curg->name); + return; + } + + ol = &face->glyph->outline; + lastx = 0.0; lasty = 0.0; + + if( FT_Outline_Decompose(ol, &ft_outl_funcs, NULL) ) { + fprintf(stderr, "Can't decompose outline of glyph %s, skipped\n", curg->name); + return; + } + + /* FreeType does not do explicit closepath() */ + if(curg->lastentry) { + g_closepath(curg); + } + + if(ol->flags & ft_outline_reverse_fill) { + assertpath(curg->entries, __FILE__, __LINE__, curg->name); + reversepaths(curg); + } +} + +/* + * Get the kerning data. + */ + +static void +kerning( + GLYPH *glyph_list +) +{ + int i, j, n; + int nglyphs = face->num_glyphs; + FT_Vector k; + GLYPH *gl; + + if( nglyphs == 0 || !FT_HAS_KERNING(face) ) { + WARNING_1 fputs("No Kerning data\n", stderr); + return; + } + + for(i=0; i= 1) +#define WARNING_2 if(warnlevel >= 2) +#define WARNING_3 if(warnlevel >= 3) +#define WARNING_4 if(warnlevel >= 4) + +/* + * Bitmap control macros + */ + +#define BITMAP_BYTES(size) (((size)+7)>>3) +#define DEF_BITMAP(name, size) unsigned char name[BITMAP_BYTES(size)] +#define SET_BITMAP(name, bit) ( name[(bit)>>3] |= (1<<((bit)&7)) ) +#define CLR_BITMAP(name, bit) ( name[(bit)>>3] &= ~(1<<((bit)&7)) ) +#define IS_BITMAP(name, bit) ( name[(bit)>>3] & (1<<((bit)&7)) ) + +/* debugging */ + +/* debug flags */ +#define DEBUG_UNICODE 0x00000001 /* unicode to 8-bit code conversion */ +#define DEBUG_MAINSTEMS 0x00000002 /* glyph-wide main stem generation */ +#define DEBUG_SUBSTEMS 0x00000004 /* substituted stem generation */ +#define DEBUG_STEMS (DEBUG_MAINSTEMS|DEBUG_SUBSTEMS) +#define DEBUG_REVERSAL 0x00000008 /* reversal of the paths */ +#define DEBUG_FIXCVDIR 0x00000010 /* fixcvdir() */ +#define DEBUG_STEMOVERLAP 0x00000020 /* stemoverlap() */ +#define DEBUG_BLUESTEMS 0x00000040 /* markbluestems() */ +#define DEBUG_STRAIGHTEN 0x00000080 /* markbluestems() */ +#define DEBUG_EXTMAP 0x00000100 /* parsing of external map */ +#define DEBUG_TOINT 0x00000200 /* conversion of path to integer */ +#define DEBUG_BUILDG 0x00000400 /* building of glyph path */ +#define DEBUG_QUAD 0x00000800 /* splitting curves by quadrants */ +#define DEBUG_SQEQ 0x00001000 /* square equation solver */ +#define DEBUG_COMPOSITE 0x00002000 /* handling of composite glyphs */ +#define DEBUG_FCONCISE 0x00004000 /* normalization of curves */ +#define DEBUG_FT 0x00008000 /* FreeType front-end */ +#define DEBUG_BITMAP 0x00010000 /* conversion from bitmap */ +#define DEBUG_DISABLED 0x80000000 /* special flag: temporary disable debugging */ + +/* at what we want to look now */ +#ifndef DEBUG +# define DEBUG (0) +#endif + +/* uncomment the next line if debugging data is wanted for one glyph only */ +/* #define DBG_GLYPH "C118" /* */ + +#if DEBUG==0 +# define ISDBG(name) (0) +# define ENABLEDBG(condition) (0) +# define DISABLEDBG(condition) (0) +#else + extern int debug; /* collection of the flags */ +/* this ISDBG will only work on ANSI C, not K&R */ +# define ISDBG(name) ( (debug & DEBUG_DISABLED) ? 0 : (debug & (DEBUG_##name)) ) +# define ENABLEDBG(condition) ( (condition) ? (debug&=~DEBUG_DISABLED) : 0 ) +# define DISABLEDBG(condition) ( (condition) ? (debug|=DEBUG_DISABLED) : 0 ) +#endif + +#ifdef DBG_GLYPH +# define DBG_TO_GLYPH(g) DISABLEDBG( strcmp( (g)->name, DBG_GLYPH ) ) +# define DBG_FROM_GLYPH(g) ENABLEDBG(1) +#else +# define DBG_TO_GLYPH(g) (0) +# define DBG_FROM_GLYPH(g) (0) +#endif + +/* prototypes */ +int iscale( int val); +double fscale( double val); +int unicode_rev_lookup( int unival); +void bmp_outline( GLYPH *g, int scale, char *bmap, + int xsz, int ysz, int xoff, int yoff); +int isign( int x); +int fsign( double x); +char *dupcnstring( unsigned char *s, int len); + +/* global metrics for a font */ + +struct font_metrics { + /* post */ + double italic_angle; + short underline_position; + short underline_thickness; + short is_fixed_pitch; + + /* hhea */ + short ascender; + short descender; + + /* head */ + unsigned short units_per_em; + short bbox[4]; + + /* name */ + char *name_copyright; + char *name_family; + char *name_style; + char *name_full; + char *name_version; + char *name_ps; + + /* other */ + int force_bold; +}; + +/* size of the encoding table - glyphs beyond 255 are actually unnumbered */ + +#define ENCTABSZ 1024 + +/* switch table structure for front-ends */ + +#define MAXSUFFIX 10 + +struct frontsw { + char *name; /* name of the front end */ + char *descr; /* description of the front end */ + char *suffix[MAXSUFFIX]; /* possible file name suffixes */ + + void (*open)(char *fname, char *arg); /* open font file */ + void (*close)(void); /* close font file */ + int (*nglyphs)(void); /* get the number of glyphs */ + int (*glnames)(GLYPH *glyphs); /* get the names of glyphs */ + void (*glmetrics)(GLYPH *glyphs); /* get the metrics of glyphs */ + int (*glenc)(GLYPH *glyphs, int *enc, int *unimap); /* get the encoding */ + void (*fnmetrics)(struct font_metrics *fm); /* get the font metrics */ + void (*glpath)(int glyphno, GLYPH *glyphs); /* get the glyph path */ + void (*kerning)(GLYPH *glyph_list); /* extract the kerning data */ +}; diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/CP1250.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/CP1250.map new file mode 100755 index 00000000..34596a94 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/CP1250.map @@ -0,0 +1,254 @@ +// CP1250 code encoding table with glyph renaming +// Petr Titera P.Titera@sh.cvut.cz + +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quote +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D minus +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC .notdef +!82 U+201A quotesinglbase +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+015A Sacute +!8D U+0164 Tcaron +!8E U+017D Zcaron +!8F U+0179 Zacute +!91 U+2018 quotesinglleft +!92 U+2019 quotesinglright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+015B sacute +!9D U+0165 tcaron +!9E U+017E zcaron +!9F U+017A zacute +!A0 U+00A0 nbspace +!A1 U+02C7 caron +!A2 U+02D8 breve +!A3 U+0141 Lslash +!A4 U+00A4 currency +!A5 U+0104 Aogonek +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+015E Scedilla +!AB U+00AB guillemotleft +!AC U+00AC notsign +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+02DB ogonek +!B3 U+0142 lslash +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+2219 periodcentered +!B8 U+00B8 cedilla +!B9 U+0105 aogonek +!BA U+015F scedilla +!BB U+00BB guillemotright +!BC U+013D Lcaron +!BD U+02DD hungarumlaut +!BE U+013E lcaron +!BF U+017C zdotaccent +!C0 U+0154 Racute +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0139 Lacute +!C6 U+0106 Cacute +!C7 U+00C7 Ccedilla +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+011A Ecaron +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+010E Dcaron +!D0 U+00D0 Eth +!D1 U+0143 Nacute +!D2 U+0147 Ncaron +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0158 Rcaron +!D9 U+016E Uring +!DA U+00DA Uacute +!DB U+0170 Uhungarumlaut +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+0162 Tcedilla +!DF U+00DF germandbls +!E0 U+0155 racute +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+013A lacute +!E6 U+0107 cacute +!E7 U+00E7 ccedilla +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+011B ecaron +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+010F dcaron +!F0 U+0111 eth +!F1 U+0144 nacute +!F2 U+0148 ncaron +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0159 rcaron +!F9 U+016F uring +!FA U+00FA uacute +!FB U+0171 uhungarumlaut +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+0163 tcedilla +!FF U+02D9 dotaccent diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/CP1251.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/CP1251.map new file mode 100755 index 00000000..3fd854d9 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/CP1251.map @@ -0,0 +1,245 @@ +// CP1251 encoding table +// Zvezdan Petkovic + +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quote +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D minus +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0402 cyr_DJE +!81 U+0403 cyr_GJE +!82 U+201A quotesinglbase +!83 U+0453 cyr_gje +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+20AC Euro +!89 U+2030 perthousand +!8A U+0409 cyr_LJE +!8B U+2039 guilsinglleft +!8C U+040A cyr_NJE +!8D U+040C cyr_KJE +!8E U+040B cyr_TSHE +!8F U+040F cyr_DZHE +!90 U+0452 cyr_dje +!91 U+2018 quotesinglleft +!92 U+2019 quotesinglright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9A U+0459 cyr_lje +!9B U+203A guilsinglright +!9C U+045A cyr_nje +!9D U+045C cyr_kje +!9E U+045B cyr_tshe +!9F U+045F cyr_dzhe +!A0 U+00A0 nbspace +!A1 U+040E cyr_SHORT_U +!A2 U+045E cyr_short_u +!A3 U+0408 cyr_JE +!A4 U+00A4 currency +!A5 U+0490 cyr_GHE_UPTURN +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+0401 cyr_IO +!A9 U+00A9 copyright +!AA U+0404 cyr_UKRAINIAN_IE +!AB U+00AB guillemotleft +!AC U+00AC notsign +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+0407 cyr_YI +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+0406 cyr_BYELORUSSIAN_UKRAINIAN_I +!B3 U+0456 cyr_byelorussian_ukrainian_i +!B4 U+0491 cyr_ghe_upturn +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+0451 cyr_io +!B9 U+2116 numero +!BA U+0454 cyr_ukrainian_ie +!BB U+00BB guillemotright +!BC U+0458 cyr_je +!BD U+0405 cyr_DZE +!BE U+0455 cyr_dze +!BF U+0457 cyr_yi +!C0 U+0410 cyr_A +!C1 U+0411 cyr_BE +!C2 U+0412 cyr_VE +!C3 U+0413 cyr_GHE +!C4 U+0414 cyr_DE +!C5 U+0415 cyr_IE +!C6 U+0416 cyr_ZHE +!C7 U+0417 cyr_ZE +!C8 U+0418 cyr_I +!C9 U+0419 cyr_SHORT_I +!CA U+041A cyr_KA +!CB U+041B cyr_EL +!CC U+041C cyr_EM +!CD U+041D cyr_EN +!CE U+041E cyr_O +!CF U+041F cyr_PE +!D0 U+0420 cyr_ER +!D1 U+0421 cyr_ES +!D2 U+0422 cyr_TE +!D3 U+0423 cyr_U +!D4 U+0424 cyr_EF +!D5 U+0425 cyr_HA +!D6 U+0426 cyr_TSE +!D7 U+0427 cyr_CHE +!D8 U+0428 cyr_SHA +!D9 U+0429 cyr_SHCHA +!DA U+042A cyr_HARD_SIGN +!DB U+042B cyr_YERU +!DC U+042C cyr_SOFT_SIGN +!DD U+042D cyr_E +!DE U+042E cyr_YU +!DF U+042F cyr_YA +!E0 U+0430 cyr_a +!E1 U+0431 cyr_be +!E2 U+0432 cyr_ve +!E3 U+0433 cyr_ghe +!E4 U+0434 cyr_de +!E5 U+0435 cyr_ie +!E6 U+0436 cyr_zhe +!E7 U+0437 cyr_ze +!E8 U+0438 cyr_i +!E9 U+0439 cyr_short_i +!EA U+043A cyr_ka +!EB U+043B cyr_el +!EC U+043C cyr_em +!ED U+043D cyr_en +!EE U+043E cyr_o +!EF U+043F cyr_pe +!F0 U+0440 cyr_er +!F1 U+0441 cyr_es +!F2 U+0442 cyr_te +!F3 U+0443 cyr_u +!F4 U+0444 cyr_ef +!F5 U+0445 cyr_ha +!F6 U+0446 cyr_tse +!F7 U+0447 cyr_che +!F8 U+0448 cyr_sha +!F9 U+0449 cyr_shcha +!FA U+044A cyr_hard_sign +!FB U+044B cyr_yeru +!FC U+044C cyr_soft_sign +!FD U+044D cyr_e +!FE U+044E cyr_yu +!FF U+044F cyr_ya diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/T2A_compact.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/T2A_compact.map new file mode 100755 index 00000000..c329b64a --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/T2A_compact.map @@ -0,0 +1,111 @@ +// Map file to make PFA/PFB files with T2A encoding +// from TTF using ttf2pt1 package. See package documentation for details. +// The encoding is incomplete but some (many) glyphs do not exist in TTF. +// Mikhail Umorin mikeumo@obebox.com +//start at 0 +0x0060 +0x00B4 +0x02C6 +0x02DC +0x00A8 +0x02DD +0x02DA +0x02C7 +0x02D8 +0x00AF +0x02D9 +// at 0x000B (11) +// will set more later +0x00B8 +0x02DB +0x0130 +0x2039 +0x203A +0x201C +0x201D +0x0000 +0x0000 +0x0000 +0x2013 +0x2014 +0x0000 +0x0000 +0x0131 +0x0000 +0x0000 +0x0000 +0x0000 +0x0000 +0x0000 +// at 0x0020 (32) +0x0020-0x005F +// at 0x0060 (96) +0x2018 +// at 0x0061 (97) +0x0061-0x007E +0x00AD +//this ends the lower half of the table: 0x007F (127) +// at 0x008F +0x0490 +0x0000 +0x040B +0x0402 +0x0000 +0x0000 +0x0000 +0x0409 +0x0407 +0x0000 +0x0000 +0x0000 +0x00C6 +0x0000 +0x0000 +0x0405 +0x0000 +0x00C7 +0x040E +0x0000 +0x0000 +0x0000 +0x040F +0x0000 +0x0000 +0x0404 +0x0000 +// at 155 +0x040A, 0x0401, 0x2116, 0x00A4, 0x00A7 +// at A0 (160) +0x0491 +0x0000 +0x045B +0x0452 +0x0000 +0x0000 +0x0000 +0x0459 +0x0457 +0x0000 +0x0000 +0x0000 +0x00E6 +0x0000 +0x0000 +0x0455 +0x0000 +0x00E7 +0x045E +0x0000 +0x0000 +0x0000 +0x045F +0x0000 +0x0000 +0x0454 +0x0000 +// at 187 +0x045A, 0x0451, 0x201E, 0x00AB, 0x00BB +// at 192 +0x0410-0x044F +// this concludes the upper half of the table + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/adobe-standard-encoding.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/adobe-standard-encoding.map new file mode 100755 index 00000000..230d4a1e --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/adobe-standard-encoding.map @@ -0,0 +1,231 @@ +// Adobe Standard Encoding table for ttf2pt1 +// Thomas Henlich + +=20 U+0020 SPACE +=21 U+0021 EXCLAMATION MARK +=22 U+0022 QUOTATION MARK +=23 U+0023 NUMBER SIGN +=24 U+0024 DOLLAR SIGN +=25 U+0025 PERCENT SIGN +=26 U+0026 AMPERSAND +=27 U+2019 RIGHT SINGLE QUOTATION MARK +=28 U+0028 LEFT PARENTHESIS +=29 U+0029 RIGHT PARENTHESIS +=2A U+002A ASTERISK +=2B U+002B PLUS SIGN +=2C U+002C COMMA +=2D U+002D HYPHEN-MINUS +=2E U+002E FULL STOP +=2F U+002F SOLIDUS +=30 U+0030 DIGIT ZERO +=31 U+0031 DIGIT ONE +=32 U+0032 DIGIT TWO +=33 U+0033 DIGIT THREE +=34 U+0034 DIGIT FOUR +=35 U+0035 DIGIT FIVE +=36 U+0036 DIGIT SIX +=37 U+0037 DIGIT SEVEN +=38 U+0038 DIGIT EIGHT +=39 U+0039 DIGIT NINE +=3A U+003A COLON +=3B U+003B SEMICOLON +=3C U+003C LESS-THAN SIGN +=3D U+003D EQUALS SIGN +=3E U+003E GREATER-THAN SIGN +=3F U+003F QUESTION MARK +=40 U+0040 COMMERCIAL AT +=41 U+0041 LATIN CAPITAL LETTER A +=42 U+0042 LATIN CAPITAL LETTER B +=43 U+0043 LATIN CAPITAL LETTER C +=44 U+0044 LATIN CAPITAL LETTER D +=45 U+0045 LATIN CAPITAL LETTER E +=46 U+0046 LATIN CAPITAL LETTER F +=47 U+0047 LATIN CAPITAL LETTER G +=48 U+0048 LATIN CAPITAL LETTER H +=49 U+0049 LATIN CAPITAL LETTER I +=4A U+004A LATIN CAPITAL LETTER J +=4B U+004B LATIN CAPITAL LETTER K +=4C U+004C LATIN CAPITAL LETTER L +=4D U+004D LATIN CAPITAL LETTER M +=4E U+004E LATIN CAPITAL LETTER N +=4F U+004F LATIN CAPITAL LETTER O +=50 U+0050 LATIN CAPITAL LETTER P +=51 U+0051 LATIN CAPITAL LETTER Q +=52 U+0052 LATIN CAPITAL LETTER R +=53 U+0053 LATIN CAPITAL LETTER S +=54 U+0054 LATIN CAPITAL LETTER T +=55 U+0055 LATIN CAPITAL LETTER U +=56 U+0056 LATIN CAPITAL LETTER V +=57 U+0057 LATIN CAPITAL LETTER W +=58 U+0058 LATIN CAPITAL LETTER X +=59 U+0059 LATIN CAPITAL LETTER Y +=5A U+005A LATIN CAPITAL LETTER Z +=5B U+005B LEFT SQUARE BRACKET +=5C U+005C REVERSE SOLIDUS +=5D U+005D RIGHT SQUARE BRACKET +=5E U+005E CIRCUMFLEX ACCENT +=5F U+005F LOW LINE +=60 U+2018 LEFT SINGLE QUOTATION MARK +=61 U+0061 LATIN SMALL LETTER A +=62 U+0062 LATIN SMALL LETTER B +=63 U+0063 LATIN SMALL LETTER C +=64 U+0064 LATIN SMALL LETTER D +=65 U+0065 LATIN SMALL LETTER E +=66 U+0066 LATIN SMALL LETTER F +=67 U+0067 LATIN SMALL LETTER G +=68 U+0068 LATIN SMALL LETTER H +=69 U+0069 LATIN SMALL LETTER I +=6A U+006A LATIN SMALL LETTER J +=6B U+006B LATIN SMALL LETTER K +=6C U+006C LATIN SMALL LETTER L +=6D U+006D LATIN SMALL LETTER M +=6E U+006E LATIN SMALL LETTER N +=6F U+006F LATIN SMALL LETTER O +=70 U+0070 LATIN SMALL LETTER P +=71 U+0071 LATIN SMALL LETTER Q +=72 U+0072 LATIN SMALL LETTER R +=73 U+0073 LATIN SMALL LETTER S +=74 U+0074 LATIN SMALL LETTER T +=75 U+0075 LATIN SMALL LETTER U +=76 U+0076 LATIN SMALL LETTER V +=77 U+0077 LATIN SMALL LETTER W +=78 U+0078 LATIN SMALL LETTER X +=79 U+0079 LATIN SMALL LETTER Y +=7A U+007A LATIN SMALL LETTER Z +=7B U+007B LEFT CURLY BRACKET +=7C U+007C VERTICAL LINE +=7D U+007D RIGHT CURLY BRACKET +=7E U+007E TILDE +=A1 U+00A1 INVERTED EXCLAMATION MARK +=A2 U+00A2 CENT SIGN +=A3 U+00A3 POUND SIGN +=A4 U+2044 FRACTION SLASH +=A5 U+00A5 YEN SIGN +=A6 U+0192 LATIN SMALL LETTER F WITH HOOK +=A7 U+00A7 SECTION SIGN +=A8 U+00A4 CURRENCY SIGN +=A9 U+0027 APOSTROPHE +=AA U+201C LEFT DOUBLE QUOTATION MARK +=AB U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +=AC U+2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK +=AD U+203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +=AE U+FB01 LATIN SMALL LIGATURE FI +=AF U+FB02 LATIN SMALL LIGATURE FL +=B1 U+2013 EN DASH +=B2 U+2020 DAGGER +=B3 U+2021 DOUBLE DAGGER +=B4 U+00B7 MIDDLE DOT +=B6 U+00B6 PILCROW SIGN +=B7 U+2022 BULLET +=B8 U+201A SINGLE LOW-9 QUOTATION MARK +=B9 U+201E DOUBLE LOW-9 QUOTATION MARK +=BA U+201D RIGHT DOUBLE QUOTATION MARK +=BB U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +=BC U+2026 HORIZONTAL ELLIPSIS +=BD U+2030 PER MILLE SIGN +=BF U+00BF INVERTED QUESTION MARK +=C1 U+0060 GRAVE ACCENT +=C2 U+00B4 ACUTE ACCENT +=C3 U+02C6 MODIFIER LETTER CIRCUMFLEX ACCENT +=C4 U+02DC SMALL TILDE +=C5 U+00AF MACRON +=C6 U+02D8 BREVE +=C7 U+02D9 DOT ABOVE +=C8 U+00A8 DIAERESIS +=CA U+02DA RING ABOVE +=CB U+00B8 CEDILLA +=CD U+02DD DOUBLE ACUTE ACCENT +=CE U+02DB OGONEK +=CF U+02C7 CARON +=D0 U+2014 EM DASH +=E1 U+00C6 LATIN CAPITAL LETTER AE +=E3 U+00AA FEMININE ORDINAL INDICATOR +=E8 U+0141 LATIN CAPITAL LETTER L WITH STROKE +=E9 U+00D8 LATIN CAPITAL LETTER O WITH STROKE +=EA U+0152 LATIN CAPITAL LIGATURE OE +=EB U+00BA MASCULINE ORDINAL INDICATOR +=F1 U+00E6 LATIN SMALL LETTER AE +=F5 U+0131 LATIN SMALL LETTER DOTLESS I +=F8 U+0142 LATIN SMALL LETTER L WITH STROKE +=F9 U+00F8 LATIN SMALL LETTER O WITH STROKE +=FA U+0153 LATIN SMALL LIGATURE OE +=FB U+00DF LATIN SMALL LETTER SHARP S + +// unencoded characters: +=100 U+00E7 LATIN SMALL LETTER C WITH CEDILLA +=101 U+00FF LATIN SMALL LETTER Y WITH DIAERESIS +=102 U+00E3 LATIN SMALL LETTER A WITH TILDE +=103 U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX +=104 U+00B3 SUPERSCRIPT THREE +=105 U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX +=106 U+00FE LATIN SMALL LETTER THORN +=107 U+00E8 LATIN SMALL LETTER E WITH GRAVE +=108 U+00B2 SUPERSCRIPT TWO +=109 U+00E9 LATIN SMALL LETTER E WITH ACUTE +=10A U+00F5 LATIN SMALL LETTER O WITH TILDE +=10B U+00C1 LATIN CAPITAL LETTER A WITH ACUTE +=10C U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX +=10D U+00FD LATIN SMALL LETTER Y WITH ACUTE +=10E U+00FC LATIN SMALL LETTER U WITH DIAERESIS +=10F U+00BE VULGAR FRACTION THREE QUARTERS +=110 U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX +=111 U+00D0 LATIN CAPITAL LETTER ETH +=112 U+00EB LATIN SMALL LETTER E WITH DIAERESIS +=113 U+00F9 LATIN SMALL LETTER U WITH GRAVE +=114 U+2122 TRADE MARK SIGN +=115 U+00F2 LATIN SMALL LETTER O WITH GRAVE +=116 U+0161 LATIN SMALL LETTER S WITH CARON +=117 U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS +=118 U+00FA LATIN SMALL LETTER U WITH ACUTE +=119 U+00E0 LATIN SMALL LETTER A WITH GRAVE +=11A U+00F1 LATIN SMALL LETTER N WITH TILDE +=11B U+00E5 LATIN SMALL LETTER A WITH RING ABOVE +=11C U+017E LATIN SMALL LETTER Z WITH CARON +=11D U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX +=11E U+00D1 LATIN CAPITAL LETTER N WITH TILDE +=11F U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX +=120 U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX +=121 U+00CD LATIN CAPITAL LETTER I WITH ACUTE +=122 U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA +=123 U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS +=124 U+0160 LATIN CAPITAL LETTER S WITH CARON +=125 U+00CC LATIN CAPITAL LETTER I WITH GRAVE +=126 U+00E4 LATIN SMALL LETTER A WITH DIAERESIS +=127 U+00D2 LATIN CAPITAL LETTER O WITH GRAVE +=128 U+00C8 LATIN CAPITAL LETTER E WITH GRAVE +=129 U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS +=12A U+00AE REGISTERED SIGN +=12B U+00D5 LATIN CAPITAL LETTER O WITH TILDE +=12C U+00BC VULGAR FRACTION ONE QUARTER +=12D U+00D9 LATIN CAPITAL LETTER U WITH GRAVE +=12E U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX +=12F U+00DE LATIN CAPITAL LETTER THORN +=130 U+00F7 DIVISION SIGN +=131 U+00C3 LATIN CAPITAL LETTER A WITH TILDE +=132 U+00DA LATIN CAPITAL LETTER U WITH ACUTE +=133 U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX +=134 U+00AC NOT SIGN +=135 U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE +=136 U+00EF LATIN SMALL LETTER I WITH DIAERESIS +=137 U+00ED LATIN SMALL LETTER I WITH ACUTE +=138 U+00E1 LATIN SMALL LETTER A WITH ACUTE +=139 U+00B1 PLUS-MINUS SIGN +=13A U+00D7 MULTIPLICATION SIGN +=13B U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS +=13C U+2212 MINUS SIGN +=13D U+00B9 SUPERSCRIPT ONE +=13E U+00C9 LATIN CAPITAL LETTER E WITH ACUTE +=13F U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX +=140 U+00A9 COPYRIGHT SIGN +=141 U+00C0 LATIN CAPITAL LETTER A WITH GRAVE +=142 U+00F6 LATIN SMALL LETTER O WITH DIAERESIS +=143 U+00F3 LATIN SMALL LETTER O WITH ACUTE +=144 U+00B0 DEGREE SIGN +=145 U+00EC LATIN SMALL LETTER I WITH GRAVE +=146 U+00B5 MICRO SIGN +=147 U+00D3 LATIN CAPITAL LETTER O WITH ACUTE +=148 U+00F0 LATIN SMALL LETTER ETH +=149 U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS +=14A U+00DD LATIN CAPITAL LETTER Y WITH ACUTE +=14B U+00A6 BROKEN BAR +=14C U+00BD VULGAR FRACTION ONE HALF diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/cubg5plus.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/cubg5plus.map new file mode 100755 index 00000000..18f4d283 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/cubg5plus.map @@ -0,0 +1,3184 @@ +# +# For unicode Big5+ Chinese fonts. +# +plane 01 +at 0x00 + 0x8488, 0x8710, 0x871F, 0x870F, 0x88D3, 0x8C87, 0x8CC6, 0x90CC, + 0x916D, 0x9258, 0x9242, 0x9268, 0x9269, 0x9243, 0x9247, 0x959D, + 0x96CF, 0x97F4, 0x9809, 0x98AB, 0x98FB, 0x9AAC, 0x9AAE, 0x9AAA, + 0x9B5C, 0x50DF, 0x5619, 0x560A, 0x589A, 0x5D85, 0x5E56, 0x5E51, + 0x5FB1, 0x645A, 0x6463, 0x669B, 0x66A3, 0x669E, 0x69B8, 0x69BA, + 0x69C7, 0x69D7, 0x6B70, 0x6B9D, 0x6F16, 0x6F24, 0x6F45, 0x7179, + 0x717A, 0x7254, 0x757C, 0x757B, 0x7612, 0x76B6, 0x76E0, 0x7773, + 0x7772, 0x7770, 0x789D, 0x7A27, 0x7A35, 0x7BA2, 0x7B89, 0x4E28, + 0x4E05, 0x4E04, 0x4E2A, 0x4E87, 0x4E49, 0x51E2, 0x4E46, 0x4E8F, + 0x4EBC, 0x4EBE, 0x5166, 0x51E3, 0x5204, 0x529C, 0x5344, 0x5F51, + 0x961D, 0x4E63, 0x4E62, 0x4EA3, 0x5185, 0x4EC5, 0x4ECF, 0x4ECE, + 0x4ECC, 0x5184, 0x5186, 0x51E4, 0x5205, 0x529E, 0x529D, 0x52FD, + 0x7BA5, 0x7CB6, 0x7DA5, 0x7DC3, 0x7FAB, 0x8025, 0x8059, 0x8185, + 0x818E, 0x84BE, 0x84A6, 0x872F, 0x89A0, 0x8A97, 0x8C8B, 0x8F0F, + 0x9275, 0x929F, 0x95A6, 0x969A, 0x9757, 0x97F7, 0x98B0, 0x99C6, + 0x50FA, 0x5285, 0x5643, 0x563C, 0x5BED, 0x5C35, 0x5F47, 0x616D, + 0x69F5, 0x6A03, 0x6A65, 0x6B75, 0x6F56, 0x6F98, 0x6F68, 0x7234, + 0x7245, 0x735C, 0x7356, 0x78BF, 0x78BD, 0x78E4, 0x7A34, 0x7A36, + 0x7BBA, 0x7BBC, 0x7BC8, 0x7BC3, 0x7BB6, 0x7BC2, 0x7BC5, 0x7BBD, + 0x7BB0, 0x7BBB, 0x7E04, 0x81F1, 0x8522, 0x8538, 0x8532, 0x8510, + 0x854F, 0x877C, 0x890D, 0x8908, 0x8D9E, 0x8F28, 0x8F21, 0x9066, + 0x906C, 0x90F6, 0x92EC, 0x92BA, 0x92E3, 0x92BD, 0x95B4, 0x97D1, + 0x9823, 0x990B, 0x9AB2, 0x9ADB, 0x9B73, 0x9B6E, 0x9B65, 0x9B6A, + 0x9B6D, 0x9D0B, 0x9E76, 0x9F11, 0x5119, 0x5675, 0x596F, 0x61A5, + 0x61A0, 0x65B4, 0x65D8, 0x66C2, 0x6BA8, 0x6F83, 0x6FC5, 0x71CD, + 0x729C, 0x7499, 0x7639, 0x762E, 0x769F, 0x76A0, 0x7794, 0x77AE, + 0x78E6, 0x7ABC, 0x7BD6, 0x7CCF, 0x7E18, 0x806D, 0x8190, 0x8552, + 0x8550, 0x87A0, 0x8786, 0x8795, 0x8860, 0x8928, 0x8920, 0x89A8, + 0x8E3A, 0x9194, 0x9311, 0x9337, 0x9343, 0x96A6, 0x9795, 0x9796, + 0x9825, 0x9926, 0x9934, 0x9B8A, 0x9B7F, 0x9D11, 0x9ED9, 0x9F3C, + 0x5123, 0x512C, 0x5295, 0x5688, 0x568B, 0x61E1, 0x61D7, 0x65A3, + 0x66D3, 0x6A8B, 0x6BAC, 0x7374, 0x7640, 0x5300, 0x533A, 0x5346, +plane 02 +at 0x00 + 0x535D, 0x5386, 0x53B7, 0x53CC, 0x53CE, 0x5721, 0x5E00, 0x5F0C, + 0x6237, 0x6238, 0x6535, 0x738D, 0x4E97, 0x4EE0, 0x4EE7, 0x4EE6, + 0x56D8, 0x518B, 0x518C, 0x5199, 0x51E5, 0x520B, 0x5304, 0x5303, + 0x5307, 0x531E, 0x535F, 0x536D, 0x5389, 0x53BA, 0x7641, 0x76E8, + 0x78F6, 0x7900, 0x7A59, 0x7A55, 0x7AF4, 0x7C04, 0x7C15, 0x7BF5, + 0x81C1, 0x857D, 0x85A5, 0x893A, 0x8E51, 0x9198, 0x9381, 0x936F, + 0x9842, 0x9937, 0x9BA9, 0x9BA7, 0x9BAC, 0x9B9C, 0x9D3C, 0x9D1C, + 0x9D3A, 0x9D32, 0x9D34, 0x9F3F, 0x5EEB, 0x61D5, 0x6502, 0x7012, + 0x7585, 0x7654, 0x7655, 0x76A7, 0x76A8, 0x790F, 0x7CE4, 0x7CE5, + 0x7E65, 0x7E4E, 0x7F82, 0x802D, 0x85CA, 0x85BC, 0x8CFF, 0x91A6, + 0x93B6, 0x93AB, 0x97A7, 0x983E, 0x9BBC, 0x9BB7, 0x9BBE, 0x9D62, + 0x9E8F, 0x9ECB, 0x56A9, 0x5913, 0x5BF4, 0x61EC, 0x61EF, 0x6AD6, + 0x7209, 0x7379, 0x74C6, 0x77C3, 0x791F, 0x7A65, 0x7AC6, 0x7C3A, + 0x7CEB, 0x7F84, 0x85E0, 0x85F3, 0x881E, 0x89B4, 0x89F9, 0x8B44, + 0x8E71, 0x8E6E, 0x8E79, 0x8EC4, 0x908C, 0x93C9, 0x97B0, 0x985A, + 0x9946, 0x9AC3, 0x9B0F, 0x9BF4, 0x9BFA, 0x9BDD, 0x9BED, 0x9BEF, + 0x9E96, 0x9EB3, 0x9EE2, 0x9F8F, 0x56B1, 0x5B41, 0x6AF6, 0x6AF2, + 0x7588, 0x8267, 0x860E, 0x8D0E, 0x91B6, 0x942F, 0x97E0, 0x97DB, + 0x9861, 0x9A33, 0x9C0F, 0x9C11, 0x9C03, 0x9C01, 0x9C16, 0x9D93, + 0x535B, 0x56BF, 0x5DCE, 0x76AC, 0x77D2, 0x7C52, 0x8B76, 0x8EC7, + 0x9434, 0x943E, 0x97BC, 0x9B39, 0x9C2A, 0x9C26, 0x9C27, 0x9DC0, + 0x9DC9, 0x9EEC, 0x9F68, 0x8032, 0x8031, 0x89FD, 0x908E, 0x97C2, + 0x9A4B, 0x9B1C, 0x9B1B, 0x9C42, 0x56D0, 0x56CF, 0x5DDA, 0x66EA, + 0x8B89, 0x9458, 0x9DE7, 0x53D0, 0x53F6, 0x53F7, 0x53F9, 0x53F4, + 0x5724, 0x5904, 0x5918, 0x5932, 0x5930, 0x5934, 0x5975, 0x5B82, + 0x5BF9, 0x5C14, 0x5E81, 0x5E83, 0x5F0D, 0x5F52, 0x5FCA, 0x5FC7, + 0x6239, 0x624F, 0x65E7, 0x672F, 0x6B7A, 0x6C39, 0x6C37, 0x6C44, + 0x6C45, 0x738C, 0x9093, 0x9092, 0x9DEA, 0x9DF1, 0x9F44, 0x9F6D, + 0x5DD9, 0x883A, 0x8975, 0x9A5D, 0x9C64, 0x9E0A, 0x9F73, 0x77E1, + 0x9B2D, 0x9E0C, 0x9F1F, 0x7C70, 0x9479, 0x974A, 0x7E9D, 0x9960, + 0x9F9E, 0x9EF8, 0x9F3A, 0x9F7D, 0x9F96, 0x6729, 0x5E07, 0x5FCB, + 0x52B7, 0x52B8, 0x52B6, 0x52BA, 0x6306, 0x6B85, 0x8C38, 0x7309, +plane 03 +at 0x00 + 0x8A2F, 0x52DC, 0x5921, 0x5E3F, 0x7B3F, 0x83D0, 0x86E7, 0x6117, + 0x8714, 0x88D1, 0x8CCB, 0x8EED, 0x52EC, 0x52E8, 0x7527, 0x798C, + 0x7991, 0x8660, 0x9904, 0x999B, 0x729F, 0x8770, 0x8E37, 0x9703, + 0x52F6, 0x64CC, 0x764A, 0x7AB9, 0x7BD7, 0x999F, 0x9B8D, 0x9E77, + 0x764B, 0x76A2, 0x87F1, 0x9BBA, 0x8804, 0x9BD8, 0x9D7C, 0x7C46, + 0x9D8D, 0x957E, 0x9C20, 0x9C22, 0x9C1E, 0x8970, 0x9C43, 0x9DE0, + 0x9459, 0x9C72, 0x6530, 0x72DD, 0x6804, 0x82FF, 0x8FEC, 0x53DE, + 0x5A30, 0x5BB2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x4E21, 0x4E20, 0x4E22, 0x4E68, 0x4E89, 0x4E98, 0x4EF9, + 0x4EEF, 0x4EF8, 0x4F06, 0x4F03, 0x4EFC, 0x4EEE, 0x4F16, 0x4F28, + 0x4F1C, 0x4F07, 0x4F1A, 0x4EFA, 0x4F17, 0x514A, 0x5172, 0x51B4, + 0x51B3, 0x51B2, 0x51E8, 0x5214, 0x520F, 0x5215, 0x5218, 0x52A8, + 0x534B, 0x534F, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 04 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0x5350, + 0x538B, 0x53BE, 0x53D2, 0x5416, 0x53FF, 0x5400, 0x5405, 0x5413, + 0x5415, 0x56E3, 0x5735, 0x5736, 0x5731, 0x5732, 0x58EE, 0x5905, + 0x4E54, 0x5936, 0x597A, 0x5986, 0x5B86, 0x5F53, 0x5C18, 0x5C3D, + 0x5C78, 0x5C80, 0x5E08, 0x5EF5, 0x5F0E, 0x5FD3, 0x5FDA, 0x5FDB, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0x620F, 0x625D, 0x625F, + 0x6267, 0x6257, 0x9F50, 0x65EB, 0x65EA, 0x6737, 0x6732, 0x6736, +plane 05 +at 0x00 + 0x6B22, 0x6BCE, 0x6C58, 0x6C51, 0x6C77, 0x6C3C, 0x6C5A, 0x6C53, + 0x706F, 0x7072, 0x706E, 0x7073, 0x72B1, 0x72B2, 0x738F, 0x793C, + 0x808D, 0x808E, 0x827B, 0x8D71, 0x8FB9, 0x9096, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x909A, 0x4E24, 0x4E71, 0x4E9C, 0x4F45, + 0x4F4A, 0x4F39, 0x4F37, 0x4F32, 0x4F42, 0x4F44, 0x4F4B, 0x4F40, + 0x4F35, 0x4F31, 0x5151, 0x5150, 0x514E, 0x519D, 0x51B5, 0x51B8, + 0x51EC, 0x5223, 0x5227, 0x5226, 0x521F, 0x522B, 0x5220, 0x52B4, + 0x52B3, 0x5325, 0x533B, 0x5374, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 06 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x544D, 0x543A, 0x5444, 0x544C, 0x5423, 0x541A, 0x5432, + 0x544B, 0x5421, 0x5434, 0x5449, 0x5450, 0x5422, 0x543F, 0x5451, + 0x545A, 0x542F, 0x56E9, 0x56F2, 0x56F3, 0x56EF, 0x56ED, 0x56EC, + 0x56E6, 0x5748, 0x5744, 0x573F, 0x573C, 0x5753, 0x5756, 0x575F, + 0x5743, 0x5758, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 07 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0x5757, + 0x5746, 0x573D, 0x5742, 0x5754, 0x5755, 0x58F1, 0x58F2, 0x58F0, + 0x590B, 0x9EA6, 0x56F1, 0x593D, 0x5994, 0x598C, 0x599C, 0x599F, + 0x599B, 0x5989, 0x599A, 0x6588, 0x5B8D, 0x5BFE, 0x5BFF, 0x5BFD, + 0x5C2B, 0x5C84, 0x5C8E, 0x5C9C, 0x5C85, 0x5DF5, 0x5E09, 0x5E0B, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0x5E92, 0x5E90, 0x5F03, + 0x5F1E, 0x5F63, 0x5FE7, 0x5FFE, 0x5FE6, 0x5FDC, 0x5FCE, 0x5FFC, + 0x5FDF, 0x5FEC, 0x5FF6, 0x5FF2, 0x5FF0, 0x5FF9, 0x6213, 0x623B, +plane 08 +at 0x00 + 0x623C, 0x6282, 0x6278, 0x628B, 0x629E, 0x62A5, 0x629B, 0x629C, + 0x6299, 0x628D, 0x6285, 0x629D, 0x6275, 0x65F6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x66F5, 0x675B, 0x6754, 0x6752, 0x6758, + 0x6744, 0x674A, 0x6761, 0x6C7F, 0x6C91, 0x6C9E, 0x6C6E, 0x6C7C, + 0x6C9F, 0x6C75, 0x6C56, 0x6CA2, 0x6C79, 0x6CA1, 0x6CAA, 0x6CA0, + 0x7079, 0x7077, 0x707E, 0x7075, 0x707B, 0x7264, 0x72BB, 0x72BC, + 0x72C7, 0x72B9, 0x72BE, 0x72B6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 09 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x7398, 0x7593, 0x7680, 0x7683, 0x76C0, 0x76C1, 0x77F4, + 0x77F5, 0x7ACC, 0x7ACD, 0x7CFA, 0x809F, 0x8091, 0x8097, 0x8094, + 0x8286, 0x828C, 0x8295, 0x866C, 0x8FBE, 0x8FC7, 0x8FC1, 0x90A9, + 0x90A4, 0x90A8, 0x9627, 0x9626, 0x962B, 0x9633, 0x9634, 0x9629, + 0x4E3D, 0x4E9D, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 10 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0x4F93, + 0x4F8A, 0x4F6D, 0x4F8E, 0x4FA0, 0x4FA2, 0x4FA1, 0x4F9F, 0x4FA3, + 0x4F72, 0x4F8C, 0x5156, 0x5190, 0x51ED, 0x51FE, 0x522F, 0x523C, + 0x5234, 0x5239, 0x52B9, 0x52B5, 0x52BF, 0x5355, 0x5376, 0x537A, + 0x5393, 0x53C1, 0x53C2, 0x53D5, 0x5485, 0x545F, 0x5493, 0x5489, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x8038, 0x8081, + 0x8158, 0x8A24, 0x8DC3, 0x51F2, 0x55B6, 0x5EC3, 0x7861, 0x7A01, + 0x8849, 0x8999, 0x921F, 0x5313, 0x55E0, 0x6139, 0x6ED7, 0x733D, + 0x9775, 0x7FE4, 0x8088, 0x5655, 0x617F, 0x71D7, 0x8666, 0x8F3A, + 0x933D, 0x64F5, 0x7F80, 0x8D01, 0x58E1, 0x7CE9, 0x81CB, 0x95D9, + 0x6707, 0x9A47, 0x7674, 0x5301, 0x53FA, 0x9F99, 0x6C49, 0x8FB7, + 0x4F29, 0x534E, 0x5C81, 0x5F10, 0x6268, 0x6742, 0x6740, 0x51EA, + 0x6C62, 0x7391, 0x8FBB, 0x8FBC, 0x56E8, 0x575B, 0x5C97, 0x6762, + 0x62A4, 0x6766, 0x6CA3, 0x707F, 0x77F6, 0x5479, 0x9EFE, 0x548F, + 0x5469, 0x546D, 0x5494, 0x546A, 0x548A, 0x56FD, 0x56FB, 0x56F8, + 0x56FC, 0x56F6, 0x5765, 0x5781, 0x5763, 0x5767, 0x576E, 0x5778, + 0x577F, 0x58F3, 0x594B, 0x594C, 0x59AD, 0x59C4, 0x59C2, 0x59B0, +plane 11 +at 0x00 + 0x59BF, 0x59C9, 0x59B8, 0x59AC, 0x59B7, 0x59D7, 0x8FC8, 0x4FAB, + 0x5C2D, 0x549C, 0x5788, 0x62C3, 0x6619, 0x67A1, 0x67A6, 0x77FE, + 0x7F57, 0x82C5, 0x8FDF, 0x8FDC, 0x4FE4, 0x551B, 0x57AA, 0x57AB, + 0x5BA9, 0x6811, 0x7551, 0x7553, 0x7818, 0x7AD7, 0x7C7E, 0x867E, + 0x5266, 0x5520, 0x5521, 0x57D7, 0x5BBE, 0x6857, 0x7F3C, 0x8273, + 0x96BE, 0x66FA, 0x5A72, 0x68BD, 0x6E15, 0x7413, 0x74F8, 0x7B3D, + 0x76D8, 0x79FC, 0x7B39, 0x7D4B, 0x83B9, 0x86CF, 0x8EAE, 0x96EB, + 0x55B0, 0x5840, 0x5842, 0x692B, 0x6916, 0x691B, 0x6927, 0x6BF5, + 0x6E82, 0x6E7A, 0x7129, 0x7CAB, 0x7CAC, 0x83F7, 0x9596, 0x55F1, + 0x5F41, 0x698A, 0x698C, 0x6980, 0x697F, 0x789C, 0x7B7B, 0x90D2, + 0x95A0, 0x51A9, 0x7195, 0x7198, 0x7478, 0x78B9, 0x7A33, 0x7CC0, + 0x7CC1, 0x8744, 0x9064, 0x9277, 0x92AF, 0x5E64, 0x6A2B, 0x6F46, + 0x6F9A, 0x92F2, 0x9B79, 0x567A, 0x5F5C, 0x65D9, 0x6A72, 0x6A78, + 0x6B5A, 0x8EBE, 0x933B, 0x9340, 0x933A, 0x9B96, 0x71F5, 0x7A50, + 0x9387, 0x9385, 0x9BB1, 0x9D47, 0x93B9, 0x93BF, 0x9BCF, 0x9D64, + 0x9EBF, 0x89B8, 0x9BF3, 0x7C4F, 0x9425, 0x95E6, 0x9C2F, 0x6B0C, + 0x9C47, 0x7936, 0x6B15, 0x53B5, 0x4F66, 0x4F68, 0x4FE7, 0x503F, + 0x50A6, 0x510F, 0x523E, 0x5324, 0x5365, 0x539B, 0x517F, 0x54CB, + 0x5573, 0x5571, 0x556B, 0x55F4, 0x5622, 0x5620, 0x5692, 0x56BA, + 0x5691, 0x56B0, 0x5759, 0x578A, 0x580F, 0x5812, 0x5813, 0x5847, + 0x589B, 0x5900, 0x594D, 0x5B60, 0x5B96, 0x5B9E, 0x5B94, 0x5B9F, + 0x5B9D, 0x5C00, 0x5C19, 0x5C49, 0x5C4A, 0x5CBB, 0x5CC1, 0x5CB9, + 0x5C9E, 0x5CB4, 0x5CBA, 0x5DF6, 0x5E13, 0x5E12, 0x5E77, 0x5E98, + 0x5E99, 0x5E9D, 0x5EF8, 0x5EF9, 0x5F06, 0x5F21, 0x5F25, 0x5F55, + 0x5F84, 0x5F83, 0x6030, 0x6007, 0x5AD1, 0x5AD3, 0x5B67, 0x5C57, + 0x5C77, 0x5CD5, 0x5D75, 0x5D8E, 0x5DA5, 0x5DB6, 0x5DBF, 0x5E65, + 0x5ECD, 0x5EED, 0x5F94, 0x5F9A, 0x5FBA, 0x6125, 0x6150, 0x62A3, + 0x6360, 0x6364, 0x63B6, 0x6403, 0x64B6, 0x651A, 0x7A25, 0x5C21, + 0x66E2, 0x6702, 0x67A4, 0x67AC, 0x6810, 0x6806, 0x685E, 0x685A, + 0x692C, 0x6929, 0x6A2D, 0x6A77, 0x6A7A, 0x6ACA, 0x6AE6, 0x6AF5, + 0x6B0D, 0x6B0E, 0x6BDC, 0x6BDD, 0x6BF6, 0x6C1E, 0x6C63, 0x6DA5, + 0x6E0F, 0x6E8A, 0x6E84, 0x6E8B, 0x6E7C, 0x6F4C, 0x6F48, 0x6F49, +plane 12 +at 0x00 + 0x6F9D, 0x6F99, 0x6FF8, 0x702E, 0x702D, 0x705C, 0x79CC, 0x70BF, + 0x70EA, 0x70E5, 0x7111, 0x7112, 0x713F, 0x7139, 0x713B, 0x713D, + 0x7177, 0x7175, 0x7176, 0x7171, 0x7196, 0x7193, 0x71B4, 0x71DD, + 0x71DE, 0x720E, 0x5911, 0x7218, 0x7347, 0x7348, 0x73EF, 0x7412, + 0x743B, 0x74A4, 0x748D, 0x74B4, 0x7673, 0x7677, 0x76BC, 0x7819, + 0x781B, 0x783D, 0x7853, 0x7854, 0x7858, 0x78B7, 0x78D8, 0x78EE, + 0x7922, 0x794D, 0x7986, 0x7999, 0x79A3, 0x79BC, 0x7AA7, 0x7B37, + 0x7B59, 0x7BD0, 0x7C2F, 0x7C32, 0x7C42, 0x7C4E, 0x7C68, 0x7CA9, + 0x7CED, 0x7DD0, 0x7E07, 0x7DD3, 0x7E64, 0x7F40, 0x8041, 0x8063, + 0x80BB, 0x6711, 0x6725, 0x8248, 0x8310, 0x8362, 0x8312, 0x8421, + 0x841E, 0x84E2, 0x84DE, 0x84E1, 0x8573, 0x85D4, 0x85F5, 0x8637, + 0x8645, 0x8672, 0x874A, 0x87A9, 0x87A5, 0x87F5, 0x8834, 0x8850, + 0x8887, 0x6036, 0x5FE9, 0x603D, 0x6008, 0x62BA, 0x62B2, 0x62B7, + 0x62E4, 0x62A7, 0x62D5, 0x62E1, 0x62DD, 0x62A6, 0x62C1, 0x62C5, + 0x62C0, 0x62DF, 0x62E0, 0x62DE, 0x6589, 0x65A6, 0x65BA, 0x65FF, + 0x6617, 0x6618, 0x6601, 0x65FE, 0x670C, 0x676B, 0x6796, 0x6782, + 0x678A, 0x67A3, 0x8954, 0x8984, 0x8B03, 0x8C52, 0x8CD8, 0x8D0C, + 0x8D18, 0x8DB0, 0x8EBC, 0x8ED5, 0x8FAA, 0x909C, 0x915C, 0x922B, + 0x9221, 0x9273, 0x92F4, 0x92F5, 0x933F, 0x9342, 0x9386, 0x93BE, + 0x93BC, 0x93BD, 0x93F1, 0x93F2, 0x93EF, 0x9422, 0x9423, 0x9424, + 0x9467, 0x9466, 0x9597, 0x95CE, 0x95E7, 0x973B, 0x974D, 0x98E4, + 0x9942, 0x9B1D, 0x9B98, 0x9D49, 0x6449, 0x5E71, 0x5E85, 0x61D3, + 0x990E, 0x8002, 0x781E, 0x5528, 0x5572, 0x55BA, 0x55F0, 0x55EE, + 0x56B8, 0x56B9, 0x56C4, 0x8053, 0x92B0, 0x4E13, 0x4E1A, 0x4E1B, + 0x4E1C, 0x4E1D, 0x4E25, 0x4E27, 0x4E2C, 0x4E34, 0x4E3A, 0x4E3E, + 0x4E4C, 0x4E50, 0x4E60, 0x4E61, 0x4E66, 0x4E70, 0x4E78, 0x4E9A, + 0x4EA7, 0x4EA9, 0x4EAA, 0x4EB5, 0x4EB8, 0x4EBB, 0x4EBF, 0x4ED1, + 0x4ED3, 0x4EEA, 0x4EEB, 0x4EEC, 0x4F1E, 0x4F1F, 0x4F20, 0x4F21, + 0x4F23, 0x4F24, 0x4F25, 0x4F26, 0x4F27, 0x4F2A, 0x4F2B, 0x4F65, + 0x4FA5, 0x4FA6, 0x4FA7, 0x4FA8, 0x4FA9, 0x4FAA, 0x4FAC, 0x4FE6, + 0x4FE8, 0x4FEA, 0x4FEB, 0x4FED, 0x503A, 0x503D, 0x503E, 0x507E, + 0x507F, 0x50A4, 0x50A5, 0x50A7, 0x50A8, 0x50A9, 0x5170, 0x5174, +plane 13 +at 0x00 + 0x517B, 0x517D, 0x5181, 0x519A, 0x519B, 0x519C, 0x51A7, 0x51AE, + 0x51AF, 0x51BB, 0x51EB, 0x51EF, 0x51FB, 0x51FC, 0x51FF, 0x520D, + 0x5219, 0x521A, 0x521B, 0x522C, 0x522D, 0x523F, 0x5240, 0x5242, + 0x5250, 0x5251, 0x528F, 0x52A1, 0x52A2, 0x52B2, 0x52CB, 0x67A2, + 0x678F, 0x67F9, 0x6780, 0x6B26, 0x6B27, 0x6B68, 0x6B69, 0x6B81, + 0x6BB4, 0x6BD1, 0x6C1C, 0x6C97, 0x6C6C, 0x6CDF, 0x6CEA, 0x6CE4, + 0x6CD8, 0x6CB2, 0x6CCE, 0x6CC8, 0x708B, 0x7088, 0x7090, 0x708F, + 0x7087, 0x7089, 0x708D, 0x7081, 0x708C, 0x7240, 0x7265, 0x7266, + 0x52DA, 0x5326, 0x532E, 0x5356, 0x5362, 0x536B, 0x5385, 0x538C, + 0x538D, 0x5390, 0x5395, 0x53A2, 0x53A3, 0x53BF, 0x53C6, 0x53C7, + 0x53D1, 0x53D8, 0x53FE, 0x5417, 0x5452, 0x5453, 0x5456, 0x5457, + 0x5458, 0x5459, 0x545B, 0x545C, 0x5497, 0x5499, 0x549B, 0x549D, + 0x54D1, 0x54D2, 0x54D3, 0x54D4, 0x54D5, 0x54D7, 0x54D9, 0x54DC, + 0x54DD, 0x54DF, 0x551D, 0x551E, 0x5522, 0x5523, 0x5524, 0x5525, + 0x5567, 0x556C, 0x556D, 0x556E, 0x556F, 0x5570, 0x5574, 0x5578, + 0x5579, 0x55B7, 0x55B9, 0x55BC, 0x55BE, 0x55EB, 0x55EC, 0x55F3, + 0x55F5, 0x5621, 0x5623, 0x5624, 0x5625, 0x565C, 0x565D, 0x567C, + 0x56A1, 0x56A3, 0x56A4, 0x56D6, 0x56E2, 0x56F4, 0x56F5, 0x56FE, + 0x5706, 0x5719, 0x5739, 0x573A, 0x575A, 0x575C, 0x575D, 0x575E, + 0x5760, 0x5784, 0x5785, 0x57AD, 0x57AF, 0x57B1, 0x57B2, 0x57D8, + 0x57D9, 0x57DA, 0x5811, 0x5816, 0x5846, 0x5899, 0x58B6, 0x58CB, + 0x58EA, 0x58F6, 0x58F8, 0x5907, 0x5939, 0x593A, 0x5941, 0x5942, + 0x5956, 0x5987, 0x5988, 0x59A9, 0x59AA, 0x59AB, 0x5A05, 0x5A06, + 0x5A07, 0x5A08, 0x5A32, 0x5A34, 0x5A74, 0x5A76, 0x5AAD, 0x5AD2, + 0x5AD4, 0x5AF1, 0x5AF2, 0x5B59, 0x5B6D, 0x5BA0, 0x5BA1, 0x5BAA, + 0x5BBD, 0x5BFB, 0x5BFC, 0x5C1C, 0x5C1D, 0x5C27, 0x5C34, 0x5C42, + 0x5C43, 0x5C66, 0x5C72, 0x5C7F, 0x5C82, 0x5C83, 0x5C96, 0x5C98, + 0x5C99, 0x5C9A, 0x5C9B, 0x5CBD, 0x5CBF, 0x7268, 0x72CD, 0x72D3, + 0x72DB, 0x72CF, 0x73A7, 0x73A3, 0x739E, 0x73AF, 0x73AA, 0x739C, + 0x7542, 0x7544, 0x753B, 0x7541, 0x759B, 0x759E, 0x79C4, 0x79C3, + 0x79C6, 0x79C7, 0x79CA, 0x7ACF, 0x7C76, 0x7C74, 0x7CFF, 0x7CFC, + 0x7F59, 0x80A8, 0x80B0, 0x80B3, 0x80A4, 0x80B6, 0x5CC2, 0x5CC3, +plane 14 +at 0x00 + 0x5CC4, 0x5CE3, 0x5CE4, 0x5CE7, 0x5D02, 0x5D03, 0x5D04, 0x5D05, + 0x5D2D, 0x5D58, 0x5D5A, 0x5D5D, 0x5DC5, 0x5DEF, 0x5E05, 0x5E0F, + 0x5E10, 0x5E1C, 0x5E26, 0x5E27, 0x5E31, 0x5E3B, 0x5E3C, 0x5E86, + 0x5E91, 0x5E93, 0x5E94, 0x5E9E, 0x5E9F, 0x5EBC, 0x5F20, 0x5F2A, + 0x5F5F, 0x5F68, 0x5F7B, 0x5F95, 0x6001, 0x6002, 0x6003, 0x6004, + 0x6005, 0x6006, 0x603B, 0x603C, 0x603F, 0x6076, 0x6078, 0x6079, + 0x607A, 0x607B, 0x607D, 0x60AB, 0x60AC, 0x60AD, 0x60AF, 0x60EB, + 0x60EC, 0x60ED, 0x60EF, 0x6124, 0x6126, 0x6151, 0x61D1, 0x61D2, + 0x61D4, 0x6206, 0x620B, 0x6217, 0x6269, 0x626A, 0x626B, 0x626C, + 0x629F, 0x62A0, 0x62A1, 0x62A2, 0x62E2, 0x62E3, 0x62E6, 0x62E7, + 0x62E8, 0x62E9, 0x631A, 0x631C, 0x631D, 0x631E, 0x6320, 0x6322, + 0x6324, 0x6325, 0x6326, 0x635E, 0x635F, 0x6361, 0x6362, 0x6363, + 0x63B3, 0x63B7, 0x63B8, 0x63B9, 0x63BC, 0x63FB, 0x63FC, 0x63FD, + 0x63FF, 0x6400, 0x6401, 0x6402, 0x6404, 0x6405, 0x6444, 0x6445, + 0x6448, 0x644A, 0x6484, 0x64B5, 0x64B7, 0x64B8, 0x64BA, 0x64DD, + 0x64DE, 0x6512, 0x6569, 0x6586, 0x658F, 0x6593, 0x65A9, 0x65F7, + 0x65F8, 0x663D, 0x663E, 0x6653, 0x6654, 0x6655, 0x6656, 0x6682, + 0x66A7, 0x6743, 0x6767, 0x6768, 0x6769, 0x67A5, 0x67A7, 0x67A8, + 0x67AA, 0x67AB, 0x67AD, 0x67FD, 0x6807, 0x6808, 0x6809, 0x680A, + 0x680B, 0x680C, 0x680E, 0x80A7, 0x80AC, 0x80A6, 0x5367, 0x820E, + 0x82C4, 0x833E, 0x829C, 0x82AA, 0x82C9, 0x82A6, 0x82B2, 0x8FCC, + 0x8FD9, 0x8FCA, 0x8FD8, 0x8FCF, 0x90B7, 0x90AD, 0x90B9, 0x9637, + 0x9641, 0x963E, 0x9751, 0x9763, 0x4E57, 0x4E79, 0x4EB2, 0x4EB0, + 0x4EAF, 0x4EB1, 0x4FD2, 0x4FD5, 0x680F, 0x6860, 0x6861, 0x6862, + 0x6864, 0x6865, 0x6866, 0x6868, 0x6869, 0x686A, 0x68BE, 0x68BF, + 0x68C0, 0x691D, 0x691F, 0x6920, 0x6924, 0x692D, 0x6984, 0x6987, + 0x6988, 0x6989, 0x69DA, 0x69DB, 0x69DC, 0x69DF, 0x69E0, 0x6A2F, + 0x6A31, 0x6A79, 0x6A7C, 0x6AA9, 0x6B7C, 0x6B87, 0x6B92, 0x6B93, + 0x6B9A, 0x6BC2, 0x6BD5, 0x6BD9, 0x6C07, 0x6C22, 0x6C29, 0x6C47, + 0x6C48, 0x6C64, 0x6CA4, 0x6CA5, 0x6CA6, 0x6CA7, 0x6CA8, 0x6CA9, + 0x6CF6, 0x6CF7, 0x6CF8, 0x6CFA, 0x6CFB, 0x6CFC, 0x6CFD, 0x6CFE, + 0x6D46, 0x6D47, 0x6D48, 0x6D49, 0x6D4A, 0x6D4B, 0x6D4D, 0x6D4E, +plane 15 +at 0x00 + 0x6D4F, 0x6D50, 0x6D51, 0x6D52, 0x6D53, 0x6D54, 0x6D55, 0x6D9D, + 0x6D9F, 0x6DA0, 0x6DA1, 0x6DA2, 0x6DA3, 0x6DA4, 0x6DA6, 0x6DA7, + 0x6DA8, 0x6DA9, 0x6E0D, 0x6E0E, 0x6E10, 0x6E11, 0x6E14, 0x6E16, + 0x6E81, 0x6E83, 0x6E85, 0x6E87, 0x6EDF, 0x6EE0, 0x6EE1, 0x6EE2, + 0x6EE4, 0x6EE5, 0x6EE7, 0x6EEA, 0x6F47, 0x6F4B, 0x6F4D, 0x6F9B, + 0x6F9C, 0x6FD1, 0x6FD2, 0x704F, 0x706D, 0x7080, 0x709C, 0x709D, + 0x709E, 0x70BC, 0x70BD, 0x70C1, 0x70C2, 0x70C3, 0x70E6, 0x70E7, + 0x70E8, 0x70E9, 0x70EB, 0x70EC, 0x70ED, 0x7115, 0x7116, 0x7118, + 0x7140, 0x71F7, 0x7231, 0x7237, 0x724D, 0x7275, 0x728A, 0x72B7, + 0x72B8, 0x72C8, 0x72DE, 0x72EE, 0x72EF, 0x72F0, 0x72F1, 0x72F2, + 0x7303, 0x7321, 0x736D, 0x7399, 0x739A, 0x739B, 0x73AE, 0x73B0, + 0x73B1, 0x4FBE, 0x4FB8, 0x4FB0, 0x4FB1, 0x4FC8, 0x4FC6, 0x4FCC, + 0x4FE5, 0x4FE3, 0x4FB4, 0x516A, 0x519F, 0x51C1, 0x51C2, 0x51C3, + 0x5245, 0x5248, 0x524F, 0x52C5, 0x52CA, 0x52C4, 0x5327, 0x5358, + 0x537D, 0x53DD, 0x53DC, 0x53DA, 0x53D9, 0x54B9, 0x54D0, 0x54B4, + 0x54CA, 0x54A3, 0x73D1, 0x73F0, 0x73F2, 0x740E, 0x740F, 0x7410, + 0x7437, 0x7477, 0x748E, 0x74D2, 0x7519, 0x7534, 0x7535, 0x7545, + 0x758D, 0x7596, 0x759F, 0x75A0, 0x75A1, 0x75AC, 0x75AD, 0x75AE, + 0x75AF, 0x75C8, 0x75C9, 0x75D6, 0x75E8, 0x75EA, 0x75EB, 0x7605, + 0x7617, 0x7618, 0x762A, 0x762B, 0x763E, 0x763F, 0x765D, 0x765E, + 0x7663, 0x7666, 0x766B, 0x7691, 0x76B1, 0x76B2, 0x76CF, 0x76D0, + 0x76D1, 0x770D, 0x772C, 0x7750, 0x7751, 0x7786, 0x7792, 0x7793, + 0x77CB, 0x77EB, 0x77FF, 0x7800, 0x7801, 0x7816, 0x7817, 0x781A, + 0x781C, 0x7839, 0x783B, 0x783E, 0x7840, 0x7841, 0x7855, 0x7856, + 0x7857, 0x7859, 0x785A, 0x785B, 0x7875, 0x7877, 0x789B, 0x78D7, + 0x78D9, 0x7903, 0x7933, 0x7943, 0x794E, 0x796F, 0x7978, 0x79EF, + 0x79FE, 0x7A06, 0x7A23, 0x7A51, 0x7A52, 0x7A5E, 0x7A77, 0x7A8D, + 0x7A8E, 0x7A9C, 0x7A9D, 0x7AA5, 0x7AA6, 0x7AAD, 0x7AD6, 0x7ADE, + 0x7B03, 0x7B15, 0x7B3A, 0x7B3C, 0x7B3E, 0x7B5A, 0x7B5B, 0x7B5C, + 0x7B7C, 0x7B7E, 0x7B7F, 0x7B80, 0x7BA6, 0x7BA7, 0x7BA8, 0x7BA9, + 0x7BAB, 0x7BD1, 0x7BD3, 0x7BEE, 0x7BEF, 0x7C16, 0x7C41, 0x7CAA, + 0x7CF9, 0x7D27, 0x7D77, 0x7DD4, 0x7E06, 0x7E9F, 0x7EA0, 0x7EA1, +plane 16 +at 0x00 + 0x7EA2, 0x7EA3, 0x7EA4, 0x7EA5, 0x7EA6, 0x7EA7, 0x7EA8, 0x7EA9, + 0x7EAA, 0x7EAB, 0x7EAC, 0x7EAD, 0x7EAE, 0x7EAF, 0x7EB0, 0x7EB1, + 0x7EB2, 0x7EB3, 0x7EB4, 0x7EB5, 0x7EB6, 0x7EB7, 0x7EB8, 0x54DA, + 0x54A4, 0x54B2, 0x549E, 0x549F, 0x54B5, 0x54CD, 0x54CC, 0x5700, + 0x57AC, 0x5791, 0x578E, 0x578D, 0x5792, 0x57A1, 0x5790, 0x57A6, + 0x57A8, 0x579C, 0x5796, 0x57A7, 0x58F5, 0x5909, 0x5908, 0x5952, + 0x59DF, 0x59EB, 0x59EF, 0x59F0, 0x59D5, 0x5A0D, 0x5A04, 0x59F9, + 0x7EB9, 0x7EBA, 0x7EBB, 0x7EBC, 0x7EBD, 0x7EBE, 0x7EBF, 0x7EC0, + 0x7EC1, 0x7EC2, 0x7EC3, 0x7EC4, 0x7EC5, 0x7EC6, 0x7EC7, 0x7EC8, + 0x7EC9, 0x7ECA, 0x7ECB, 0x7ECC, 0x7ECD, 0x7ECE, 0x7ECF, 0x7ED0, + 0x7ED1, 0x7ED2, 0x7ED3, 0x7ED4, 0x7ED5, 0x7ED6, 0x7ED7, 0x7ED8, + 0x7ED9, 0x7EDA, 0x7EDB, 0x7EDC, 0x7EDD, 0x7EDE, 0x7EDF, 0x7EE0, + 0x7EE1, 0x7EE2, 0x7EE3, 0x7EE4, 0x7EE5, 0x7EE6, 0x7EE7, 0x7EE8, + 0x7EE9, 0x7EEA, 0x7EEB, 0x7EEC, 0x7EED, 0x7EEE, 0x7EEF, 0x7EF0, + 0x7EF1, 0x7EF2, 0x7EF3, 0x7EF4, 0x7EF5, 0x7EF6, 0x7EF7, 0x7EF8, + 0x7EF9, 0x7EFA, 0x7EFB, 0x7EFC, 0x7EFD, 0x7EFE, 0x7EFF, 0x7F00, + 0x7F01, 0x7F02, 0x7F03, 0x7F04, 0x7F05, 0x7F06, 0x7F07, 0x7F08, + 0x7F09, 0x7F0A, 0x7F0B, 0x7F0C, 0x7F0D, 0x7F0E, 0x7F0F, 0x7F10, + 0x7F11, 0x7F12, 0x7F13, 0x7F14, 0x7F15, 0x7F16, 0x7F17, 0x7F18, + 0x7F19, 0x7F1A, 0x7F1B, 0x7F1C, 0x7F1D, 0x7F1E, 0x7F1F, 0x7F20, + 0x7F21, 0x7F22, 0x7F23, 0x7F24, 0x7F25, 0x7F26, 0x7F27, 0x7F28, + 0x7F29, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, 0x7F2E, 0x7F2F, 0x7F30, + 0x7F31, 0x7F32, 0x7F33, 0x7F34, 0x7F35, 0x7F42, 0x7F49, 0x7F56, + 0x7F5A, 0x7F74, 0x7F81, 0x7F9F, 0x7FD8, 0x7FD9, 0x7FDA, 0x8022, + 0x8027, 0x8042, 0x804B, 0x804C, 0x804D, 0x8054, 0x8069, 0x8080, + 0x8083, 0x80A0, 0x80BC, 0x80BD, 0x80BE, 0x80BF, 0x80C0, 0x80C1, + 0x80E7, 0x80E8, 0x80E9, 0x80EA, 0x80EB, 0x5A02, 0x59F8, 0x59E2, + 0x59D9, 0x59E7, 0x5B6A, 0x5BAB, 0x5C1B, 0x5C2F, 0x663C, 0x5CD1, + 0x5CDC, 0x5CE6, 0x5CE1, 0x5CCD, 0x5CE2, 0x5CDD, 0x5CE5, 0x5DFB, + 0x5DFA, 0x5E1E, 0x5EA1, 0x5EFC, 0x5EFB, 0x5F2F, 0x5F66, 0x605C, + 0x604E, 0x6051, 0x6023, 0x6031, 0x607C, 0x6060, 0x80EC, 0x810C, + 0x810D, 0x810E, 0x810F, 0x8110, 0x8111, 0x8112, 0x8113, 0x8132, +plane 17 +at 0x00 + 0x8136, 0x8137, 0x8138, 0x8156, 0x8159, 0x815A, 0x817B, 0x817C, + 0x817E, 0x8191, 0x81A5, 0x81B6, 0x81DC, 0x8206, 0x8223, 0x8230, + 0x8231, 0x823B, 0x823E, 0x8254, 0x8270, 0x8282, 0x8288, 0x8297, + 0x82C7, 0x82C8, 0x82CB, 0x82CC, 0x82CD, 0x82CE, 0x82CF, 0x830F, + 0x8311, 0x8313, 0x8314, 0x8315, 0x8359, 0x835A, 0x835B, 0x835C, + 0x835D, 0x835E, 0x835F, 0x8360, 0x8361, 0x8364, 0x8365, 0x8366, + 0x8367, 0x8368, 0x8369, 0x836A, 0x836B, 0x836C, 0x836D, 0x836E, + 0x836F, 0x83B2, 0x83B3, 0x83B4, 0x83B6, 0x83B8, 0x83BA, 0x83BC, + 0x841A, 0x841C, 0x841D, 0x8424, 0x8425, 0x8426, 0x8427, 0x8428, + 0x8487, 0x8489, 0x848C, 0x84DD, 0x84DF, 0x84E0, 0x84E3, 0x84E5, + 0x84E6, 0x8537, 0x8539, 0x853A, 0x853C, 0x8572, 0x8574, 0x85D3, + 0x8614, 0x864F, 0x867F, 0x8680, 0x8681, 0x8682, 0x8683, 0x86AC, + 0x86F0, 0x86F1, 0x86F2, 0x86F3, 0x86F4, 0x8717, 0x8748, 0x877E, + 0x8780, 0x87A8, 0x87CF, 0x8854, 0x8865, 0x886C, 0x8885, 0x8886, + 0x88AD, 0x88AF, 0x88C6, 0x88C7, 0x88C8, 0x88E2, 0x88E3, 0x88E4, + 0x88E5, 0x8934, 0x8947, 0x8955, 0x8980, 0x89C1, 0x89C2, 0x89C3, + 0x89C4, 0x89C5, 0x89C6, 0x89C7, 0x89C8, 0x89C9, 0x89CA, 0x89CB, + 0x89CC, 0x89CD, 0x89CE, 0x89CF, 0x89D0, 0x89D1, 0x89DE, 0x89EF, + 0x8A01, 0x8A1A, 0x8A5F, 0x604A, 0x6061, 0x6218, 0x631F, 0x6317, + 0x62EA, 0x6321, 0x6304, 0x6305, 0x6531, 0x6544, 0x6540, 0x6542, + 0x65BE, 0x6629, 0x661B, 0x6623, 0x662C, 0x661A, 0x6630, 0x663B, + 0x661E, 0x6637, 0x6638, 0x670E, 0x67E8, 0x67D6, 0x67C7, 0x67BC, + 0x6852, 0x67BF, 0x67D5, 0x67FE, 0x8A8A, 0x8BA0, 0x8BA1, 0x8BA2, + 0x8BA3, 0x8BA4, 0x8BA5, 0x8BA6, 0x8BA7, 0x8BA8, 0x8BA9, 0x8BAA, + 0x8BAB, 0x8BAC, 0x8BAD, 0x8BAE, 0x8BAF, 0x8BB0, 0x8BB1, 0x8BB2, + 0x8BB3, 0x8BB4, 0x8BB5, 0x8BB6, 0x8BB7, 0x8BB8, 0x8BB9, 0x8BBA, + 0x8BBB, 0x8BBC, 0x8BBD, 0x8BBE, 0x8BBF, 0x8BC0, 0x8BC1, 0x8BC2, + 0x8BC3, 0x8BC4, 0x8BC5, 0x8BC6, 0x8BC7, 0x8BC8, 0x8BC9, 0x8BCA, + 0x8BCB, 0x8BCC, 0x8BCD, 0x8BCE, 0x8BCF, 0x8BD0, 0x8BD1, 0x8BD2, + 0x8BD3, 0x8BD4, 0x8BD5, 0x8BD6, 0x8BD7, 0x8BD8, 0x8BD9, 0x8BDA, + 0x8BDB, 0x8BDC, 0x8BDD, 0x8BDE, 0x8BDF, 0x8BE0, 0x8BE1, 0x8BE2, + 0x8BE3, 0x8BE4, 0x8BE5, 0x8BE6, 0x8BE7, 0x8BE8, 0x8BE9, 0x8BEA, +plane 18 +at 0x00 + 0x8BEB, 0x8BEC, 0x8BED, 0x8BEE, 0x8BEF, 0x8BF0, 0x8BF1, 0x8BF2, + 0x8BF3, 0x8BF4, 0x8BF5, 0x8BF6, 0x8BF7, 0x8BF8, 0x8BF9, 0x8BFA, + 0x8BFB, 0x8BFC, 0x8BFD, 0x8BFE, 0x8BFF, 0x8C00, 0x8C01, 0x8C02, + 0x8C03, 0x8C04, 0x8C05, 0x8C06, 0x8C07, 0x8C08, 0x8C09, 0x8C0A, + 0x8C0B, 0x8C0C, 0x8C0D, 0x8C0E, 0x8C0F, 0x8C10, 0x8C11, 0x8C12, + 0x8C13, 0x8C14, 0x8C15, 0x8C16, 0x8C17, 0x8C18, 0x8C19, 0x8C1A, + 0x8C1B, 0x8C1C, 0x8C1D, 0x8C1E, 0x8C1F, 0x8C20, 0x8C21, 0x8C22, + 0x8C23, 0x8C24, 0x8C25, 0x8C26, 0x8C27, 0x8C28, 0x8C29, 0x8C2A, + 0x8C2B, 0x8C2C, 0x8C2D, 0x8C2E, 0x8C2F, 0x8C30, 0x8C31, 0x8C32, + 0x8C33, 0x8C34, 0x8C35, 0x8C36, 0x8C6E, 0x8D1D, 0x8D1E, 0x8D1F, + 0x8D20, 0x8363, 0x67FB, 0x67B1, 0x6801, 0x6805, 0x6800, 0x67D7, + 0x6B2A, 0x6B6B, 0x6BE1, 0x6D23, 0x6CFF, 0x6D14, 0x6D05, 0x6D13, + 0x6D06, 0x6D21, 0x6D15, 0x6CAF, 0x6CF4, 0x6D02, 0x6D45, 0x6D26, + 0x6D44, 0x6D24, 0x70A5, 0x70A3, 0x70A2, 0x70BB, 0x70A0, 0x70AA, + 0x70A8, 0x70B6, 0x8D21, 0x8D22, 0x8D23, 0x8D24, 0x8D25, 0x8D26, + 0x8D27, 0x8D28, 0x8D29, 0x8D2A, 0x8D2B, 0x8D2C, 0x8D2D, 0x8D2E, + 0x8D2F, 0x8D30, 0x8D31, 0x8D32, 0x8D33, 0x8D34, 0x8D35, 0x8D36, + 0x8D37, 0x8D38, 0x8D39, 0x8D3A, 0x8D3B, 0x8D3C, 0x8D3D, 0x8D3E, + 0x8D3F, 0x8D40, 0x8D41, 0x8D42, 0x8D43, 0x8D44, 0x8D45, 0x8D46, + 0x8D47, 0x8D48, 0x8D49, 0x8D4A, 0x8D4B, 0x8D4C, 0x8D4D, 0x8D4E, + 0x8D4F, 0x8D50, 0x8D51, 0x8D52, 0x8D53, 0x8D54, 0x8D55, 0x8D56, + 0x8D57, 0x8D58, 0x8D59, 0x8D5A, 0x8D5B, 0x8D5C, 0x8D5D, 0x8D5E, + 0x8D5F, 0x8D60, 0x8D61, 0x8D62, 0x8D63, 0x8D6A, 0x8D75, 0x8DB1, + 0x8DB8, 0x8DC4, 0x8DDE, 0x8DF6, 0x8DF7, 0x8DF8, 0x8DF9, 0x8DFB, + 0x8E0C, 0x8E0E, 0x8E2C, 0x8E2D, 0x8E2F, 0x8E52, 0x8E7E, 0x8E7F, + 0x8E80, 0x8E8F, 0x8E9C, 0x8ECE, 0x8F66, 0x8F67, 0x8F68, 0x8F69, + 0x8F6A, 0x8F6B, 0x8F6C, 0x8F6D, 0x8F6E, 0x8F6F, 0x8F70, 0x8F71, + 0x8F72, 0x8F73, 0x8F74, 0x8F75, 0x8F76, 0x8F77, 0x8F78, 0x8F79, + 0x8F7A, 0x8F7B, 0x8F7C, 0x8F7D, 0x8F7E, 0x8F7F, 0x8F80, 0x8F81, + 0x8F82, 0x8F83, 0x8F84, 0x8F85, 0x8F86, 0x8F87, 0x8F88, 0x8F89, + 0x8F8A, 0x8F8B, 0x8F8C, 0x8F8D, 0x8F8E, 0x8F8F, 0x8F90, 0x8F91, + 0x8F92, 0x8F93, 0x8F94, 0x8F95, 0x8F96, 0x8F97, 0x8F98, 0x8F99, +plane 19 +at 0x00 + 0x8F9A, 0x8FA9, 0x8FAB, 0x8FBD, 0x8FDB, 0x8FDD, 0x8FDE, 0x8FF3, + 0x900A, 0x9026, 0x9057, 0x909D, 0x90AC, 0x90BA, 0x90BB, 0x70B2, + 0x70A7, 0x70B9, 0x722E, 0x723C, 0x726D, 0x72E7, 0x72ED, 0x72EC, + 0x72E5, 0x72E2, 0x73C4, 0x73BD, 0x73CF, 0x73C9, 0x73C1, 0x73D0, + 0x73CE, 0x74ED, 0x74EB, 0x74EF, 0x7549, 0x7550, 0x7546, 0x754A, + 0x754D, 0x75A6, 0x75A8, 0x76C7, 0x76FF, 0x76FD, 0x77E6, 0x780A, + 0x90CF, 0x90D0, 0x90D1, 0x90D3, 0x90E6, 0x90E7, 0x90F8, 0x9142, + 0x915D, 0x915E, 0x9166, 0x9171, 0x917D, 0x917E, 0x917F, 0x91CA, + 0x91D2, 0x91FA, 0x922A, 0x9274, 0x933E, 0x9341, 0x93F0, 0x9426, + 0x9485, 0x9486, 0x9487, 0x9488, 0x9489, 0x948A, 0x948B, 0x948C, + 0x948D, 0x948E, 0x948F, 0x9490, 0x9491, 0x9492, 0x9493, 0x9494, + 0x9495, 0x9496, 0x9497, 0x9498, 0x9499, 0x949A, 0x949B, 0x949C, + 0x949D, 0x949E, 0x949F, 0x94A0, 0x94A1, 0x94A2, 0x94A3, 0x94A4, + 0x94A5, 0x94A6, 0x94A7, 0x94A8, 0x94A9, 0x94AA, 0x94AB, 0x94AC, + 0x94AD, 0x94AE, 0x94AF, 0x94B0, 0x94B1, 0x94B2, 0x94B3, 0x94B4, + 0x94B5, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BB, 0x94BC, + 0x94BD, 0x94BE, 0x94BF, 0x94C0, 0x94C1, 0x94C2, 0x94C3, 0x94C4, + 0x94C5, 0x94C6, 0x94C7, 0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, + 0x94CD, 0x94CE, 0x94CF, 0x94D0, 0x94D1, 0x94D2, 0x94D3, 0x94D4, + 0x94D5, 0x94D6, 0x94D7, 0x94D8, 0x94D9, 0x94DA, 0x94DB, 0x94DC, + 0x94DD, 0x94DE, 0x94DF, 0x94E0, 0x94E1, 0x94E2, 0x94E3, 0x94E4, + 0x94E5, 0x94E6, 0x94E7, 0x94E8, 0x94E9, 0x94EA, 0x94EB, 0x94EC, + 0x94ED, 0x94EE, 0x94EF, 0x94F0, 0x94F1, 0x94F2, 0x94F3, 0x94F4, + 0x94F5, 0x94F6, 0x94F7, 0x94F8, 0x94F9, 0x94FA, 0x94FB, 0x94FC, + 0x94FD, 0x94FE, 0x94FF, 0x9500, 0x9501, 0x9502, 0x9503, 0x9504, + 0x9505, 0x9506, 0x9507, 0x9508, 0x9509, 0x7804, 0x780B, 0x7807, + 0x7815, 0x7808, 0x79D3, 0x79D4, 0x79D0, 0x79D7, 0x7A7C, 0x7A7D, + 0x7A83, 0x7A82, 0x7AD4, 0x7AD5, 0x7AD3, 0x7AD0, 0x7AD2, 0x7AFE, + 0x7AFC, 0x7C77, 0x7C7C, 0x7C7B, 0x7F8F, 0x80D3, 0x80CB, 0x80D2, + 0x8109, 0x80E2, 0x80DF, 0x80C6, 0x8224, 0x82F7, 0x950A, 0x950B, + 0x950C, 0x950D, 0x950E, 0x950F, 0x9510, 0x9511, 0x9512, 0x9513, + 0x9514, 0x9515, 0x9516, 0x9517, 0x9518, 0x9519, 0x951A, 0x951B, +plane 20 +at 0x00 + 0x951C, 0x951D, 0x951E, 0x951F, 0x9520, 0x9521, 0x9522, 0x9523, + 0x9524, 0x9525, 0x9526, 0x9527, 0x9528, 0x9529, 0x952A, 0x952B, + 0x952C, 0x952D, 0x952E, 0x952F, 0x9530, 0x9531, 0x9532, 0x9533, + 0x9534, 0x9535, 0x9536, 0x9537, 0x9538, 0x9539, 0x953A, 0x953B, + 0x953C, 0x953D, 0x953E, 0x953F, 0x9540, 0x9541, 0x9542, 0x9543, + 0x9544, 0x9545, 0x9546, 0x9547, 0x9548, 0x9549, 0x954A, 0x954B, + 0x954C, 0x954D, 0x954E, 0x954F, 0x9550, 0x9551, 0x9552, 0x9553, + 0x9554, 0x9555, 0x9556, 0x9557, 0x9558, 0x9559, 0x955A, 0x955B, + 0x955C, 0x955D, 0x955E, 0x955F, 0x9560, 0x9561, 0x9562, 0x9563, + 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956A, 0x956B, + 0x956C, 0x956D, 0x956E, 0x956F, 0x9570, 0x9571, 0x9572, 0x9573, + 0x9574, 0x9575, 0x9576, 0x957F, 0x95E8, 0x95E9, 0x95EA, 0x95EB, + 0x95EC, 0x95ED, 0x95EE, 0x95EF, 0x95F0, 0x95F1, 0x95F2, 0x95F3, + 0x95F4, 0x95F5, 0x95F6, 0x95F7, 0x95F8, 0x95F9, 0x95FA, 0x95FB, + 0x95FC, 0x95FD, 0x95FE, 0x95FF, 0x9600, 0x9601, 0x9602, 0x9603, + 0x9604, 0x9605, 0x9606, 0x9607, 0x9608, 0x9609, 0x960A, 0x960B, + 0x960C, 0x960D, 0x960E, 0x960F, 0x9610, 0x9611, 0x9612, 0x9613, + 0x9614, 0x9615, 0x9616, 0x82D8, 0x82DD, 0x82F8, 0x82FC, 0x82E9, + 0x82EE, 0x82D0, 0x830E, 0x82E2, 0x830B, 0x82FD, 0x5179, 0x8676, + 0x8678, 0x8675, 0x867D, 0x8842, 0x8866, 0x898C, 0x8A05, 0x8A06, + 0x8C9F, 0x8FF1, 0x8FE7, 0x8FE9, 0x8FEF, 0x90C2, 0x90BC, 0x90C6, + 0x90C0, 0x90CD, 0x90C9, 0x90C4, 0x9617, 0x9618, 0x9619, 0x961A, + 0x961B, 0x961F, 0x9635, 0x9636, 0x9645, 0x9646, 0x9647, 0x9648, + 0x9649, 0x9667, 0x9668, 0x9669, 0x9690, 0x96E0, 0x96F3, 0x96FE, + 0x9701, 0x972D, 0x9753, 0x9754, 0x9765, 0x9791, 0x9792, 0x97AF, + 0x97E6, 0x97E7, 0x97E8, 0x97E9, 0x97EA, 0x97EB, 0x97EC, 0x9875, + 0x9876, 0x9877, 0x9878, 0x9879, 0x987A, 0x987B, 0x987C, 0x987D, + 0x987E, 0x987F, 0x9880, 0x9881, 0x9882, 0x9883, 0x9884, 0x9885, + 0x9886, 0x9887, 0x9888, 0x9889, 0x988A, 0x988B, 0x988C, 0x988D, + 0x988E, 0x988F, 0x9890, 0x9891, 0x9892, 0x9893, 0x9894, 0x9895, + 0x9896, 0x9897, 0x9898, 0x9899, 0x989A, 0x989B, 0x989C, 0x989D, + 0x989E, 0x989F, 0x98A0, 0x98A1, 0x98A2, 0x98A3, 0x98A4, 0x98A5, +plane 21 +at 0x00 + 0x98A6, 0x98A7, 0x98CE, 0x98CF, 0x98D0, 0x98D1, 0x98D2, 0x98D3, + 0x98D4, 0x98D5, 0x98D6, 0x98D7, 0x98D8, 0x98D9, 0x98DA, 0x98DE, + 0x98E0, 0x98E8, 0x990D, 0x990F, 0x9962, 0x9963, 0x9964, 0x9965, + 0x9966, 0x9967, 0x9968, 0x9969, 0x996A, 0x996B, 0x996C, 0x996D, + 0x996E, 0x996F, 0x9970, 0x9971, 0x9972, 0x9973, 0x9974, 0x9975, + 0x9976, 0x9977, 0x9978, 0x9979, 0x997A, 0x997B, 0x997C, 0x997D, + 0x997E, 0x997F, 0x9980, 0x9981, 0x9982, 0x9983, 0x9984, 0x9985, + 0x9986, 0x9987, 0x9988, 0x9989, 0x998A, 0x998B, 0x998C, 0x998D, + 0x998E, 0x998F, 0x9990, 0x9991, 0x9992, 0x9993, 0x9994, 0x9995, + 0x9A6C, 0x9581, 0x9CEC, 0x5032, 0x4FF9, 0x501D, 0x4FFF, 0x5004, + 0x4FF0, 0x5003, 0x5002, 0x4FFC, 0x4FF2, 0x5024, 0x5008, 0x5036, + 0x502E, 0x5010, 0x5038, 0x5039, 0x4FFD, 0x5056, 0x4FFB, 0x51A3, + 0x51A6, 0x51A1, 0x51C7, 0x51C9, 0x5260, 0x5264, 0x5259, 0x5265, + 0x5267, 0x5257, 0x9A6D, 0x9A6E, 0x9A6F, 0x9A70, 0x9A71, 0x9A72, + 0x9A73, 0x9A74, 0x9A75, 0x9A76, 0x9A77, 0x9A78, 0x9A79, 0x9A7A, + 0x9A7B, 0x9A7C, 0x9A7D, 0x9A7E, 0x9A7F, 0x9A80, 0x9A81, 0x9A82, + 0x9A83, 0x9A84, 0x9A85, 0x9A86, 0x9A87, 0x9A88, 0x9A89, 0x9A8A, + 0x9A8B, 0x9A8C, 0x9A8D, 0x9A8E, 0x9A8F, 0x9A90, 0x9A91, 0x9A92, + 0x9A93, 0x9A94, 0x9A95, 0x9A96, 0x9A97, 0x9A98, 0x9A99, 0x9A9A, + 0x9A9B, 0x9A9C, 0x9A9D, 0x9A9E, 0x9A9F, 0x9AA0, 0x9AA1, 0x9AA2, + 0x9AA3, 0x9AA4, 0x9AA5, 0x9AA6, 0x9AA7, 0x9ACB, 0x9ACC, 0x9B13, + 0x9B47, 0x9C7C, 0x9C7D, 0x9C7E, 0x9C7F, 0x9C80, 0x9C81, 0x9C82, + 0x9C83, 0x9C84, 0x9C85, 0x9C86, 0x9C87, 0x9C88, 0x9C89, 0x9C8A, + 0x9C8B, 0x9C8C, 0x9C8D, 0x9C8E, 0x9C8F, 0x9C90, 0x9C91, 0x9C92, + 0x9C93, 0x9C94, 0x9C95, 0x9C96, 0x9C97, 0x9C98, 0x9C99, 0x9C9A, + 0x9C9B, 0x9C9C, 0x9C9D, 0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, + 0x9CA3, 0x9CA4, 0x9CA5, 0x9CA6, 0x9CA7, 0x9CA8, 0x9CA9, 0x9CAA, + 0x9CAB, 0x9CAC, 0x9CAD, 0x9CAE, 0x9CAF, 0x9CB0, 0x9CB1, 0x9CB2, + 0x9CB3, 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CB8, 0x9CB9, 0x9CBA, + 0x9CBB, 0x9CBC, 0x9CBD, 0x9CBE, 0x9CBF, 0x9CC0, 0x9CC1, 0x9CC2, + 0x9CC3, 0x9CC4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CC8, 0x9CC9, 0x9CCA, + 0x9CCB, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD1, 0x9CD2, +plane 22 +at 0x00 + 0x9CD3, 0x9CD4, 0x9CD5, 0x9CD6, 0x9CD7, 0x9CD8, 0x9CD9, 0x5263, + 0x5253, 0x52CF, 0x52CE, 0x52D0, 0x52D1, 0x52CC, 0x550D, 0x54F4, + 0x5513, 0x54EF, 0x54F5, 0x54F9, 0x5502, 0x5500, 0x5518, 0x54F0, + 0x54F6, 0x5519, 0x5705, 0x57C9, 0x57B7, 0x57CD, 0x57BE, 0x57BB, + 0x57DB, 0x57C8, 0x57C4, 0x57C5, 0x57D1, 0x57CA, 0x57C0, 0x5A21, + 0x9CDA, 0x9CDB, 0x9CDC, 0x9CDD, 0x9CDE, 0x9CDF, 0x9CE0, 0x9CE1, + 0x9CE2, 0x9CE3, 0x9CE4, 0x9E1F, 0x9E20, 0x9E21, 0x9E22, 0x9E23, + 0x9E24, 0x9E25, 0x9E26, 0x9E27, 0x9E28, 0x9E29, 0x9E2A, 0x9E2B, + 0x9E2C, 0x9E2D, 0x9E2E, 0x9E2F, 0x9E30, 0x9E31, 0x9E32, 0x9E33, + 0x9E34, 0x9E35, 0x9E36, 0x9E37, 0x9E38, 0x9E39, 0x9E3A, 0x9E3B, + 0x9E3C, 0x9E3D, 0x9E3E, 0x9E3F, 0x9E40, 0x9E41, 0x9E42, 0x9E43, + 0x9E44, 0x9E45, 0x9E46, 0x9E47, 0x9E48, 0x9E49, 0x9E4A, 0x9E4B, + 0x9E4C, 0x9E4D, 0x9E4E, 0x9E4F, 0x9E50, 0x9E51, 0x9E52, 0x9E53, + 0x9E54, 0x9E55, 0x9E56, 0x9E57, 0x9E58, 0x9E59, 0x9E5A, 0x9E5B, + 0x9E5C, 0x9E5D, 0x9E5E, 0x9E5F, 0x9E60, 0x9E61, 0x9E62, 0x9E63, + 0x9E64, 0x9E65, 0x9E66, 0x9E67, 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, + 0x9E6C, 0x9E6D, 0x9E6E, 0x9E6F, 0x9E70, 0x9E71, 0x9E72, 0x9E73, + 0x9E74, 0x9E7E, 0x9EC9, 0x9EE1, 0x9EE9, 0x9EEA, 0x9F0B, 0x9F0C, + 0x9F0D, 0x9F51, 0x9F7F, 0x9F80, 0x9F81, 0x9F82, 0x9F83, 0x9F84, + 0x9F85, 0x9F86, 0x9F87, 0x9F88, 0x9F89, 0x9F8A, 0x9F8B, 0x9F8C, + 0x9F9A, 0x9F9B, 0x9F9F, 0x4E06, 0x4E37, 0x4E44, 0x4E4A, 0x4E55, + 0x4E5B, 0x4E64, 0x4E65, 0x4E67, 0x4E6B, 0x4E6C, 0x4E6D, 0x4E6E, + 0x4E6F, 0x4E72, 0x4E76, 0x4E77, 0x4E7A, 0x4E7B, 0x4E7C, 0x4E7D, + 0x4E8A, 0x4E90, 0x4EBD, 0x4ED2, 0x4EED, 0x4FA4, 0x4FAD, 0x503B, + 0x50F2, 0x516F, 0x517A, 0x51E6, 0x51E7, 0x5A2A, 0x5A1D, 0x5A0B, + 0x5A22, 0x5A24, 0x5A14, 0x5A31, 0x5A2F, 0x5A1A, 0x5A12, 0x5A26, + 0x5BBC, 0x5BBB, 0x5BB7, 0x5C05, 0x5C06, 0x5C52, 0x5C53, 0x5CFA, + 0x5CEB, 0x5CF3, 0x5CF5, 0x5CE9, 0x5CEF, 0x5E2A, 0x5E30, 0x5E2E, + 0x5E2C, 0x5E2F, 0x5EAF, 0x5EA9, 0x5EFD, 0x5F32, 0x51E9, 0x5271, + 0x5302, 0x5381, 0x5391, 0x53BC, 0x5414, 0x5455, 0x54D8, 0x54DB, + 0x551C, 0x551F, 0x5569, 0x55B8, 0x55BD, 0x55ED, 0x561A, 0x565B, + 0x56A2, 0x56CE, 0x56D5, 0x5726, 0x5737, 0x5738, 0x5786, 0x5789, +plane 23 +at 0x00 + 0x57B0, 0x57B3, 0x57D6, 0x5815, 0x5841, 0x586E, 0x5870, 0x58B8, + 0x58B9, 0x58CC, 0x58D7, 0x58E5, 0x58ED, 0x591E, 0x593B, 0x5B36, + 0x5B5E, 0x5B91, 0x5BC9, 0x5C02, 0x5C26, 0x5C2E, 0x5C32, 0x5C76, + 0x5CBC, 0x5CBE, 0x5CC5, 0x5CE0, 0x5D2B, 0x5D5C, 0x5D76, 0x5DEA, + 0x5DEC, 0x5DED, 0x5DFC, 0x5E49, 0x5EE4, 0x5F09, 0x5F16, 0x5F45, + 0x5FC6, 0x603A, 0x603E, 0x6077, 0x6184, 0x61F4, 0x6244, 0x6255, + 0x6256, 0x62E5, 0x6318, 0x6327, 0x63B4, 0x63B5, 0x63BB, 0x6442, + 0x655B, 0x657D, 0x657E, 0x65C0, 0x65D5, 0x663F, 0x6683, 0x66FB, + 0x66FD, 0x6730, 0x6741, 0x6763, 0x6764, 0x67A0, 0x67A9, 0x6802, + 0x6803, 0x680D, 0x685B, 0x685C, 0x685D, 0x685F, 0x6863, 0x6867, + 0x688D, 0x68BA, 0x68BB, 0x68BC, 0x68C2, 0x6919, 0x691A, 0x6921, + 0x6922, 0x6923, 0x6926, 0x6928, 0x697E, 0x6981, 0x698B, 0x69DD, + 0x69DE, 0x6A2E, 0x6A30, 0x6A73, 0x6A74, 0x6A75, 0x6A7B, 0x6AC9, + 0x6AE4, 0x6AF7, 0x6B05, 0x6B1F, 0x6BA9, 0x6BB1, 0x6BDF, 0x6BEE, + 0x6C0E, 0x6C17, 0x6C35, 0x6C3A, 0x6C3D, 0x6D4C, 0x6D9C, 0x6D9E, + 0x6E13, 0x6E7F, 0x6E8C, 0x6EDE, 0x6FF9, 0x704E, 0x7050, 0x7114, + 0x713C, 0x713E, 0x7155, 0x5F8E, 0x5F93, 0x5F8F, 0x604F, 0x6099, + 0x607E, 0x6074, 0x604B, 0x6073, 0x6075, 0x6056, 0x60A9, 0x608B, + 0x60A6, 0x6093, 0x60AE, 0x609E, 0x60A7, 0x6245, 0x632E, 0x6352, + 0x6330, 0x635B, 0x6319, 0x631B, 0x6331, 0x635D, 0x6337, 0x6335, + 0x6353, 0x635C, 0x633F, 0x654B, 0x7173, 0x71F6, 0x7233, 0x725C, + 0x72A0, 0x731F, 0x7320, 0x7339, 0x7363, 0x7364, 0x73F1, 0x7411, + 0x748F, 0x7491, 0x74E7, 0x74F0, 0x74F1, 0x74F2, 0x74FC, 0x7505, + 0x753C, 0x7552, 0x7560, 0x7569, 0x7573, 0x7574, 0x7582, 0x7597, + 0x75E9, 0x7604, 0x7606, 0x764D, 0x767A, 0x770C, 0x77C8, 0x783A, + 0x783C, 0x783F, 0x7872, 0x7873, 0x7874, 0x78B5, 0x78B6, 0x78F5, + 0x7916, 0x7934, 0x793B, 0x7985, 0x79F4, 0x79FD, 0x7A24, 0x7A43, + 0x7A5D, 0x7A63, 0x7AC3, 0x7B02, 0x7B07, 0x7B5D, 0x7B7A, 0x7B7D, + 0x7B9A, 0x7BAA, 0x7BCF, 0x7BD2, 0x7C13, 0x7C14, 0x7C17, 0x7C31, + 0x7C61, 0x7C82, 0x7C8F, 0x7C90, 0x7CAD, 0x7CD8, 0x7D26, 0x7D9A, + 0x7D9B, 0x7DD5, 0x7E05, 0x7E28, 0x7E4A, 0x7E4B, 0x7E67, 0x7E83, + 0x7E90, 0x7F53, 0x7FAA, 0x8062, 0x810B, 0x8133, 0x8135, 0x8157, +plane 24 +at 0x00 + 0x81A4, 0x81D3, 0x8217, 0x822E, 0x824D, 0x825D, 0x8260, 0x827A, + 0x82C6, 0x83B1, 0x83B5, 0x83BB, 0x8419, 0x8420, 0x8422, 0x8485, + 0x848A, 0x848B, 0x84D9, 0x84DC, 0x8536, 0x85AD, 0x85AE, 0x8612, + 0x8630, 0x8644, 0x86AB, 0x86CD, 0x86CE, 0x86EF, 0x8749, 0x874B, + 0x877F, 0x87A6, 0x87A7, 0x87D0, 0x8864, 0x88AE, 0x88B0, 0x88C3, + 0x88C4, 0x88C5, 0x8904, 0x891C, 0x891D, 0x8945, 0x8968, 0x8977, + 0x8A33, 0x8A89, 0x8AAD, 0x8AAE, 0x8ADA, 0x8B21, 0x8B5B, 0x8B72, + 0x8B8F, 0x8CCE, 0x8DE5, 0x8DF5, 0x8E7D, 0x8E9B, 0x8EB5, 0x8EBB, + 0x8EC5, 0x658B, 0x659A, 0x6650, 0x6646, 0x664E, 0x6640, 0x664B, + 0x6648, 0x6660, 0x6644, 0x664D, 0x6837, 0x6824, 0x681B, 0x6836, + 0x682C, 0x6819, 0x6856, 0x6847, 0x683E, 0x681E, 0x6815, 0x6822, + 0x6827, 0x6859, 0x6858, 0x6855, 0x6830, 0x6823, 0x6B2E, 0x6B2B, + 0x6B30, 0x6B6C, 0x8EC8, 0x8EE2, 0x8EE3, 0x8F0C, 0x8F4C, 0x8FBA, + 0x8FDA, 0x8FF2, 0x9027, 0x9039, 0x9056, 0x9065, 0x915B, 0x9197, + 0x91A4, 0x91B8, 0x91C8, 0x91E1, 0x91FB, 0x91FC, 0x9228, 0x9229, + 0x922C, 0x9271, 0x9344, 0x93BA, 0x9421, 0x9441, 0x9453, 0x958A, + 0x95AA, 0x95CF, 0x9665, 0x9666, 0x967A, 0x974C, 0x974E, 0x974F, + 0x9771, 0x9786, 0x9790, 0x982C, 0x98AA, 0x98B4, 0x98C5, 0x98EE, + 0x99C5, 0x99F2, 0x9A12, 0x9A13, 0x9A28, 0x9AC5, 0x9B36, 0x9B5E, + 0x9B78, 0x9B97, 0x9BB2, 0x9BB4, 0x9BCE, 0x9BD0, 0x9BD1, 0x9BF1, + 0x9BF2, 0x9BF5, 0x9C18, 0x9C19, 0x9C1A, 0x9C30, 0x9C5A, 0x9C5B, + 0x9C5C, 0x9C69, 0x9C6A, 0x9C6B, 0x9C70, 0x9CF0, 0x9D0E, 0x9D2B, + 0x9D2C, 0x9D46, 0x9D48, 0x9D65, 0x9D8E, 0x9D8F, 0x9DAB, 0x9DC6, + 0x9E78, 0x9EB8, 0x9EB9, 0x9EBA, 0x9F21, 0x9F62, 0, 0, + 0x3000, 0xFF0C, 0x3001, 0x3002, 0xFF0E, 0x2027, 0xFF1B, 0xFF1A, + 0xFF1F, 0xFF01, 0xFE30, 0x2026, 0x2025, 0xFE50, 0xFE51, 0xFE52, + 0x00B7, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFF5C, 0x2015, 0xFE31, + 0x2014, 0xFE33, 0x2574, 0xFE34, 0xFE4F, 0xFF08, 0xFF09, 0xFE35, + 0xFE36, 0xFF5B, 0xFF5D, 0xFE37, 0xFE38, 0x3014, 0x3015, 0xFE39, + 0xFE3A, 0x3010, 0x3011, 0xFE3B, 0xFE3C, 0x300A, 0x300B, 0xFE3D, + 0xFE3E, 0x3008, 0x3009, 0xFE3F, 0xFE40, 0x300C, 0x300D, 0xFE41, + 0xFE42, 0x300E, 0x300F, 0xFE43, 0xFE44, 0xFE59, 0xFE5A, 0x6B8B, +plane 25 +at 0x00 + 0x6BE9, 0x6BEA, 0x6BE5, 0x6D6B, 0x6D73, 0x6D57, 0x6D5D, 0x6D56, + 0x6D8F, 0x6D5B, 0x6D1C, 0x6D9A, 0x6D9B, 0x6D99, 0x6D81, 0x6D71, + 0x6D72, 0x6D5C, 0x6D96, 0x70C4, 0x70DB, 0x70CC, 0x70D0, 0x70E3, + 0x70DF, 0x70D6, 0x70EE, 0x70D5, 0x727A, 0x72F5, 0x7302, 0x73E2, + 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0x2018, 0x2019, 0x201C, 0x201D, + 0x301D, 0x301E, 0x2035, 0x2032, 0xFF03, 0xFF06, 0xFF0A, 0x203B, + 0x00A7, 0x3003, 0x25CB, 0x25CF, 0x25B3, 0x25B2, 0x25CE, 0x2606, + 0x2605, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25BD, 0x25BC, 0x32A3, + 0x2105, 0x203E, 0xFFE3, 0xFF3F, 0x02CD, 0xFE49, 0xFE4A, 0xFE4D, + 0xFE4E, 0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, 0xFE61, 0xFF0B, 0xFF0D, + 0x00D7, 0x00F7, 0x00B1, 0x221A, 0xFF1C, 0xFF1E, 0xFF1D, 0x2266, + 0x2267, 0x2260, 0x221E, 0x2252, 0x2261, 0xFE62, 0xFE63, 0xFE64, + 0xFE65, 0xFE66, 0xFF5E, 0x2229, 0x222A, 0x22A5, 0x2220, 0x221F, + 0x22BF, 0x33D2, 0x33D1, 0x222B, 0x222E, 0x2235, 0x2234, 0x2640, + 0x2642, 0x2295, 0x2299, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, + 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0xFF0F, 0xFF3C, 0x2215, + 0xFE68, 0xFF04, 0xFFE5, 0x3012, 0xFFE0, 0xFFE1, 0xFF05, 0xFF20, + 0x2103, 0x2109, 0xFE69, 0xFE6A, 0xFE6B, 0x33D5, 0x339C, 0x339D, + 0x339E, 0x33CE, 0x33A1, 0x338E, 0x338F, 0x33C4, 0x00B0, 0x5159, + 0x515B, 0x515E, 0x515D, 0x5161, 0x5163, 0x55E7, 0x74E9, 0x7CCE, + 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, + 0x258F, 0x258E, 0x258D, 0x258C, 0x258B, 0x258A, 0x2589, 0x253C, + 0x2534, 0x252C, 0x2524, 0x251C, 0x2594, 0x2500, 0x2502, 0x2595, + 0x250C, 0x2510, 0x2514, 0x2518, 0x256D, 0x73EC, 0x73D5, 0x73F9, + 0x73DF, 0x73E6, 0x73E4, 0x73E1, 0x74F3, 0x7556, 0x7555, 0x7558, + 0x7557, 0x755E, 0x75C3, 0x75B4, 0x75B1, 0x76CB, 0x76CC, 0x772A, + 0x7716, 0x770F, 0x773F, 0x772B, 0x770E, 0x7724, 0x7721, 0x7718, + 0x77DD, 0x7824, 0x7836, 0x7958, 0x7959, 0x7962, 0x256E, 0x2570, + 0x256F, 0x2501, 0x251D, 0x253F, 0x2525, 0x25E2, 0x25E3, 0x25E5, + 0x25E4, 0x2571, 0x2572, 0x2573, 0xFF10, 0xFF11, 0xFF12, 0xFF13, + 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0x2160, 0x2161, + 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, +plane 26 +at 0x00 + 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, + 0x3029, 0x5341, 0x5344, 0x5345, 0xFF21, 0xFF22, 0xFF23, 0xFF24, + 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, + 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, + 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF41, 0xFF42, + 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, + 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, + 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, + 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, + 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, + 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, + 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, + 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, + 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, + 0x310D, 0x310E, 0x310F, 0x79DA, 0x79D9, 0x79E1, 0x79E5, 0x79E8, + 0x79DB, 0x79E2, 0x79F0, 0x7ADA, 0x7ADD, 0x7ADB, 0x7ADC, 0x7B0D, + 0x7B0B, 0x7B14, 0x7C8E, 0x7C86, 0x7C87, 0x7C83, 0x7C8B, 0x7D24, + 0x7D25, 0x7F62, 0x7F93, 0x7F99, 0x7F97, 0x7FC4, 0x7FC6, 0x800A, + 0x8040, 0x803C, 0x803B, 0x80F6, 0x3110, 0x3111, 0x3112, 0x3113, + 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311A, 0x311B, + 0x311C, 0x311D, 0x311E, 0x311F, 0x3120, 0x3121, 0x3122, 0x3123, + 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x02D9, 0x02C9, + 0x02CA, 0x02C7, 0x02CB, 0x2400, 0x2401, 0x2402, 0x2403, 0x2404, + 0x2405, 0x2406, 0x2407, 0x2408, 0x2409, 0x240A, 0x240B, 0x240C, + 0x240D, 0x240E, 0x240F, 0x2410, 0x2411, 0x2412, 0x2413, 0x2414, + 0x2415, 0x2416, 0x2417, 0x2418, 0x2419, 0x241A, 0x241B, 0x241C, + 0x241D, 0x241E, 0x241F, 0x2421, 0x532C, 0x5359, 0x5368, 0x537E, + 0x53A1, 0x555B, 0x5542, 0x5547, 0x553D, 0x5560, 0x57EB, 0x595F, + 0x5B6F, 0x5C5A, 0x5FA2, 0x5F9D, 0x5FA3, 0x60C2, 0x60A5, 0x621C, + 0x621D, 0x6395, 0x639A, 0x63A6, 0x6550, 0x6552, 0x65C8, 0x6658, + 0x6888, 0x6BB8, 0x4E00, 0x4E59, 0x4E01, 0x4E03, 0x4E43, 0x4E5D, +plane 27 +at 0x00 + 0x4E86, 0x4E8C, 0x4EBA, 0x513F, 0x5165, 0x516B, 0x51E0, 0x5200, + 0x5201, 0x529B, 0x5315, 0x5341, 0x535C, 0x53C8, 0x4E09, 0x4E0B, + 0x4E08, 0x4E0A, 0x4E2B, 0x4E38, 0x51E1, 0x4E45, 0x4E48, 0x4E5F, + 0x4E5E, 0x4E8E, 0x4EA1, 0x5140, 0x5203, 0x52FA, 0x5343, 0x53C9, + 0x53E3, 0x571F, 0x58EB, 0x5915, 0x5927, 0x5973, 0x5B50, 0x5B51, + 0x5B53, 0x5BF8, 0x5C0F, 0x5C22, 0x5C38, 0x5C71, 0x5DDD, 0x5DE5, + 0x5DF1, 0x5DF2, 0x5DF3, 0x5DFE, 0x5E72, 0x5EFE, 0x5F0B, 0x5F13, + 0x624D, 0x80FF, 0x80EE, 0x8104, 0x8103, 0x8107, 0x80F7, 0x822D, + 0x8227, 0x8229, 0x831F, 0x8357, 0x8321, 0x8318, 0x8358, 0x8684, + 0x869F, 0x869B, 0x8689, 0x86A6, 0x8692, 0x868F, 0x86A0, 0x884F, + 0x8878, 0x887A, 0x886E, 0x887B, 0x8884, 0x8873, 0x8A0D, 0x8A0B, + 0x8A19, 0x8ED0, 0x4E11, 0x4E10, 0x4E0D, 0x4E2D, 0x4E30, 0x4E39, + 0x4E4B, 0x5C39, 0x4E88, 0x4E91, 0x4E95, 0x4E92, 0x4E94, 0x4EA2, + 0x4EC1, 0x4EC0, 0x4EC3, 0x4EC6, 0x4EC7, 0x4ECD, 0x4ECA, 0x4ECB, + 0x4EC4, 0x5143, 0x5141, 0x5167, 0x516D, 0x516E, 0x516C, 0x5197, + 0x51F6, 0x5206, 0x5207, 0x5208, 0x52FB, 0x52FE, 0x52FF, 0x5316, + 0x5339, 0x5348, 0x5347, 0x5345, 0x535E, 0x5384, 0x53CB, 0x53CA, + 0x53CD, 0x58EC, 0x5929, 0x592B, 0x592A, 0x592D, 0x5B54, 0x5C11, + 0x5C24, 0x5C3A, 0x5C6F, 0x5DF4, 0x5E7B, 0x5EFF, 0x5F14, 0x5F15, + 0x5FC3, 0x6208, 0x6236, 0x624B, 0x624E, 0x652F, 0x6587, 0x6597, + 0x65A4, 0x65B9, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62, + 0x6B79, 0x6BCB, 0x6BD4, 0x6BDB, 0x6C0F, 0x6C34, 0x706B, 0x722A, + 0x7236, 0x723B, 0x7247, 0x7259, 0x725B, 0x72AC, 0x738B, 0x4E19, + 0x4E16, 0x4E15, 0x4E14, 0x4E18, 0x4E3B, 0x4E4D, 0x4E4F, 0x4E4E, + 0x4EE5, 0x4ED8, 0x4ED4, 0x4ED5, 0x4ED6, 0x4ED7, 0x4EE3, 0x4EE4, + 0x4ED9, 0x4EDE, 0x5145, 0x5144, 0x5189, 0x518A, 0x51AC, 0x51F9, + 0x51FA, 0x51F8, 0x520A, 0x52A0, 0x529F, 0x5305, 0x5306, 0x5317, + 0x531D, 0x4EDF, 0x534A, 0x5349, 0x5361, 0x5360, 0x536F, 0x536E, + 0x53BB, 0x53EF, 0x53E4, 0x53F3, 0x53EC, 0x53EE, 0x53E9, 0x53E8, + 0x53FC, 0x53F8, 0x53F5, 0x53EB, 0x53E6, 0x53EA, 0x53F2, 0x53F1, + 0x53F0, 0x53E5, 0x53ED, 0x53FB, 0x56DB, 0x56DA, 0x5916, 0x8FF9, + 0x9009, 0x9008, 0x90DE, 0x9151, 0x91DB, 0x91DF, 0x91DE, 0x91D6, +plane 28 +at 0x00 + 0x91E0, 0x9585, 0x9660, 0x9659, 0x9656, 0x96BD, 0x5042, 0x5059, + 0x5044, 0x5066, 0x5052, 0x5054, 0x5071, 0x5050, 0x507B, 0x507C, + 0x5058, 0x5079, 0x506C, 0x5078, 0x51A8, 0x51D1, 0x51CF, 0x5268, + 0x592E, 0x5931, 0x5974, 0x5976, 0x5B55, 0x5B83, 0x5C3C, 0x5DE8, + 0x5DE7, 0x5DE6, 0x5E02, 0x5E03, 0x5E73, 0x5E7C, 0x5F01, 0x5F18, + 0x5F17, 0x5FC5, 0x620A, 0x6253, 0x6254, 0x6252, 0x6251, 0x65A5, + 0x65E6, 0x672E, 0x672C, 0x672A, 0x672B, 0x672D, 0x6B63, 0x6BCD, + 0x6C11, 0x6C10, 0x6C38, 0x6C41, 0x6C40, 0x6C3E, 0x72AF, 0x7384, + 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7529, 0x7530, + 0x7531, 0x7532, 0x7533, 0x758B, 0x767D, 0x76AE, 0x76BF, 0x76EE, + 0x77DB, 0x77E2, 0x77F3, 0x793A, 0x79BE, 0x7A74, 0x7ACB, 0x4E1E, + 0x4E1F, 0x4E52, 0x4E53, 0x4E69, 0x4E99, 0x4EA4, 0x4EA6, 0x4EA5, + 0x4EFF, 0x4F09, 0x4F19, 0x4F0A, 0x4F15, 0x4F0D, 0x4F10, 0x4F11, + 0x4F0F, 0x4EF2, 0x4EF6, 0x4EFB, 0x4EF0, 0x4EF3, 0x4EFD, 0x4F01, + 0x4F0B, 0x5149, 0x5147, 0x5146, 0x5148, 0x5168, 0x5171, 0x518D, + 0x51B0, 0x5217, 0x5211, 0x5212, 0x520E, 0x5216, 0x52A3, 0x5308, + 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540F, 0x540C, 0x540A, + 0x5410, 0x5401, 0x540B, 0x5404, 0x5411, 0x540D, 0x5408, 0x5403, + 0x540E, 0x5406, 0x5412, 0x56E0, 0x56DE, 0x56DD, 0x5733, 0x5730, + 0x5728, 0x572D, 0x572C, 0x572F, 0x5729, 0x5919, 0x591A, 0x5937, + 0x5938, 0x5984, 0x5978, 0x5983, 0x597D, 0x5979, 0x5982, 0x5981, + 0x5B57, 0x5B58, 0x5B87, 0x5B88, 0x5B85, 0x5B89, 0x5BFA, 0x5C16, + 0x5C79, 0x5DDE, 0x5E06, 0x5E76, 0x5E74, 0x5276, 0x52D4, 0x53A0, + 0x53C4, 0x5558, 0x554C, 0x5568, 0x5549, 0x555D, 0x5529, 0x5554, + 0x5553, 0x555A, 0x553A, 0x553F, 0x552B, 0x57EA, 0x57EF, 0x57DD, + 0x57FE, 0x57DE, 0x57E6, 0x57E8, 0x57FF, 0x5803, 0x58F7, 0x68A6, + 0x591F, 0x595B, 0x595D, 0x595E, 0x5A2B, 0x5A3B, 0x5F0F, 0x5F1B, + 0x5FD9, 0x5FD6, 0x620E, 0x620C, 0x620D, 0x6210, 0x6263, 0x625B, + 0x6258, 0x6536, 0x65E9, 0x65E8, 0x65EC, 0x65ED, 0x66F2, 0x66F3, + 0x6709, 0x673D, 0x6734, 0x6731, 0x6735, 0x6B21, 0x6B64, 0x6B7B, + 0x6C16, 0x6C5D, 0x6C57, 0x6C59, 0x6C5F, 0x6C60, 0x6C50, 0x6C55, + 0x6C61, 0x6C5B, 0x6C4D, 0x6C4E, 0x7070, 0x725F, 0x725D, 0x767E, +plane 29 +at 0x00 + 0x7AF9, 0x7C73, 0x7CF8, 0x7F36, 0x7F8A, 0x7FBD, 0x8001, 0x8003, + 0x800C, 0x8012, 0x8033, 0x807F, 0x8089, 0x808B, 0x808C, 0x81E3, + 0x81EA, 0x81F3, 0x81FC, 0x820C, 0x821B, 0x821F, 0x826E, 0x8272, + 0x827E, 0x866B, 0x8840, 0x884C, 0x8863, 0x897F, 0x9621, 0x4E32, + 0x4EA8, 0x4F4D, 0x4F4F, 0x4F47, 0x4F57, 0x4F5E, 0x4F34, 0x4F5B, + 0x4F55, 0x4F30, 0x4F50, 0x4F51, 0x4F3D, 0x4F3A, 0x4F38, 0x4F43, + 0x4F54, 0x4F3C, 0x4F46, 0x4F63, 0x4F5C, 0x4F60, 0x4F2F, 0x4F4E, + 0x4F36, 0x4F59, 0x4F5D, 0x4F48, 0x4F5A, 0x514C, 0x514B, 0x514D, + 0x5175, 0x51B6, 0x51B7, 0x5225, 0x5224, 0x5229, 0x522A, 0x5228, + 0x52AB, 0x52A9, 0x52AA, 0x52AC, 0x5323, 0x5373, 0x5375, 0x541D, + 0x542D, 0x541E, 0x543E, 0x5426, 0x544E, 0x5427, 0x5446, 0x5443, + 0x5433, 0x5448, 0x5442, 0x541B, 0x5429, 0x544A, 0x5439, 0x543B, + 0x5438, 0x542E, 0x5435, 0x5436, 0x5420, 0x543C, 0x5440, 0x5431, + 0x542B, 0x541F, 0x542C, 0x56EA, 0x56F0, 0x56E4, 0x56EB, 0x574A, + 0x5751, 0x5740, 0x574D, 0x5A61, 0x5A3A, 0x5A6E, 0x5A4B, 0x5A6B, + 0x5A45, 0x5A4E, 0x5A68, 0x5A3D, 0x5A71, 0x5A3F, 0x5A6F, 0x5A75, + 0x5A73, 0x5A2C, 0x5A59, 0x5A54, 0x5A4F, 0x5A63, 0x5BC8, 0x5BC3, + 0x5C5B, 0x5C61, 0x5D21, 0x5D0A, 0x5D09, 0x5D2C, 0x5D08, 0x5D2A, + 0x5D15, 0x5D10, 0x5D13, 0x5D2F, 0x5747, 0x574E, 0x573E, 0x5750, + 0x574F, 0x573B, 0x58EF, 0x593E, 0x599D, 0x5992, 0x59A8, 0x599E, + 0x59A3, 0x5999, 0x5996, 0x598D, 0x59A4, 0x5993, 0x598A, 0x59A5, + 0x5B5D, 0x5B5C, 0x5B5A, 0x5B5B, 0x5B8C, 0x5B8B, 0x5B8F, 0x5C2C, + 0x5C40, 0x5C41, 0x5C3F, 0x5C3E, 0x5C90, 0x5C91, 0x5C94, 0x5C8C, + 0x5DEB, 0x5E0C, 0x5E8F, 0x5E87, 0x5E8A, 0x5EF7, 0x5F04, 0x5F1F, + 0x5F64, 0x5F62, 0x5F77, 0x5F79, 0x5FD8, 0x5FCC, 0x5FD7, 0x5FCD, + 0x5FF1, 0x5FEB, 0x5FF8, 0x5FEA, 0x6212, 0x6211, 0x6284, 0x6297, + 0x6296, 0x6280, 0x6276, 0x6289, 0x626D, 0x628A, 0x627C, 0x627E, + 0x6279, 0x6273, 0x6292, 0x626F, 0x6298, 0x626E, 0x6295, 0x6293, + 0x6291, 0x6286, 0x6539, 0x653B, 0x6538, 0x65F1, 0x66F4, 0x675F, + 0x674E, 0x674F, 0x6750, 0x6751, 0x675C, 0x6756, 0x675E, 0x6749, + 0x6746, 0x6760, 0x6753, 0x6757, 0x6B65, 0x6BCF, 0x6C42, 0x6C5E, + 0x6C99, 0x6C81, 0x6C88, 0x6C89, 0x6C85, 0x6C9B, 0x6C6A, 0x6C7A, +plane 30 +at 0x00 + 0x6C90, 0x6C70, 0x6C8C, 0x6C68, 0x6C96, 0x6C92, 0x6C7D, 0x6C83, + 0x6C72, 0x6C7E, 0x6C74, 0x6C86, 0x6C76, 0x6C8D, 0x6C94, 0x6C98, + 0x6C82, 0x7076, 0x707C, 0x707D, 0x7078, 0x7262, 0x7261, 0x7260, + 0x72C4, 0x72C2, 0x7396, 0x752C, 0x752B, 0x7537, 0x7538, 0x7682, + 0x76EF, 0x77E3, 0x79C1, 0x79C0, 0x79BF, 0x7A76, 0x7CFB, 0x7F55, + 0x8096, 0x8093, 0x809D, 0x8098, 0x809B, 0x809A, 0x80B2, 0x826F, + 0x8292, 0x5D18, 0x5DE3, 0x5E39, 0x5E35, 0x5E3A, 0x5E32, 0x5EBB, + 0x5EBA, 0x5F34, 0x5F39, 0x6098, 0x60D0, 0x60D7, 0x60AA, 0x60A1, + 0x60A4, 0x60EE, 0x60E7, 0x60E8, 0x60DE, 0x637E, 0x638B, 0x6379, + 0x6386, 0x6393, 0x6373, 0x636A, 0x636C, 0x637F, 0x63B2, 0x63BA, + 0x6366, 0x6374, 0x828B, 0x828D, 0x898B, 0x89D2, 0x8A00, 0x8C37, + 0x8C46, 0x8C55, 0x8C9D, 0x8D64, 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, + 0x8F9B, 0x8FB0, 0x8FC2, 0x8FC6, 0x8FC5, 0x8FC4, 0x5DE1, 0x9091, + 0x90A2, 0x90AA, 0x90A6, 0x90A3, 0x9149, 0x91C6, 0x91CC, 0x9632, + 0x962E, 0x9631, 0x962A, 0x962C, 0x4E26, 0x4E56, 0x4E73, 0x4E8B, + 0x4E9B, 0x4E9E, 0x4EAB, 0x4EAC, 0x4F6F, 0x4F9D, 0x4F8D, 0x4F73, + 0x4F7F, 0x4F6C, 0x4F9B, 0x4F8B, 0x4F86, 0x4F83, 0x4F70, 0x4F75, + 0x4F88, 0x4F69, 0x4F7B, 0x4F96, 0x4F7E, 0x4F8F, 0x4F91, 0x4F7A, + 0x5154, 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51BD, + 0x51FD, 0x523B, 0x5238, 0x5237, 0x523A, 0x5230, 0x522E, 0x5236, + 0x5241, 0x52BE, 0x52BB, 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, + 0x5377, 0x5378, 0x5379, 0x53D6, 0x53D4, 0x53D7, 0x5473, 0x5475, + 0x5496, 0x5478, 0x5495, 0x5480, 0x547B, 0x5477, 0x5484, 0x5492, + 0x5486, 0x547C, 0x5490, 0x5471, 0x5476, 0x548C, 0x549A, 0x5462, + 0x5468, 0x548B, 0x547D, 0x548E, 0x56FA, 0x5783, 0x5777, 0x576A, + 0x5769, 0x5761, 0x5766, 0x5764, 0x577C, 0x591C, 0x5949, 0x5947, + 0x5948, 0x5944, 0x5954, 0x59BE, 0x59BB, 0x59D4, 0x59B9, 0x59AE, + 0x59D1, 0x59C6, 0x59D0, 0x59CD, 0x59CB, 0x59D3, 0x59CA, 0x59AF, + 0x59B3, 0x59D2, 0x59C5, 0x5B5F, 0x5B64, 0x5B63, 0x5B97, 0x5B9A, + 0x5B98, 0x5B9C, 0x5B99, 0x5B9B, 0x5C1A, 0x5C48, 0x5C45, 0x655A, + 0x654E, 0x654D, 0x658D, 0x658E, 0x65AD, 0x65C7, 0x65CA, 0x65C9, + 0x65E3, 0x6657, 0x6663, 0x6667, 0x671A, 0x6719, 0x6716, 0x689E, +plane 31 +at 0x00 + 0x68B6, 0x6898, 0x6873, 0x689A, 0x688E, 0x68B7, 0x68DB, 0x68A5, + 0x686C, 0x68C1, 0x6884, 0x6895, 0x687A, 0x6899, 0x68B8, 0x68B9, + 0x5C46, 0x5CB7, 0x5CA1, 0x5CB8, 0x5CA9, 0x5CAB, 0x5CB1, 0x5CB3, + 0x5E18, 0x5E1A, 0x5E16, 0x5E15, 0x5E1B, 0x5E11, 0x5E78, 0x5E9A, + 0x5E97, 0x5E9C, 0x5E95, 0x5E96, 0x5EF6, 0x5F26, 0x5F27, 0x5F29, + 0x5F80, 0x5F81, 0x5F7F, 0x5F7C, 0x5FDD, 0x5FE0, 0x5FFD, 0x5FF5, + 0x5FFF, 0x600F, 0x6014, 0x602F, 0x6035, 0x6016, 0x602A, 0x6015, + 0x6021, 0x6027, 0x6029, 0x602B, 0x601B, 0x6216, 0x6215, 0x623F, + 0x623E, 0x6240, 0x627F, 0x62C9, 0x62CC, 0x62C4, 0x62BF, 0x62C2, + 0x62B9, 0x62D2, 0x62DB, 0x62AB, 0x62D3, 0x62D4, 0x62CB, 0x62C8, + 0x62A8, 0x62BD, 0x62BC, 0x62D0, 0x62D9, 0x62C7, 0x62CD, 0x62B5, + 0x62DA, 0x62B1, 0x62D8, 0x62D6, 0x62D7, 0x62C6, 0x62AC, 0x62CE, + 0x653E, 0x65A7, 0x65BC, 0x65FA, 0x6614, 0x6613, 0x660C, 0x6606, + 0x6602, 0x660E, 0x6600, 0x660F, 0x6615, 0x660A, 0x6607, 0x670D, + 0x670B, 0x676D, 0x678B, 0x6795, 0x6771, 0x679C, 0x6773, 0x6777, + 0x6787, 0x679D, 0x6797, 0x676F, 0x6770, 0x677F, 0x6789, 0x677E, + 0x6790, 0x6775, 0x679A, 0x6793, 0x677C, 0x676A, 0x6772, 0x6B23, + 0x6B66, 0x6B67, 0x6B7F, 0x6C13, 0x6C1B, 0x6CE3, 0x6CE8, 0x6CF3, + 0x6CB1, 0x6CCC, 0x6CE5, 0x6CB3, 0x6CBD, 0x6CBE, 0x6CBC, 0x6CE2, + 0x6CAB, 0x6CD5, 0x6CD3, 0x6CB8, 0x6CC4, 0x6CB9, 0x6CC1, 0x6CAE, + 0x6CD7, 0x6CC5, 0x6CF1, 0x6CBF, 0x6CBB, 0x6CE1, 0x6CDB, 0x6CCA, + 0x6CAC, 0x6CEF, 0x6CDC, 0x6CD6, 0x6CE0, 0x6870, 0x6B35, 0x6B90, + 0x6BBB, 0x6BED, 0x6DC1, 0x6DC3, 0x6DCE, 0x6DAD, 0x6E04, 0x6DB9, + 0x6DE7, 0x6E08, 0x6E06, 0x6E0A, 0x6DB0, 0x6DF8, 0x6E0C, 0x6DB1, + 0x6E02, 0x6E07, 0x6E09, 0x6E01, 0x6E17, 0x6DFF, 0x6E12, 0x7103, + 0x7107, 0x7101, 0x70F5, 0x70F1, 0x7108, 0x70F2, 0x7095, 0x708E, + 0x7092, 0x708A, 0x7099, 0x722C, 0x722D, 0x7238, 0x7248, 0x7267, + 0x7269, 0x72C0, 0x72CE, 0x72D9, 0x72D7, 0x72D0, 0x73A9, 0x73A8, + 0x739F, 0x73AB, 0x73A5, 0x753D, 0x759D, 0x7599, 0x759A, 0x7684, + 0x76C2, 0x76F2, 0x76F4, 0x77E5, 0x77FD, 0x793E, 0x7940, 0x7941, + 0x79C9, 0x79C8, 0x7A7A, 0x7A79, 0x7AFA, 0x7CFE, 0x7F54, 0x7F8C, + 0x7F8B, 0x8005, 0x80BA, 0x80A5, 0x80A2, 0x80B1, 0x80A1, 0x80AB, +plane 32 +at 0x00 + 0x80A9, 0x80B4, 0x80AA, 0x80AF, 0x81E5, 0x81FE, 0x820D, 0x82B3, + 0x829D, 0x8299, 0x82AD, 0x82BD, 0x829F, 0x82B9, 0x82B1, 0x82AC, + 0x82A5, 0x82AF, 0x82B8, 0x82A3, 0x82B0, 0x82BE, 0x82B7, 0x864E, + 0x8671, 0x521D, 0x8868, 0x8ECB, 0x8FCE, 0x8FD4, 0x8FD1, 0x90B5, + 0x90B8, 0x90B1, 0x90B6, 0x91C7, 0x91D1, 0x9577, 0x9580, 0x961C, + 0x9640, 0x963F, 0x963B, 0x9644, 0x9642, 0x96B9, 0x96E8, 0x9752, + 0x975E, 0x4E9F, 0x4EAD, 0x4EAE, 0x4FE1, 0x4FB5, 0x4FAF, 0x4FBF, + 0x4FE0, 0x4FD1, 0x4FCF, 0x4FDD, 0x4FC3, 0x4FB6, 0x4FD8, 0x4FDF, + 0x4FCA, 0x4FD7, 0x4FAE, 0x4FD0, 0x4FC4, 0x4FC2, 0x4FDA, 0x4FCE, + 0x4FDE, 0x4FB7, 0x5157, 0x5192, 0x5191, 0x51A0, 0x524E, 0x5243, + 0x524A, 0x524D, 0x524C, 0x524B, 0x5247, 0x52C7, 0x52C9, 0x52C3, + 0x52C1, 0x530D, 0x5357, 0x537B, 0x539A, 0x53DB, 0x54AC, 0x54C0, + 0x54A8, 0x54CE, 0x54C9, 0x54B8, 0x54A6, 0x54B3, 0x54C7, 0x54C2, + 0x54BD, 0x54AA, 0x54C1, 0x710F, 0x70FE, 0x731A, 0x7310, 0x730E, + 0x7402, 0x73F3, 0x73FB, 0x751B, 0x7523, 0x7561, 0x7568, 0x7567, + 0x75D3, 0x7690, 0x76D5, 0x76D7, 0x76D6, 0x7730, 0x7726, 0x7740, + 0x771E, 0x7847, 0x784B, 0x7851, 0x784F, 0x7842, 0x7846, 0x796E, + 0x796C, 0x79F2, 0x79F1, 0x79F5, 0x54C4, 0x54C8, 0x54AF, 0x54AB, + 0x54B1, 0x54BB, 0x54A9, 0x54A7, 0x54BF, 0x56FF, 0x5782, 0x578B, + 0x57A0, 0x57A3, 0x57A2, 0x57CE, 0x57AE, 0x5793, 0x5955, 0x5951, + 0x594F, 0x594E, 0x5950, 0x59DC, 0x59D8, 0x59FF, 0x59E3, 0x59E8, + 0x5A03, 0x59E5, 0x59EA, 0x59DA, 0x59E6, 0x5A01, 0x59FB, 0x5B69, + 0x5BA3, 0x5BA6, 0x5BA4, 0x5BA2, 0x5BA5, 0x5C01, 0x5C4E, 0x5C4F, + 0x5C4D, 0x5C4B, 0x5CD9, 0x5CD2, 0x5DF7, 0x5E1D, 0x5E25, 0x5E1F, + 0x5E7D, 0x5EA0, 0x5EA6, 0x5EFA, 0x5F08, 0x5F2D, 0x5F65, 0x5F88, + 0x5F85, 0x5F8A, 0x5F8B, 0x5F87, 0x5F8C, 0x5F89, 0x6012, 0x601D, + 0x6020, 0x6025, 0x600E, 0x6028, 0x604D, 0x6070, 0x6068, 0x6062, + 0x6046, 0x6043, 0x606C, 0x606B, 0x606A, 0x6064, 0x6241, 0x62DC, + 0x6316, 0x6309, 0x62FC, 0x62ED, 0x6301, 0x62EE, 0x62FD, 0x6307, + 0x62F1, 0x62F7, 0x62EF, 0x62EC, 0x62FE, 0x62F4, 0x6311, 0x6302, + 0x653F, 0x6545, 0x65AB, 0x65BD, 0x65E2, 0x6625, 0x662D, 0x6620, + 0x6627, 0x662F, 0x661F, 0x6628, 0x6631, 0x6624, 0x66F7, 0x67FF, +plane 33 +at 0x00 + 0x67D3, 0x67F1, 0x67D4, 0x67D0, 0x67EC, 0x67B6, 0x67AF, 0x67F5, + 0x67E9, 0x67EF, 0x67C4, 0x67D1, 0x67B4, 0x67DA, 0x67E5, 0x67B8, + 0x67CF, 0x67DE, 0x67F3, 0x67B0, 0x67D9, 0x67E2, 0x67DD, 0x67D2, + 0x6B6A, 0x6B83, 0x6B86, 0x6BB5, 0x6BD2, 0x6BD7, 0x6C1F, 0x6CC9, + 0x6D0B, 0x6D32, 0x6D2A, 0x6D41, 0x6D25, 0x6D0C, 0x6D31, 0x6D1E, + 0x6D17, 0x79F3, 0x79F9, 0x7A9A, 0x7A93, 0x7A91, 0x7AE1, 0x7B21, + 0x7B1C, 0x7B16, 0x7B17, 0x7B36, 0x7B1F, 0x7C93, 0x7C99, 0x7C9A, + 0x7C9C, 0x7D49, 0x7D34, 0x7D37, 0x7D2D, 0x7D4C, 0x7D48, 0x7F3B, + 0x8008, 0x801A, 0x801D, 0x8049, 0x8045, 0x8044, 0x7C9B, 0x812A, + 0x812E, 0x8131, 0x6D3B, 0x6D3D, 0x6D3E, 0x6D36, 0x6D1B, 0x6CF5, + 0x6D39, 0x6D27, 0x6D38, 0x6D29, 0x6D2E, 0x6D35, 0x6D0E, 0x6D2B, + 0x70AB, 0x70BA, 0x70B3, 0x70AC, 0x70AF, 0x70AD, 0x70B8, 0x70AE, + 0x70A4, 0x7230, 0x7272, 0x726F, 0x7274, 0x72E9, 0x72E0, 0x72E1, + 0x73B7, 0x73CA, 0x73BB, 0x73B2, 0x73CD, 0x73C0, 0x73B3, 0x751A, + 0x752D, 0x754F, 0x754C, 0x754E, 0x754B, 0x75AB, 0x75A4, 0x75A5, + 0x75A2, 0x75A3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76C8, 0x76C6, + 0x76C3, 0x76C5, 0x7701, 0x76F9, 0x76F8, 0x7709, 0x770B, 0x76FE, + 0x76FC, 0x7707, 0x77DC, 0x7802, 0x7814, 0x780C, 0x780D, 0x7946, + 0x7949, 0x7948, 0x7947, 0x79B9, 0x79BA, 0x79D1, 0x79D2, 0x79CB, + 0x7A7F, 0x7A81, 0x7AFF, 0x7AFD, 0x7C7D, 0x7D02, 0x7D05, 0x7D00, + 0x7D09, 0x7D07, 0x7D04, 0x7D06, 0x7F38, 0x7F8E, 0x7FBF, 0x8004, + 0x8010, 0x800D, 0x8011, 0x8036, 0x80D6, 0x80E5, 0x80DA, 0x80C3, + 0x80C4, 0x80CC, 0x80E1, 0x80DB, 0x80CE, 0x80DE, 0x80E4, 0x80DD, + 0x81F4, 0x8222, 0x82E7, 0x8303, 0x8305, 0x82E3, 0x82DB, 0x82E6, + 0x8304, 0x82E5, 0x8302, 0x8309, 0x82D2, 0x82D7, 0x82F1, 0x8301, + 0x82DC, 0x82D4, 0x82D1, 0x82DE, 0x82D3, 0x82DF, 0x82EF, 0x8306, + 0x8650, 0x8679, 0x867B, 0x867A, 0x884D, 0x886B, 0x8981, 0x89D4, + 0x8A08, 0x8A02, 0x8A03, 0x8C9E, 0x8CA0, 0x8D74, 0x8D73, 0x8DB4, + 0x8ECD, 0x8ECC, 0x8FF0, 0x8FE6, 0x8FE2, 0x8FEA, 0x8FE5, 0x811A, + 0x8134, 0x8117, 0x831D, 0x8371, 0x8384, 0x8380, 0x8372, 0x83A1, + 0x8379, 0x8391, 0x839F, 0x83AD, 0x8323, 0x8385, 0x839C, 0x83B7, + 0x8658, 0x865A, 0x8657, 0x86B2, 0x86AE, 0x8845, 0x889C, 0x8894, +plane 34 +at 0x00 + 0x88A3, 0x888F, 0x88A5, 0x88A9, 0x88A6, 0x888A, 0x88A0, 0x8890, + 0x8FED, 0x8FEB, 0x8FE4, 0x8FE8, 0x90CA, 0x90CE, 0x90C1, 0x90C3, + 0x914B, 0x914A, 0x91CD, 0x9582, 0x9650, 0x964B, 0x964C, 0x964D, + 0x9762, 0x9769, 0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8, 0x98DB, + 0x98DF, 0x9996, 0x9999, 0x4E58, 0x4EB3, 0x500C, 0x500D, 0x5023, + 0x4FEF, 0x5026, 0x5025, 0x4FF8, 0x5029, 0x5016, 0x5006, 0x503C, + 0x501F, 0x501A, 0x5012, 0x5011, 0x4FFA, 0x5000, 0x5014, 0x5028, + 0x4FF1, 0x5021, 0x500B, 0x5019, 0x5018, 0x4FF3, 0x4FEE, 0x502D, + 0x502A, 0x4FFE, 0x502B, 0x5009, 0x517C, 0x51A4, 0x51A5, 0x51A2, + 0x51CD, 0x51CC, 0x51C6, 0x51CB, 0x5256, 0x525C, 0x5254, 0x525B, + 0x525D, 0x532A, 0x537F, 0x539F, 0x539D, 0x53DF, 0x54E8, 0x5510, + 0x5501, 0x5537, 0x54FC, 0x54E5, 0x54F2, 0x5506, 0x54FA, 0x5514, + 0x54E9, 0x54ED, 0x54E1, 0x5509, 0x54EE, 0x54EA, 0x54E6, 0x5527, + 0x5507, 0x54FD, 0x550F, 0x5703, 0x5704, 0x57C2, 0x57D4, 0x57CB, + 0x57C3, 0x5809, 0x590F, 0x5957, 0x5958, 0x595A, 0x5A11, 0x5A18, + 0x5A1C, 0x5A1F, 0x5A1B, 0x5A13, 0x59EC, 0x5A20, 0x5A23, 0x5A29, + 0x5A25, 0x5A0C, 0x5A09, 0x5B6B, 0x5C58, 0x5BB0, 0x5BB3, 0x5BB6, + 0x5BB4, 0x5BAE, 0x5BB5, 0x5BB9, 0x5BB8, 0x5C04, 0x5C51, 0x5C55, + 0x5C50, 0x5CED, 0x5CFD, 0x5CFB, 0x5CEA, 0x5CE8, 0x5CF0, 0x5CF6, + 0x5D01, 0x5CF4, 0x5DEE, 0x5E2D, 0x5E2B, 0x5EAB, 0x5EAD, 0x5EA7, + 0x5F31, 0x5F92, 0x5F91, 0x5F90, 0x6059, 0x8992, 0x8991, 0x8994, + 0x8A26, 0x8A32, 0x8A28, 0x8A1C, 0x8A2B, 0x8A20, 0x8A29, 0x8A21, + 0x8C3A, 0x8C5B, 0x8C58, 0x8C7C, 0x8CA6, 0x8CAE, 0x8CAD, 0x8D65, + 0x8D7E, 0x8D7C, 0x8D7F, 0x8D7A, 0x8DBD, 0x8DC0, 0x8DBB, 0x8EAD, + 0x8EAF, 0x8ED6, 0x8ED9, 0x9012, 0x900E, 0x9025, 0x6063, 0x6065, + 0x6050, 0x6055, 0x606D, 0x6069, 0x606F, 0x6084, 0x609F, 0x609A, + 0x608D, 0x6094, 0x608C, 0x6085, 0x6096, 0x6247, 0x62F3, 0x6308, + 0x62FF, 0x634E, 0x633E, 0x632F, 0x6355, 0x6342, 0x6346, 0x634F, + 0x6349, 0x633A, 0x6350, 0x633D, 0x632A, 0x632B, 0x6328, 0x634D, + 0x634C, 0x6548, 0x6549, 0x6599, 0x65C1, 0x65C5, 0x6642, 0x6649, + 0x664F, 0x6643, 0x6652, 0x664C, 0x6645, 0x6641, 0x66F8, 0x6714, + 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, 0x6846, 0x6853, 0x6839, +plane 35 +at 0x00 + 0x6842, 0x6854, 0x6829, 0x68B3, 0x6817, 0x684C, 0x6851, 0x683D, + 0x67F4, 0x6850, 0x6840, 0x683C, 0x6843, 0x682A, 0x6845, 0x6813, + 0x6818, 0x6841, 0x6B8A, 0x6B89, 0x6BB7, 0x6C23, 0x6C27, 0x6C28, + 0x6C26, 0x6C24, 0x6CF0, 0x6D6A, 0x6D95, 0x6D88, 0x6D87, 0x6D66, + 0x6D78, 0x6D77, 0x6D59, 0x6D93, 0x6D6C, 0x6D89, 0x6D6E, 0x6D5A, + 0x6D74, 0x6D69, 0x6D8C, 0x6D8A, 0x6D79, 0x6D85, 0x6D65, 0x6D94, + 0x70CA, 0x70D8, 0x70E4, 0x70D9, 0x70C8, 0x70CF, 0x7239, 0x7279, + 0x72FC, 0x72F9, 0x72FD, 0x72F8, 0x72F7, 0x7386, 0x73ED, 0x7409, + 0x73EE, 0x73E0, 0x73EA, 0x73DE, 0x7554, 0x755D, 0x755C, 0x755A, + 0x7559, 0x75BE, 0x75C5, 0x75C7, 0x75B2, 0x75B3, 0x75BD, 0x75BC, + 0x75B9, 0x75C2, 0x75B8, 0x768B, 0x76B0, 0x76CA, 0x76CD, 0x76CE, + 0x7729, 0x771F, 0x7720, 0x7728, 0x77E9, 0x7830, 0x7827, 0x7838, + 0x781D, 0x7834, 0x7837, 0x9013, 0x90EE, 0x90AB, 0x90F7, 0x9159, + 0x9154, 0x91F2, 0x91F0, 0x91E5, 0x91F6, 0x9587, 0x965A, 0x966E, + 0x9679, 0x98E1, 0x98E6, 0x9EC4, 0x9ED2, 0x4E80, 0x4E81, 0x508F, + 0x5097, 0x5088, 0x5089, 0x5081, 0x5160, 0x5E42, 0x51D3, 0x51D2, + 0x51D6, 0x5273, 0x5270, 0x53A8, 0x7825, 0x782D, 0x7820, 0x781F, + 0x7832, 0x7955, 0x7950, 0x7960, 0x795F, 0x7956, 0x795E, 0x795D, + 0x7957, 0x795A, 0x79E4, 0x79E3, 0x79E7, 0x79DF, 0x79E6, 0x79E9, + 0x79D8, 0x7A84, 0x7A88, 0x7AD9, 0x7B06, 0x7B11, 0x7C89, 0x7D21, + 0x7D17, 0x7D0B, 0x7D0A, 0x7D20, 0x7D22, 0x7D14, 0x7D10, 0x7D15, + 0x7D1A, 0x7D1C, 0x7D0D, 0x7D19, 0x7D1B, 0x7F3A, 0x7F5F, 0x7F94, + 0x7FC5, 0x7FC1, 0x8006, 0x8018, 0x8015, 0x8019, 0x8017, 0x803D, + 0x803F, 0x80F1, 0x8102, 0x80F0, 0x8105, 0x80ED, 0x80F4, 0x8106, + 0x80F8, 0x80F3, 0x8108, 0x80FD, 0x810A, 0x80FC, 0x80EF, 0x81ED, + 0x81EC, 0x8200, 0x8210, 0x822A, 0x822B, 0x8228, 0x822C, 0x82BB, + 0x832B, 0x8352, 0x8354, 0x834A, 0x8338, 0x8350, 0x8349, 0x8335, + 0x8334, 0x834F, 0x8332, 0x8339, 0x8336, 0x8317, 0x8340, 0x8331, + 0x8328, 0x8343, 0x8654, 0x868A, 0x86AA, 0x8693, 0x86A4, 0x86A9, + 0x868C, 0x86A3, 0x869C, 0x8870, 0x8877, 0x8881, 0x8882, 0x887D, + 0x8879, 0x8A18, 0x8A10, 0x8A0E, 0x8A0C, 0x8A15, 0x8A0A, 0x8A17, + 0x8A13, 0x8A16, 0x8A0F, 0x8A11, 0x8C48, 0x8C7A, 0x8C79, 0x8CA1, +plane 36 +at 0x00 + 0x8CA2, 0x8D77, 0x8EAC, 0x8ED2, 0x8ED4, 0x8ECF, 0x8FB1, 0x9001, + 0x9006, 0x8FF7, 0x9000, 0x8FFA, 0x8FF4, 0x9003, 0x8FFD, 0x9005, + 0x8FF8, 0x9095, 0x90E1, 0x90DD, 0x90E2, 0x9152, 0x914D, 0x914C, + 0x91D8, 0x91DD, 0x91D7, 0x91DC, 0x91D9, 0x9583, 0x9662, 0x9663, + 0x9661, 0x53A6, 0x53C5, 0x5597, 0x55DE, 0x5596, 0x55B4, 0x5585, + 0x559B, 0x55A0, 0x5559, 0x5586, 0x55AF, 0x557A, 0x559E, 0x55A9, + 0x570F, 0x570E, 0x581A, 0x581F, 0x583C, 0x5818, 0x583E, 0x5826, + 0x583A, 0x5822, 0x58FB, 0x5963, 0x5964, 0x5AA8, 0x5AA3, 0x5A82, + 0x5A88, 0x5AA1, 0x965B, 0x965D, 0x9664, 0x9658, 0x965E, 0x96BB, + 0x98E2, 0x99AC, 0x9AA8, 0x9AD8, 0x9B25, 0x9B32, 0x9B3C, 0x4E7E, + 0x507A, 0x507D, 0x505C, 0x5047, 0x5043, 0x504C, 0x505A, 0x5049, + 0x5065, 0x5076, 0x504E, 0x5055, 0x5075, 0x5074, 0x5077, 0x504F, + 0x500F, 0x506F, 0x506D, 0x515C, 0x5195, 0x51F0, 0x526A, 0x526F, + 0x52D2, 0x52D9, 0x52D8, 0x52D5, 0x5310, 0x530F, 0x5319, 0x533F, + 0x5340, 0x533E, 0x53C3, 0x66FC, 0x5546, 0x556A, 0x5566, 0x5544, + 0x555E, 0x5561, 0x5543, 0x554A, 0x5531, 0x5556, 0x554F, 0x5555, + 0x552F, 0x5564, 0x5538, 0x552E, 0x555C, 0x552C, 0x5563, 0x5533, + 0x5541, 0x5557, 0x5708, 0x570B, 0x5709, 0x57DF, 0x5805, 0x580A, + 0x5806, 0x57E0, 0x57E4, 0x57FA, 0x5802, 0x5835, 0x57F7, 0x57F9, + 0x5920, 0x5962, 0x5A36, 0x5A41, 0x5A49, 0x5A66, 0x5A6A, 0x5A40, + 0x5A3C, 0x5A62, 0x5A5A, 0x5A46, 0x5A4A, 0x5B70, 0x5BC7, 0x5BC5, + 0x5BC4, 0x5BC2, 0x5BBF, 0x5BC6, 0x5C09, 0x5C08, 0x5C07, 0x5C60, + 0x5C5C, 0x5C5D, 0x5D07, 0x5D06, 0x5D0E, 0x5D1B, 0x5D16, 0x5D22, + 0x5D11, 0x5D29, 0x5D14, 0x5D19, 0x5D24, 0x5D27, 0x5D17, 0x5DE2, + 0x5E38, 0x5E36, 0x5E33, 0x5E37, 0x5EB7, 0x5EB8, 0x5EB6, 0x5EB5, + 0x5EBE, 0x5F35, 0x5F37, 0x5F57, 0x5F6C, 0x5F69, 0x5F6B, 0x5F97, + 0x5F99, 0x5F9E, 0x5F98, 0x5FA1, 0x5FA0, 0x5F9C, 0x607F, 0x60A3, + 0x6089, 0x60A0, 0x60A8, 0x60CB, 0x60B4, 0x60E6, 0x60BD, 0x5A85, + 0x5A98, 0x5A99, 0x5A89, 0x5A81, 0x5A96, 0x5A80, 0x5A91, 0x5ACF, + 0x5A87, 0x5AA0, 0x5A79, 0x5A86, 0x5AAB, 0x5AAA, 0x5AA4, 0x5A8D, + 0x5A7E, 0x5BD5, 0x5C1E, 0x5C5F, 0x5C5E, 0x5D44, 0x5D3E, 0x5D48, + 0x5D1C, 0x5D5B, 0x5D4D, 0x5D57, 0x5D53, 0x5D4F, 0x5D3B, 0x5D46, +plane 37 +at 0x00 + 0x60C5, 0x60BB, 0x60B5, 0x60DC, 0x60BC, 0x60D8, 0x60D5, 0x60C6, + 0x60DF, 0x60B8, 0x60DA, 0x60C7, 0x621A, 0x621B, 0x6248, 0x63A0, + 0x63A7, 0x6372, 0x6396, 0x63A2, 0x63A5, 0x6377, 0x6367, 0x6398, + 0x63AA, 0x6371, 0x63A9, 0x6389, 0x6383, 0x639B, 0x636B, 0x63A8, + 0x6384, 0x6388, 0x6399, 0x63A1, 0x63AC, 0x6392, 0x638F, 0x6380, + 0x637B, 0x6369, 0x6368, 0x637A, 0x655D, 0x6556, 0x6551, 0x6559, + 0x6557, 0x555F, 0x654F, 0x6558, 0x6555, 0x6554, 0x659C, 0x659B, + 0x65AC, 0x65CF, 0x65CB, 0x65CC, 0x65CE, 0x665D, 0x665A, 0x6664, + 0x6668, 0x6666, 0x665E, 0x66F9, 0x52D7, 0x671B, 0x6881, 0x68AF, + 0x68A2, 0x6893, 0x68B5, 0x687F, 0x6876, 0x68B1, 0x68A7, 0x6897, + 0x68B0, 0x6883, 0x68C4, 0x68AD, 0x6886, 0x6885, 0x6894, 0x689D, + 0x68A8, 0x689F, 0x68A1, 0x6882, 0x6B32, 0x6BBA, 0x6BEB, 0x6BEC, + 0x6C2B, 0x6D8E, 0x6DBC, 0x6DF3, 0x6DD9, 0x6DB2, 0x6DE1, 0x6DCC, + 0x6DE4, 0x6DFB, 0x6DFA, 0x6E05, 0x6DC7, 0x6DCB, 0x6DAF, 0x6DD1, + 0x6DAE, 0x6DDE, 0x6DF9, 0x6DB8, 0x6DF7, 0x6DF5, 0x6DC5, 0x6DD2, + 0x6E1A, 0x6DB5, 0x6DDA, 0x6DEB, 0x6DD8, 0x6DEA, 0x6DF1, 0x6DEE, + 0x6DE8, 0x6DC6, 0x6DC4, 0x6DAA, 0x6DEC, 0x6DBF, 0x6DE6, 0x70F9, + 0x7109, 0x710A, 0x70FD, 0x70EF, 0x723D, 0x727D, 0x7281, 0x731C, + 0x731B, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405, 0x740A, 0x7403, + 0x7406, 0x73FE, 0x740D, 0x74E0, 0x74F6, 0x5E46, 0x5E47, 0x5E48, + 0x5EC0, 0x5EBD, 0x5EBF, 0x5F11, 0x5F3E, 0x5F3B, 0x5F3A, 0x5FA7, + 0x60EA, 0x6107, 0x6122, 0x610C, 0x60B3, 0x60D6, 0x60D2, 0x60E3, + 0x60E5, 0x60E9, 0x6111, 0x60FD, 0x611E, 0x6120, 0x6121, 0x621E, + 0x63E2, 0x63DE, 0x63E6, 0x63F8, 0x63FE, 0x63C1, 0x74F7, 0x751C, + 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, 0x758F, 0x75D4, 0x75D5, + 0x75B5, 0x75CA, 0x75CD, 0x768E, 0x76D4, 0x76D2, 0x76DB, 0x7737, + 0x773E, 0x773C, 0x7736, 0x7738, 0x773A, 0x786B, 0x7843, 0x784E, + 0x7965, 0x7968, 0x796D, 0x79FB, 0x7A92, 0x7A95, 0x7B20, 0x7B28, + 0x7B1B, 0x7B2C, 0x7B26, 0x7B19, 0x7B1E, 0x7B2E, 0x7C92, 0x7C97, + 0x7C95, 0x7D46, 0x7D43, 0x7D71, 0x7D2E, 0x7D39, 0x7D3C, 0x7D40, + 0x7D30, 0x7D33, 0x7D44, 0x7D2F, 0x7D42, 0x7D32, 0x7D31, 0x7F3D, + 0x7F9E, 0x7F9A, 0x7FCC, 0x7FCE, 0x7FD2, 0x801C, 0x804A, 0x8046, +plane 38 +at 0x00 + 0x812F, 0x8116, 0x8123, 0x812B, 0x8129, 0x8130, 0x8124, 0x8202, + 0x8235, 0x8237, 0x8236, 0x8239, 0x838E, 0x839E, 0x8398, 0x8378, + 0x83A2, 0x8396, 0x83BD, 0x83AB, 0x8392, 0x838A, 0x8393, 0x8389, + 0x83A0, 0x8377, 0x837B, 0x837C, 0x8386, 0x83A7, 0x8655, 0x5F6A, + 0x86C7, 0x86C0, 0x86B6, 0x86C4, 0x86B5, 0x86C6, 0x86CB, 0x86B1, + 0x86AF, 0x86C9, 0x8853, 0x889E, 0x8888, 0x88AB, 0x8892, 0x8896, + 0x888D, 0x888B, 0x8993, 0x898F, 0x8A2A, 0x8A1D, 0x8A23, 0x8A25, + 0x8A31, 0x8A2D, 0x8A1F, 0x8A1B, 0x8A22, 0x8C49, 0x8C5A, 0x8CA9, + 0x8CAC, 0x8CAB, 0x8CA8, 0x8CAA, 0x8CA7, 0x8D67, 0x8D66, 0x8DBE, + 0x8DBA, 0x8EDB, 0x8EDF, 0x9019, 0x900D, 0x901A, 0x9017, 0x9023, + 0x901F, 0x901D, 0x9010, 0x9015, 0x901E, 0x9020, 0x900F, 0x9022, + 0x9016, 0x901B, 0x9014, 0x63BF, 0x63F7, 0x63D1, 0x655F, 0x6560, + 0x6561, 0x65D1, 0x667D, 0x666B, 0x667F, 0x6673, 0x6681, 0x666D, + 0x6669, 0x671E, 0x68ED, 0x6903, 0x68FE, 0x68E5, 0x691E, 0x6902, + 0x6909, 0x68CA, 0x6900, 0x6901, 0x6918, 0x68E2, 0x68CF, 0x692E, + 0x68C5, 0x68FF, 0x691C, 0x68C3, 0x90E8, 0x90ED, 0x90FD, 0x9157, + 0x91CE, 0x91F5, 0x91E6, 0x91E3, 0x91E7, 0x91ED, 0x91E9, 0x9589, + 0x966A, 0x9675, 0x9673, 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, + 0x966C, 0x96C0, 0x96EA, 0x96E9, 0x7AE0, 0x7ADF, 0x9802, 0x9803, + 0x9B5A, 0x9CE5, 0x9E75, 0x9E7F, 0x9EA5, 0x9EBB, 0x50A2, 0x508D, + 0x5085, 0x5099, 0x5091, 0x5080, 0x5096, 0x5098, 0x509A, 0x6700, + 0x51F1, 0x5272, 0x5274, 0x5275, 0x5269, 0x52DE, 0x52DD, 0x52DB, + 0x535A, 0x53A5, 0x557B, 0x5580, 0x55A7, 0x557C, 0x558A, 0x559D, + 0x5598, 0x5582, 0x559C, 0x55AA, 0x5594, 0x5587, 0x558B, 0x5583, + 0x55B3, 0x55AE, 0x559F, 0x553E, 0x55B2, 0x559A, 0x55BB, 0x55AC, + 0x55B1, 0x557E, 0x5589, 0x55AB, 0x5599, 0x570D, 0x582F, 0x582A, + 0x5834, 0x5824, 0x5830, 0x5831, 0x5821, 0x581D, 0x5820, 0x58F9, + 0x58FA, 0x5960, 0x5A77, 0x5A9A, 0x5A7F, 0x5A92, 0x5A9B, 0x5AA7, + 0x5B73, 0x5B71, 0x5BD2, 0x5BCC, 0x5BD3, 0x5BD0, 0x5C0A, 0x5C0B, + 0x5C31, 0x5D4C, 0x5D50, 0x5D34, 0x5D47, 0x5DFD, 0x5E45, 0x5E3D, + 0x5E40, 0x5E43, 0x5E7E, 0x5ECA, 0x5EC1, 0x5EC2, 0x5EC4, 0x5F3C, + 0x5F6D, 0x5FA9, 0x5FAA, 0x5FA8, 0x60D1, 0x60E1, 0x60B2, 0x60B6, +plane 39 +at 0x00 + 0x60E0, 0x611C, 0x6123, 0x60FA, 0x6115, 0x60F0, 0x60FB, 0x60F4, + 0x6168, 0x60F1, 0x610E, 0x60F6, 0x6109, 0x6100, 0x6112, 0x621F, + 0x6249, 0x63A3, 0x638C, 0x63CF, 0x63C0, 0x63E9, 0x63C9, 0x63C6, + 0x63CD, 0x6B6F, 0x6B6E, 0x6BBE, 0x6BF4, 0x6C2D, 0x6DB6, 0x6E75, + 0x6E1E, 0x6E18, 0x6E48, 0x6E4F, 0x6E42, 0x6E6A, 0x6E70, 0x6DFE, + 0x6E6D, 0x6E7B, 0x6E7E, 0x6E59, 0x6E57, 0x6E80, 0x6E50, 0x6E29, + 0x6E76, 0x6E2A, 0x6E4C, 0x712A, 0x7135, 0x712C, 0x7137, 0x711D, + 0x7138, 0x7134, 0x63D2, 0x63E3, 0x63D0, 0x63E1, 0x63D6, 0x63ED, + 0x63EE, 0x6376, 0x63F4, 0x63EA, 0x63DB, 0x6452, 0x63DA, 0x63F9, + 0x655E, 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65AF, 0x666E, + 0x6670, 0x6674, 0x6676, 0x666F, 0x6691, 0x667A, 0x667E, 0x6677, + 0x66FE, 0x66FF, 0x671F, 0x671D, 0x68FA, 0x68D5, 0x68E0, 0x68D8, + 0x68D7, 0x6905, 0x68DF, 0x68F5, 0x68EE, 0x68E7, 0x68F9, 0x68D2, + 0x68F2, 0x68E3, 0x68CB, 0x68CD, 0x690D, 0x6912, 0x690E, 0x68C9, + 0x68DA, 0x696E, 0x68FB, 0x6B3E, 0x6B3A, 0x6B3D, 0x6B98, 0x6B96, + 0x6BBC, 0x6BEF, 0x6C2E, 0x6C2F, 0x6C2C, 0x6E2F, 0x6E38, 0x6E54, + 0x6E21, 0x6E32, 0x6E67, 0x6E4A, 0x6E20, 0x6E25, 0x6E23, 0x6E1B, + 0x6E5B, 0x6E58, 0x6E24, 0x6E56, 0x6E6E, 0x6E2D, 0x6E26, 0x6E6F, + 0x6E34, 0x6E4D, 0x6E3A, 0x6E2C, 0x6E43, 0x6E1D, 0x6E3E, 0x6ECB, + 0x6E89, 0x6E19, 0x6E4E, 0x6E63, 0x6E44, 0x6E72, 0x6E69, 0x6E5F, + 0x7119, 0x711A, 0x7126, 0x7130, 0x7121, 0x7136, 0x716E, 0x711C, + 0x724C, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743A, + 0x742A, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742F, + 0x741B, 0x7426, 0x7428, 0x7525, 0x7526, 0x756B, 0x756A, 0x75E2, + 0x75DB, 0x75E3, 0x75D9, 0x75D8, 0x75DE, 0x75E0, 0x767B, 0x767C, + 0x7696, 0x7693, 0x76B4, 0x76DC, 0x774F, 0x77ED, 0x785D, 0x786C, + 0x786F, 0x7A0D, 0x7A08, 0x7A0B, 0x7A05, 0x7A00, 0x7A98, 0x712B, + 0x7133, 0x7127, 0x7124, 0x712D, 0x7232, 0x7283, 0x7282, 0x7287, + 0x7306, 0x7324, 0x7338, 0x732A, 0x732C, 0x732B, 0x732F, 0x7328, + 0x7417, 0x7419, 0x7438, 0x741F, 0x7414, 0x743C, 0x73F7, 0x741C, + 0x7415, 0x7418, 0x7439, 0x74F9, 0x7524, 0x756E, 0x756D, 0x7571, + 0x7A97, 0x7A96, 0x7AE5, 0x7AE3, 0x7B49, 0x7B56, 0x7B46, 0x7B50, +plane 40 +at 0x00 + 0x7B52, 0x7B54, 0x7B4D, 0x7B4B, 0x7B4F, 0x7B51, 0x7C9F, 0x7CA5, + 0x7D5E, 0x7D50, 0x7D68, 0x7D55, 0x7D2B, 0x7D6E, 0x7D72, 0x7D61, + 0x7D66, 0x7D62, 0x7D70, 0x7D73, 0x5584, 0x7FD4, 0x7FD5, 0x800B, + 0x8052, 0x8085, 0x8155, 0x8154, 0x814B, 0x8151, 0x814E, 0x8139, + 0x8146, 0x813E, 0x814C, 0x8153, 0x8174, 0x8212, 0x821C, 0x83E9, + 0x8403, 0x83F8, 0x840D, 0x83E0, 0x83C5, 0x840B, 0x83C1, 0x83EF, + 0x83F1, 0x83F4, 0x8457, 0x840A, 0x83F0, 0x840C, 0x83CC, 0x83FD, + 0x83F2, 0x83CA, 0x8438, 0x840E, 0x8404, 0x83DC, 0x8407, 0x83D4, + 0x83DF, 0x865B, 0x86DF, 0x86D9, 0x86ED, 0x86D4, 0x86DB, 0x86E4, + 0x86D0, 0x86DE, 0x8857, 0x88C1, 0x88C2, 0x88B1, 0x8983, 0x8996, + 0x8A3B, 0x8A60, 0x8A55, 0x8A5E, 0x8A3C, 0x8A41, 0x8A54, 0x8A5B, + 0x8A50, 0x8A46, 0x8A34, 0x8A3A, 0x8A36, 0x8A56, 0x8C61, 0x8C82, + 0x8CAF, 0x8CBC, 0x8CB3, 0x8CBD, 0x8CC1, 0x8CBB, 0x8CC0, 0x8CB4, + 0x8CB7, 0x8CB6, 0x8CBF, 0x8CB8, 0x8D8A, 0x8D85, 0x8D81, 0x8DCE, + 0x8DDD, 0x8DCB, 0x8DDA, 0x8DD1, 0x8DCC, 0x8DDB, 0x8DC6, 0x8EFB, + 0x8EF8, 0x8EFC, 0x8F9C, 0x902E, 0x9035, 0x9031, 0x9038, 0x9032, + 0x9036, 0x9102, 0x90F5, 0x9109, 0x90FE, 0x9163, 0x9165, 0x91CF, + 0x9214, 0x9215, 0x9223, 0x9209, 0x921E, 0x920D, 0x9210, 0x9207, + 0x9211, 0x9594, 0x958F, 0x958B, 0x9591, 0x758E, 0x75E5, 0x7694, + 0x76B3, 0x76D9, 0x7748, 0x7749, 0x7743, 0x7742, 0x77DF, 0x7863, + 0x7876, 0x785F, 0x7866, 0x7966, 0x7971, 0x7976, 0x7984, 0x7975, + 0x79FF, 0x7A07, 0x7A0E, 0x7A09, 0x7AE7, 0x7AE2, 0x7B55, 0x7B43, + 0x7B57, 0x7B6C, 0x7B42, 0x7B53, 0x7B41, 0x7CA0, 0x9593, 0x9592, + 0x958E, 0x968A, 0x968E, 0x968B, 0x967D, 0x9685, 0x9686, 0x968D, + 0x9672, 0x9684, 0x96C1, 0x96C5, 0x96C4, 0x96C6, 0x96C7, 0x96EF, + 0x96F2, 0x97CC, 0x9805, 0x9806, 0x9808, 0x98E7, 0x98EA, 0x98EF, + 0x98E9, 0x98F2, 0x98ED, 0x99AE, 0x99AD, 0x9EC3, 0x9ECD, 0x9ED1, + 0x4E82, 0x50AD, 0x50B5, 0x50B2, 0x50B3, 0x50C5, 0x50BE, 0x50AC, + 0x50B7, 0x50BB, 0x50AF, 0x50C7, 0x527F, 0x5277, 0x527D, 0x52DF, + 0x52E6, 0x52E4, 0x52E2, 0x52E3, 0x532F, 0x55DF, 0x55E8, 0x55D3, + 0x55E6, 0x55CE, 0x55DC, 0x55C7, 0x55D1, 0x55E3, 0x55E4, 0x55EF, + 0x55DA, 0x55E1, 0x55C5, 0x55C6, 0x55E5, 0x55C9, 0x5712, 0x5713, +plane 41 +at 0x00 + 0x585E, 0x5851, 0x5858, 0x5857, 0x585A, 0x5854, 0x586B, 0x584C, + 0x586D, 0x584A, 0x5862, 0x5852, 0x584B, 0x5967, 0x5AC1, 0x5AC9, + 0x5ACC, 0x5ABE, 0x5ABD, 0x5ABC, 0x5AB3, 0x5AC2, 0x5AB2, 0x5D69, + 0x5D6F, 0x5E4C, 0x5E79, 0x5EC9, 0x5EC8, 0x5F12, 0x5F59, 0x5FAC, + 0x5FAE, 0x611A, 0x610F, 0x6148, 0x611F, 0x60F3, 0x611B, 0x60F9, + 0x6101, 0x6108, 0x614E, 0x614C, 0x6144, 0x614D, 0x613E, 0x6134, + 0x6127, 0x610D, 0x6106, 0x6137, 0x6221, 0x6222, 0x6413, 0x643E, + 0x641E, 0x642A, 0x642D, 0x643D, 0x642C, 0x640F, 0x641C, 0x6414, + 0x640D, 0x6436, 0x6416, 0x6417, 0x6406, 0x656C, 0x659F, 0x65B0, + 0x6697, 0x6689, 0x6687, 0x6688, 0x6696, 0x6684, 0x6698, 0x668D, + 0x6703, 0x6994, 0x696D, 0x7CA6, 0x7CA4, 0x7D74, 0x7D59, 0x7D60, + 0x7D57, 0x7D6C, 0x7D7E, 0x7D64, 0x7D5A, 0x7D5D, 0x7D76, 0x7D4D, + 0x7D75, 0x7FD3, 0x7FD6, 0x8060, 0x804E, 0x8145, 0x813B, 0x8148, + 0x8142, 0x8149, 0x8140, 0x8114, 0x8141, 0x81EF, 0x81F6, 0x8203, + 0x83ED, 0x83DA, 0x8418, 0x83D2, 0x695A, 0x6977, 0x6960, 0x6954, + 0x6975, 0x6930, 0x6982, 0x694A, 0x6968, 0x696B, 0x695E, 0x6953, + 0x6979, 0x6986, 0x695D, 0x6963, 0x695B, 0x6B47, 0x6B72, 0x6BC0, + 0x6BBF, 0x6BD3, 0x6BFD, 0x6EA2, 0x6EAF, 0x6ED3, 0x6EB6, 0x6EC2, + 0x6E90, 0x6E9D, 0x6EC7, 0x6EC5, 0x6EA5, 0x6E98, 0x6EBC, 0x6EBA, + 0x6EAB, 0x6ED1, 0x6E96, 0x6E9C, 0x6EC4, 0x6ED4, 0x6EAA, 0x6EA7, + 0x6EB4, 0x714E, 0x7159, 0x7169, 0x7164, 0x7149, 0x7167, 0x715C, + 0x716C, 0x7166, 0x714C, 0x7165, 0x715E, 0x7146, 0x7168, 0x7156, + 0x723A, 0x7252, 0x7337, 0x7345, 0x733F, 0x733E, 0x746F, 0x745A, + 0x7455, 0x745F, 0x745E, 0x7441, 0x743F, 0x7459, 0x745B, 0x745C, + 0x7576, 0x7578, 0x7600, 0x75F0, 0x7601, 0x75F2, 0x75F1, 0x75FA, + 0x75FF, 0x75F4, 0x75F3, 0x76DE, 0x76DF, 0x775B, 0x776B, 0x7766, + 0x775E, 0x7763, 0x7779, 0x776A, 0x776C, 0x775C, 0x7765, 0x7768, + 0x7762, 0x77EE, 0x788E, 0x78B0, 0x7897, 0x7898, 0x788C, 0x7889, + 0x787C, 0x7891, 0x7893, 0x787F, 0x797A, 0x797F, 0x7981, 0x842C, + 0x79BD, 0x7A1C, 0x7A1A, 0x7A20, 0x7A14, 0x7A1F, 0x7A1E, 0x7A9F, + 0x7AA0, 0x7B77, 0x7BC0, 0x7B60, 0x7B6E, 0x7B67, 0x7CB1, 0x7CB3, + 0x7CB5, 0x7D93, 0x7D79, 0x7D91, 0x7D81, 0x7D8F, 0x7D5B, 0x7F6E, +plane 42 +at 0x00 + 0x7F69, 0x7F6A, 0x7F72, 0x7FA9, 0x7FA8, 0x7FA4, 0x8056, 0x8058, + 0x8086, 0x8084, 0x8171, 0x8170, 0x8178, 0x8165, 0x816E, 0x8173, + 0x816B, 0x8408, 0x8400, 0x8417, 0x8346, 0x8414, 0x83D3, 0x8405, + 0x841F, 0x8402, 0x8416, 0x83CD, 0x83E6, 0x865D, 0x86D5, 0x86E1, + 0x86EE, 0x8847, 0x8846, 0x88BB, 0x88BF, 0x88B4, 0x88B5, 0x899A, + 0x8A43, 0x8A5A, 0x8A35, 0x8A38, 0x8A42, 0x8A49, 0x8A5D, 0x8A4B, + 0x8A3D, 0x8C60, 0x8179, 0x817A, 0x8166, 0x8205, 0x8247, 0x8482, + 0x8477, 0x843D, 0x8431, 0x8475, 0x8466, 0x846B, 0x8449, 0x846C, + 0x845B, 0x843C, 0x8435, 0x8461, 0x8463, 0x8469, 0x846D, 0x8446, + 0x865E, 0x865C, 0x865F, 0x86F9, 0x8713, 0x8708, 0x8707, 0x8700, + 0x86FE, 0x86FB, 0x8702, 0x8703, 0x8706, 0x870A, 0x8859, 0x88DF, + 0x88D4, 0x88D9, 0x88DC, 0x88D8, 0x88DD, 0x88E1, 0x88CA, 0x88D5, + 0x88D2, 0x899C, 0x89E3, 0x8A6B, 0x8A72, 0x8A73, 0x8A66, 0x8A69, + 0x8A70, 0x8A87, 0x8A7C, 0x8A63, 0x8AA0, 0x8A71, 0x8A85, 0x8A6D, + 0x8A62, 0x8A6E, 0x8A6C, 0x8A79, 0x8A7B, 0x8A3E, 0x8A68, 0x8C62, + 0x8C8A, 0x8C89, 0x8CCA, 0x8CC7, 0x8CC8, 0x8CC4, 0x8CB2, 0x8CC3, + 0x8CC2, 0x8CC5, 0x8DE1, 0x8DDF, 0x8DE8, 0x8DEF, 0x8DF3, 0x8DFA, + 0x8DEA, 0x8DE4, 0x8DE6, 0x8EB2, 0x8F03, 0x8F09, 0x8EFE, 0x8F0A, + 0x8F9F, 0x8FB2, 0x904B, 0x904A, 0x9053, 0x9042, 0x9054, 0x903C, + 0x9055, 0x9050, 0x9047, 0x904F, 0x904E, 0x904D, 0x9051, 0x903E, + 0x9041, 0x9112, 0x9117, 0x916C, 0x916A, 0x9169, 0x91C9, 0x9237, + 0x9257, 0x9238, 0x923D, 0x9240, 0x923E, 0x925B, 0x924B, 0x9264, + 0x9251, 0x9234, 0x9249, 0x924D, 0x9245, 0x9239, 0x923F, 0x925A, + 0x9598, 0x9698, 0x9694, 0x9695, 0x96CD, 0x96CB, 0x96C9, 0x96CA, + 0x96F7, 0x96FB, 0x96F9, 0x96F6, 0x9756, 0x9774, 0x9776, 0x9810, + 0x9811, 0x9813, 0x980A, 0x9812, 0x980C, 0x98FC, 0x98F4, 0x8C5E, + 0x8C7F, 0x8C7E, 0x8C83, 0x8CB1, 0x8D87, 0x8D88, 0x8D83, 0x8D86, + 0x8D8B, 0x8D82, 0x8DCA, 0x8DD2, 0x8DD4, 0x8DC9, 0x8EB0, 0x8EF2, + 0x8EE4, 0x8EF3, 0x8EEA, 0x8EFD, 0x8F9D, 0x902B, 0x902A, 0x9028, + 0x9029, 0x902C, 0x903A, 0x9030, 0x9037, 0x903B, 0x910A, 0x91FE, + 0x98FD, 0x98FE, 0x99B3, 0x99B1, 0x99B4, 0x9AE1, 0x9CE9, 0x9E82, + 0x9F0E, 0x9F13, 0x9F20, 0x50E7, 0x50EE, 0x50E5, 0x50D6, 0x50ED, +plane 43 +at 0x00 + 0x50DA, 0x50D5, 0x50CF, 0x50D1, 0x50F1, 0x50CE, 0x50E9, 0x5162, + 0x51F3, 0x5283, 0x5282, 0x5331, 0x53AD, 0x55FE, 0x5600, 0x561B, + 0x5617, 0x55FD, 0x5614, 0x5606, 0x5609, 0x560D, 0x560E, 0x55F7, + 0x5616, 0x561F, 0x5608, 0x5610, 0x55F6, 0x5718, 0x5716, 0x5875, + 0x587E, 0x5883, 0x5893, 0x588A, 0x5879, 0x5885, 0x587D, 0x58FD, + 0x5925, 0x5922, 0x5924, 0x596A, 0x5969, 0x5AE1, 0x5AE6, 0x5AE9, + 0x5AD7, 0x5AD6, 0x5AD8, 0x5AE3, 0x5B75, 0x5BDE, 0x5BE7, 0x5BE1, + 0x5BE5, 0x5BE6, 0x5BE8, 0x5BE2, 0x5BE4, 0x5BDF, 0x5C0D, 0x5C62, + 0x5D84, 0x5D87, 0x5E5B, 0x5E63, 0x5E55, 0x5E57, 0x5E54, 0x5ED3, + 0x5ED6, 0x5F0A, 0x5F46, 0x5F70, 0x5FB9, 0x6147, 0x613F, 0x614B, + 0x6177, 0x6162, 0x6163, 0x615F, 0x615A, 0x6158, 0x6175, 0x622A, + 0x6487, 0x6458, 0x6454, 0x64A4, 0x6478, 0x645F, 0x647A, 0x6451, + 0x6467, 0x6434, 0x646D, 0x647B, 0x6572, 0x65A1, 0x65D7, 0x65D6, + 0x66A2, 0x66A8, 0x669D, 0x699C, 0x69A8, 0x6995, 0x69C1, 0x69AE, + 0x69D3, 0x69CB, 0x699B, 0x69B7, 0x69BB, 0x69AB, 0x69B4, 0x69D0, + 0x69CD, 0x69AD, 0x69CC, 0x69A6, 0x69C3, 0x69A3, 0x6B49, 0x6B4C, + 0x6C33, 0x6F33, 0x6F14, 0x6EFE, 0x6F13, 0x6EF4, 0x6F29, 0x6F3E, + 0x6F20, 0x6F2C, 0x6F0F, 0x6F02, 0x6F22, 0x9220, 0x920B, 0x9218, + 0x9222, 0x921B, 0x9208, 0x920E, 0x9213, 0x9595, 0x968C, 0x967B, + 0x967F, 0x9681, 0x9682, 0x96EE, 0x96ED, 0x96EC, 0x975F, 0x976F, + 0x976D, 0x98F0, 0x9AA9, 0x9AE0, 0x4EB7, 0x50CC, 0x50BC, 0x50AA, + 0x50B9, 0x50AB, 0x50C3, 0x50CD, 0x517E, 0x527E, 0x6EFF, 0x6EEF, + 0x6F06, 0x6F31, 0x6F38, 0x6F32, 0x6F23, 0x6F15, 0x6F2B, 0x6F2F, + 0x6F88, 0x6F2A, 0x6EEC, 0x6F01, 0x6EF2, 0x6ECC, 0x6EF7, 0x7194, + 0x7199, 0x717D, 0x718A, 0x7184, 0x7192, 0x723E, 0x7292, 0x7296, + 0x7344, 0x7350, 0x7464, 0x7463, 0x746A, 0x7470, 0x746D, 0x7504, + 0x7591, 0x7627, 0x760D, 0x760B, 0x7609, 0x7613, 0x76E1, 0x76E3, + 0x7784, 0x777D, 0x777F, 0x7761, 0x78C1, 0x789F, 0x78A7, 0x78B3, + 0x78A9, 0x78A3, 0x798E, 0x798F, 0x798D, 0x7A2E, 0x7A31, 0x7AAA, + 0x7AA9, 0x7AED, 0x7AEF, 0x7BA1, 0x7B95, 0x7B8B, 0x7B75, 0x7B97, + 0x7B9D, 0x7B94, 0x7B8F, 0x7BB8, 0x7B87, 0x7B84, 0x7CB9, 0x7CBD, + 0x7CBE, 0x7DBB, 0x7DB0, 0x7D9C, 0x7DBD, 0x7DBE, 0x7DA0, 0x7DCA, +plane 44 +at 0x00 + 0x7DB4, 0x7DB2, 0x7DB1, 0x7DBA, 0x7DA2, 0x7DBF, 0x7DB5, 0x7DB8, + 0x7DAD, 0x7DD2, 0x7DC7, 0x7DAC, 0x7F70, 0x7FE0, 0x7FE1, 0x7FDF, + 0x805E, 0x805A, 0x8087, 0x8150, 0x8180, 0x818F, 0x8188, 0x818A, + 0x817F, 0x8182, 0x81E7, 0x81FA, 0x8207, 0x8214, 0x821E, 0x824B, + 0x84C9, 0x84BF, 0x84C6, 0x84C4, 0x8499, 0x849E, 0x84B2, 0x849C, + 0x84CB, 0x84B8, 0x84C0, 0x84D3, 0x8490, 0x84BC, 0x84D1, 0x84CA, + 0x873F, 0x871C, 0x873B, 0x8722, 0x8725, 0x8734, 0x8718, 0x8755, + 0x8737, 0x8729, 0x88F3, 0x8902, 0x88F4, 0x88F9, 0x88F8, 0x88FD, + 0x88E8, 0x891A, 0x88EF, 0x8AA6, 0x8A8C, 0x8A9E, 0x8AA3, 0x8A8D, + 0x8AA1, 0x8A93, 0x8AA4, 0x5279, 0x52E1, 0x52E0, 0x52E7, 0x5380, + 0x53AB, 0x53AA, 0x53A9, 0x53E0, 0x55EA, 0x55D7, 0x55C1, 0x5715, + 0x586C, 0x585C, 0x5850, 0x5861, 0x586A, 0x5869, 0x5856, 0x5860, + 0x5866, 0x585F, 0x5923, 0x5966, 0x5968, 0x5ACE, 0x5AC5, 0x5AC3, + 0x5AD0, 0x5B74, 0x5B76, 0x5BDC, 0x8AAA, 0x8AA5, 0x8AA8, 0x8A98, + 0x8A91, 0x8A9A, 0x8AA7, 0x8C6A, 0x8C8D, 0x8C8C, 0x8CD3, 0x8CD1, + 0x8CD2, 0x8D6B, 0x8D99, 0x8D95, 0x8DFC, 0x8F14, 0x8F12, 0x8F15, + 0x8F13, 0x8FA3, 0x9060, 0x9058, 0x905C, 0x9063, 0x9059, 0x905E, + 0x9062, 0x905D, 0x905B, 0x9119, 0x9118, 0x911E, 0x9175, 0x9178, + 0x9177, 0x9174, 0x9278, 0x9280, 0x9285, 0x9298, 0x9296, 0x927B, + 0x9293, 0x929C, 0x92A8, 0x927C, 0x9291, 0x95A1, 0x95A8, 0x95A9, + 0x95A3, 0x95A5, 0x95A4, 0x9699, 0x969C, 0x969B, 0x96CC, 0x96D2, + 0x9700, 0x977C, 0x9785, 0x97F6, 0x9817, 0x9818, 0x98AF, 0x98B1, + 0x9903, 0x9905, 0x990C, 0x9909, 0x99C1, 0x9AAF, 0x9AB0, 0x9AE6, + 0x9B41, 0x9B42, 0x9CF4, 0x9CF6, 0x9CF3, 0x9EBC, 0x9F3B, 0x9F4A, + 0x5104, 0x5100, 0x50FB, 0x50F5, 0x50F9, 0x5102, 0x5108, 0x5109, + 0x5105, 0x51DC, 0x5287, 0x5288, 0x5289, 0x528D, 0x528A, 0x52F0, + 0x53B2, 0x562E, 0x563B, 0x5639, 0x5632, 0x563F, 0x5634, 0x5629, + 0x5653, 0x564E, 0x5657, 0x5674, 0x5636, 0x562F, 0x5630, 0x5880, + 0x589F, 0x589E, 0x58B3, 0x589C, 0x58AE, 0x58A9, 0x58A6, 0x596D, + 0x5B09, 0x5AFB, 0x5B0B, 0x5AF5, 0x5B0C, 0x5B08, 0x5BEE, 0x5BEC, + 0x5BE9, 0x5BEB, 0x5C64, 0x5C65, 0x5D9D, 0x5D94, 0x5E62, 0x5E5F, + 0x5E61, 0x5EE2, 0x5EDA, 0x5EDF, 0x5EDD, 0x5EE3, 0x5EE0, 0x5F48, +plane 45 +at 0x00 + 0x5F71, 0x5FB7, 0x5FB5, 0x6176, 0x6167, 0x616E, 0x615D, 0x6155, + 0x6182, 0x5BD7, 0x5BDA, 0x5BDB, 0x5C20, 0x5D6D, 0x5D66, 0x5D64, + 0x5D6E, 0x5D60, 0x5F42, 0x5F5A, 0x5F6E, 0x6130, 0x613A, 0x612A, + 0x6143, 0x6119, 0x6131, 0x613D, 0x6408, 0x6432, 0x6438, 0x6431, + 0x6419, 0x6411, 0x6429, 0x641D, 0x643C, 0x6446, 0x6447, 0x643A, + 0x6407, 0x656B, 0x617C, 0x6170, 0x616B, 0x617E, 0x61A7, 0x6190, + 0x61AB, 0x618E, 0x61AC, 0x619A, 0x61A4, 0x6194, 0x61AE, 0x622E, + 0x6469, 0x646F, 0x6479, 0x649E, 0x64B2, 0x6488, 0x6490, 0x64B0, + 0x64A5, 0x6493, 0x6495, 0x64A9, 0x6492, 0x64AE, 0x64AD, 0x64AB, + 0x649A, 0x64AC, 0x6499, 0x64A2, 0x64B3, 0x6575, 0x6577, 0x6578, + 0x66AE, 0x66AB, 0x66B4, 0x66B1, 0x6A23, 0x6A1F, 0x69E8, 0x6A01, + 0x6A1E, 0x6A19, 0x69FD, 0x6A21, 0x6A13, 0x6A0A, 0x69F3, 0x6A02, + 0x6A05, 0x69ED, 0x6A11, 0x6B50, 0x6B4E, 0x6BA4, 0x6BC5, 0x6BC6, + 0x6F3F, 0x6F7C, 0x6F84, 0x6F51, 0x6F66, 0x6F54, 0x6F86, 0x6F6D, + 0x6F5B, 0x6F78, 0x6F6E, 0x6F8E, 0x6F7A, 0x6F70, 0x6F64, 0x6F97, + 0x6F58, 0x6ED5, 0x6F6F, 0x6F60, 0x6F5F, 0x719F, 0x71AC, 0x71B1, + 0x71A8, 0x7256, 0x729B, 0x734E, 0x7357, 0x7469, 0x748B, 0x7483, + 0x747E, 0x7480, 0x757F, 0x7620, 0x7629, 0x761F, 0x7624, 0x7626, + 0x7621, 0x7622, 0x769A, 0x76BA, 0x76E4, 0x778E, 0x7787, 0x778C, + 0x7791, 0x778B, 0x78CB, 0x78C5, 0x78BA, 0x78CA, 0x78BE, 0x78D5, + 0x78BC, 0x78D0, 0x7A3F, 0x7A3C, 0x7A40, 0x7A3D, 0x7A37, 0x7A3B, + 0x7AAF, 0x7AAE, 0x7BAD, 0x7BB1, 0x7BC4, 0x7BB4, 0x7BC6, 0x7BC7, + 0x7BC1, 0x7BA0, 0x7BCC, 0x7CCA, 0x7DE0, 0x7DF4, 0x7DEF, 0x7DFB, + 0x7DD8, 0x7DEC, 0x7DDD, 0x7DE8, 0x7DE3, 0x7DDA, 0x7DDE, 0x7DE9, + 0x7D9E, 0x7DD9, 0x7DF2, 0x7DF9, 0x7F75, 0x7F77, 0x7FAF, 0x6570, + 0x656D, 0x65E4, 0x6693, 0x668F, 0x6692, 0x668E, 0x6946, 0x6931, + 0x693E, 0x697C, 0x6943, 0x6973, 0x6955, 0x6985, 0x694D, 0x6950, + 0x6947, 0x6967, 0x6936, 0x6964, 0x6961, 0x697D, 0x6B44, 0x6B40, + 0x6B71, 0x6B73, 0x6B9C, 0x6BC1, 0x6BFA, 0x6C31, 0x6C32, 0x6EB8, + 0x7FE9, 0x8026, 0x819B, 0x819C, 0x819D, 0x81A0, 0x819A, 0x8198, + 0x8517, 0x853D, 0x851A, 0x84EE, 0x852C, 0x852D, 0x8513, 0x8511, + 0x8523, 0x8521, 0x8514, 0x84EC, 0x8525, 0x84FF, 0x8506, 0x8782, +plane 46 +at 0x00 + 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, 0x8757, + 0x874C, 0x8753, 0x885B, 0x885D, 0x8910, 0x8907, 0x8912, 0x8913, + 0x8915, 0x890A, 0x8ABC, 0x8AD2, 0x8AC7, 0x8AC4, 0x8A95, 0x8ACB, + 0x8AF8, 0x8AB2, 0x8AC9, 0x8AC2, 0x8ABF, 0x8AB0, 0x8AD6, 0x8ACD, + 0x8AB6, 0x8AB9, 0x8ADB, 0x8C4C, 0x8C4E, 0x8C6C, 0x8CE0, 0x8CDE, + 0x8CE6, 0x8CE4, 0x8CEC, 0x8CED, 0x8CE2, 0x8CE3, 0x8CDC, 0x8CEA, + 0x8CE1, 0x8D6D, 0x8D9F, 0x8DA3, 0x8E2B, 0x8E10, 0x8E1D, 0x8E22, + 0x8E0F, 0x8E29, 0x8E1F, 0x8E21, 0x8E1E, 0x8EBA, 0x8F1D, 0x8F1B, + 0x8F1F, 0x8F29, 0x8F26, 0x8F2A, 0x8F1C, 0x8F1E, 0x8F25, 0x9069, + 0x906E, 0x9068, 0x906D, 0x9077, 0x9130, 0x912D, 0x9127, 0x9131, + 0x9187, 0x9189, 0x918B, 0x9183, 0x92C5, 0x92BB, 0x92B7, 0x92EA, + 0x92AC, 0x92E4, 0x92C1, 0x92B3, 0x92BC, 0x92D2, 0x92C7, 0x92F0, + 0x92B2, 0x95AD, 0x95B1, 0x9704, 0x9706, 0x9707, 0x9709, 0x9760, + 0x978D, 0x978B, 0x978F, 0x9821, 0x982B, 0x981C, 0x98B3, 0x990A, + 0x9913, 0x9912, 0x9918, 0x99DD, 0x99D0, 0x99DF, 0x99DB, 0x99D1, + 0x99D5, 0x99D2, 0x99D9, 0x9AB7, 0x9AEE, 0x9AEF, 0x9B27, 0x9B45, + 0x9B44, 0x9B77, 0x9B6F, 0x9D06, 0x9D09, 0x6EA8, 0x6E91, 0x6EBB, + 0x6E9A, 0x6EA9, 0x6EB5, 0x6E6C, 0x6EE8, 0x6EDD, 0x6EDA, 0x6EE6, + 0x6EAC, 0x6ED9, 0x6EE3, 0x6EE9, 0x6EDB, 0x716F, 0x7148, 0x714A, + 0x716B, 0x714F, 0x7157, 0x7174, 0x7145, 0x7151, 0x716D, 0x7251, + 0x7250, 0x724E, 0x7341, 0x732E, 0x7346, 0x7427, 0x9D03, 0x9EA9, + 0x9EBE, 0x9ECE, 0x58A8, 0x9F52, 0x5112, 0x5118, 0x5114, 0x5110, + 0x5115, 0x5180, 0x51AA, 0x51DD, 0x5291, 0x5293, 0x52F3, 0x5659, + 0x566B, 0x5679, 0x5669, 0x5664, 0x5678, 0x566A, 0x5668, 0x5665, + 0x5671, 0x566F, 0x566C, 0x5662, 0x5676, 0x58C1, 0x58BE, 0x58C7, + 0x58C5, 0x596E, 0x5B1D, 0x5B34, 0x5B78, 0x5BF0, 0x5C0E, 0x5F4A, + 0x61B2, 0x6191, 0x61A9, 0x618A, 0x61CD, 0x61B6, 0x61BE, 0x61CA, + 0x61C8, 0x6230, 0x64C5, 0x64C1, 0x64CB, 0x64BB, 0x64BC, 0x64DA, + 0x64C4, 0x64C7, 0x64C2, 0x64CD, 0x64BF, 0x64D2, 0x64D4, 0x64BE, + 0x6574, 0x66C6, 0x66C9, 0x66B9, 0x66C4, 0x66C7, 0x66B8, 0x6A3D, + 0x6A38, 0x6A3A, 0x6A59, 0x6A6B, 0x6A58, 0x6A39, 0x6A44, 0x6A62, + 0x6A61, 0x6A4B, 0x6A47, 0x6A35, 0x6A5F, 0x6A48, 0x6B59, 0x6B77, +plane 47 +at 0x00 + 0x6C05, 0x6FC2, 0x6FB1, 0x6FA1, 0x6FC3, 0x6FA4, 0x6FC1, 0x6FA7, + 0x6FB3, 0x6FC0, 0x6FB9, 0x6FB6, 0x6FA6, 0x6FA0, 0x6FB4, 0x71BE, + 0x71C9, 0x71D0, 0x71D2, 0x71C8, 0x71D5, 0x71B9, 0x71CE, 0x71D9, + 0x71DC, 0x71C3, 0x71C4, 0x7368, 0x749C, 0x74A3, 0x7498, 0x749F, + 0x749E, 0x74E2, 0x750C, 0x750D, 0x7634, 0x7638, 0x763A, 0x76E7, + 0x76E5, 0x77A0, 0x779E, 0x779F, 0x77A5, 0x78E8, 0x78DA, 0x78EC, + 0x78E7, 0x79A6, 0x7A4D, 0x7A4E, 0x7A46, 0x7A4C, 0x7A4B, 0x7ABA, + 0x7BD9, 0x7C11, 0x7BC9, 0x7BE4, 0x7BDB, 0x7BE1, 0x7BE9, 0x7BE6, + 0x7CD5, 0x7CD6, 0x7E0A, 0x7448, 0x7453, 0x743D, 0x745D, 0x7456, + 0x741E, 0x7447, 0x7443, 0x7458, 0x7449, 0x744C, 0x7445, 0x743E, + 0x7501, 0x751E, 0x757A, 0x75EE, 0x7602, 0x7697, 0x7698, 0x775D, + 0x7764, 0x7753, 0x7758, 0x7882, 0x7890, 0x788A, 0x787A, 0x787D, + 0x788B, 0x7878, 0x788D, 0x7888, 0x7E11, 0x7E08, 0x7E1B, 0x7E23, + 0x7E1E, 0x7E1D, 0x7E09, 0x7E10, 0x7F79, 0x7FB2, 0x7FF0, 0x7FF1, + 0x7FEE, 0x8028, 0x81B3, 0x81A9, 0x81A8, 0x81FB, 0x8208, 0x8258, + 0x8259, 0x854A, 0x8559, 0x8548, 0x8568, 0x8569, 0x8543, 0x8549, + 0x856D, 0x856A, 0x855E, 0x8783, 0x879F, 0x879E, 0x87A2, 0x878D, + 0x8861, 0x892A, 0x8932, 0x8925, 0x892B, 0x8921, 0x89AA, 0x89A6, + 0x8AE6, 0x8AFA, 0x8AEB, 0x8AF1, 0x8B00, 0x8ADC, 0x8AE7, 0x8AEE, + 0x8AFE, 0x8B01, 0x8B02, 0x8AF7, 0x8AED, 0x8AF3, 0x8AF6, 0x8AFC, + 0x8C6B, 0x8C6D, 0x8C93, 0x8CF4, 0x8E44, 0x8E31, 0x8E34, 0x8E42, + 0x8E39, 0x8E35, 0x8F3B, 0x8F2F, 0x8F38, 0x8F33, 0x8FA8, 0x8FA6, + 0x9075, 0x9074, 0x9078, 0x9072, 0x907C, 0x907A, 0x9134, 0x9192, + 0x9320, 0x9336, 0x92F8, 0x9333, 0x932F, 0x9322, 0x92FC, 0x932B, + 0x9304, 0x931A, 0x9310, 0x9326, 0x9321, 0x9315, 0x932E, 0x9319, + 0x95BB, 0x96A7, 0x96A8, 0x96AA, 0x96D5, 0x970E, 0x9711, 0x9716, + 0x970D, 0x9713, 0x970F, 0x975B, 0x975C, 0x9766, 0x9798, 0x9830, + 0x9838, 0x983B, 0x9837, 0x982D, 0x9839, 0x9824, 0x9910, 0x9928, + 0x991E, 0x991B, 0x9921, 0x991A, 0x99ED, 0x99E2, 0x99F1, 0x9AB8, + 0x9ABC, 0x9AFB, 0x9AED, 0x9B28, 0x9B91, 0x9D15, 0x9D23, 0x9D26, + 0x9D28, 0x9D12, 0x9D1B, 0x9ED8, 0x9ED4, 0x9F8D, 0x9F9C, 0x512A, + 0x511F, 0x5121, 0x5132, 0x52F5, 0x568E, 0x5680, 0x5690, 0x5685, +plane 48 +at 0x00 + 0x5687, 0x7892, 0x797E, 0x7983, 0x7980, 0x7A0F, 0x7A1D, 0x7AA1, + 0x7AA4, 0x7AE9, 0x7AEA, 0x7B62, 0x7B6B, 0x7B5E, 0x7B79, 0x7B6F, + 0x7B68, 0x7CAE, 0x7CB0, 0x7D90, 0x7D8A, 0x7D8B, 0x7D99, 0x7D95, + 0x7D87, 0x7D78, 0x7D97, 0x7D89, 0x7D98, 0x7FA3, 0x7FDD, 0x8057, + 0x8163, 0x816A, 0x568F, 0x58D5, 0x58D3, 0x58D1, 0x58CE, 0x5B30, + 0x5B2A, 0x5B24, 0x5B7A, 0x5C37, 0x5C68, 0x5DBC, 0x5DBA, 0x5DBD, + 0x5DB8, 0x5E6B, 0x5F4C, 0x5FBD, 0x61C9, 0x61C2, 0x61C7, 0x61E6, + 0x61CB, 0x6232, 0x6234, 0x64CE, 0x64CA, 0x64D8, 0x64E0, 0x64F0, + 0x64E6, 0x64EC, 0x64F1, 0x64E2, 0x64ED, 0x6582, 0x6583, 0x66D9, + 0x66D6, 0x6A80, 0x6A94, 0x6A84, 0x6AA2, 0x6A9C, 0x6ADB, 0x6AA3, + 0x6A7E, 0x6A97, 0x6A90, 0x6AA0, 0x6B5C, 0x6BAE, 0x6BDA, 0x6C08, + 0x6FD8, 0x6FF1, 0x6FDF, 0x6FE0, 0x6FDB, 0x6FE4, 0x6FEB, 0x6FEF, + 0x6F80, 0x6FEC, 0x6FE1, 0x6FE9, 0x6FD5, 0x6FEE, 0x6FF0, 0x71E7, + 0x71DF, 0x71EE, 0x71E6, 0x71E5, 0x71ED, 0x71EC, 0x71F4, 0x71E0, + 0x7235, 0x7246, 0x7370, 0x7372, 0x74A9, 0x74B0, 0x74A6, 0x74A8, + 0x7646, 0x7642, 0x764C, 0x76EA, 0x77B3, 0x77AA, 0x77B0, 0x77AC, + 0x77A7, 0x77AD, 0x77EF, 0x78F7, 0x78FA, 0x78F4, 0x78EF, 0x7901, + 0x79A7, 0x79AA, 0x7A57, 0x7ABF, 0x7C07, 0x7C0D, 0x7BFE, 0x7BF7, + 0x7C0C, 0x7BE0, 0x7CE0, 0x7CDC, 0x7CDE, 0x7CE2, 0x7CDF, 0x7CD9, + 0x7CDD, 0x7E2E, 0x7E3E, 0x7E46, 0x7E37, 0x7E32, 0x7E43, 0x7E2B, + 0x7E3D, 0x7E31, 0x7E45, 0x7E41, 0x7E34, 0x7E39, 0x7E48, 0x7E35, + 0x7E3F, 0x7E2F, 0x7F44, 0x7FF3, 0x7FFC, 0x8071, 0x8072, 0x8070, + 0x806F, 0x8073, 0x81C6, 0x81C3, 0x81BA, 0x81C2, 0x81C0, 0x81BF, + 0x81BD, 0x81C9, 0x81BE, 0x81E8, 0x8209, 0x8271, 0x85AA, 0x816C, + 0x815D, 0x8175, 0x815F, 0x817D, 0x816D, 0x8241, 0x844F, 0x8484, + 0x847F, 0x8448, 0x842A, 0x847B, 0x8472, 0x8464, 0x842E, 0x845C, + 0x8453, 0x8441, 0x84C8, 0x8462, 0x8480, 0x843E, 0x8483, 0x8471, + 0x844A, 0x8455, 0x8458, 0x86FC, 0x86FD, 0x8715, 0x8716, 0x86FF, + 0x8584, 0x857E, 0x859C, 0x8591, 0x8594, 0x85AF, 0x859B, 0x8587, + 0x85A8, 0x858A, 0x8667, 0x87C0, 0x87D1, 0x87B3, 0x87D2, 0x87C6, + 0x87AB, 0x87BB, 0x87BA, 0x87C8, 0x87CB, 0x893B, 0x8936, 0x8944, + 0x8938, 0x893D, 0x89AC, 0x8B0E, 0x8B17, 0x8B19, 0x8B1B, 0x8B0A, +plane 49 +at 0x00 + 0x8B20, 0x8B1D, 0x8B04, 0x8B10, 0x8C41, 0x8C3F, 0x8C73, 0x8CFA, + 0x8CFD, 0x8CFC, 0x8CF8, 0x8CFB, 0x8DA8, 0x8E49, 0x8E4B, 0x8E48, + 0x8E4A, 0x8F44, 0x8F3E, 0x8F42, 0x8F45, 0x8F3F, 0x907F, 0x907D, + 0x9084, 0x9081, 0x9082, 0x9080, 0x9139, 0x91A3, 0x919E, 0x919C, + 0x934D, 0x9382, 0x9328, 0x9375, 0x934A, 0x9365, 0x934B, 0x9318, + 0x937E, 0x936C, 0x935B, 0x9370, 0x935A, 0x9354, 0x95CA, 0x95CB, + 0x95CC, 0x95C8, 0x95C6, 0x96B1, 0x96B8, 0x96D6, 0x971C, 0x971E, + 0x97A0, 0x97D3, 0x9846, 0x98B6, 0x9935, 0x9A01, 0x99FF, 0x9BAE, + 0x9BAB, 0x9BAA, 0x9BAD, 0x9D3B, 0x9D3F, 0x9E8B, 0x9ECF, 0x9EDE, + 0x9EDC, 0x9EDD, 0x9EDB, 0x9F3E, 0x9F4B, 0x53E2, 0x5695, 0x56AE, + 0x58D9, 0x58D8, 0x5B38, 0x5F5E, 0x61E3, 0x6233, 0x64F4, 0x64F2, + 0x64FE, 0x6506, 0x64FA, 0x64FB, 0x64F7, 0x65B7, 0x66DC, 0x6726, + 0x6AB3, 0x6AAC, 0x6AC3, 0x6ABB, 0x6AB8, 0x6AC2, 0x6AAE, 0x6AAF, + 0x6B5F, 0x6B78, 0x6BAF, 0x7009, 0x700B, 0x6FFE, 0x7006, 0x6FFA, + 0x7011, 0x700F, 0x71FB, 0x71FC, 0x71FE, 0x71F8, 0x7377, 0x7375, + 0x74A7, 0x74BF, 0x7515, 0x7656, 0x7658, 0x8858, 0x88E0, 0x89E7, + 0x8A6A, 0x8A80, 0x8A6F, 0x8A65, 0x8A78, 0x8A7D, 0x8A88, 0x8A64, + 0x8A7E, 0x8A67, 0x8C63, 0x8C88, 0x8CCD, 0x8CC9, 0x8DED, 0x8EB1, + 0x8F04, 0x8F9E, 0x8FA0, 0x9043, 0x9046, 0x9048, 0x9045, 0x9040, + 0x904C, 0x910C, 0x9113, 0x9115, 0x916B, 0x9167, 0x7652, 0x77BD, + 0x77BF, 0x77BB, 0x77BC, 0x790E, 0x79AE, 0x7A61, 0x7A62, 0x7A60, + 0x7AC4, 0x7AC5, 0x7C2B, 0x7C27, 0x7C2A, 0x7C1E, 0x7C23, 0x7C21, + 0x7CE7, 0x7E54, 0x7E55, 0x7E5E, 0x7E5A, 0x7E61, 0x7E52, 0x7E59, + 0x7F48, 0x7FF9, 0x7FFB, 0x8077, 0x8076, 0x81CD, 0x81CF, 0x820A, + 0x85CF, 0x85A9, 0x85CD, 0x85D0, 0x85C9, 0x85B0, 0x85BA, 0x85B9, + 0x85A6, 0x87EF, 0x87EC, 0x87F2, 0x87E0, 0x8986, 0x89B2, 0x89F4, + 0x8B28, 0x8B39, 0x8B2C, 0x8B2B, 0x8C50, 0x8D05, 0x8E59, 0x8E63, + 0x8E66, 0x8E64, 0x8E5F, 0x8E55, 0x8EC0, 0x8F49, 0x8F4D, 0x9087, + 0x9083, 0x9088, 0x91AB, 0x91AC, 0x91D0, 0x9394, 0x938A, 0x9396, + 0x93A2, 0x93B3, 0x93AE, 0x93AC, 0x93B0, 0x9398, 0x939A, 0x9397, + 0x95D4, 0x95D6, 0x95D0, 0x95D5, 0x96E2, 0x96DC, 0x96D9, 0x96DB, + 0x96DE, 0x9724, 0x97A3, 0x97A6, 0x97AD, 0x97F9, 0x984D, 0x984F, +plane 50 +at 0x00 + 0x984C, 0x984E, 0x9853, 0x98BA, 0x993E, 0x993F, 0x993D, 0x992E, + 0x99A5, 0x9A0E, 0x9AC1, 0x9B03, 0x9B06, 0x9B4F, 0x9B4E, 0x9B4D, + 0x9BCA, 0x9BC9, 0x9BFD, 0x9BC8, 0x9BC0, 0x9D51, 0x9D5D, 0x9D60, + 0x9EE0, 0x9F15, 0x9F2C, 0x5133, 0x56A5, 0x58DE, 0x58DF, 0x58E2, + 0x5BF5, 0x9F90, 0x5EEC, 0x61F2, 0x61F7, 0x61F6, 0x61F5, 0x6500, + 0x650F, 0x66E0, 0x66DD, 0x6AE5, 0x6ADD, 0x6ADA, 0x6AD3, 0x701B, + 0x701F, 0x7028, 0x701A, 0x701D, 0x7015, 0x7018, 0x7206, 0x720D, + 0x7258, 0x72A2, 0x7378, 0x925D, 0x9255, 0x9235, 0x9259, 0x922F, + 0x923C, 0x928F, 0x925C, 0x926A, 0x9262, 0x925F, 0x926B, 0x926E, + 0x923B, 0x9244, 0x9241, 0x959A, 0x9599, 0x968F, 0x9696, 0x96F4, + 0x96FC, 0x9755, 0x9779, 0x97EE, 0x97F5, 0x980B, 0x98F3, 0x98F7, + 0x98FF, 0x98F5, 0x98EC, 0x98F1, 0x737A, 0x74BD, 0x74CA, 0x74E3, + 0x7587, 0x7586, 0x765F, 0x7661, 0x77C7, 0x7919, 0x79B1, 0x7A6B, + 0x7A69, 0x7C3E, 0x7C3F, 0x7C38, 0x7C3D, 0x7C37, 0x7C40, 0x7E6B, + 0x7E6D, 0x7E79, 0x7E69, 0x7E6A, 0x7F85, 0x7E73, 0x7FB6, 0x7FB9, + 0x7FB8, 0x81D8, 0x85E9, 0x85DD, 0x85EA, 0x85D5, 0x85E4, 0x85E5, + 0x85F7, 0x87FB, 0x8805, 0x880D, 0x87F9, 0x87FE, 0x8960, 0x895F, + 0x8956, 0x895E, 0x8B41, 0x8B5C, 0x8B58, 0x8B49, 0x8B5A, 0x8B4E, + 0x8B4F, 0x8B46, 0x8B59, 0x8D08, 0x8D0A, 0x8E7C, 0x8E72, 0x8E87, + 0x8E76, 0x8E6C, 0x8E7A, 0x8E74, 0x8F54, 0x8F4E, 0x8FAD, 0x908A, + 0x908B, 0x91B1, 0x91AE, 0x93E1, 0x93D1, 0x93DF, 0x93C3, 0x93C8, + 0x93DC, 0x93DD, 0x93D6, 0x93E2, 0x93CD, 0x93D8, 0x93E4, 0x93D7, + 0x93E8, 0x95DC, 0x96B4, 0x96E3, 0x972A, 0x9727, 0x9761, 0x97DC, + 0x97FB, 0x985E, 0x9858, 0x985B, 0x98BC, 0x9945, 0x9949, 0x9A16, + 0x9A19, 0x9B0D, 0x9BE8, 0x9BE7, 0x9BD6, 0x9BDB, 0x9D89, 0x9D61, + 0x9D72, 0x9D6A, 0x9D6C, 0x9E92, 0x9E97, 0x9E93, 0x9EB4, 0x52F8, + 0x56A8, 0x56B7, 0x56B6, 0x56B4, 0x56BC, 0x58E4, 0x5B40, 0x5B43, + 0x5B7D, 0x5BF6, 0x5DC9, 0x61F8, 0x61FA, 0x6518, 0x6514, 0x6519, + 0x66E6, 0x6727, 0x6AEC, 0x703E, 0x7030, 0x7032, 0x7210, 0x737B, + 0x74CF, 0x7662, 0x7665, 0x7926, 0x792A, 0x792C, 0x792B, 0x7AC7, + 0x7AF6, 0x7C4C, 0x7C43, 0x7C4D, 0x7CEF, 0x7CF0, 0x8FAE, 0x7E7D, + 0x7E7C, 0x999A, 0x9AE2, 0x9B3D, 0x9B5D, 0x9CE8, 0x9CEB, 0x9CEF, +plane 51 +at 0x00 + 0x9CEE, 0x9E81, 0x9F14, 0x50D0, 0x50D9, 0x50DC, 0x50D8, 0x50E1, + 0x50EB, 0x50F4, 0x50E2, 0x50DE, 0x51F4, 0x52ED, 0x52EA, 0x5332, + 0x53AE, 0x53B0, 0x55FB, 0x5603, 0x560B, 0x5607, 0x55F8, 0x5628, + 0x561E, 0x5618, 0x7E82, 0x7F4C, 0x8000, 0x81DA, 0x8266, 0x85FB, + 0x85F9, 0x8611, 0x85FA, 0x8606, 0x860B, 0x8607, 0x860A, 0x8814, + 0x8815, 0x8964, 0x89BA, 0x89F8, 0x8B70, 0x8B6C, 0x8B66, 0x8B6F, + 0x8B5F, 0x8B6B, 0x8D0F, 0x8D0D, 0x8E89, 0x8E81, 0x8E85, 0x8E82, + 0x91B4, 0x91CB, 0x9418, 0x9403, 0x93FD, 0x95E1, 0x9730, 0x98C4, + 0x9952, 0x9951, 0x99A8, 0x9A2B, 0x9A30, 0x9A37, 0x9A35, 0x9C13, + 0x9C0D, 0x9E79, 0x9EB5, 0x9EE8, 0x9F2F, 0x9F5F, 0x9F63, 0x9F61, + 0x5137, 0x5138, 0x56C1, 0x56C0, 0x56C2, 0x5914, 0x5C6C, 0x5DCD, + 0x61FC, 0x61FE, 0x651D, 0x651C, 0x6595, 0x66E9, 0x6AFB, 0x6B04, + 0x6AFA, 0x6BB2, 0x704C, 0x721B, 0x72A7, 0x74D6, 0x74D4, 0x7669, + 0x77D3, 0x7C50, 0x7E8F, 0x7E8C, 0x7FBC, 0x8617, 0x862D, 0x861A, + 0x8823, 0x8822, 0x8821, 0x881F, 0x896A, 0x896C, 0x89BD, 0x8B74, + 0x8B77, 0x8B7D, 0x8D13, 0x8E8A, 0x8E8D, 0x8E8B, 0x8F5F, 0x8FAF, + 0x91BA, 0x942E, 0x9433, 0x9435, 0x943A, 0x9438, 0x9432, 0x942B, + 0x95E2, 0x9738, 0x9739, 0x9732, 0x97FF, 0x9867, 0x9865, 0x9957, + 0x9A45, 0x9A43, 0x9A40, 0x9A3E, 0x9ACF, 0x9B54, 0x9B51, 0x9C2D, + 0x9C25, 0x9DAF, 0x9DB4, 0x9DC2, 0x9DB8, 0x9E9D, 0x9EEF, 0x9F19, + 0x9F5C, 0x9F66, 0x9F67, 0x513C, 0x513B, 0x56C8, 0x56CA, 0x56C9, + 0x5B7F, 0x5DD4, 0x5DD2, 0x5F4E, 0x61FF, 0x6524, 0x6B0A, 0x6B61, + 0x7051, 0x7058, 0x7380, 0x74E4, 0x758A, 0x766E, 0x766C, 0x5611, + 0x5651, 0x5605, 0x5717, 0x5892, 0x588C, 0x5878, 0x5884, 0x5873, + 0x58AD, 0x5897, 0x5895, 0x5877, 0x5872, 0x5896, 0x588D, 0x5910, + 0x596C, 0x5AE7, 0x5AE4, 0x5AEF, 0x5626, 0x5AF0, 0x5D7B, 0x5D83, + 0x5D8B, 0x5D8C, 0x5D78, 0x5E52, 0x5ED0, 0x5ECF, 0x5FB3, 0x5FB4, + 0x79B3, 0x7C60, 0x7C5F, 0x807E, 0x807D, 0x81DF, 0x8972, 0x896F, + 0x89FC, 0x8B80, 0x8D16, 0x8D17, 0x8E91, 0x8E93, 0x8F61, 0x9148, + 0x9444, 0x9451, 0x9452, 0x973D, 0x973E, 0x97C3, 0x97C1, 0x986B, + 0x9955, 0x9A55, 0x9A4D, 0x9AD2, 0x9B1A, 0x9C49, 0x9C31, 0x9C3E, + 0x9C3B, 0x9DD3, 0x9DD7, 0x9F34, 0x9F6C, 0x9F6A, 0x9F94, 0x56CC, +plane 52 +at 0x00 + 0x5DD6, 0x6200, 0x6523, 0x652B, 0x652A, 0x66EC, 0x6B10, 0x74DA, + 0x7ACA, 0x7C64, 0x7C63, 0x7C65, 0x7E93, 0x7E96, 0x7E94, 0x81E2, + 0x8638, 0x863F, 0x8831, 0x8B8A, 0x9090, 0x908F, 0x9463, 0x9460, + 0x9464, 0x9768, 0x986F, 0x995C, 0x9A5A, 0x9A5B, 0x9A57, 0x9AD3, + 0x9AD4, 0x9AD1, 0x9C54, 0x9C57, 0x9C56, 0x9DE5, 0x9E9F, 0x9EF4, + 0x56D1, 0x58E9, 0x652C, 0x705E, 0x7671, 0x7672, 0x77D7, 0x7F50, + 0x7F88, 0x8836, 0x8839, 0x8862, 0x8B93, 0x8B92, 0x8B96, 0x8277, + 0x8D1B, 0x91C0, 0x946A, 0x9742, 0x9748, 0x9744, 0x97C6, 0x9870, + 0x9A5F, 0x9B22, 0x9B58, 0x9C5F, 0x9DF9, 0x9DFA, 0x9E7C, 0x9E7D, + 0x9F07, 0x9F77, 0x9F72, 0x5EF3, 0x6B16, 0x7063, 0x7C6C, 0x7C6E, + 0x883B, 0x89C0, 0x8EA1, 0x91C1, 0x9472, 0x9470, 0x9871, 0x995E, + 0x9AD6, 0x9B23, 0x9ECC, 0x7064, 0x77DA, 0x8B9A, 0x9477, 0x97C9, + 0x9A62, 0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, 0x91C5, 0x947D, 0x947E, + 0x947C, 0x9C77, 0x9C78, 0x9EF7, 0x8C54, 0x947F, 0x9E1A, 0x7228, + 0x9A6A, 0x9B31, 0x9E1B, 0x9E1E, 0x7C72, 0x617B, 0x616F, 0x6181, + 0x613C, 0x6142, 0x6138, 0x6133, 0x6160, 0x6169, 0x617D, 0x6186, + 0x622C, 0x6228, 0x644C, 0x6457, 0x647C, 0x6455, 0x6462, 0x6471, + 0x646A, 0x6456, 0x643B, 0x6481, 0x644F, 0x647E, 0x6464, 0x6571, + 0x66A5, 0x669A, 0x669C, 0x66A6, 0x66A4, 0x698F, 0x2460, 0x2461, + 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, + 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, + 0x247C, 0x247D, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, + 0x2176, 0x2177, 0x2178, 0x2179, 0x4E36, 0x4E3F, 0x4E85, 0x4EA0, + 0x5182, 0x5196, 0x51AB, 0x52F9, 0x5338, 0x5369, 0x53B6, 0x590A, + 0x5B80, 0x5DDB, 0x5E7A, 0x5E7F, 0x5EF4, 0x5F50, 0x5F61, 0x6534, + 0x65E0, 0x7592, 0x7676, 0x8FB5, 0x96B6, 0x5902, 0xFF3E, 0x30FD, + 0x30FE, 0x309D, 0x309E, 0xFF02, 0x309B, 0x309C, 0x30FB, 0x3007, + 0x30FC, 0xFF3B, 0xFF3D, 0x273D, 0x3041, 0x3042, 0x3043, 0x3044, + 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, + 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, + 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, + 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, +plane 53 +at 0x00 + 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, + 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, + 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, + 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, + 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, + 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, + 0x30A2, 0x30A3, 0x30A4, 0x69C5, 0x69C8, 0x6992, 0x69B2, 0x69E3, + 0x69C0, 0x69D6, 0x69D1, 0x699F, 0x69A2, 0x69D2, 0x69E1, 0x69D5, + 0x699D, 0x6998, 0x6B74, 0x6BA1, 0x6EF0, 0x6EF3, 0x6F1B, 0x6F0C, + 0x6F1D, 0x6F34, 0x6F28, 0x6F17, 0x6F44, 0x6F42, 0x6F04, 0x6F11, + 0x6EFA, 0x6F4A, 0x7191, 0x718E, 0x30A5, 0x30A6, 0x30A7, 0x30A8, + 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, + 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, + 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, + 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, + 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, + 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, + 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, + 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, + 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, + 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0x6BB9, 0x6E0B, + 0x7105, 0x7314, 0x7304, 0x7305, 0x7315, 0x730D, 0x772E, 0x7741, + 0x77EA, 0x7844, 0x7B29, 0x7B27, 0x7C9D, 0x7FC8, 0x8126, 0x811C, + 0x8128, 0x8370, 0x8382, 0x83AC, 0x86AD, 0x86CA, 0x8851, 0x889D, + 0x8990, 0x89D8, 0x89D7, 0x8A2E, 0x8C59, 0x8EDA, 0x9033, 0x9018, + 0x91EF, 0x9AD9, 0x4EB4, 0x50A0, 0x5090, 0x5086, 0x5084, 0x508A, + 0x509F, 0x50A1, 0x5093, 0x51D5, 0x5590, 0x5710, 0x5817, 0x5844, + 0x582B, 0x5845, 0x5965, 0x5BCF, 0x5D56, 0x5D54, 0x5F3D, 0x5FA4, + 0x63EC, 0x63FA, 0x63D4, 0x6675, 0x671C, 0x68D9, 0x6BF1, 0x6E37, + 0x6E7D, 0x6E86, 0x74FA, 0x7572, 0x75DC, 0x7867, 0x7977, 0x7A9B, + 0x7D2A, 0x718B, 0x718D, 0x717F, 0x718C, 0x717E, 0x717C, 0x7183, + 0x7188, 0x7294, 0x7355, 0x7353, 0x734F, 0x7354, 0x746C, 0x7465, +plane 54 +at 0x00 + 0x7466, 0x7461, 0x746B, 0x7468, 0x7476, 0x7460, 0x7474, 0x7506, + 0x760E, 0x7607, 0x76B9, 0x76B7, 0x76E2, 0x7774, 0x7777, 0x7776, + 0x7775, 0x7778, 0x7D65, 0x7F64, 0x8020, 0x8120, 0x813C, 0x813F, + 0x81F0, 0x81F5, 0x8415, 0x83BE, 0x86E5, 0x86D2, 0x86E0, 0x88B3, + 0x8A53, 0x8A37, 0x8A47, 0x8A5C, 0x8EF0, 0x921D, 0x976B, 0x50C0, + 0x52E5, 0x53AF, 0x55D8, 0x5711, 0x5867, 0x5843, 0x5BDD, 0x5D70, + 0x5D6A, 0x5D74, 0x5D5F, 0x5D61, 0x5D73, 0x5E50, 0x5F3F, 0x5FB0, + 0x6135, 0x612D, 0x6102, 0x6226, 0x656E, 0x65B1, 0x65D4, 0x6685, + 0x6972, 0x693A, 0x6EAD, 0x6E95, 0x7243, 0x728F, 0x7575, 0x75EC, + 0x7757, 0x797B, 0x7A21, 0x7A16, 0x7AE8, 0x7B6A, 0x7B5F, 0x7D82, + 0x8055, 0x8168, 0x8246, 0x8243, 0x8481, 0x847C, 0x846A, 0x9170, + 0x50D2, 0x9B62, 0x6F8A, 0x8772, 0x9AF0, 0x9EA8, 0x5292, 0x878C, + 0x9ABA, 0x9B81, 0x9384, 0x9AFF, 0x9BB3, 0x9BB0, 0x9EC7, 0x9721, + 0x7C36, 0x8B5E, 0x9401, 0x941D, 0x994A, 0x8B73, 0x9DD4, 0x77D6, + 0x4E42, 0x4E5C, 0x51F5, 0x531A, 0x5382, 0x4E07, 0x4E0C, 0x4E47, + 0x4E8D, 0x56D7, 0x5140, 0x5C6E, 0x5F73, 0x4E0F, 0x5187, 0x4E0E, + 0x4E2E, 0x4E93, 0x4EC2, 0x4EC9, 0x4EC8, 0x5198, 0x52FC, 0x536C, + 0x53B9, 0x5720, 0x5903, 0x592C, 0x5C10, 0x5DFF, 0x65E1, 0x6BB3, + 0x6BCC, 0x6C14, 0x723F, 0x4E31, 0x4E3C, 0x4EE8, 0x4EDC, 0x4EE9, + 0x4EE1, 0x4EDD, 0x4EDA, 0x520C, 0x531C, 0x534C, 0x5722, 0x5723, + 0x5917, 0x592F, 0x5B81, 0x5B84, 0x5C12, 0x5C3B, 0x5C74, 0x5C73, + 0x5E04, 0x5E80, 0x5E82, 0x5FC9, 0x6209, 0x6250, 0x6C15, 0x7771, + 0x777A, 0x715B, 0x777B, 0x78A6, 0x78AE, 0x78B8, 0x78B1, 0x78AF, + 0x7989, 0x7987, 0x7A29, 0x7A2A, 0x7A2D, 0x7A2C, 0x7A32, 0x7AEC, + 0x7AF0, 0x7B81, 0x7B9E, 0x7B83, 0x7B92, 0x7BA3, 0x7B9F, 0x7B93, + 0x7B86, 0x7CB8, 0x7CB7, 0x7DC8, 0x7DB6, 0x7DD1, 0x7DA8, 0x7DAB, + 0x6C36, 0x6C43, 0x6C3F, 0x6C3B, 0x72AE, 0x72B0, 0x738A, 0x79B8, + 0x808A, 0x961E, 0x4F0E, 0x4F18, 0x4F2C, 0x4EF5, 0x4F14, 0x4EF1, + 0x4F00, 0x4EF7, 0x4F08, 0x4F1D, 0x4F02, 0x4F05, 0x4F22, 0x4F13, + 0x4F04, 0x4EF4, 0x4F12, 0x51B1, 0x5213, 0x5209, 0x5210, 0x52A6, + 0x5322, 0x531F, 0x534D, 0x538A, 0x5407, 0x56E1, 0x56DF, 0x572E, + 0x572A, 0x5734, 0x593C, 0x5980, 0x597C, 0x5985, 0x597B, 0x597E, +plane 55 +at 0x00 + 0x5977, 0x597F, 0x5B56, 0x5C15, 0x5C25, 0x5C7C, 0x5C7A, 0x5C7B, + 0x5C7E, 0x5DDF, 0x5E75, 0x5E84, 0x5F02, 0x5F1A, 0x5F74, 0x5FD5, + 0x5FD4, 0x5FCF, 0x625C, 0x625E, 0x6264, 0x6261, 0x6266, 0x6262, + 0x6259, 0x6260, 0x625A, 0x6265, 0x65EF, 0x65EE, 0x673E, 0x6739, + 0x6738, 0x673B, 0x673A, 0x673F, 0x673C, 0x6733, 0x6C18, 0x6C46, + 0x6C52, 0x6C5C, 0x6C4F, 0x6C4A, 0x6C54, 0x6C4B, 0x6C4C, 0x7071, + 0x725E, 0x72B4, 0x72B5, 0x738E, 0x752A, 0x767F, 0x7A75, 0x7F51, + 0x8278, 0x827C, 0x8280, 0x827D, 0x827F, 0x864D, 0x897E, 0x9099, + 0x9097, 0x9098, 0x909B, 0x9094, 0x9622, 0x9624, 0x9620, 0x9623, + 0x4F56, 0x4F3B, 0x4F62, 0x4F49, 0x4F53, 0x4F64, 0x4F3E, 0x4F67, + 0x4F52, 0x4F5F, 0x4F41, 0x4F58, 0x4F2D, 0x4F33, 0x4F3F, 0x4F61, + 0x518F, 0x51B9, 0x521C, 0x521E, 0x5221, 0x52AD, 0x52AE, 0x5309, + 0x5363, 0x5372, 0x538E, 0x538F, 0x5430, 0x5437, 0x542A, 0x5454, + 0x5445, 0x5419, 0x541C, 0x5425, 0x5418, 0x7DB3, 0x7DCD, 0x7DCF, + 0x7DA4, 0x7F41, 0x7F6F, 0x7F71, 0x8023, 0x805B, 0x8061, 0x805F, + 0x8181, 0x8184, 0x8213, 0x824A, 0x824C, 0x84BD, 0x8495, 0x8492, + 0x84C3, 0x8496, 0x84A5, 0x84B5, 0x84B3, 0x84A3, 0x84E4, 0x84D8, + 0x84D5, 0x84B7, 0x84AD, 0x84DA, 0x8493, 0x8736, 0x543D, 0x544F, + 0x5441, 0x5428, 0x5424, 0x5447, 0x56EE, 0x56E7, 0x56E5, 0x5741, + 0x5745, 0x574C, 0x5749, 0x574B, 0x5752, 0x5906, 0x5940, 0x59A6, + 0x5998, 0x59A0, 0x5997, 0x598E, 0x59A2, 0x5990, 0x598F, 0x59A7, + 0x59A1, 0x5B8E, 0x5B92, 0x5C28, 0x5C2A, 0x5C8D, 0x5C8F, 0x5C88, + 0x5C8B, 0x5C89, 0x5C92, 0x5C8A, 0x5C86, 0x5C93, 0x5C95, 0x5DE0, + 0x5E0A, 0x5E0E, 0x5E8B, 0x5E89, 0x5E8C, 0x5E88, 0x5E8D, 0x5F05, + 0x5F1D, 0x5F78, 0x5F76, 0x5FD2, 0x5FD1, 0x5FD0, 0x5FED, 0x5FE8, + 0x5FEE, 0x5FF3, 0x5FE1, 0x5FE4, 0x5FE3, 0x5FFA, 0x5FEF, 0x5FF7, + 0x5FFB, 0x6000, 0x5FF4, 0x623A, 0x6283, 0x628C, 0x628E, 0x628F, + 0x6294, 0x6287, 0x6271, 0x627B, 0x627A, 0x6270, 0x6281, 0x6288, + 0x6277, 0x627D, 0x6272, 0x6274, 0x6537, 0x65F0, 0x65F4, 0x65F3, + 0x65F2, 0x65F5, 0x6745, 0x6747, 0x6759, 0x6755, 0x674C, 0x6748, + 0x675D, 0x674D, 0x675A, 0x674B, 0x6BD0, 0x6C19, 0x6C1A, 0x6C78, + 0x6C67, 0x6C6B, 0x6C84, 0x6C8B, 0x6C8F, 0x6C71, 0x6C6F, 0x6C69, +plane 56 +at 0x00 + 0x6C9A, 0x6C6D, 0x6C87, 0x6C95, 0x6C9C, 0x6C66, 0x6C73, 0x6C65, + 0x6C7B, 0x6C8E, 0x7074, 0x707A, 0x7263, 0x72BF, 0x72BD, 0x72C3, + 0x72C6, 0x72C1, 0x72BA, 0x72C5, 0x7395, 0x7397, 0x7393, 0x7394, + 0x7392, 0x753A, 0x7539, 0x7594, 0x7595, 0x7681, 0x793D, 0x8034, + 0x8095, 0x8099, 0x8090, 0x8092, 0x809C, 0x8290, 0x828F, 0x8285, + 0x828E, 0x8291, 0x8293, 0x873D, 0x872B, 0x8747, 0x8739, 0x8745, + 0x871D, 0x88FF, 0x88EA, 0x88F5, 0x8900, 0x88ED, 0x8903, 0x88E9, + 0x89EA, 0x8A9B, 0x8A8E, 0x8AA2, 0x8A9C, 0x8A94, 0x8A90, 0x8AA9, + 0x8AAC, 0x8A9F, 0x8A9D, 0x8C67, 0x8CD0, 0x8CD6, 0x8CD4, 0x8D98, + 0x8D9A, 0x8D97, 0x8E0B, 0x8E08, 0x828A, 0x8283, 0x8284, 0x8C78, + 0x8FC9, 0x8FBF, 0x909F, 0x90A1, 0x90A5, 0x909E, 0x90A7, 0x90A0, + 0x9630, 0x9628, 0x962F, 0x962D, 0x4E33, 0x4F98, 0x4F7C, 0x4F85, + 0x4F7D, 0x4F80, 0x4F87, 0x4F76, 0x4F74, 0x4F89, 0x4F84, 0x4F77, + 0x4F4C, 0x4F97, 0x4F6A, 0x4F9A, 0x4F79, 0x4F81, 0x4F78, 0x4F90, + 0x4F9C, 0x4F94, 0x4F9E, 0x4F92, 0x4F82, 0x4F95, 0x4F6B, 0x4F6E, + 0x519E, 0x51BC, 0x51BE, 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, + 0x52BC, 0x530A, 0x530B, 0x533C, 0x5392, 0x5394, 0x5487, 0x547F, + 0x5481, 0x5491, 0x5482, 0x5488, 0x546B, 0x547A, 0x547E, 0x5465, + 0x546C, 0x5474, 0x5466, 0x548D, 0x546F, 0x5461, 0x5460, 0x5498, + 0x5463, 0x5467, 0x5464, 0x56F7, 0x56F9, 0x576F, 0x5772, 0x576D, + 0x576B, 0x5771, 0x5770, 0x5776, 0x5780, 0x5775, 0x577B, 0x5773, + 0x5774, 0x5762, 0x5768, 0x577D, 0x590C, 0x5945, 0x59B5, 0x59BA, + 0x59CF, 0x59CE, 0x59B2, 0x59CC, 0x59C1, 0x59B6, 0x59BC, 0x59C3, + 0x59D6, 0x59B1, 0x59BD, 0x59C0, 0x59C8, 0x59B4, 0x59C7, 0x5B62, + 0x5B65, 0x5B93, 0x5B95, 0x5C44, 0x5C47, 0x5CAE, 0x5CA4, 0x5CA0, + 0x5CB5, 0x5CAF, 0x5CA8, 0x5CAC, 0x5C9F, 0x5CA3, 0x5CAD, 0x5CA2, + 0x5CAA, 0x5CA7, 0x5C9D, 0x5CA5, 0x5CB6, 0x5CB0, 0x5CA6, 0x5E17, + 0x5E14, 0x5E19, 0x5F28, 0x5F22, 0x5F23, 0x5F24, 0x5F54, 0x5F82, + 0x5F7E, 0x5F7D, 0x5FDE, 0x5FE5, 0x602D, 0x6026, 0x6019, 0x6032, + 0x600B, 0x8E01, 0x8EB4, 0x8EB3, 0x8FA1, 0x8FA2, 0x905A, 0x9061, + 0x905F, 0x9125, 0x917B, 0x9176, 0x917C, 0x9289, 0x92F6, 0x92B1, + 0x92AD, 0x9292, 0x9281, 0x9284, 0x92AE, 0x9290, 0x929E, 0x95A2, +plane 57 +at 0x00 + 0x95A7, 0x96A0, 0x969D, 0x969F, 0x96D0, 0x96D1, 0x9759, 0x9764, + 0x9819, 0x9814, 0x6034, 0x600A, 0x6017, 0x6033, 0x601A, 0x601E, + 0x602C, 0x6022, 0x600D, 0x6010, 0x602E, 0x6013, 0x6011, 0x600C, + 0x6009, 0x601C, 0x6214, 0x623D, 0x62AD, 0x62B4, 0x62D1, 0x62BE, + 0x62AA, 0x62B6, 0x62CA, 0x62AE, 0x62B3, 0x62AF, 0x62BB, 0x62A9, + 0x62B0, 0x62B8, 0x653D, 0x65A8, 0x65BB, 0x6609, 0x65FC, 0x6604, + 0x6612, 0x6608, 0x65FB, 0x6603, 0x660B, 0x660D, 0x6605, 0x65FD, + 0x6611, 0x6610, 0x66F6, 0x670A, 0x6785, 0x676C, 0x678E, 0x6792, + 0x6776, 0x677B, 0x6798, 0x6786, 0x6784, 0x6774, 0x678D, 0x678C, + 0x677A, 0x679F, 0x6791, 0x6799, 0x6783, 0x677D, 0x6781, 0x6778, + 0x6779, 0x6794, 0x6B25, 0x6B80, 0x6B7E, 0x6BDE, 0x6C1D, 0x6C93, + 0x6CEC, 0x6CEB, 0x6CEE, 0x6CD9, 0x6CB6, 0x6CD4, 0x6CAD, 0x6CE7, + 0x6CB7, 0x6CD0, 0x6CC2, 0x6CBA, 0x6CC3, 0x6CC6, 0x6CED, 0x6CF2, + 0x6CD2, 0x6CDD, 0x6CB4, 0x6C8A, 0x6C9D, 0x6C80, 0x6CDE, 0x6CC0, + 0x6D30, 0x6CCD, 0x6CC7, 0x6CB0, 0x6CF9, 0x6CCF, 0x6CE9, 0x6CD1, + 0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, + 0x7082, 0x709A, 0x7083, 0x726A, 0x72D6, 0x72CB, 0x72D8, 0x72C9, + 0x72DC, 0x72D2, 0x72D4, 0x72DA, 0x72CC, 0x72D1, 0x73A4, 0x73A1, + 0x73AD, 0x73A6, 0x73A2, 0x73A0, 0x73AC, 0x739D, 0x74DD, 0x74E8, + 0x753F, 0x7540, 0x753E, 0x758C, 0x7598, 0x76AF, 0x76F3, 0x76F1, + 0x76F0, 0x76F5, 0x77F8, 0x77FC, 0x77F9, 0x77FB, 0x77FA, 0x9815, + 0x981A, 0x9906, 0x98F8, 0x9901, 0x99BE, 0x99BC, 0x99B7, 0x99B6, + 0x99C0, 0x99B8, 0x99C4, 0x99BF, 0x9ADA, 0x9AE4, 0x9AE9, 0x9AE8, + 0x9AEA, 0x9AE5, 0x9B26, 0x9B40, 0x9EBD, 0x510E, 0x50F7, 0x50FC, + 0x510D, 0x5101, 0x51DA, 0x51D9, 0x51DB, 0x5286, 0x528E, 0x52EE, + 0x77F7, 0x7942, 0x793F, 0x79C5, 0x7A78, 0x7A7B, 0x7AFB, 0x7C75, + 0x7CFD, 0x8035, 0x808F, 0x80AE, 0x80A3, 0x80B8, 0x80B5, 0x80AD, + 0x8220, 0x82A0, 0x82C0, 0x82AB, 0x829A, 0x8298, 0x829B, 0x82B5, + 0x82A7, 0x82AE, 0x82BC, 0x829E, 0x82BA, 0x82B4, 0x82A8, 0x82A1, + 0x82A9, 0x82C2, 0x82A4, 0x82C3, 0x82B6, 0x82A2, 0x8670, 0x866F, + 0x866D, 0x866E, 0x8C56, 0x8FD2, 0x8FCB, 0x8FD3, 0x8FCD, 0x8FD6, + 0x8FD5, 0x8FD7, 0x90B2, 0x90B4, 0x90AF, 0x90B3, 0x90B0, 0x9639, +plane 58 +at 0x00 + 0x963D, 0x963C, 0x963A, 0x9643, 0x4FCD, 0x4FC5, 0x4FD3, 0x4FB2, + 0x4FC9, 0x4FCB, 0x4FC1, 0x4FD4, 0x4FDC, 0x4FD9, 0x4FBB, 0x4FB3, + 0x4FDB, 0x4FC7, 0x4FD6, 0x4FBA, 0x4FC0, 0x4FB9, 0x4FEC, 0x5244, + 0x5249, 0x52C0, 0x52C2, 0x533D, 0x537C, 0x5397, 0x5396, 0x5399, + 0x5398, 0x54BA, 0x54A1, 0x54AD, 0x54A5, 0x54CF, 0x54C3, 0x830D, + 0x54B7, 0x54AE, 0x54D6, 0x54B6, 0x54C5, 0x54C6, 0x54A0, 0x5470, + 0x54BC, 0x54A2, 0x54BE, 0x5472, 0x54DE, 0x54B0, 0x57B5, 0x579E, + 0x579F, 0x57A4, 0x578C, 0x5797, 0x579D, 0x579B, 0x5794, 0x5798, + 0x578F, 0x5799, 0x57A5, 0x579A, 0x5795, 0x58F4, 0x590D, 0x5953, + 0x59E1, 0x59DE, 0x59EE, 0x5A00, 0x59F1, 0x59DD, 0x59FA, 0x59FD, + 0x59FC, 0x59F6, 0x59E4, 0x59F2, 0x59F7, 0x59DB, 0x59E9, 0x59F3, + 0x59F5, 0x59E0, 0x59FE, 0x59F4, 0x59ED, 0x5BA8, 0x5C4C, 0x5CD0, + 0x5CD8, 0x5CCC, 0x5CD7, 0x5CCB, 0x5CDB, 0x5333, 0x53B1, 0x5647, + 0x562D, 0x5654, 0x564B, 0x5652, 0x5631, 0x5644, 0x5656, 0x5650, + 0x562B, 0x564D, 0x5637, 0x564F, 0x58A2, 0x58B7, 0x58B2, 0x58AA, + 0x58B5, 0x58B0, 0x58B4, 0x58A4, 0x58A7, 0x5926, 0x5AFE, 0x5B04, + 0x5AFC, 0x5B06, 0x5B0A, 0x5B0D, 0x5B00, 0x5B0E, 0x5CDE, 0x5CDA, + 0x5CC9, 0x5CC7, 0x5CCA, 0x5CD6, 0x5CD3, 0x5CD4, 0x5CCF, 0x5CC8, + 0x5CC6, 0x5CCE, 0x5CDF, 0x5CF8, 0x5DF9, 0x5E21, 0x5E22, 0x5E23, + 0x5E20, 0x5E24, 0x5EB0, 0x5EA4, 0x5EA2, 0x5E9B, 0x5EA3, 0x5EA5, + 0x5F07, 0x5F2E, 0x5F56, 0x5F86, 0x6037, 0x6039, 0x6054, 0x6072, + 0x605E, 0x6045, 0x6053, 0x6047, 0x6049, 0x605B, 0x604C, 0x6040, + 0x6042, 0x605F, 0x6024, 0x6044, 0x6058, 0x6066, 0x606E, 0x6242, + 0x6243, 0x62CF, 0x630D, 0x630B, 0x62F5, 0x630E, 0x6303, 0x62EB, + 0x62F9, 0x630F, 0x630C, 0x62F8, 0x62F6, 0x6300, 0x6313, 0x6314, + 0x62FA, 0x6315, 0x62FB, 0x62F0, 0x6541, 0x6543, 0x65AA, 0x65BF, + 0x6636, 0x6621, 0x6632, 0x6635, 0x661C, 0x6626, 0x6622, 0x6633, + 0x662B, 0x663A, 0x661D, 0x6634, 0x6639, 0x662E, 0x670F, 0x6710, + 0x67C1, 0x67F2, 0x67C8, 0x67BA, 0x67DC, 0x67BB, 0x67F8, 0x67D8, + 0x67C0, 0x67B7, 0x67C5, 0x67EB, 0x67E4, 0x67DF, 0x67B5, 0x67CD, + 0x67B3, 0x67F7, 0x67F6, 0x67EE, 0x67E3, 0x67C2, 0x67B9, 0x67CE, + 0x67E7, 0x67F0, 0x67B2, 0x67FC, 0x67C6, 0x67ED, 0x67CC, 0x67AE, +plane 59 +at 0x00 + 0x67E6, 0x67DB, 0x67FA, 0x67C9, 0x67CA, 0x67C3, 0x67EA, 0x67CB, + 0x6B28, 0x6B82, 0x6B84, 0x6BB6, 0x6BD6, 0x6BD8, 0x6BE0, 0x6C20, + 0x6C21, 0x6D28, 0x6D34, 0x6D2D, 0x6D1F, 0x6D3C, 0x6D3F, 0x6D12, + 0x6D0A, 0x6CDA, 0x6D33, 0x6D04, 0x6D19, 0x6D3A, 0x6D1A, 0x6D11, + 0x6D00, 0x6D1D, 0x6D42, 0x5D91, 0x5D8F, 0x5D90, 0x5D98, 0x5DA4, + 0x5D9B, 0x5DA3, 0x5D96, 0x5DE4, 0x5E5A, 0x5E5E, 0x5FB8, 0x6157, + 0x615C, 0x61A6, 0x6195, 0x6188, 0x61A3, 0x618F, 0x6164, 0x6159, + 0x6178, 0x6185, 0x6187, 0x619E, 0x6198, 0x619C, 0x622F, 0x6480, + 0x649B, 0x648E, 0x648D, 0x6494, 0x6D01, 0x6D18, 0x6D37, 0x6D03, + 0x6D0F, 0x6D40, 0x6D07, 0x6D20, 0x6D2C, 0x6D08, 0x6D22, 0x6D09, + 0x6D10, 0x70B7, 0x709F, 0x70BE, 0x70B1, 0x70B0, 0x70A1, 0x70B4, + 0x70B5, 0x70A9, 0x7241, 0x7249, 0x724A, 0x726C, 0x7270, 0x7273, + 0x726E, 0x72CA, 0x72E4, 0x72E8, 0x72EB, 0x72DF, 0x72EA, 0x72E6, + 0x72E3, 0x7385, 0x73CC, 0x73C2, 0x73C8, 0x73C5, 0x73B9, 0x73B6, + 0x73B5, 0x73B4, 0x73EB, 0x73BF, 0x73C7, 0x73BE, 0x73C3, 0x73C6, + 0x73B8, 0x73CB, 0x74EC, 0x74EE, 0x752E, 0x7547, 0x7548, 0x75A7, + 0x75AA, 0x7679, 0x76C4, 0x7708, 0x7703, 0x7704, 0x7705, 0x770A, + 0x76F7, 0x76FB, 0x76FA, 0x77E7, 0x77E8, 0x7806, 0x7811, 0x7812, + 0x7805, 0x7810, 0x780F, 0x780E, 0x7809, 0x7803, 0x7813, 0x794A, + 0x794C, 0x794B, 0x7945, 0x7944, 0x79D5, 0x79CD, 0x79CF, 0x79D6, + 0x79CE, 0x7A80, 0x7A7E, 0x7AD1, 0x7B00, 0x7B01, 0x7C7A, 0x7C78, + 0x7C79, 0x7C7F, 0x7C80, 0x7C81, 0x7D03, 0x7D08, 0x7D01, 0x7F58, + 0x7F91, 0x7F8D, 0x7FBE, 0x8007, 0x800E, 0x800F, 0x8014, 0x8037, + 0x80D8, 0x80C7, 0x80E0, 0x80D1, 0x80C8, 0x80C2, 0x80D0, 0x80C5, + 0x80E3, 0x80D9, 0x80DC, 0x80CA, 0x80D5, 0x80C9, 0x80CF, 0x80D7, + 0x80E6, 0x80CD, 0x81FF, 0x8221, 0x8294, 0x82D9, 0x82FE, 0x82F9, + 0x8307, 0x82E8, 0x8300, 0x82D5, 0x833A, 0x82EB, 0x82D6, 0x82F4, + 0x82EC, 0x82E1, 0x82F2, 0x82F5, 0x830C, 0x82FB, 0x82F6, 0x82F0, + 0x82EA, 0x64C6, 0x64A8, 0x6483, 0x64B9, 0x6486, 0x64B4, 0x64AF, + 0x6491, 0x64AA, 0x64A1, 0x64A7, 0x66B6, 0x66B3, 0x66BC, 0x66AC, + 0x66AD, 0x6A0E, 0x6A1C, 0x6A1A, 0x6A0B, 0x69EF, 0x6A0C, 0x69F0, + 0x6A22, 0x69D8, 0x6A12, 0x69FA, 0x6A2A, 0x6A10, 0x6A29, 0x69F9, +plane 60 +at 0x00 + 0x69EA, 0x6A2C, 0x82E4, 0x82E0, 0x82FA, 0x82F3, 0x82ED, 0x8677, + 0x8674, 0x867C, 0x8673, 0x8841, 0x884E, 0x8867, 0x886A, 0x8869, + 0x89D3, 0x8A04, 0x8A07, 0x8D72, 0x8FE3, 0x8FE1, 0x8FEE, 0x8FE0, + 0x90F1, 0x90BD, 0x90BF, 0x90D5, 0x90C5, 0x90BE, 0x90C7, 0x90CB, + 0x90C8, 0x91D4, 0x91D3, 0x9654, 0x964F, 0x9651, 0x9653, 0x964A, + 0x964E, 0x501E, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501B, + 0x4FF5, 0x4FF4, 0x5033, 0x5037, 0x502C, 0x4FF6, 0x4FF7, 0x5017, + 0x501C, 0x5020, 0x5027, 0x5035, 0x502F, 0x5031, 0x500E, 0x515A, + 0x5194, 0x5193, 0x51CA, 0x51C4, 0x51C5, 0x51C8, 0x51CE, 0x5261, + 0x525A, 0x5252, 0x525E, 0x525F, 0x5255, 0x5262, 0x52CD, 0x530E, + 0x539E, 0x5526, 0x54E2, 0x5517, 0x5512, 0x54E7, 0x54F3, 0x54E4, + 0x551A, 0x54FF, 0x5504, 0x5508, 0x54EB, 0x5511, 0x5505, 0x54F1, + 0x550A, 0x54FB, 0x54F7, 0x54F8, 0x54E0, 0x550E, 0x5503, 0x550B, + 0x5701, 0x5702, 0x57CC, 0x5832, 0x57D5, 0x57D2, 0x57BA, 0x57C6, + 0x57BD, 0x57BC, 0x57B8, 0x57B6, 0x57BF, 0x57C7, 0x57D0, 0x57B9, + 0x57C1, 0x590E, 0x594A, 0x5A19, 0x5A16, 0x5A2D, 0x5A2E, 0x5A15, + 0x5A0F, 0x5A17, 0x5A0A, 0x5A1E, 0x5A33, 0x5B6C, 0x5BA7, 0x5BAD, + 0x5BAC, 0x5C03, 0x5C56, 0x5C54, 0x5CEC, 0x5CFF, 0x5CEE, 0x5CF1, + 0x5CF7, 0x5D00, 0x5CF9, 0x5E29, 0x5E28, 0x5EA8, 0x5EAE, 0x5EAA, + 0x5EAC, 0x5F33, 0x5F30, 0x5F67, 0x605D, 0x605A, 0x6067, 0x6A24, + 0x69E9, 0x6B52, 0x6B4F, 0x6B53, 0x6F10, 0x6F65, 0x6F75, 0x6FD0, + 0x6F5C, 0x6F3D, 0x6F71, 0x6F91, 0x6F0B, 0x6F79, 0x6F81, 0x6F8F, + 0x6F59, 0x6F74, 0x71AE, 0x71A3, 0x71AD, 0x71AB, 0x71A6, 0x71A2, + 0x52F2, 0x7257, 0x7255, 0x7299, 0x734B, 0x747A, 0x748C, 0x7484, + 0x6041, 0x60A2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609D, 0x6083, + 0x6095, 0x609B, 0x6097, 0x6087, 0x609C, 0x608E, 0x6219, 0x6246, + 0x62F2, 0x6310, 0x6356, 0x632C, 0x6344, 0x6345, 0x6336, 0x6343, + 0x63E4, 0x6339, 0x634B, 0x634A, 0x633C, 0x6329, 0x6341, 0x6334, + 0x6358, 0x6354, 0x6359, 0x632D, 0x6347, 0x6333, 0x635A, 0x6351, + 0x6338, 0x6357, 0x6340, 0x6348, 0x654A, 0x6546, 0x65C6, 0x65C3, + 0x65C4, 0x65C2, 0x664A, 0x665F, 0x6647, 0x6651, 0x6712, 0x6713, + 0x681F, 0x681A, 0x6849, 0x6832, 0x6833, 0x683B, 0x684B, 0x684F, +plane 61 +at 0x00 + 0x6816, 0x6831, 0x681C, 0x6835, 0x682B, 0x682D, 0x682F, 0x684E, + 0x6844, 0x6834, 0x681D, 0x6812, 0x6814, 0x6826, 0x6828, 0x682E, + 0x684D, 0x683A, 0x6825, 0x6820, 0x6B2C, 0x6B2F, 0x6B2D, 0x6B31, + 0x6B34, 0x6B6D, 0x8082, 0x6B88, 0x6BE6, 0x6BE4, 0x6BE8, 0x6BE3, + 0x6BE2, 0x6BE7, 0x6C25, 0x6D7A, 0x6D63, 0x6D64, 0x6D76, 0x6D0D, + 0x6D61, 0x6D92, 0x6D58, 0x6D62, 0x6D6D, 0x6D6F, 0x6D91, 0x6D8D, + 0x6DEF, 0x6D7F, 0x6D86, 0x6D5E, 0x6D67, 0x6D60, 0x6D97, 0x6D70, + 0x6D7C, 0x6D5F, 0x6D82, 0x6D98, 0x6D2F, 0x6D68, 0x6D8B, 0x6D7E, + 0x6D80, 0x6D84, 0x6D16, 0x6D83, 0x6D7B, 0x6D7D, 0x6D75, 0x6D90, + 0x70DC, 0x70D3, 0x70D1, 0x70DD, 0x70CB, 0x7F39, 0x70E2, 0x70D7, + 0x70D2, 0x70DE, 0x70E0, 0x70D4, 0x70CD, 0x70C5, 0x70C6, 0x70C7, + 0x70DA, 0x70CE, 0x70E1, 0x7242, 0x7278, 0x7482, 0x7493, 0x747B, + 0x7509, 0x778A, 0x7790, 0x78C6, 0x78D3, 0x78C0, 0x78D2, 0x78C7, + 0x78C2, 0x799F, 0x799D, 0x799E, 0x7A41, 0x7A38, 0x7A3A, 0x7A42, + 0x7A3E, 0x7AB0, 0x7BAE, 0x7BB3, 0x7BBF, 0x7BCD, 0x7BB2, 0x7CC4, + 0x7CCD, 0x7CC2, 0x7CC6, 0x7CC3, 0x7CC9, 0x7CC7, 0x7277, 0x7276, + 0x7300, 0x72FA, 0x72F4, 0x72FE, 0x72F6, 0x72F3, 0x72FB, 0x7301, + 0x73D3, 0x73D9, 0x73E5, 0x73D6, 0x73BC, 0x73E7, 0x73E3, 0x73E9, + 0x73DC, 0x73D2, 0x73DB, 0x73D4, 0x73DD, 0x73DA, 0x73D7, 0x73D8, + 0x73E8, 0x74DE, 0x74DF, 0x74F4, 0x74F5, 0x7521, 0x755B, 0x755F, + 0x75B0, 0x75C1, 0x75BB, 0x75C4, 0x75C0, 0x75BF, 0x75B6, 0x75BA, + 0x768A, 0x76C9, 0x771D, 0x771B, 0x7710, 0x7713, 0x7712, 0x7723, + 0x7711, 0x7715, 0x7719, 0x771A, 0x7722, 0x7727, 0x7823, 0x782C, + 0x7822, 0x7835, 0x782F, 0x7828, 0x782E, 0x782B, 0x7821, 0x7829, + 0x7833, 0x782A, 0x7831, 0x7954, 0x795B, 0x794F, 0x795C, 0x7953, + 0x7952, 0x7951, 0x79EB, 0x79EC, 0x79E0, 0x79EE, 0x79ED, 0x79EA, + 0x79DC, 0x79DE, 0x79DD, 0x7A86, 0x7A89, 0x7A85, 0x7A8B, 0x7A8C, + 0x7A8A, 0x7A87, 0x7AD8, 0x7B10, 0x7B04, 0x7B13, 0x7B05, 0x7B0F, + 0x7B08, 0x7B0A, 0x7B0E, 0x7B09, 0x7B12, 0x7C84, 0x7C91, 0x7C8A, + 0x7C8C, 0x7C88, 0x7C8D, 0x7C85, 0x7D1E, 0x7D1D, 0x7D11, 0x7D0E, + 0x7D18, 0x7D16, 0x7D13, 0x7D1F, 0x7D12, 0x7D0F, 0x7D0C, 0x7F5C, + 0x7F61, 0x7F5E, 0x7F60, 0x7F5D, 0x7F5B, 0x7F96, 0x7F92, 0x7FC3, +plane 62 +at 0x00 + 0x7FC2, 0x7FC0, 0x8016, 0x803E, 0x8039, 0x80FA, 0x80F2, 0x80F9, + 0x80F5, 0x8101, 0x80FB, 0x8100, 0x8201, 0x822F, 0x8225, 0x8333, + 0x832D, 0x8344, 0x8319, 0x8351, 0x8325, 0x8356, 0x833F, 0x8341, + 0x8326, 0x831C, 0x8322, 0x7DF8, 0x7DED, 0x7DE2, 0x7DDC, 0x7E02, + 0x7E01, 0x7DD6, 0x7DE4, 0x7DFE, 0x7E00, 0x7DFC, 0x7DFD, 0x7DF5, + 0x7DFF, 0x7DEB, 0x7DE5, 0x7F78, 0x7FAE, 0x7FE7, 0x8065, 0x806A, + 0x8066, 0x8068, 0x806B, 0x8194, 0x81A1, 0x8192, 0x8196, 0x8193, + 0x8501, 0x84F8, 0x84F5, 0x8504, 0x8342, 0x834E, 0x831B, 0x832A, + 0x8308, 0x833C, 0x834D, 0x8316, 0x8324, 0x8320, 0x8337, 0x832F, + 0x8329, 0x8347, 0x8345, 0x834C, 0x8353, 0x831E, 0x832C, 0x834B, + 0x8327, 0x8348, 0x8653, 0x8652, 0x86A2, 0x86A8, 0x8696, 0x868D, + 0x8691, 0x869E, 0x8687, 0x8697, 0x8686, 0x868B, 0x869A, 0x8685, + 0x86A5, 0x8699, 0x86A1, 0x86A7, 0x8695, 0x8698, 0x868E, 0x869D, + 0x8690, 0x8694, 0x8843, 0x8844, 0x886D, 0x8875, 0x8876, 0x8872, + 0x8880, 0x8871, 0x887F, 0x886F, 0x8883, 0x887E, 0x8874, 0x887C, + 0x8A12, 0x8C47, 0x8C57, 0x8C7B, 0x8CA4, 0x8CA3, 0x8D76, 0x8D78, + 0x8DB5, 0x8DB7, 0x8DB6, 0x8ED1, 0x8ED3, 0x8FFE, 0x8FF5, 0x9002, + 0x8FFF, 0x8FFB, 0x9004, 0x8FFC, 0x8FF6, 0x90D6, 0x90E0, 0x90D9, + 0x90DA, 0x90E3, 0x90DF, 0x90E5, 0x90D8, 0x90DB, 0x90D7, 0x90DC, + 0x90E4, 0x9150, 0x914E, 0x914F, 0x91D5, 0x91E2, 0x91DA, 0x965C, + 0x965F, 0x96BC, 0x98E3, 0x9ADF, 0x9B2F, 0x4E7F, 0x5070, 0x506A, + 0x5061, 0x505E, 0x5060, 0x5053, 0x504B, 0x505D, 0x5072, 0x5048, + 0x504D, 0x5041, 0x505B, 0x504A, 0x5062, 0x5015, 0x5045, 0x505F, + 0x5069, 0x506B, 0x5063, 0x5064, 0x5046, 0x5040, 0x506E, 0x5073, + 0x5057, 0x5051, 0x51D0, 0x526B, 0x526D, 0x526C, 0x526E, 0x52D6, + 0x52D3, 0x532D, 0x539C, 0x5575, 0x5576, 0x553C, 0x554D, 0x5550, + 0x5534, 0x552A, 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, + 0x5545, 0x851B, 0x8503, 0x8533, 0x8534, 0x84ED, 0x8535, 0x8505, + 0x877D, 0x8771, 0x885C, 0x88E6, 0x890F, 0x891B, 0x89A9, 0x89A5, + 0x89EE, 0x8AB1, 0x8ACC, 0x8ACE, 0x8AB7, 0x8AB5, 0x8AE9, 0x8AB4, + 0x8AB3, 0x8AC1, 0x8AAF, 0x8ACA, 0x8AD0, 0x8C8E, 0x8CE9, 0x8CDB, + 0x8CEB, 0x8DA4, 0x550C, 0x5532, 0x5565, 0x554E, 0x5539, 0x5548, +plane 63 +at 0x00 + 0x552D, 0x553B, 0x5540, 0x554B, 0x570A, 0x5707, 0x57FB, 0x5814, + 0x57E2, 0x57F6, 0x57DC, 0x57F4, 0x5800, 0x57ED, 0x57FD, 0x5808, + 0x57F8, 0x580B, 0x57F3, 0x57CF, 0x5807, 0x57EE, 0x57E3, 0x57F2, + 0x57E5, 0x57EC, 0x57E1, 0x580E, 0x57FC, 0x5810, 0x57E7, 0x5801, + 0x580C, 0x57F1, 0x57E9, 0x57F0, 0x580D, 0x5804, 0x595C, 0x5A60, + 0x5A58, 0x5A55, 0x5A67, 0x5A5E, 0x5A38, 0x5A35, 0x5A6D, 0x5A50, + 0x5A5F, 0x5A65, 0x5A6C, 0x5A53, 0x5A64, 0x5A57, 0x5A43, 0x5A5D, + 0x5A52, 0x5A44, 0x5A5B, 0x5A48, 0x5A8E, 0x5A3E, 0x5A4D, 0x5A39, + 0x5A4C, 0x5A70, 0x5A69, 0x5A47, 0x5A51, 0x5A56, 0x5A42, 0x5A5C, + 0x5B72, 0x5B6E, 0x5BC1, 0x5BC0, 0x5C59, 0x5D1E, 0x5D0B, 0x5D1D, + 0x5D1A, 0x5D20, 0x5D0C, 0x5D28, 0x5D0D, 0x5D26, 0x5D25, 0x5D0F, + 0x5D30, 0x5D12, 0x5D23, 0x5D1F, 0x5D2E, 0x5E3E, 0x5E34, 0x5EB1, + 0x5EB4, 0x5EB9, 0x5EB2, 0x5EB3, 0x5F36, 0x5F38, 0x5F9B, 0x5F96, + 0x5F9F, 0x608A, 0x6090, 0x6086, 0x60BE, 0x60B0, 0x60BA, 0x60D3, + 0x60D4, 0x60CF, 0x60E4, 0x60D9, 0x60DD, 0x60C8, 0x60B1, 0x60DB, + 0x60B7, 0x60CA, 0x60BF, 0x60C3, 0x60CD, 0x60C0, 0x6332, 0x6365, + 0x638A, 0x6382, 0x637D, 0x63BD, 0x639E, 0x63AD, 0x639D, 0x6397, + 0x63AB, 0x638E, 0x636F, 0x6387, 0x6390, 0x636E, 0x63AF, 0x6375, + 0x639C, 0x636D, 0x63AE, 0x637C, 0x63A4, 0x633B, 0x639F, 0x8DA2, + 0x8D9D, 0x8E2A, 0x8E28, 0x8EB8, 0x8EB6, 0x8EB9, 0x8EB7, 0x8F22, + 0x8F2B, 0x8F27, 0x8F19, 0x8FA4, 0x8FB3, 0x9071, 0x906A, 0x9188, + 0x918C, 0x92BF, 0x92B8, 0x92BE, 0x92DC, 0x92E5, 0x92D4, 0x92D6, + 0x92DA, 0x92ED, 0x92F3, 0x92DB, 0x92E2, 0x92EB, 0x95AF, 0x95B2, + 0x6378, 0x6385, 0x6381, 0x6391, 0x638D, 0x6370, 0x6553, 0x65CD, + 0x6665, 0x6661, 0x665B, 0x6659, 0x665C, 0x6662, 0x6718, 0x6879, + 0x6887, 0x6890, 0x689C, 0x686D, 0x686E, 0x68AE, 0x68AB, 0x6956, + 0x686F, 0x68A3, 0x68AC, 0x68A9, 0x6875, 0x6874, 0x68B2, 0x688F, + 0x6877, 0x6892, 0x687C, 0x686B, 0x6872, 0x68AA, 0x6880, 0x6871, + 0x687E, 0x689B, 0x6896, 0x688B, 0x68A0, 0x6889, 0x68A4, 0x6878, + 0x687B, 0x6891, 0x688C, 0x688A, 0x687D, 0x6B36, 0x6B33, 0x6B37, + 0x6B38, 0x6B91, 0x6B8F, 0x6B8D, 0x6B8E, 0x6B8C, 0x6C2A, 0x6DC0, + 0x6DAB, 0x6DB4, 0x6DB3, 0x6E74, 0x6DAC, 0x6DE9, 0x6DE2, 0x6DB7, +plane 64 +at 0x00 + 0x6DF6, 0x6DD4, 0x6E00, 0x6DC8, 0x6DE0, 0x6DDF, 0x6DD6, 0x6DBE, + 0x6DE5, 0x6DDC, 0x6DDD, 0x6DDB, 0x6DF4, 0x6DCA, 0x6DBD, 0x6DED, + 0x6DF0, 0x6DBA, 0x6DD5, 0x6DC2, 0x6DCF, 0x6DC9, 0x6DD0, 0x6DF2, + 0x6DD3, 0x6DFD, 0x6DD7, 0x6DCD, 0x6DE3, 0x6DBB, 0x70FA, 0x710D, + 0x70F7, 0x7117, 0x70F4, 0x710C, 0x70F0, 0x7104, 0x70F3, 0x7110, + 0x70FC, 0x70FF, 0x7106, 0x7113, 0x7100, 0x70F8, 0x70F6, 0x710B, + 0x7102, 0x710E, 0x727E, 0x727B, 0x727C, 0x727F, 0x731D, 0x7317, + 0x7307, 0x7311, 0x7318, 0x730A, 0x7308, 0x72FF, 0x730F, 0x731E, + 0x7388, 0x73F6, 0x73F8, 0x73F5, 0x7404, 0x7401, 0x73FD, 0x7407, + 0x7400, 0x73FA, 0x73FC, 0x73FF, 0x740C, 0x740B, 0x73F4, 0x7408, + 0x7564, 0x7563, 0x75CE, 0x75D2, 0x75CF, 0x95B3, 0x96A3, 0x96A5, + 0x970A, 0x9787, 0x9789, 0x978C, 0x97EF, 0x982A, 0x9822, 0x981F, + 0x9919, 0x99CA, 0x99DA, 0x99DE, 0x99C8, 0x99E0, 0x9AB6, 0x9AB5, + 0x9AF4, 0x9B6B, 0x9B69, 0x9B72, 0x9B63, 0x9D0D, 0x9D01, 0x9D0C, + 0x9CF8, 0x9CFE, 0x9D02, 0x9E84, 0x9EAB, 0x9EAA, 0x75CB, 0x75CC, + 0x75D1, 0x75D0, 0x768F, 0x7689, 0x76D3, 0x7739, 0x772F, 0x772D, + 0x7731, 0x7732, 0x7734, 0x7733, 0x773D, 0x7725, 0x773B, 0x7735, + 0x7848, 0x7852, 0x7849, 0x784D, 0x784A, 0x784C, 0x7826, 0x7845, + 0x7850, 0x7964, 0x7967, 0x7969, 0x796A, 0x7963, 0x796B, 0x7961, + 0x79BB, 0x79FA, 0x79F8, 0x79F6, 0x79F7, 0x7A8F, 0x7A94, 0x7A90, + 0x7B35, 0x7B47, 0x7B34, 0x7B25, 0x7B30, 0x7B22, 0x7B24, 0x7B33, + 0x7B18, 0x7B2A, 0x7B1D, 0x7B31, 0x7B2B, 0x7B2D, 0x7B2F, 0x7B32, + 0x7B38, 0x7B1A, 0x7B23, 0x7C94, 0x7C98, 0x7C96, 0x7CA3, 0x7D35, + 0x7D3D, 0x7D38, 0x7D36, 0x7D3A, 0x7D45, 0x7D2C, 0x7D29, 0x7D41, + 0x7D47, 0x7D3E, 0x7D3F, 0x7D4A, 0x7D3B, 0x7D28, 0x7F63, 0x7F95, + 0x7F9C, 0x7F9D, 0x7F9B, 0x7FCA, 0x7FCB, 0x7FCD, 0x7FD0, 0x7FD1, + 0x7FC7, 0x7FCF, 0x7FC9, 0x801F, 0x801E, 0x801B, 0x8047, 0x8043, + 0x8048, 0x8118, 0x8125, 0x8119, 0x811B, 0x812D, 0x811F, 0x812C, + 0x811E, 0x8121, 0x8115, 0x8127, 0x811D, 0x8122, 0x8211, 0x8238, + 0x8233, 0x823A, 0x8234, 0x8232, 0x8274, 0x8390, 0x83A3, 0x83A8, + 0x838D, 0x837A, 0x8373, 0x83A4, 0x8374, 0x838F, 0x8381, 0x8395, + 0x8399, 0x8375, 0x8394, 0x83A9, 0x837D, 0x8383, 0x838C, 0x839D, +plane 65 +at 0x00 + 0x839B, 0x83AA, 0x838B, 0x837E, 0x83A5, 0x83AF, 0x8388, 0x8397, + 0x83B0, 0x837F, 0x83A6, 0x8387, 0x83AE, 0x8376, 0x839A, 0x8659, + 0x8656, 0x86BF, 0x86B7, 0x511D, 0x5116, 0x512B, 0x511E, 0x511B, + 0x5290, 0x5294, 0x5314, 0x5667, 0x567B, 0x565F, 0x5661, 0x58C3, + 0x58CA, 0x58C0, 0x58C4, 0x5901, 0x5B1F, 0x5B18, 0x5B11, 0x5B15, + 0x5B12, 0x5B1C, 0x5B22, 0x5B79, 0x5DA6, 0x5DB3, 0x5DAB, 0x5EEA, + 0x5F5B, 0x61B7, 0x61CE, 0x61B9, 0x86C2, 0x86C1, 0x86C5, 0x86BA, + 0x86B0, 0x86C8, 0x86B9, 0x86B3, 0x86B8, 0x86CC, 0x86B4, 0x86BB, + 0x86BC, 0x86C3, 0x86BD, 0x86BE, 0x8852, 0x8889, 0x8895, 0x88A8, + 0x88A2, 0x88AA, 0x889A, 0x8891, 0x88A1, 0x889F, 0x8898, 0x88A7, + 0x8899, 0x889B, 0x8897, 0x88A4, 0x88AC, 0x888C, 0x8893, 0x888E, + 0x8982, 0x89D6, 0x89D9, 0x89D5, 0x8A30, 0x8A27, 0x8A2C, 0x8A1E, + 0x8C39, 0x8C3B, 0x8C5C, 0x8C5D, 0x8C7D, 0x8CA5, 0x8D7D, 0x8D7B, + 0x8D79, 0x8DBC, 0x8DC2, 0x8DB9, 0x8DBF, 0x8DC1, 0x8ED8, 0x8EDE, + 0x8EDD, 0x8EDC, 0x8ED7, 0x8EE0, 0x8EE1, 0x9024, 0x900B, 0x9011, + 0x901C, 0x900C, 0x9021, 0x90EF, 0x90EA, 0x90F0, 0x90F4, 0x90F2, + 0x90F3, 0x90D4, 0x90EB, 0x90EC, 0x90E9, 0x9156, 0x9158, 0x915A, + 0x9153, 0x9155, 0x91EC, 0x91F4, 0x91F1, 0x91F3, 0x91F8, 0x91E4, + 0x91F9, 0x91EA, 0x91EB, 0x91F7, 0x91E8, 0x91EE, 0x957A, 0x9586, + 0x9588, 0x967C, 0x966D, 0x966B, 0x9671, 0x966F, 0x96BF, 0x976A, + 0x9804, 0x98E5, 0x9997, 0x509B, 0x5095, 0x5094, 0x509E, 0x508B, + 0x50A3, 0x5083, 0x508C, 0x508E, 0x509D, 0x5068, 0x509C, 0x5092, + 0x5082, 0x5087, 0x515F, 0x51D4, 0x5312, 0x5311, 0x53A4, 0x53A7, + 0x5591, 0x55A8, 0x55A5, 0x55AD, 0x5577, 0x5645, 0x55A2, 0x5593, + 0x5588, 0x558F, 0x55B5, 0x5581, 0x55A3, 0x5592, 0x55A4, 0x557D, + 0x558C, 0x55A6, 0x557F, 0x5595, 0x55A1, 0x558E, 0x570C, 0x5829, + 0x5837, 0x61BD, 0x61CF, 0x61C0, 0x6199, 0x6197, 0x61BB, 0x61D0, + 0x61C4, 0x6231, 0x64D3, 0x64C0, 0x64DC, 0x64D1, 0x64C8, 0x64D5, + 0x66C3, 0x66BF, 0x66C5, 0x66CD, 0x66C1, 0x6706, 0x6724, 0x6A63, + 0x6A42, 0x6A52, 0x6A43, 0x6A33, 0x6A6C, 0x6A57, 0x6A4C, 0x6A6E, + 0x6A37, 0x6A71, 0x5819, 0x581E, 0x5827, 0x5823, 0x5828, 0x57F5, + 0x5848, 0x5825, 0x581C, 0x581B, 0x5833, 0x583F, 0x5836, 0x582E, +plane 66 +at 0x00 + 0x5839, 0x5838, 0x582D, 0x582C, 0x583B, 0x5961, 0x5AAF, 0x5A94, + 0x5A9F, 0x5A7A, 0x5AA2, 0x5A9E, 0x5A78, 0x5AA6, 0x5A7C, 0x5AA5, + 0x5AAC, 0x5A95, 0x5AAE, 0x5A37, 0x5A84, 0x5A8A, 0x5A97, 0x5A83, + 0x5A8B, 0x5AA9, 0x5A7B, 0x5A7D, 0x5A8C, 0x5A9C, 0x5A8F, 0x5A93, + 0x5A9D, 0x5BEA, 0x5BCD, 0x5BCB, 0x5BD4, 0x5BD1, 0x5BCA, 0x5BCE, + 0x5C0C, 0x5C30, 0x5D37, 0x5D43, 0x5D6B, 0x5D41, 0x5D4B, 0x5D3F, + 0x5D35, 0x5D51, 0x5D4E, 0x5D55, 0x5D33, 0x5D3A, 0x5D52, 0x5D3D, + 0x5D31, 0x5D59, 0x5D42, 0x5D39, 0x5D49, 0x5D38, 0x5D3C, 0x5D32, + 0x5D36, 0x5D40, 0x5D45, 0x5E44, 0x5E41, 0x5F58, 0x5FA6, 0x5FA5, + 0x5FAB, 0x60C9, 0x60B9, 0x60CC, 0x60E2, 0x60CE, 0x60C4, 0x6114, + 0x60F2, 0x610A, 0x6116, 0x6105, 0x60F5, 0x6113, 0x60F8, 0x60FC, + 0x60FE, 0x60C1, 0x6103, 0x6118, 0x611D, 0x6110, 0x60FF, 0x6104, + 0x610B, 0x624A, 0x6394, 0x63B1, 0x63B0, 0x63CE, 0x63E5, 0x63E8, + 0x63EF, 0x63C3, 0x649D, 0x63F3, 0x63CA, 0x63E0, 0x63F6, 0x63D5, + 0x63F2, 0x63F5, 0x6461, 0x63DF, 0x63BE, 0x63DD, 0x63DC, 0x63C4, + 0x63D8, 0x63D3, 0x63C2, 0x63C7, 0x63CC, 0x63CB, 0x63C8, 0x63F0, + 0x63D7, 0x63D9, 0x6532, 0x6567, 0x656A, 0x6564, 0x655C, 0x6568, + 0x6565, 0x658C, 0x659D, 0x659E, 0x65AE, 0x65D0, 0x65D2, 0x6A4A, + 0x6A36, 0x6A53, 0x6A45, 0x6A70, 0x6A5C, 0x6B58, 0x6B57, 0x6FBB, + 0x6FBE, 0x6FB5, 0x6FD3, 0x6F9F, 0x6FB7, 0x6FF5, 0x71B7, 0x71BB, + 0x71D1, 0x71BA, 0x71B6, 0x71CC, 0x71D3, 0x749B, 0x7496, 0x74A2, + 0x749D, 0x750A, 0x750E, 0x7581, 0x762C, 0x7637, 0x7636, 0x763B, + 0x667C, 0x666C, 0x667B, 0x6680, 0x6671, 0x6679, 0x666A, 0x6672, + 0x6701, 0x690C, 0x68D3, 0x6904, 0x68DC, 0x692A, 0x68EC, 0x68EA, + 0x68F1, 0x690F, 0x68D6, 0x68F7, 0x68EB, 0x68E4, 0x68F6, 0x6913, + 0x6910, 0x68F3, 0x68E1, 0x6907, 0x68CC, 0x6908, 0x6970, 0x68B4, + 0x6911, 0x68EF, 0x68C6, 0x6914, 0x68F8, 0x68D0, 0x68FD, 0x68FC, + 0x68E8, 0x690B, 0x690A, 0x6917, 0x68CE, 0x68C8, 0x68DD, 0x68DE, + 0x68E6, 0x68F4, 0x68D1, 0x6906, 0x68D4, 0x68E9, 0x6915, 0x6925, + 0x68C7, 0x6B39, 0x6B3B, 0x6B3F, 0x6B3C, 0x6B94, 0x6B97, 0x6B99, + 0x6B95, 0x6BBD, 0x6BF0, 0x6BF2, 0x6BF3, 0x6C30, 0x6DFC, 0x6E46, + 0x6E47, 0x6E1F, 0x6E49, 0x6E88, 0x6E3C, 0x6E3D, 0x6E45, 0x6E62, +plane 67 +at 0x00 + 0x6E2B, 0x6E3F, 0x6E41, 0x6E5D, 0x6E73, 0x6E1C, 0x6E33, 0x6E4B, + 0x6E40, 0x6E51, 0x6E3B, 0x6E03, 0x6E2E, 0x6E5E, 0x6E68, 0x6E5C, + 0x6E61, 0x6E31, 0x6E28, 0x6E60, 0x6E71, 0x6E6B, 0x6E39, 0x6E22, + 0x6E30, 0x6E53, 0x6E65, 0x6E27, 0x6E78, 0x6E64, 0x6E77, 0x6E55, + 0x6E79, 0x6E52, 0x6E66, 0x6E35, 0x6E36, 0x6E5A, 0x7120, 0x711E, + 0x712F, 0x70FB, 0x712E, 0x7131, 0x7123, 0x7125, 0x7122, 0x7132, + 0x711F, 0x7128, 0x713A, 0x711B, 0x724B, 0x725A, 0x7288, 0x7289, + 0x7286, 0x7285, 0x728B, 0x7312, 0x730B, 0x7330, 0x7322, 0x7331, + 0x7333, 0x7327, 0x7332, 0x732D, 0x7326, 0x7323, 0x7335, 0x730C, + 0x742E, 0x742C, 0x7430, 0x742B, 0x7416, 0x76A1, 0x7798, 0x7796, + 0x78D6, 0x78EB, 0x78DC, 0x79A5, 0x79A9, 0x9834, 0x7A53, 0x7A45, + 0x7A4F, 0x7ABD, 0x7ABB, 0x7AF1, 0x7BEC, 0x7BED, 0x7CD3, 0x7CE1, + 0x7E19, 0x7E27, 0x7E26, 0x806E, 0x81AF, 0x81AD, 0x81AA, 0x8218, + 0x856F, 0x854C, 0x8542, 0x855C, 0x8570, 0x855F, 0x741A, 0x7421, + 0x742D, 0x7431, 0x7424, 0x7423, 0x741D, 0x7429, 0x7420, 0x7432, + 0x74FB, 0x752F, 0x756F, 0x756C, 0x75E7, 0x75DA, 0x75E1, 0x75E6, + 0x75DD, 0x75DF, 0x75E4, 0x75D7, 0x7695, 0x7692, 0x76DA, 0x7746, + 0x7747, 0x7744, 0x774D, 0x7745, 0x774A, 0x774E, 0x774B, 0x774C, + 0x77DE, 0x77EC, 0x7860, 0x7864, 0x7865, 0x785C, 0x786D, 0x7871, + 0x786A, 0x786E, 0x7870, 0x7869, 0x7868, 0x785E, 0x7862, 0x7974, + 0x7973, 0x7972, 0x7970, 0x7A02, 0x7A0A, 0x7A03, 0x7A0C, 0x7A04, + 0x7A99, 0x7AE6, 0x7AE4, 0x7B4A, 0x7B3B, 0x7B44, 0x7B48, 0x7B4C, + 0x7B4E, 0x7B40, 0x7B58, 0x7B45, 0x7CA2, 0x7C9E, 0x7CA8, 0x7CA1, + 0x7D58, 0x7D6F, 0x7D63, 0x7D53, 0x7D56, 0x7D67, 0x7D6A, 0x7D4F, + 0x7D6D, 0x7D5C, 0x7D6B, 0x7D52, 0x7D54, 0x7D69, 0x7D51, 0x7D5F, + 0x7D4E, 0x7F3E, 0x7F3F, 0x7F65, 0x7F66, 0x7FA2, 0x7FA0, 0x7FA1, + 0x7FD7, 0x8051, 0x804F, 0x8050, 0x80FE, 0x80D4, 0x8143, 0x814A, + 0x8152, 0x814F, 0x8147, 0x813D, 0x814D, 0x813A, 0x81E6, 0x81EE, + 0x81F7, 0x81F8, 0x81F9, 0x8204, 0x823C, 0x823D, 0x823F, 0x8275, + 0x833B, 0x83CF, 0x83F9, 0x8423, 0x83C0, 0x83E8, 0x8412, 0x83E7, + 0x83E4, 0x83FC, 0x83F6, 0x8410, 0x83C6, 0x83C8, 0x83EB, 0x83E3, + 0x83BF, 0x8401, 0x83DD, 0x83E5, 0x83D8, 0x83FF, 0x83E1, 0x83CB, +plane 68 +at 0x00 + 0x83CE, 0x83D6, 0x83F5, 0x83C9, 0x8409, 0x840F, 0x83DE, 0x8411, + 0x8406, 0x83C2, 0x83F3, 0x855A, 0x854B, 0x853F, 0x878A, 0x878B, + 0x87A1, 0x878E, 0x8799, 0x885E, 0x885F, 0x8924, 0x89A7, 0x8AEA, + 0x8AFD, 0x8AF9, 0x8AE3, 0x8AE5, 0x8AEC, 0x8CF2, 0x8CEF, 0x8DA6, + 0x8E3B, 0x8E43, 0x8E32, 0x8F31, 0x8F30, 0x8F2D, 0x8F3C, 0x8FA7, + 0x8FA5, 0x9137, 0x9195, 0x918E, 0x83D5, 0x83FA, 0x83C7, 0x83D1, + 0x83EA, 0x8413, 0x83C3, 0x83EC, 0x83EE, 0x83C4, 0x83FB, 0x83D7, + 0x83E2, 0x841B, 0x83DB, 0x83FE, 0x86D8, 0x86E2, 0x86E6, 0x86D3, + 0x86E3, 0x86DA, 0x86EA, 0x86DD, 0x86EB, 0x86DC, 0x86EC, 0x86E9, + 0x86D7, 0x86E8, 0x86D1, 0x8848, 0x8856, 0x8855, 0x88BA, 0x88D7, + 0x88B9, 0x88B8, 0x88C0, 0x88BE, 0x88B6, 0x88BC, 0x88B7, 0x88BD, + 0x88B2, 0x8901, 0x88C9, 0x8995, 0x8998, 0x8997, 0x89DD, 0x89DA, + 0x89DB, 0x8A4E, 0x8A4D, 0x8A39, 0x8A59, 0x8A40, 0x8A57, 0x8A58, + 0x8A44, 0x8A45, 0x8A52, 0x8A48, 0x8A51, 0x8A4A, 0x8A4C, 0x8A4F, + 0x8C5F, 0x8C81, 0x8C80, 0x8CBA, 0x8CBE, 0x8CB0, 0x8CB9, 0x8CB5, + 0x8D84, 0x8D80, 0x8D89, 0x8DD8, 0x8DD3, 0x8DCD, 0x8DC7, 0x8DD6, + 0x8DDC, 0x8DCF, 0x8DD5, 0x8DD9, 0x8DC8, 0x8DD7, 0x8DC5, 0x8EEF, + 0x8EF7, 0x8EFA, 0x8EF9, 0x8EE6, 0x8EEE, 0x8EE5, 0x8EF5, 0x8EE7, + 0x8EE8, 0x8EF6, 0x8EEB, 0x8EF1, 0x8EEC, 0x8EF4, 0x8EE9, 0x902D, + 0x9034, 0x902F, 0x9106, 0x912C, 0x9104, 0x90FF, 0x90FC, 0x9108, + 0x90F9, 0x90FB, 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, + 0x9164, 0x915F, 0x9162, 0x9160, 0x9201, 0x920A, 0x9225, 0x9203, + 0x921A, 0x9226, 0x920F, 0x920C, 0x9200, 0x9212, 0x91FF, 0x91FD, + 0x9206, 0x9204, 0x9227, 0x9202, 0x921C, 0x9224, 0x9219, 0x9217, + 0x9205, 0x9216, 0x957B, 0x958D, 0x958C, 0x9590, 0x9687, 0x967E, + 0x9688, 0x9196, 0x9345, 0x930A, 0x92FD, 0x9317, 0x931C, 0x9307, + 0x9331, 0x9332, 0x932C, 0x9330, 0x9303, 0x9305, 0x95C2, 0x95B8, + 0x95C1, 0x96AB, 0x96B7, 0x9715, 0x9714, 0x970C, 0x9717, 0x9793, + 0x97D2, 0x9836, 0x9831, 0x9833, 0x983C, 0x982E, 0x983A, 0x983D, + 0x98B5, 0x9922, 0x9689, 0x9683, 0x9680, 0x96C2, 0x96C8, 0x96C3, + 0x96F1, 0x96F0, 0x976C, 0x9770, 0x976E, 0x9807, 0x98A9, 0x98EB, + 0x9CE6, 0x9EF9, 0x4E83, 0x4E84, 0x4EB6, 0x50BD, 0x50BF, 0x50C6, +plane 69 +at 0x00 + 0x50AE, 0x50C4, 0x50CA, 0x50B4, 0x50C8, 0x50C2, 0x50B0, 0x50C1, + 0x50BA, 0x50B1, 0x50CB, 0x50C9, 0x50B6, 0x50B8, 0x51D7, 0x527A, + 0x5278, 0x527B, 0x527C, 0x55C3, 0x55DB, 0x55CC, 0x55D0, 0x55CB, + 0x55CA, 0x55DD, 0x55C0, 0x55D4, 0x55C4, 0x55E9, 0x55BF, 0x55D2, + 0x558D, 0x55CF, 0x55D5, 0x55E2, 0x55D6, 0x55C8, 0x55F2, 0x55CD, + 0x55D9, 0x55C2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584F, 0x584D, + 0x5849, 0x586F, 0x5855, 0x584E, 0x585D, 0x5859, 0x5865, 0x585B, + 0x583D, 0x5863, 0x5871, 0x58FC, 0x5AC7, 0x5AC4, 0x5ACB, 0x5ABA, + 0x5AB8, 0x5AB1, 0x5AB5, 0x5AB0, 0x5ABF, 0x5AC8, 0x5ABB, 0x5AC6, + 0x5AB7, 0x5AC0, 0x5ACA, 0x5AB4, 0x5AB6, 0x5ACD, 0x5AB9, 0x5A90, + 0x5BD6, 0x5BD8, 0x5BD9, 0x5C1F, 0x5C33, 0x5D71, 0x5D63, 0x5D4A, + 0x5D65, 0x5D72, 0x5D6C, 0x5D5E, 0x5D68, 0x5D67, 0x5D62, 0x5DF0, + 0x5E4F, 0x5E4E, 0x5E4A, 0x5E4D, 0x5E4B, 0x5EC5, 0x5ECC, 0x5EC6, + 0x5ECB, 0x5EC7, 0x5F40, 0x5FAF, 0x5FAD, 0x60F7, 0x6149, 0x614A, + 0x612B, 0x6145, 0x6136, 0x6132, 0x612E, 0x6146, 0x612F, 0x614F, + 0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63C5, + 0x63F1, 0x63EB, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0x9923, + 0x9920, 0x991C, 0x991D, 0x99A0, 0x99EF, 0x99E8, 0x99EB, 0x99E1, + 0x99E6, 0x9AF8, 0x9AF5, 0x9B83, 0x9B94, 0x9B84, 0x9B8B, 0x9B8F, + 0x9B8C, 0x9B89, 0x9B8E, 0x9D24, 0x9D0F, 0x9D13, 0x9D0A, 0x9D2A, + 0x9D1A, 0x9D27, 0x9D16, 0x9D21, 0x9E85, 0x9EAC, 0x9EC6, 0x9EC5, + 0x6433, 0x6443, 0x641F, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, + 0x6423, 0x640C, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642F, + 0x640A, 0x641A, 0x6440, 0x6425, 0x6427, 0x640B, 0x63E7, 0x641B, + 0x642E, 0x6421, 0x640E, 0x656F, 0x6592, 0x65D3, 0x6686, 0x668C, + 0x6695, 0x6690, 0x668B, 0x668A, 0x6699, 0x6694, 0x6678, 0x6720, + 0x6966, 0x695F, 0x6938, 0x694E, 0x6962, 0x6971, 0x693F, 0x6945, + 0x696A, 0x6939, 0x6942, 0x6957, 0x6959, 0x697A, 0x6948, 0x6949, + 0x6935, 0x696C, 0x6933, 0x693D, 0x6965, 0x68F0, 0x6978, 0x6934, + 0x6969, 0x6940, 0x696F, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, + 0x694C, 0x693B, 0x694B, 0x6937, 0x695C, 0x694F, 0x6951, 0x6932, + 0x6952, 0x692F, 0x697B, 0x693C, 0x6B46, 0x6B45, 0x6B43, 0x6B42, +plane 70 +at 0x00 + 0x6B48, 0x6B41, 0x6B9B, 0x55C0, 0x6BFB, 0x6BFC, 0x6BF9, 0x6BF7, + 0x6BF8, 0x6E9B, 0x6ED6, 0x6EC8, 0x6E8F, 0x6EC0, 0x6E9F, 0x6E93, + 0x6E94, 0x6EA0, 0x6EB1, 0x6EB9, 0x6EC6, 0x6ED2, 0x6EBD, 0x6EC1, + 0x6E9E, 0x6EC9, 0x6EB7, 0x6EB0, 0x6ECD, 0x6EA6, 0x6ECF, 0x6EB2, + 0x6EBE, 0x6EC3, 0x6EDC, 0x6ED8, 0x6E99, 0x6E92, 0x6E8E, 0x6E8D, + 0x6EA4, 0x6EA1, 0x6EBF, 0x6EB3, 0x6ED0, 0x6ECA, 0x6E97, 0x6EAE, + 0x6EA3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160, 0x7141, 0x715D, + 0x7162, 0x7172, 0x7178, 0x716A, 0x7161, 0x7142, 0x7158, 0x7143, + 0x714B, 0x7170, 0x715F, 0x7150, 0x7153, 0x9ED7, 0x9F53, 0x5128, + 0x5127, 0x51DF, 0x5335, 0x53B3, 0x568A, 0x567D, 0x5689, 0x58CD, + 0x58D0, 0x5B2B, 0x5B33, 0x5B29, 0x5B35, 0x5B31, 0x5B37, 0x5C36, + 0x5DBE, 0x5DB9, 0x5DBB, 0x61E2, 0x61DB, 0x61DD, 0x61DC, 0x61DA, + 0x61D9, 0x64DF, 0x64E1, 0x64EE, 0x65B5, 0x66D4, 0x7144, 0x714D, + 0x715A, 0x724F, 0x728D, 0x728C, 0x7291, 0x7290, 0x728E, 0x733C, + 0x7342, 0x733B, 0x733A, 0x7340, 0x734A, 0x7349, 0x7444, 0x744A, + 0x744B, 0x7452, 0x7451, 0x7457, 0x7440, 0x744F, 0x7450, 0x744E, + 0x7442, 0x7446, 0x744D, 0x7454, 0x74E1, 0x74FF, 0x74FE, 0x74FD, + 0x751D, 0x7579, 0x7577, 0x6983, 0x75EF, 0x760F, 0x7603, 0x75F7, + 0x75FE, 0x75FC, 0x75F9, 0x75F8, 0x7610, 0x75FB, 0x75F6, 0x75ED, + 0x75F5, 0x75FD, 0x7699, 0x76B5, 0x76DD, 0x7755, 0x775F, 0x7760, + 0x7752, 0x7756, 0x775A, 0x7769, 0x7767, 0x7754, 0x7759, 0x776D, + 0x77E0, 0x7887, 0x789A, 0x7894, 0x788F, 0x7884, 0x7895, 0x7885, + 0x7886, 0x78A1, 0x7883, 0x7879, 0x7899, 0x7880, 0x7896, 0x787B, + 0x797C, 0x7982, 0x797D, 0x7979, 0x7A11, 0x7A18, 0x7A19, 0x7A12, + 0x7A17, 0x7A15, 0x7A22, 0x7A13, 0x7A1B, 0x7A10, 0x7AA3, 0x7AA2, + 0x7A9E, 0x7AEB, 0x7B66, 0x7B64, 0x7B6D, 0x7B74, 0x7B69, 0x7B72, + 0x7B65, 0x7B73, 0x7B71, 0x7B70, 0x7B61, 0x7B78, 0x7B76, 0x7B63, + 0x7CB2, 0x7CB4, 0x7CAF, 0x7D88, 0x7D86, 0x7D80, 0x7D8D, 0x7D7F, + 0x7D85, 0x7D7A, 0x7D8E, 0x7D7B, 0x7D83, 0x7D7C, 0x7D8C, 0x7D94, + 0x7D84, 0x7D7D, 0x7D92, 0x7F6D, 0x7F6B, 0x7F67, 0x7F68, 0x7F6C, + 0x7FA6, 0x7FA5, 0x7FA7, 0x7FDB, 0x7FDC, 0x8021, 0x8164, 0x8160, + 0x8177, 0x815C, 0x8169, 0x815B, 0x8162, 0x8172, 0x6721, 0x815E, +plane 71 +at 0x00 + 0x8176, 0x8167, 0x816F, 0x66D5, 0x66D0, 0x66D1, 0x66CE, 0x66D7, + 0x6A7D, 0x6A8A, 0x6AA7, 0x6A99, 0x6A82, 0x6A88, 0x6A86, 0x6A98, + 0x6A9D, 0x6A8F, 0x6AAA, 0x6B5D, 0x6C0A, 0x6FD7, 0x6FD6, 0x6FE5, + 0x6FD9, 0x6FDA, 0x6FEA, 0x6FF6, 0x71E3, 0x71E9, 0x71EB, 0x71EF, + 0x71F3, 0x71EA, 0x7371, 0x74AE, 0x8144, 0x8161, 0x821D, 0x8249, + 0x8244, 0x8240, 0x8242, 0x8245, 0x84F1, 0x843F, 0x8456, 0x8476, + 0x8479, 0x848F, 0x848D, 0x8465, 0x8451, 0x8440, 0x8486, 0x8467, + 0x8430, 0x844D, 0x847D, 0x845A, 0x8459, 0x8474, 0x8473, 0x845D, + 0x8507, 0x845E, 0x8437, 0x843A, 0x8434, 0x847A, 0x8443, 0x8478, + 0x8432, 0x8445, 0x8429, 0x83D9, 0x844B, 0x842F, 0x8442, 0x842D, + 0x845F, 0x8470, 0x8439, 0x844E, 0x844C, 0x8452, 0x846F, 0x84C5, + 0x848E, 0x843B, 0x8447, 0x8436, 0x8433, 0x8468, 0x847E, 0x8444, + 0x842B, 0x8460, 0x8454, 0x846E, 0x8450, 0x870B, 0x8704, 0x86F7, + 0x870C, 0x86FA, 0x86D6, 0x86F5, 0x874D, 0x86F8, 0x870E, 0x8709, + 0x8701, 0x86F6, 0x870D, 0x8705, 0x88D6, 0x88CB, 0x88CD, 0x88CE, + 0x88DE, 0x88DB, 0x88DA, 0x88CC, 0x88D0, 0x8985, 0x899B, 0x89DF, + 0x89E5, 0x89E4, 0x89E1, 0x89E0, 0x89E2, 0x89DC, 0x89E6, 0x8A76, + 0x8A86, 0x8A7F, 0x8A61, 0x8A3F, 0x8A77, 0x8A82, 0x8A84, 0x8A75, + 0x8A83, 0x8A81, 0x8A74, 0x8A7A, 0x8C3C, 0x8C4B, 0x8C4A, 0x8C65, + 0x8C64, 0x8C66, 0x8C86, 0x8C84, 0x8C85, 0x8CCC, 0x8D68, 0x8D69, + 0x8D91, 0x8D8C, 0x8D8E, 0x8D8F, 0x8D8D, 0x8D93, 0x8D94, 0x8D90, + 0x8D92, 0x8DF0, 0x8DE0, 0x8DEC, 0x8DF1, 0x8DEE, 0x8DD0, 0x8DE9, + 0x8DE3, 0x8DE2, 0x8DE7, 0x8DF2, 0x8DEB, 0x8DF4, 0x8F06, 0x8EFF, + 0x8F01, 0x8F00, 0x8F05, 0x8F07, 0x8F08, 0x8F02, 0x8F0B, 0x9052, + 0x903F, 0x74B3, 0x74AC, 0x7583, 0x7645, 0x764E, 0x7644, 0x76A3, + 0x76A5, 0x77A6, 0x77A4, 0x77A9, 0x77AF, 0x78F0, 0x78F8, 0x78F1, + 0x7A49, 0x7AC2, 0x7AF2, 0x7AF3, 0x7BFA, 0x7BF6, 0x7BFC, 0x7C18, + 0x7C08, 0x7C12, 0x7CDB, 0x7CDA, 0x7E2C, 0x7E4D, 0x7F46, 0x7FF6, + 0x802B, 0x8074, 0x9044, 0x9049, 0x903D, 0x9110, 0x910D, 0x910F, + 0x9111, 0x9116, 0x9114, 0x910B, 0x910E, 0x916E, 0x916F, 0x9248, + 0x9252, 0x9230, 0x923A, 0x9266, 0x9233, 0x9265, 0x925E, 0x9283, + 0x922E, 0x924A, 0x9246, 0x926D, 0x926C, 0x924F, 0x9260, 0x9267, +plane 72 +at 0x00 + 0x926F, 0x9236, 0x9261, 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, + 0x9272, 0x924E, 0x9253, 0x924C, 0x9256, 0x9232, 0x959F, 0x959C, + 0x959E, 0x959B, 0x9692, 0x9693, 0x9691, 0x9697, 0x96CE, 0x96FA, + 0x96FD, 0x96F8, 0x96F5, 0x9773, 0x9777, 0x9778, 0x9772, 0x980F, + 0x980D, 0x980E, 0x98AC, 0x98F6, 0x98F9, 0x99AF, 0x99B2, 0x99B0, + 0x99B5, 0x9AAD, 0x9AAB, 0x9B5B, 0x9CEA, 0x9CED, 0x9CE7, 0x9E80, + 0x9EFD, 0x50E6, 0x50D4, 0x50D7, 0x50E8, 0x50F3, 0x50DB, 0x50EA, + 0x50DD, 0x50E4, 0x50D3, 0x50EC, 0x50F0, 0x50EF, 0x50E3, 0x50E0, + 0x51D8, 0x5280, 0x5281, 0x52E9, 0x52EB, 0x5330, 0x53AC, 0x5627, + 0x5615, 0x560C, 0x5612, 0x55FC, 0x560F, 0x561C, 0x5601, 0x5613, + 0x5602, 0x55FA, 0x561D, 0x5604, 0x55FF, 0x55F9, 0x5889, 0x587C, + 0x5890, 0x5898, 0x5886, 0x5881, 0x587F, 0x5874, 0x588B, 0x587A, + 0x5887, 0x5891, 0x588E, 0x5876, 0x5882, 0x5888, 0x587B, 0x5894, + 0x588F, 0x58FE, 0x596B, 0x5ADC, 0x5AEE, 0x5AE5, 0x5AD5, 0x5AEA, + 0x5ADA, 0x5AED, 0x5AEB, 0x5AF3, 0x5AE2, 0x5AE0, 0x5ADB, 0x5AEC, + 0x5ADE, 0x5ADD, 0x5AD9, 0x5AE8, 0x5ADF, 0x5B77, 0x5BE0, 0x81B8, + 0x81C8, 0x8592, 0x8593, 0x857F, 0x85AB, 0x8597, 0x85AC, 0x87CE, + 0x87CD, 0x87C1, 0x87B1, 0x87C7, 0x8940, 0x893F, 0x8939, 0x8943, + 0x89AB, 0x8B1F, 0x8B09, 0x8B0C, 0x8C40, 0x8C96, 0x8CF6, 0x8CF7, + 0x8E46, 0x8E4F, 0x8F3D, 0x8F41, 0x9366, 0x9378, 0x935D, 0x9369, + 0x5BE3, 0x5C63, 0x5D82, 0x5D80, 0x5D7D, 0x5D86, 0x5D7A, 0x5D81, + 0x5D77, 0x5D8A, 0x5D89, 0x5D88, 0x5D7E, 0x5D7C, 0x5D8D, 0x5D79, + 0x5D7F, 0x5E58, 0x5E59, 0x5E53, 0x5ED8, 0x5ED1, 0x5ED7, 0x5ECE, + 0x5EDC, 0x5ED5, 0x5ED9, 0x5ED2, 0x5ED4, 0x5F44, 0x5F43, 0x5F6F, + 0x5FB6, 0x612C, 0x6128, 0x6141, 0x615E, 0x6171, 0x6173, 0x6152, + 0x6153, 0x6172, 0x616C, 0x6180, 0x6174, 0x6154, 0x617A, 0x615B, + 0x6165, 0x613B, 0x616A, 0x6161, 0x6156, 0x6229, 0x6227, 0x622B, + 0x642B, 0x644D, 0x645B, 0x645D, 0x6474, 0x6476, 0x6472, 0x6473, + 0x647D, 0x6475, 0x6466, 0x64A6, 0x644E, 0x6482, 0x645E, 0x645C, + 0x644B, 0x6453, 0x6460, 0x6450, 0x647F, 0x643F, 0x646C, 0x646B, + 0x6459, 0x6465, 0x6477, 0x6573, 0x65A0, 0x66A1, 0x66A0, 0x669F, + 0x6705, 0x6704, 0x6722, 0x69B1, 0x69B6, 0x69C9, 0x69A0, 0x69CE, +plane 73 +at 0x00 + 0x6996, 0x69B0, 0x69AC, 0x69BC, 0x6991, 0x6999, 0x698E, 0x69A7, + 0x698D, 0x69A9, 0x69BE, 0x69AF, 0x69BF, 0x69C4, 0x69BD, 0x69A4, + 0x69D4, 0x69B9, 0x69CA, 0x699A, 0x69CF, 0x69B3, 0x6993, 0x69AA, + 0x69A1, 0x699E, 0x69D9, 0x6997, 0x6990, 0x69C2, 0x69B5, 0x69A5, + 0x69C6, 0x6B4A, 0x6B4D, 0x6B4B, 0x6B9E, 0x6B9F, 0x6BA0, 0x6BC3, + 0x6BC4, 0x6BFE, 0x6ECE, 0x6EF5, 0x6EF1, 0x6F03, 0x6F25, 0x6EF8, + 0x6F37, 0x6EFB, 0x6F2E, 0x6F09, 0x6F4E, 0x6F19, 0x6F1A, 0x6F27, + 0x6F18, 0x6F3B, 0x6F12, 0x6EED, 0x6F0A, 0x9374, 0x937D, 0x936E, + 0x9372, 0x9373, 0x9362, 0x9348, 0x9353, 0x935F, 0x9368, 0x937F, + 0x936B, 0x95C4, 0x96AF, 0x96AD, 0x96B2, 0x971A, 0x971B, 0x979B, + 0x979F, 0x9840, 0x9847, 0x98B7, 0x99A2, 0x9A00, 0x99F3, 0x99F5, + 0x9ABD, 0x9B00, 0x9B02, 0x9B34, 0x9B49, 0x9B9F, 0x6F36, 0x6F73, + 0x6EF9, 0x6EEE, 0x6F2D, 0x6F40, 0x6F30, 0x6F3C, 0x6F35, 0x6EEB, + 0x6F07, 0x6F0E, 0x6F43, 0x6F05, 0x6EFD, 0x6EF6, 0x6F39, 0x6F1C, + 0x6EFC, 0x6F3A, 0x6F1F, 0x6F0D, 0x6F1E, 0x6F08, 0x6F21, 0x7187, + 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718F, 0x717B, 0x7186, + 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, 0x7343, + 0x734D, 0x7351, 0x734C, 0x7462, 0x7473, 0x7471, 0x7475, 0x7472, + 0x7467, 0x746E, 0x7500, 0x7502, 0x7503, 0x757D, 0x7590, 0x7616, + 0x7608, 0x760C, 0x7615, 0x7611, 0x760A, 0x7614, 0x76B8, 0x7781, + 0x777C, 0x7785, 0x7782, 0x776E, 0x7780, 0x776F, 0x777E, 0x7783, + 0x78B2, 0x78AA, 0x78B4, 0x78AD, 0x78A8, 0x787E, 0x78AB, 0x789E, + 0x78A5, 0x78A0, 0x78AC, 0x78A2, 0x78A4, 0x7998, 0x798A, 0x798B, + 0x7996, 0x7995, 0x7994, 0x7993, 0x7997, 0x7988, 0x7992, 0x7990, + 0x7A2B, 0x7A4A, 0x7A30, 0x7A2F, 0x7A28, 0x7A26, 0x7AA8, 0x7AAB, + 0x7AAC, 0x7AEE, 0x7B88, 0x7B9C, 0x7B8A, 0x7B91, 0x7B90, 0x7B96, + 0x7B8D, 0x7B8C, 0x7B9B, 0x7B8E, 0x7B85, 0x7B98, 0x5284, 0x7B99, + 0x7BA4, 0x7B82, 0x7CBB, 0x7CBF, 0x7CBC, 0x7CBA, 0x7DA7, 0x7DB7, + 0x7DC2, 0x7DA3, 0x7DAA, 0x7DC1, 0x7DC0, 0x7DC5, 0x7D9D, 0x7DCE, + 0x7DC4, 0x7DC6, 0x7DCB, 0x7DCC, 0x7DAF, 0x7DB9, 0x7D96, 0x7DBC, + 0x7D9F, 0x7DA6, 0x7DAE, 0x7DA9, 0x7DA1, 0x7DC9, 0x7F73, 0x7FE2, + 0x7FE3, 0x7FE5, 0x7FDE, 0x9BA3, 0x9BCD, 0x9B99, 0x9B9D, 0x9D39, +plane 74 +at 0x00 + 0x9D44, 0x9D35, 0x9EAF, 0x512F, 0x9F8E, 0x569F, 0x569B, 0x569E, + 0x5696, 0x5694, 0x56A0, 0x5B3B, 0x5B3A, 0x5DC1, 0x5F4D, 0x5F5D, + 0x61F3, 0x64F6, 0x64E5, 0x64EA, 0x64E7, 0x6505, 0x64F9, 0x6AAB, + 0x6AED, 0x6AB2, 0x6AB0, 0x6AB5, 0x8024, 0x805D, 0x805C, 0x8189, + 0x8186, 0x8183, 0x8187, 0x818D, 0x818C, 0x818B, 0x8215, 0x8497, + 0x84A4, 0x84A1, 0x849F, 0x84BA, 0x84CE, 0x84C2, 0x84AC, 0x84AE, + 0x84AB, 0x84B9, 0x84B4, 0x84C1, 0x84CD, 0x84AA, 0x849A, 0x84B1, + 0x84D0, 0x849D, 0x84A7, 0x84BB, 0x84A2, 0x8494, 0x84C7, 0x84CC, + 0x849B, 0x84A9, 0x84AF, 0x84A8, 0x84D6, 0x8498, 0x84B6, 0x84CF, + 0x84A0, 0x84D7, 0x84D4, 0x84D2, 0x84DB, 0x84B0, 0x8491, 0x8661, + 0x8733, 0x8723, 0x8728, 0x876B, 0x8740, 0x872E, 0x871E, 0x8721, + 0x8719, 0x871B, 0x8743, 0x872C, 0x8741, 0x873E, 0x8746, 0x8720, + 0x8732, 0x872A, 0x872D, 0x873C, 0x8712, 0x873A, 0x8731, 0x8735, + 0x8742, 0x8726, 0x8727, 0x8738, 0x8724, 0x871A, 0x8730, 0x8711, + 0x88F7, 0x88E7, 0x88F1, 0x88F2, 0x88FA, 0x88FE, 0x88EE, 0x88FC, + 0x88F6, 0x88FB, 0x88F0, 0x88EC, 0x88EB, 0x899D, 0x89A1, 0x899F, + 0x899E, 0x89E9, 0x89EB, 0x89E8, 0x8AAB, 0x8A99, 0x8A8B, 0x8A92, + 0x8A8F, 0x8A96, 0x8C3D, 0x8C68, 0x8C69, 0x8CD5, 0x8CCF, 0x8CD7, + 0x8D96, 0x8E09, 0x8E02, 0x8DFF, 0x8E0D, 0x8DFD, 0x8E0A, 0x8E03, + 0x8E07, 0x8E06, 0x8E05, 0x8DFE, 0x8E00, 0x8E04, 0x8F10, 0x8F11, + 0x8F0E, 0x8F0D, 0x9123, 0x911C, 0x9120, 0x9122, 0x911F, 0x911D, + 0x911A, 0x9124, 0x9121, 0x911B, 0x917A, 0x9172, 0x9179, 0x9173, + 0x92A5, 0x92A4, 0x9276, 0x929B, 0x927A, 0x92A0, 0x9294, 0x92AA, + 0x928D, 0x6ABE, 0x6AC1, 0x6AC8, 0x6AC0, 0x6ABC, 0x6AB1, 0x6AC4, + 0x6ABF, 0x7008, 0x7003, 0x6FFD, 0x7010, 0x7002, 0x7013, 0x71FA, + 0x7200, 0x74B9, 0x74BC, 0x765B, 0x7651, 0x764F, 0x76EB, 0x77B8, + 0x77B9, 0x77C1, 0x77C0, 0x77BE, 0x790B, 0x7907, 0x790A, 0x7908, + 0x790D, 0x7906, 0x92A6, 0x929A, 0x92AB, 0x9279, 0x9297, 0x927F, + 0x92A3, 0x92EE, 0x928E, 0x9282, 0x9295, 0x92A2, 0x927D, 0x9288, + 0x92A1, 0x928A, 0x9286, 0x928C, 0x9299, 0x92A7, 0x927E, 0x9287, + 0x92A9, 0x929D, 0x928B, 0x922D, 0x969E, 0x96A1, 0x96FF, 0x9758, + 0x977D, 0x977A, 0x977E, 0x9783, 0x9780, 0x9782, 0x977B, 0x9784, +plane 75 +at 0x00 + 0x9781, 0x977F, 0x97CE, 0x97CD, 0x9816, 0x98AD, 0x98AE, 0x9902, + 0x9900, 0x9907, 0x999D, 0x999C, 0x99C3, 0x99B9, 0x99BB, 0x99BA, + 0x99C2, 0x99BD, 0x99C7, 0x9AB1, 0x9AE3, 0x9AE7, 0x9B3E, 0x9B3F, + 0x9B60, 0x9B61, 0x9B5F, 0x9CF1, 0x9CF2, 0x9CF5, 0x9EA7, 0x50FF, + 0x5103, 0x5130, 0x50F8, 0x5106, 0x5107, 0x50F6, 0x50FE, 0x510B, + 0x510C, 0x50FD, 0x510A, 0x528B, 0x528C, 0x52F1, 0x52EF, 0x5648, + 0x5642, 0x564C, 0x5635, 0x5641, 0x564A, 0x5649, 0x5646, 0x5658, + 0x565A, 0x5640, 0x5633, 0x563D, 0x562C, 0x563E, 0x5638, 0x562A, + 0x563A, 0x571A, 0x58AB, 0x589D, 0x58B1, 0x58A0, 0x58A3, 0x58AF, + 0x58AC, 0x58A5, 0x58A1, 0x58FF, 0x5AFF, 0x5AF4, 0x5AFD, 0x5AF7, + 0x5AF6, 0x5B03, 0x5AF8, 0x5B02, 0x5AF9, 0x5B01, 0x5B07, 0x5B05, + 0x5B0F, 0x5C67, 0x5D99, 0x5D97, 0x5D9F, 0x5D92, 0x5DA2, 0x5D93, + 0x5D95, 0x5DA0, 0x5D9C, 0x5DA1, 0x5D9A, 0x5D9E, 0x5E69, 0x5E5D, + 0x5E60, 0x5E5C, 0x7DF3, 0x5EDB, 0x5EDE, 0x5EE1, 0x5F49, 0x5FB2, + 0x618B, 0x6183, 0x6179, 0x61B1, 0x61B0, 0x61A2, 0x6189, 0x7915, + 0x79AF, 0x7AF5, 0x7C2E, 0x7C1B, 0x7C1A, 0x7C24, 0x7CE6, 0x7CE3, + 0x7E5D, 0x7E4F, 0x7E66, 0x7E5B, 0x7F47, 0x7FB4, 0x7FFA, 0x802E, + 0x81CE, 0x8219, 0x85CC, 0x85B2, 0x85BB, 0x85C1, 0x87E9, 0x87EE, + 0x87F0, 0x87D6, 0x880E, 0x87DA, 0x8948, 0x894A, 0x894E, 0x894D, + 0x619B, 0x6193, 0x61AF, 0x61AD, 0x619F, 0x6192, 0x61AA, 0x61A1, + 0x618D, 0x6166, 0x61B3, 0x622D, 0x646E, 0x6470, 0x6496, 0x64A0, + 0x6485, 0x6497, 0x649C, 0x648F, 0x648B, 0x648A, 0x648C, 0x64A3, + 0x649F, 0x6468, 0x64B1, 0x6498, 0x6576, 0x657A, 0x6579, 0x657B, + 0x65B2, 0x65B3, 0x66B5, 0x66B0, 0x66A9, 0x66B2, 0x66B7, 0x66AA, + 0x66AF, 0x6A00, 0x6A06, 0x6A17, 0x69E5, 0x69F8, 0x6A15, 0x69F1, + 0x69E4, 0x6A20, 0x69FF, 0x69EC, 0x69E2, 0x6A1B, 0x6A1D, 0x69FE, + 0x6A27, 0x69F2, 0x69EE, 0x6A14, 0x69F7, 0x69E7, 0x6A40, 0x6A08, + 0x69E6, 0x69FB, 0x6A0D, 0x69FC, 0x69EB, 0x6A09, 0x6A04, 0x6A18, + 0x6A25, 0x6A0F, 0x69F6, 0x6A26, 0x6A07, 0x69F4, 0x6A16, 0x6B51, + 0x6BA5, 0x6BA3, 0x6BA2, 0x6BA6, 0x6C01, 0x6C00, 0x6BFF, 0x6C02, + 0x6F41, 0x6F26, 0x6F7E, 0x6F87, 0x6FC6, 0x6F92, 0x6F8D, 0x6F89, + 0x6F8C, 0x6F62, 0x6F4F, 0x6F85, 0x6F5A, 0x6F96, 0x6F76, 0x6F6C, +plane 76 +at 0x00 + 0x6F82, 0x6F55, 0x6F72, 0x6F52, 0x6F50, 0x6F57, 0x6F94, 0x6F93, + 0x6F5D, 0x6F00, 0x6F61, 0x6F6B, 0x6F7D, 0x6F67, 0x6F90, 0x6F53, + 0x6F8B, 0x6F69, 0x6F7F, 0x6F95, 0x6F63, 0x6F77, 0x6F6A, 0x6F7B, + 0x71B2, 0x71AF, 0x719B, 0x71B0, 0x71A0, 0x719A, 0x71A9, 0x71B5, + 0x719D, 0x71A5, 0x719E, 0x71A4, 0x71A1, 0x71AA, 0x719C, 0x71A7, + 0x71B3, 0x7298, 0x729A, 0x7358, 0x7352, 0x735E, 0x735F, 0x7360, + 0x735D, 0x735B, 0x7361, 0x735A, 0x7359, 0x89B1, 0x89B0, 0x89B3, + 0x8B38, 0x8B32, 0x8B2D, 0x8B34, 0x8B29, 0x8C74, 0x8D03, 0x8DA9, + 0x8E58, 0x8EBF, 0x8EC1, 0x8F4A, 0x8FAC, 0x9089, 0x913D, 0x913C, + 0x91A9, 0x93A0, 0x9390, 0x9393, 0x938B, 0x93AD, 0x93BB, 0x93B8, + 0x939C, 0x95D8, 0x95D7, 0x975D, 0x97A9, 0x97DA, 0x7362, 0x7487, + 0x7489, 0x748A, 0x7486, 0x7481, 0x747D, 0x7485, 0x7488, 0x747C, + 0x7479, 0x7508, 0x7507, 0x757E, 0x7625, 0x761E, 0x7619, 0x761D, + 0x761C, 0x7623, 0x761A, 0x7628, 0x761B, 0x769C, 0x769D, 0x769E, + 0x769B, 0x778D, 0x778F, 0x7789, 0x7788, 0x78CD, 0x78BB, 0x78CF, + 0x78CC, 0x78D1, 0x78CE, 0x78D4, 0x78C8, 0x78C3, 0x78C4, 0x78C9, + 0x799A, 0x79A1, 0x79A0, 0x799C, 0x79A2, 0x799B, 0x6B76, 0x7A39, + 0x7AB2, 0x7AB4, 0x7AB3, 0x7BB7, 0x7BCB, 0x7BBE, 0x7BAC, 0x7BCE, + 0x7BAF, 0x7BB9, 0x7BCA, 0x7BB5, 0x7CC5, 0x7CC8, 0x7CCC, 0x7CCB, + 0x7DF7, 0x7DDB, 0x7DEA, 0x7DE7, 0x7DD7, 0x7DE1, 0x7E03, 0x7DFA, + 0x7DE6, 0x7DF6, 0x7DF1, 0x7DF0, 0x7DEE, 0x7DDF, 0x7F76, 0x7FAC, + 0x7FB0, 0x7FAD, 0x7FED, 0x7FEB, 0x7FEA, 0x7FEC, 0x7FE6, 0x7FE8, + 0x8064, 0x8067, 0x81A3, 0x819F, 0x819E, 0x8195, 0x81A2, 0x8199, + 0x8197, 0x8216, 0x824F, 0x8253, 0x8252, 0x8250, 0x824E, 0x8251, + 0x8524, 0x853B, 0x850F, 0x8500, 0x8529, 0x850E, 0x8509, 0x850D, + 0x851F, 0x850A, 0x8527, 0x851C, 0x84FB, 0x852B, 0x84FA, 0x8508, + 0x850C, 0x84F4, 0x852A, 0x84F2, 0x8515, 0x84F7, 0x84EB, 0x84F3, + 0x84FC, 0x8512, 0x84EA, 0x84E9, 0x8516, 0x84FE, 0x8528, 0x851D, + 0x852E, 0x8502, 0x84FD, 0x851E, 0x84F6, 0x8531, 0x8526, 0x84E7, + 0x84E8, 0x84F0, 0x84EF, 0x84F9, 0x8518, 0x8520, 0x8530, 0x850B, + 0x8519, 0x852F, 0x8662, 0x9854, 0x9855, 0x984B, 0x983F, 0x98B9, + 0x9938, 0x9936, 0x9940, 0x993B, 0x9939, 0x99A4, 0x9A08, 0x9A0C, +plane 77 +at 0x00 + 0x9A10, 0x9B07, 0x9BD2, 0x9BC2, 0x9BBB, 0x9BCC, 0x9BCB, 0x9D4D, + 0x9D63, 0x9D4E, 0x9D50, 0x9D55, 0x9D5E, 0x9E90, 0x9EB2, 0x9EB1, + 0x9ECA, 0x9F02, 0x9F27, 0x9F26, 0x8756, 0x8763, 0x8764, 0x8777, + 0x87E1, 0x8773, 0x8758, 0x8754, 0x875B, 0x8752, 0x8761, 0x875A, + 0x8751, 0x875E, 0x876D, 0x876A, 0x8750, 0x874E, 0x875F, 0x875D, + 0x876F, 0x876C, 0x877A, 0x876E, 0x875C, 0x8765, 0x874F, 0x877B, + 0x8775, 0x8762, 0x8767, 0x8769, 0x885A, 0x8905, 0x890C, 0x8914, + 0x890B, 0x8917, 0x8918, 0x8919, 0x8906, 0x8916, 0x8911, 0x890E, + 0x8909, 0x89A2, 0x89A4, 0x89A3, 0x89ED, 0x89F0, 0x89EC, 0x8ACF, + 0x8AC6, 0x8AB8, 0x8AD3, 0x8AD1, 0x8AD4, 0x8AD5, 0x8ABB, 0x8AD7, + 0x8ABE, 0x8AC0, 0x8AC5, 0x8AD8, 0x8AC3, 0x8ABA, 0x8ABD, 0x8AD9, + 0x8C3E, 0x8C4D, 0x8C8F, 0x8CE5, 0x8CDF, 0x8CD9, 0x8CE8, 0x8CDA, + 0x8CDD, 0x8CE7, 0x8DA0, 0x8D9C, 0x8DA1, 0x8D9B, 0x8E20, 0x8E23, + 0x8E25, 0x8E24, 0x8E2E, 0x8E15, 0x8E1B, 0x8E16, 0x8E11, 0x8E19, + 0x8E26, 0x8E27, 0x8E14, 0x8E12, 0x8E18, 0x8E13, 0x8E1C, 0x8E17, + 0x8E1A, 0x8F2C, 0x8F24, 0x8F18, 0x8F1A, 0x8F20, 0x8F23, 0x8F16, + 0x8F17, 0x9073, 0x9070, 0x906F, 0x9067, 0x906B, 0x912F, 0x912B, + 0x9129, 0x912A, 0x9132, 0x9126, 0x912E, 0x9185, 0x9186, 0x918A, + 0x9181, 0x9182, 0x9184, 0x9180, 0x92D0, 0x92C3, 0x92C4, 0x92C0, + 0x92D9, 0x92B6, 0x92CF, 0x92F1, 0x92DF, 0x92D8, 0x92E9, 0x92D7, + 0x92DD, 0x92CC, 0x92EF, 0x92C2, 0x92E8, 0x92CA, 0x92C8, 0x92CE, + 0x92E6, 0x92CD, 0x92D5, 0x92C9, 0x92E0, 0x92DE, 0x92E7, 0x92D1, + 0x92D3, 0x56AF, 0x58E0, 0x58DC, 0x5B39, 0x5B7C, 0x5BF3, 0x5C6B, + 0x5DC4, 0x650B, 0x6508, 0x650A, 0x65DC, 0x66E1, 0x66DF, 0x6ACE, + 0x6AD4, 0x6AE3, 0x6AD7, 0x6AE2, 0x6AD8, 0x6AD5, 0x6AD2, 0x701E, + 0x702C, 0x7025, 0x6FF3, 0x7204, 0x7208, 0x7215, 0x74C4, 0x74C9, + 0x74C7, 0x74C8, 0x92B5, 0x92E1, 0x92C6, 0x92B4, 0x957C, 0x95AC, + 0x95AB, 0x95AE, 0x95B0, 0x96A4, 0x96A2, 0x96D3, 0x9705, 0x9708, + 0x9702, 0x975A, 0x978A, 0x978E, 0x9788, 0x97D0, 0x97CF, 0x981E, + 0x981D, 0x9826, 0x9829, 0x9828, 0x9820, 0x981B, 0x9827, 0x98B2, + 0x9908, 0x98FA, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99DC, + 0x99CD, 0x99CF, 0x99D3, 0x99D4, 0x99CE, 0x99C9, 0x99D6, 0x99D8, +plane 78 +at 0x00 + 0x99CB, 0x99D7, 0x99CC, 0x9AB3, 0x9AEC, 0x9AEB, 0x9AF3, 0x9AF2, + 0x9AF1, 0x9B46, 0x9B43, 0x9B67, 0x9B74, 0x9B71, 0x9B66, 0x9B76, + 0x9B75, 0x9B70, 0x9B68, 0x9B64, 0x9B6C, 0x9CFC, 0x9CFA, 0x9CFD, + 0x9CFF, 0x9CF7, 0x9D07, 0x9D00, 0x9CF9, 0x9CFB, 0x9D08, 0x9D05, + 0x9D04, 0x9E83, 0x9ED3, 0x9F0F, 0x9F10, 0x511C, 0x5113, 0x5117, + 0x511A, 0x5111, 0x51DE, 0x5334, 0x53E1, 0x5670, 0x5660, 0x566E, + 0x5673, 0x5666, 0x5663, 0x566D, 0x5672, 0x565E, 0x5677, 0x571C, + 0x571B, 0x58C8, 0x58BD, 0x58C9, 0x58BF, 0x58BA, 0x58C2, 0x58BC, + 0x58C6, 0x5B17, 0x5B19, 0x5B1B, 0x5B21, 0x5B14, 0x5B13, 0x5B10, + 0x5B16, 0x5B28, 0x5B1A, 0x5B20, 0x5B1E, 0x5BEF, 0x5DAC, 0x5DB1, + 0x5DA9, 0x5DA7, 0x5DB5, 0x5DB0, 0x5DAE, 0x5DAA, 0x5DA8, 0x5DB2, + 0x5DAD, 0x5DAF, 0x5DB4, 0x5E67, 0x5E68, 0x5E66, 0x5E6F, 0x5EE9, + 0x5EE7, 0x5EE6, 0x5EE8, 0x5EE5, 0x5F4B, 0x5FBC, 0x619D, 0x61A8, + 0x6196, 0x61C5, 0x61B4, 0x61C6, 0x61C1, 0x61CC, 0x61BA, 0x76A9, + 0x77C6, 0x77C5, 0x7918, 0x791A, 0x7920, 0x7A66, 0x7A64, 0x7A6A, + 0x7C35, 0x7C34, 0x7E6C, 0x7E6E, 0x7E71, 0x81D4, 0x81D6, 0x821A, + 0x8262, 0x8265, 0x8276, 0x85DB, 0x85D6, 0x85E7, 0x85F4, 0x87FD, + 0x87D5, 0x8807, 0x880F, 0x87F8, 0x8987, 0x89B5, 0x89F5, 0x8B3F, + 0x61BF, 0x61B8, 0x618C, 0x64D7, 0x64D6, 0x64D0, 0x64CF, 0x64C9, + 0x64BD, 0x6489, 0x64C3, 0x64DB, 0x64F3, 0x64D9, 0x6533, 0x657F, + 0x657C, 0x65A2, 0x66C8, 0x66BE, 0x66C0, 0x66CA, 0x66CB, 0x66CF, + 0x66BD, 0x66BB, 0x66BA, 0x66CC, 0x6723, 0x6A34, 0x6A66, 0x6A49, + 0x6A67, 0x6A32, 0x6A68, 0x6A3E, 0x6A5D, 0x6A6D, 0x6A76, 0x6A5B, + 0x6A51, 0x6A28, 0x6A5A, 0x6A3B, 0x6A3F, 0x6A41, 0x6A6A, 0x6A64, + 0x6A50, 0x6A4F, 0x6A54, 0x6A6F, 0x6A69, 0x6A60, 0x6A3C, 0x6A5E, + 0x6A56, 0x6A55, 0x6A4D, 0x6A4E, 0x6A46, 0x6B55, 0x6B54, 0x6B56, + 0x6BA7, 0x6BAA, 0x6BAB, 0x6BC8, 0x6BC7, 0x6C04, 0x6C03, 0x6C06, + 0x6FAD, 0x6FCB, 0x6FA3, 0x6FC7, 0x6FBC, 0x6FCE, 0x6FC8, 0x6F5E, + 0x6FC4, 0x6FBD, 0x6F9E, 0x6FCA, 0x6FA8, 0x7004, 0x6FA5, 0x6FAE, + 0x6FBA, 0x6FAC, 0x6FAA, 0x6FCF, 0x6FBF, 0x6FB8, 0x6FA2, 0x6FC9, + 0x6FAB, 0x6FCD, 0x6FAF, 0x6FB2, 0x6FB0, 0x71C5, 0x71C2, 0x71BF, + 0x71B8, 0x71D6, 0x71C0, 0x71C1, 0x71CB, 0x71D4, 0x71CA, 0x71C7, +plane 79 +at 0x00 + 0x71CF, 0x71BD, 0x71D8, 0x71BC, 0x71C6, 0x71DA, 0x71DB, 0x729D, + 0x729E, 0x7369, 0x7366, 0x7367, 0x736C, 0x7365, 0x736B, 0x736A, + 0x747F, 0x749A, 0x74A0, 0x7494, 0x7492, 0x7495, 0x74A1, 0x750B, + 0x7580, 0x762F, 0x762D, 0x7631, 0x763D, 0x7633, 0x763C, 0x7635, + 0x7632, 0x7630, 0x76BB, 0x76E6, 0x779A, 0x779D, 0x77A1, 0x779C, + 0x779B, 0x77A2, 0x77A3, 0x7795, 0x7799, 0x8B43, 0x8B4C, 0x8D0B, + 0x8E6B, 0x8E68, 0x8E70, 0x8E75, 0x8E77, 0x8EC3, 0x93E9, 0x93EA, + 0x93CB, 0x93C5, 0x93C6, 0x93ED, 0x93D3, 0x93E5, 0x93DB, 0x93EB, + 0x93E0, 0x93C1, 0x95DD, 0x97B2, 0x97B4, 0x97B1, 0x97B5, 0x97F2, + 0x9856, 0x9944, 0x9A26, 0x9A1F, 0x9A18, 0x9A21, 0x7797, 0x78DD, + 0x78E9, 0x78E5, 0x78EA, 0x78DE, 0x78E3, 0x78DB, 0x78E1, 0x78E2, + 0x78ED, 0x78DF, 0x78E0, 0x79A4, 0x7A44, 0x7A48, 0x7A47, 0x7AB6, + 0x7AB8, 0x7AB5, 0x7AB1, 0x7AB7, 0x7BDE, 0x7BE3, 0x7BE7, 0x7BDD, + 0x7BD5, 0x7BE5, 0x7BDA, 0x7BE8, 0x7BF9, 0x7BD4, 0x7BEA, 0x7BE2, + 0x7BDC, 0x7BEB, 0x7BD8, 0x7BDF, 0x7CD2, 0x7CD4, 0x7CD7, 0x7CD0, + 0x7CD1, 0x7E12, 0x7E21, 0x7E17, 0x7E0C, 0x7E1F, 0x7E20, 0x7E13, + 0x7E0E, 0x7E1C, 0x7E15, 0x7E1A, 0x7E22, 0x7E0B, 0x7E0F, 0x7E16, + 0x7E0D, 0x7E14, 0x7E25, 0x7E24, 0x7F43, 0x7F7B, 0x7F7C, 0x7F7A, + 0x7FB1, 0x7FEF, 0x802A, 0x8029, 0x806C, 0x81B1, 0x81A6, 0x81AE, + 0x81B9, 0x81B5, 0x81AB, 0x81B0, 0x81AC, 0x81B4, 0x81B2, 0x81B7, + 0x81A7, 0x81F2, 0x8255, 0x8256, 0x8257, 0x8556, 0x8545, 0x856B, + 0x854D, 0x8553, 0x8561, 0x8558, 0x8540, 0x8546, 0x8564, 0x8541, + 0x8562, 0x8544, 0x8551, 0x8547, 0x8563, 0x853E, 0x855B, 0x8571, + 0x854E, 0x856E, 0x8575, 0x8555, 0x8567, 0x8560, 0x858C, 0x8566, + 0x855D, 0x8554, 0x8565, 0x856C, 0x8663, 0x8665, 0x8664, 0x879B, + 0x878F, 0x8797, 0x8793, 0x8792, 0x8788, 0x8781, 0x8796, 0x8798, + 0x8779, 0x8787, 0x87A3, 0x8785, 0x8790, 0x8791, 0x879D, 0x8784, + 0x8794, 0x879C, 0x879A, 0x8789, 0x891E, 0x8926, 0x8930, 0x892D, + 0x892E, 0x8927, 0x8931, 0x8922, 0x8929, 0x8923, 0x892F, 0x892C, + 0x891F, 0x89F1, 0x8AE0, 0x9A17, 0x9B09, 0x9BC5, 0x9BDF, 0x9BE3, + 0x9BE9, 0x9BEE, 0x9D66, 0x9D7A, 0x9D6E, 0x9D91, 0x9D83, 0x9D76, + 0x9D7E, 0x9D6D, 0x9E95, 0x9EE3, 0x9F03, 0x9F04, 0x9F17, 0x5136, +plane 80 +at 0x00 + 0x5336, 0x5B42, 0x5B44, 0x5B46, 0x5B7E, 0x5DCA, 0x5DC8, 0x5DCC, + 0x5EF0, 0x6585, 0x66E5, 0x66E7, 0x8AE2, 0x8AF2, 0x8AF4, 0x8AF5, + 0x8ADD, 0x8B14, 0x8AE4, 0x8ADF, 0x8AF0, 0x8AC8, 0x8ADE, 0x8AE1, + 0x8AE8, 0x8AFF, 0x8AEF, 0x8AFB, 0x8C91, 0x8C92, 0x8C90, 0x8CF5, + 0x8CEE, 0x8CF1, 0x8CF0, 0x8CF3, 0x8D6C, 0x8D6E, 0x8DA5, 0x8DA7, + 0x8E33, 0x8E3E, 0x8E38, 0x8E40, 0x8E45, 0x8E36, 0x8E3C, 0x8E3D, + 0x8E41, 0x8E30, 0x8E3F, 0x8EBD, 0x8F36, 0x8F2E, 0x8F35, 0x8F32, + 0x8F39, 0x8F37, 0x8F34, 0x9076, 0x9079, 0x907B, 0x9086, 0x90FA, + 0x9133, 0x9135, 0x9136, 0x9193, 0x9190, 0x9191, 0x918D, 0x918F, + 0x9327, 0x931E, 0x9308, 0x931F, 0x9306, 0x930F, 0x937A, 0x9338, + 0x933C, 0x931B, 0x9323, 0x9312, 0x9301, 0x9346, 0x932D, 0x930E, + 0x930D, 0x92CB, 0x931D, 0x92FA, 0x9325, 0x9313, 0x92F9, 0x92F7, + 0x9334, 0x9302, 0x9324, 0x92FF, 0x9329, 0x9339, 0x9335, 0x932A, + 0x9314, 0x930C, 0x930B, 0x92FE, 0x9309, 0x9300, 0x92FB, 0x9316, + 0x95BC, 0x95CD, 0x95BE, 0x95B9, 0x95BA, 0x95B6, 0x95BF, 0x95B5, + 0x95BD, 0x96A9, 0x96D4, 0x970B, 0x9712, 0x9710, 0x9799, 0x9797, + 0x9794, 0x97F0, 0x97F8, 0x9835, 0x982F, 0x9832, 0x9924, 0x991F, + 0x9927, 0x9929, 0x999E, 0x99EE, 0x99EC, 0x99E5, 0x99E4, 0x99F0, + 0x99E3, 0x99EA, 0x99E9, 0x99E7, 0x9AB9, 0x9ABF, 0x9AB4, 0x9ABB, + 0x9AF6, 0x9AFA, 0x9AF9, 0x9AF7, 0x9B33, 0x9B80, 0x9B85, 0x9B87, + 0x9B7C, 0x9B7E, 0x9B7B, 0x9B82, 0x9B93, 0x9B92, 0x9B90, 0x9B7A, + 0x9B95, 0x6AF4, 0x6AE9, 0x703D, 0x7036, 0x7216, 0x7212, 0x720F, + 0x7217, 0x7211, 0x720B, 0x74CD, 0x74D0, 0x74CC, 0x74CE, 0x74D1, + 0x7589, 0x7A6F, 0x7C4B, 0x7C44, 0x7C55, 0x7E7F, 0x8B71, 0x802F, + 0x807A, 0x807B, 0x807C, 0x85FC, 0x8610, 0x8602, 0x85EE, 0x8603, + 0x860D, 0x8613, 0x9B7D, 0x9B88, 0x9D25, 0x9D17, 0x9D20, 0x9D1E, + 0x9D14, 0x9D29, 0x9D1D, 0x9D18, 0x9D22, 0x9D10, 0x9D19, 0x9D1F, + 0x9E88, 0x9E86, 0x9E87, 0x9EAE, 0x9EAD, 0x9ED5, 0x9ED6, 0x9EFA, + 0x9F12, 0x9F3D, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129, + 0x52F4, 0x5693, 0x568C, 0x568D, 0x5686, 0x5684, 0x5683, 0x567E, + 0x5682, 0x567F, 0x5681, 0x58D6, 0x58D4, 0x58CF, 0x58D2, 0x5B2D, + 0x5B25, 0x5B32, 0x5B23, 0x5B2C, 0x5B27, 0x5B26, 0x5B2F, 0x5B2E, +plane 81 +at 0x00 + 0x5B7B, 0x5BF1, 0x5BF2, 0x5DB7, 0x5E6C, 0x5E6A, 0x5FBE, 0x5FBB, + 0x61C3, 0x61B5, 0x61BC, 0x61E7, 0x61E0, 0x61E5, 0x61E4, 0x61E8, + 0x61DE, 0x64EF, 0x64E9, 0x64E3, 0x64EB, 0x64E4, 0x64E8, 0x6581, + 0x6580, 0x65B6, 0x65DA, 0x66D2, 0x6A8D, 0x6A96, 0x6A81, 0x6AA5, + 0x6A89, 0x6A9F, 0x6A9B, 0x6AA1, 0x6A9E, 0x6A87, 0x6A93, 0x6A8E, + 0x6A95, 0x6A83, 0x6AA8, 0x6AA4, 0x6A91, 0x6A7F, 0x6AA6, 0x6A9A, + 0x6A85, 0x6A8C, 0x6A92, 0x6B5B, 0x6BAD, 0x6C09, 0x6FCC, 0x6FA9, + 0x6FF4, 0x6FD4, 0x6FE3, 0x6FDC, 0x6FED, 0x6FE7, 0x6FE6, 0x6FDE, + 0x6FF2, 0x6FDD, 0x6FE2, 0x6FE8, 0x71E1, 0x71F1, 0x71E8, 0x71F2, + 0x71E4, 0x71F0, 0x71E2, 0x7373, 0x736E, 0x736F, 0x7497, 0x74B2, + 0x74AB, 0x7490, 0x74AA, 0x74AD, 0x74B1, 0x74A5, 0x74AF, 0x7510, + 0x7511, 0x7512, 0x750F, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647, + 0x76A4, 0x76E9, 0x77B5, 0x77AB, 0x77B2, 0x77B7, 0x77B6, 0x8608, + 0x860F, 0x8818, 0x8812, 0x8967, 0x8965, 0x89BB, 0x8B69, 0x8B62, + 0x8B6E, 0x8B61, 0x8B64, 0x8B4D, 0x8C51, 0x8E83, 0x8EC6, 0x941F, + 0x9404, 0x9417, 0x9408, 0x9405, 0x93F3, 0x941E, 0x9402, 0x941A, + 0x941B, 0x9427, 0x941C, 0x96B5, 0x9733, 0x9734, 0x9731, 0x97B8, + 0x77B4, 0x77B1, 0x77A8, 0x77F0, 0x78F3, 0x78FD, 0x7902, 0x78FB, + 0x78FC, 0x78F2, 0x7905, 0x78F9, 0x78FE, 0x7904, 0x79AB, 0x79A8, + 0x7A5C, 0x7A5B, 0x7A56, 0x7A58, 0x7A54, 0x7A5A, 0x7ABE, 0x7AC0, + 0x7AC1, 0x7C05, 0x7C0F, 0x7BF2, 0x7C00, 0x7BFF, 0x7BFB, 0x7C0E, + 0x7BF4, 0x7C0B, 0x7BF3, 0x7C02, 0x7C09, 0x7C03, 0x7C01, 0x7BF8, + 0x7BFD, 0x7C06, 0x7BF0, 0x7BF1, 0x7C10, 0x7C0A, 0x7CE8, 0x7E2D, + 0x7E3C, 0x7E42, 0x7E33, 0x9848, 0x7E38, 0x7E2A, 0x7E49, 0x7E40, + 0x7E47, 0x7E29, 0x7E4C, 0x7E30, 0x7E3B, 0x7E36, 0x7E44, 0x7E3A, + 0x7F45, 0x7F7F, 0x7F7E, 0x7F7D, 0x7FF4, 0x7FF2, 0x802C, 0x81BB, + 0x81C4, 0x81CC, 0x81CA, 0x81C5, 0x81C7, 0x81BC, 0x81E9, 0x825B, + 0x825A, 0x825C, 0x8583, 0x8580, 0x858F, 0x85A7, 0x8595, 0x85A0, + 0x858B, 0x85A3, 0x857B, 0x85A4, 0x859A, 0x859E, 0x8577, 0x857C, + 0x8589, 0x85A1, 0x857A, 0x8578, 0x8557, 0x858E, 0x8596, 0x8586, + 0x858D, 0x8599, 0x859D, 0x8581, 0x85A2, 0x8582, 0x8588, 0x8585, + 0x8579, 0x8576, 0x8598, 0x8590, 0x859F, 0x8668, 0x87BE, 0x87AA, +plane 82 +at 0x00 + 0x87AD, 0x87C5, 0x87B0, 0x87AC, 0x87B9, 0x87B5, 0x87BC, 0x87AE, + 0x87C9, 0x87C3, 0x87C2, 0x87CC, 0x87B7, 0x87AF, 0x87C4, 0x87CA, + 0x87B4, 0x87B6, 0x87BF, 0x87B8, 0x87BD, 0x87DE, 0x87B2, 0x8935, + 0x8933, 0x893C, 0x893E, 0x8941, 0x8952, 0x8937, 0x8942, 0x89AD, + 0x89AF, 0x89AE, 0x89F2, 0x89F3, 0x8B1E, 0x97BA, 0x97FC, 0x98C3, + 0x994D, 0x9A2F, 0x9AC9, 0x9AC8, 0x9AC4, 0x9B2A, 0x9B38, 0x9B50, + 0x9C0A, 0x9BFB, 0x9C04, 0x9BFC, 0x9BFE, 0x9C02, 0x9BF6, 0x9C1B, + 0x9BF9, 0x9C15, 0x9C10, 0x9BFF, 0x9C00, 0x9C0C, 0x9D95, 0x9DA5, + 0x9E98, 0x9EC1, 0x9F5A, 0x5164, 0x56BB, 0x58E6, 0x8B18, 0x8B16, + 0x8B11, 0x8B05, 0x8B0B, 0x8B22, 0x8B0F, 0x8B12, 0x8B15, 0x8B07, + 0x8B0D, 0x8B08, 0x8B06, 0x8B1C, 0x8B13, 0x8B1A, 0x8C4F, 0x8C70, + 0x8C72, 0x8C71, 0x8C6F, 0x8C95, 0x8C94, 0x8CF9, 0x8D6F, 0x8E4E, + 0x8E4D, 0x8E53, 0x8E50, 0x8E4C, 0x8E47, 0x8F43, 0x8F40, 0x9085, + 0x907E, 0x9138, 0x919A, 0x91A2, 0x919B, 0x9199, 0x919F, 0x91A1, + 0x919D, 0x91A0, 0x93A1, 0x9383, 0x93AF, 0x9364, 0x9356, 0x9347, + 0x937C, 0x9358, 0x935C, 0x9376, 0x9349, 0x9350, 0x9351, 0x9360, + 0x936D, 0x938F, 0x934C, 0x936A, 0x9379, 0x9357, 0x9355, 0x9352, + 0x934F, 0x9371, 0x9377, 0x937B, 0x9361, 0x935E, 0x9363, 0x9367, + 0x9380, 0x934E, 0x9359, 0x95C7, 0x95C0, 0x95C9, 0x95C3, 0x95C5, + 0x95B7, 0x96AE, 0x96B0, 0x96AC, 0x9720, 0x971F, 0x9718, 0x971D, + 0x9719, 0x979A, 0x97A1, 0x979C, 0x979E, 0x979D, 0x97D5, 0x97D4, + 0x97F1, 0x9841, 0x9844, 0x984A, 0x9849, 0x9845, 0x9843, 0x9925, + 0x992B, 0x992C, 0x992A, 0x9933, 0x9932, 0x992F, 0x992D, 0x9931, + 0x9930, 0x9998, 0x99A3, 0x99A1, 0x9A02, 0x99FA, 0x99F4, 0x99F7, + 0x99F9, 0x99F8, 0x99F6, 0x99FB, 0x99FD, 0x99FE, 0x99FC, 0x9A03, + 0x9ABE, 0x9AFE, 0x9AFD, 0x9B01, 0x9AFC, 0x9B48, 0x9B9A, 0x9BA8, + 0x9B9E, 0x9B9B, 0x9BA6, 0x9BA1, 0x9BA5, 0x9BA4, 0x9B86, 0x9BA2, + 0x9BA0, 0x9BAF, 0x9D33, 0x9D41, 0x9D67, 0x9D36, 0x9D2E, 0x9D2F, + 0x9D31, 0x9D38, 0x9D30, 0x5B49, 0x5BF7, 0x5DD0, 0x5FC2, 0x6511, + 0x6AFF, 0x6AFE, 0x6AFD, 0x6B01, 0x704B, 0x704D, 0x7047, 0x74D3, + 0x7668, 0x7667, 0x77D1, 0x7930, 0x7932, 0x792E, 0x9F9D, 0x7AC9, + 0x7AC8, 0x7C56, 0x7C51, 0x7E85, 0x7E89, 0x7E8E, 0x7E84, 0x826A, +plane 83 +at 0x00 + 0x862B, 0x862F, 0x8628, 0x8616, 0x9D45, 0x9D42, 0x9D43, 0x9D3E, + 0x9D37, 0x9D40, 0x9D3D, 0x7FF5, 0x9D2D, 0x9E8A, 0x9E89, 0x9E8D, + 0x9EB0, 0x9EC8, 0x9EDA, 0x9EFB, 0x9EFF, 0x9F24, 0x9F23, 0x9F22, + 0x9F54, 0x9FA0, 0x5131, 0x512D, 0x512E, 0x5698, 0x569C, 0x5697, + 0x569A, 0x569D, 0x5699, 0x5970, 0x5B3C, 0x5C69, 0x5C6A, 0x5DC0, + 0x5E6D, 0x5E6E, 0x61D8, 0x61DF, 0x61ED, 0x61EE, 0x61F1, 0x61EA, + 0x61F0, 0x61EB, 0x61D6, 0x61E9, 0x64FF, 0x6504, 0x64FD, 0x64F8, + 0x6501, 0x6503, 0x64FC, 0x6594, 0x65DB, 0x66DA, 0x66DB, 0x66D8, + 0x6AC5, 0x6AB9, 0x6ABD, 0x6AE1, 0x6AC6, 0x6ABA, 0x6AB6, 0x6AB7, + 0x6AC7, 0x6AB4, 0x6AAD, 0x6B5E, 0x6BC9, 0x6C0B, 0x7007, 0x700C, + 0x700D, 0x7001, 0x7005, 0x7014, 0x700E, 0x6FFF, 0x7000, 0x6FFB, + 0x7026, 0x6FFC, 0x6FF7, 0x700A, 0x7201, 0x71FF, 0x71F9, 0x7203, + 0x71FD, 0x7376, 0x74B8, 0x74C0, 0x74B5, 0x74C1, 0x74BE, 0x74B6, + 0x74BB, 0x74C2, 0x7514, 0x7513, 0x765C, 0x7664, 0x7659, 0x7650, + 0x7653, 0x7657, 0x765A, 0x76A6, 0x76BD, 0x76EC, 0x77C2, 0x77BA, + 0x78FF, 0x790C, 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, + 0x79AD, 0x79AC, 0x7A5F, 0x7C1C, 0x7C29, 0x7C19, 0x7C20, 0x7C1F, + 0x7C2D, 0x7C1D, 0x7C26, 0x7C28, 0x7C22, 0x7C25, 0x7C30, 0x7E5C, + 0x7E50, 0x7E56, 0x7E63, 0x7E58, 0x7E62, 0x7E5F, 0x7E51, 0x7E60, + 0x7E57, 0x7E53, 0x7FB5, 0x7FB3, 0x7FF7, 0x7FF8, 0x8075, 0x81D1, + 0x81D2, 0x8615, 0x861D, 0x881A, 0x89BC, 0x8B75, 0x8B7C, 0x8D11, + 0x8D12, 0x8F5C, 0x91BB, 0x93F4, 0x942D, 0x96E4, 0x9737, 0x9736, + 0x9767, 0x97BE, 0x97BD, 0x97E2, 0x9868, 0x9866, 0x98C8, 0x98CA, + 0x98C7, 0x98DC, 0x994F, 0x99A9, 0x9A3C, 0x9A3B, 0x9ACE, 0x9B14, + 0x9B53, 0x9C2E, 0x81D0, 0x825F, 0x825E, 0x85B4, 0x85C6, 0x85C0, + 0x85C3, 0x85C2, 0x85B3, 0x85B5, 0x85BD, 0x85C7, 0x85C4, 0x85BF, + 0x85CB, 0x85CE, 0x85C8, 0x85C5, 0x85B1, 0x85B6, 0x85D2, 0x8624, + 0x85B8, 0x85B7, 0x85BE, 0x8669, 0x87E7, 0x87E6, 0x87E2, 0x87DB, + 0x87EB, 0x87EA, 0x87E5, 0x87DF, 0x87F3, 0x87E4, 0x87D4, 0x87DC, + 0x87D3, 0x87ED, 0x87D8, 0x87E3, 0x87A4, 0x87D7, 0x87D9, 0x8801, + 0x87F4, 0x87E8, 0x87DD, 0x8953, 0x894B, 0x894F, 0x894C, 0x8946, + 0x8950, 0x8951, 0x8949, 0x8B2A, 0x8B27, 0x8B23, 0x8B33, 0x8B30, +plane 84 +at 0x00 + 0x8B35, 0x8B47, 0x8B2F, 0x8B3C, 0x8B3E, 0x8B31, 0x8B25, 0x8B37, + 0x8B26, 0x8B36, 0x8B2E, 0x8B24, 0x8B3B, 0x8B3D, 0x8B3A, 0x8C42, + 0x8C75, 0x8C99, 0x8C98, 0x8C97, 0x8CFE, 0x8D04, 0x8D02, 0x8D00, + 0x8E5C, 0x8E62, 0x8E60, 0x8E57, 0x8E56, 0x8E5E, 0x8E65, 0x8E67, + 0x8E5B, 0x8E5A, 0x8E61, 0x8E5D, 0x8E69, 0x8E54, 0x8F46, 0x8F47, + 0x8F48, 0x8F4B, 0x9128, 0x913A, 0x913B, 0x913E, 0x91A8, 0x91A5, + 0x91A7, 0x91AF, 0x91AA, 0x93B5, 0x938C, 0x9392, 0x93B7, 0x939B, + 0x939D, 0x9389, 0x93A7, 0x938E, 0x93AA, 0x939E, 0x93A6, 0x9395, + 0x9388, 0x9399, 0x939F, 0x938D, 0x93B1, 0x9391, 0x93B2, 0x93A4, + 0x93A8, 0x93B4, 0x93A3, 0x93A5, 0x95D2, 0x95D3, 0x95D1, 0x96B3, + 0x96D7, 0x96DA, 0x5DC2, 0x96DF, 0x96D8, 0x96DD, 0x9723, 0x9722, + 0x9725, 0x97AC, 0x97AE, 0x97A8, 0x97AB, 0x97A4, 0x97AA, 0x9C1F, + 0x9DB0, 0x9DBD, 0x9DAE, 0x9DC4, 0x9E7B, 0x9E9E, 0x9F05, 0x9F69, + 0x9FA1, 0x56C7, 0x571D, 0x5B4A, 0x5DD3, 0x5F72, 0x6202, 0x6235, + 0x6527, 0x651E, 0x651F, 0x6B07, 0x6B06, 0x7054, 0x721C, 0x7220, + 0x7AF8, 0x7C5D, 0x7C58, 0x7E92, 0x7F4E, 0x8827, 0x8B81, 0x8B83, + 0x97A2, 0x97A5, 0x97D7, 0x97D9, 0x97D6, 0x97D8, 0x97FA, 0x9850, + 0x9851, 0x9852, 0x98B8, 0x9941, 0x993C, 0x993A, 0x9A0F, 0x9A0B, + 0x9A09, 0x9A0D, 0x9A04, 0x9A11, 0x9A0A, 0x9A05, 0x9A07, 0x9A06, + 0x9AC0, 0x9ADC, 0x9B08, 0x9B04, 0x9B05, 0x9B29, 0x9B35, 0x9B4A, + 0x9B4C, 0x9B4B, 0x9BC7, 0x9BC6, 0x9BC3, 0x9BBF, 0x9BC1, 0x9BB5, + 0x9BB8, 0x9BD3, 0x9BB6, 0x9BC4, 0x9BB9, 0x9BBD, 0x9D5C, 0x9D53, + 0x9D4F, 0x9D4A, 0x9D5B, 0x9D4B, 0x9D59, 0x9D56, 0x9D4C, 0x9D57, + 0x9D52, 0x9D54, 0x9D5F, 0x9D58, 0x9D5A, 0x9E8E, 0x9E8C, 0x9EDF, + 0x9F01, 0x9F00, 0x9F16, 0x9F25, 0x9F2B, 0x9F2A, 0x9F29, 0x9F28, + 0x9F4C, 0x9F55, 0x5134, 0x5135, 0x5296, 0x52F7, 0x53B4, 0x56AB, + 0x56AD, 0x56A6, 0x56A7, 0x56AA, 0x56AC, 0x58DA, 0x58DD, 0x58DB, + 0x5912, 0x5B3D, 0x5B3E, 0x5B3F, 0x5DC3, 0x5E70, 0x5FBF, 0x61FB, + 0x6507, 0x6510, 0x650D, 0x6509, 0x650C, 0x650E, 0x6584, 0x65DE, + 0x65DD, 0x66DE, 0x6AE7, 0x6AE0, 0x6ACC, 0x6AD1, 0x6AD9, 0x6ACB, + 0x6ADF, 0x6ADC, 0x6AD0, 0x6AEB, 0x6ACF, 0x6ACD, 0x6ADE, 0x6B60, + 0x6BB0, 0x6C0C, 0x7019, 0x7027, 0x7020, 0x7016, 0x702B, 0x7021, +plane 85 +at 0x00 + 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701C, 0x702A, 0x720C, + 0x720A, 0x7207, 0x7202, 0x7205, 0x72A5, 0x72A6, 0x72A4, 0x72A3, + 0x72A1, 0x74CB, 0x74C5, 0x74B7, 0x74C3, 0x7516, 0x7660, 0x77C9, + 0x77CA, 0x77C4, 0x77F1, 0x791D, 0x791B, 0x8C44, 0x9442, 0x944D, + 0x9454, 0x944E, 0x9443, 0x973C, 0x9740, 0x97C0, 0x995A, 0x9A51, + 0x9ADD, 0x9C38, 0x9C45, 0x9C3A, 0x9C35, 0x9EF1, 0x9F93, 0x529A, + 0x8641, 0x5DD7, 0x6528, 0x7053, 0x7059, 0x7221, 0x766F, 0x7937, + 0x79B5, 0x7C62, 0x7C5E, 0x7CF5, 0x863D, 0x882D, 0x7921, 0x791C, + 0x7917, 0x791E, 0x79B0, 0x7A67, 0x7A68, 0x7C33, 0x7C3C, 0x7C39, + 0x7C2C, 0x7C3B, 0x7CEC, 0x7CEA, 0x7E76, 0x7E75, 0x7E78, 0x7E70, + 0x7E77, 0x7E6F, 0x7E7A, 0x7E72, 0x7E74, 0x7E68, 0x7F4B, 0x7F4A, + 0x7F83, 0x7F86, 0x7FB7, 0x7FFD, 0x7FFE, 0x8078, 0x81D7, 0x81D5, + 0x8264, 0x8261, 0x8263, 0x85EB, 0x85F1, 0x85ED, 0x85D9, 0x85E1, + 0x85E8, 0x85DA, 0x85D7, 0x85EC, 0x85F2, 0x85F8, 0x85D8, 0x85DF, + 0x85E3, 0x85DC, 0x85D1, 0x85F0, 0x85E6, 0x85EF, 0x85DE, 0x85E2, + 0x8800, 0x87FA, 0x8803, 0x87F6, 0x87F7, 0x8809, 0x880C, 0x880B, + 0x8806, 0x87FC, 0x8808, 0x87FF, 0x880A, 0x8802, 0x8962, 0x895A, + 0x895B, 0x8957, 0x8961, 0x895C, 0x8958, 0x895D, 0x8959, 0x8988, + 0x89B7, 0x89B6, 0x89F6, 0x8B50, 0x8B48, 0x8B4A, 0x8B40, 0x8B53, + 0x8B56, 0x8B54, 0x8B4B, 0x8B55, 0x8B51, 0x8B42, 0x8B52, 0x8B57, + 0x8C43, 0x8C77, 0x8C76, 0x8C9A, 0x8D06, 0x8D07, 0x8D09, 0x8DAC, + 0x8DAA, 0x8DAD, 0x8DAB, 0x8E6D, 0x8E78, 0x8E73, 0x8E6A, 0x8E6F, + 0x8E7B, 0x8EC2, 0x8F52, 0x8F51, 0x8F4F, 0x8F50, 0x8F53, 0x8FB4, + 0x9140, 0x913F, 0x91B0, 0x91AD, 0x93DE, 0x93C7, 0x93CF, 0x93C2, + 0x93DA, 0x93D0, 0x93F9, 0x93EC, 0x93CC, 0x93D9, 0x93A9, 0x93E6, + 0x93CA, 0x93D4, 0x93EE, 0x93E3, 0x93D5, 0x93C4, 0x93CE, 0x93C0, + 0x93D2, 0x93E7, 0x957D, 0x95DA, 0x95DB, 0x96E1, 0x9729, 0x972B, + 0x972C, 0x9728, 0x9726, 0x8989, 0x8B8D, 0x8B87, 0x8B90, 0x8D1A, + 0x8E99, 0x945F, 0x9456, 0x9461, 0x945B, 0x945A, 0x945C, 0x9465, + 0x9741, 0x986E, 0x986C, 0x986D, 0x99AA, 0x9A5C, 0x9A58, 0x9ADE, + 0x9C4F, 0x9C51, 0x9C53, 0x9DFC, 0x9F39, 0x513E, 0x56D2, 0x5B4F, + 0x6B14, 0x7A72, 0x7A73, 0x8B91, 0x97B3, 0x97B7, 0x97B6, 0x97DD, +plane 86 +at 0x00 + 0x97DE, 0x97DF, 0x985C, 0x9859, 0x985D, 0x9857, 0x98BF, 0x98BD, + 0x98BB, 0x98BE, 0x9948, 0x9947, 0x9943, 0x99A6, 0x99A7, 0x9A1A, + 0x9A15, 0x9A25, 0x9A1D, 0x9A24, 0x9A1B, 0x9A22, 0x9A20, 0x9A27, + 0x9A23, 0x9A1E, 0x9A1C, 0x9A14, 0x9AC2, 0x9B0B, 0x9B0A, 0x9B0E, + 0x9B0C, 0x9B37, 0x9BEA, 0x9BEB, 0x9BE0, 0x9BDE, 0x9BE4, 0x9BE6, + 0x9BE2, 0x9BF0, 0x9BD4, 0x9BD7, 0x9BEC, 0x9BDC, 0x9BD9, 0x9BE5, + 0x9BD5, 0x9BE1, 0x9BDA, 0x9D77, 0x9D81, 0x9D8A, 0x9D84, 0x9D88, + 0x9D71, 0x9D80, 0x9D78, 0x9D86, 0x9D8B, 0x9D8C, 0x9D7D, 0x9D6B, + 0x9D74, 0x9D75, 0x9D70, 0x9D69, 0x9D85, 0x9D73, 0x9D7B, 0x9D82, + 0x9D6F, 0x9D79, 0x9D7F, 0x9D87, 0x9D68, 0x9E94, 0x9E91, 0x9EC0, + 0x9EFC, 0x9F2D, 0x9F40, 0x9F41, 0x9F4D, 0x9F56, 0x9F57, 0x9F58, + 0x5337, 0x56B2, 0x56B5, 0x56B3, 0x58E3, 0x5B45, 0x5DC6, 0x5DC7, + 0x5EEE, 0x5EEF, 0x5FC0, 0x5FC1, 0x61F9, 0x6517, 0x6516, 0x6515, + 0x6513, 0x65DF, 0x66E8, 0x66E3, 0x66E4, 0x6AF3, 0x6AF0, 0x6AEA, + 0x6AE8, 0x6AF9, 0x6AF1, 0x6AEE, 0x6AEF, 0x703C, 0x7035, 0x702F, + 0x7037, 0x7034, 0x7031, 0x7042, 0x7038, 0x703F, 0x703A, 0x7039, + 0x7040, 0x703B, 0x7033, 0x7041, 0x7213, 0x7214, 0x72A8, 0x737D, + 0x737C, 0x74BA, 0x76AB, 0x76AA, 0x76BE, 0x76ED, 0x77CC, 0x77CE, + 0x77CF, 0x77CD, 0x77F2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, + 0x7929, 0x91BF, 0x946C, 0x96E6, 0x9745, 0x97C8, 0x97E4, 0x995D, + 0x9B21, 0x9B2C, 0x9B57, 0x9C5D, 0x9C61, 0x9C65, 0x9E08, 0x9F45, + 0x6205, 0x66EF, 0x6B1B, 0x6B1D, 0x7225, 0x7224, 0x7C6D, 0x8642, + 0x8649, 0x8978, 0x898A, 0x8B97, 0x8C9B, 0x8D1C, 0x8EA2, 0x9C6C, + 0x9C6F, 0x9E0E, 0x79B2, 0x7A6E, 0x7A6C, 0x7A6D, 0x7AF7, 0x7C49, + 0x7C48, 0x7C4A, 0x7C47, 0x7C45, 0x7CEE, 0x7E7B, 0x7E7E, 0x7E81, + 0x7E80, 0x7FBA, 0x7FFF, 0x8079, 0x81DB, 0x81D9, 0x820B, 0x8268, + 0x8269, 0x8622, 0x85FF, 0x8601, 0x85FE, 0x861B, 0x8600, 0x85F6, + 0x8604, 0x8609, 0x8605, 0x860C, 0x85FD, 0x8819, 0x8810, 0x8811, + 0x8817, 0x8813, 0x8816, 0x8963, 0x8966, 0x89B9, 0x89F7, 0x8B60, + 0x8B6A, 0x8B5D, 0x8B68, 0x8B63, 0x8B65, 0x8B67, 0x8B6D, 0x8DAE, + 0x8E86, 0x8E88, 0x8E84, 0x8F59, 0x8F56, 0x8F57, 0x8F55, 0x8F58, + 0x8F5A, 0x908D, 0x9143, 0x9141, 0x91B7, 0x91B5, 0x91B2, 0x91B3, +plane 87 +at 0x00 + 0x940B, 0x9413, 0x93FB, 0x9420, 0x940F, 0x9414, 0x93FE, 0x9415, + 0x9410, 0x9428, 0x9419, 0x940D, 0x93F5, 0x9400, 0x93F7, 0x9407, + 0x940E, 0x9416, 0x9412, 0x93FA, 0x9409, 0x93F8, 0x940A, 0x93FF, + 0x93FC, 0x940C, 0x93F6, 0x9411, 0x9406, 0x95DE, 0x95E0, 0x95DF, + 0x972E, 0x972F, 0x97B9, 0x97BB, 0x97FD, 0x97FE, 0x9860, 0x9862, + 0x9863, 0x985F, 0x98C1, 0x98C2, 0x9950, 0x994E, 0x9959, 0x994C, + 0x994B, 0x9953, 0x9A32, 0x9A34, 0x9A31, 0x9A2C, 0x9A2A, 0x9A36, + 0x9A29, 0x9A2E, 0x9A38, 0x9A2D, 0x9AC7, 0x9ACA, 0x9AC6, 0x9B10, + 0x9B12, 0x9B11, 0x9C0B, 0x9C08, 0x9BF7, 0x9C05, 0x9C12, 0x9BF8, + 0x9C40, 0x9C07, 0x9C0E, 0x9C06, 0x9C17, 0x9C14, 0x9C09, 0x9D9F, + 0x9D99, 0x9DA4, 0x9D9D, 0x9D92, 0x9D98, 0x9D90, 0x9D9B, 0x9F08, + 0x9F1D, 0x9FA3, 0x5F60, 0x6B1C, 0x7CF3, 0x8B9B, 0x8EA7, 0x91C4, + 0x947A, 0x9A61, 0x9A63, 0x9AD7, 0x9C76, 0x9FA5, 0x7067, 0x72AB, + 0x864A, 0x897D, 0x8B9D, 0x8C53, 0x8F65, 0x947B, 0x98CD, 0x98DD, + 0x9B30, 0x9E16, 0x96E7, 0x9E18, 0x9EA2, 0x9F7C, 0x7E9E, 0x9484, + 0x9DA0, 0x9D94, 0x9D9C, 0x9DAA, 0x9D97, 0x9DA1, 0x9D9A, 0x9DA2, + 0x9DA8, 0x9D9E, 0x9DA3, 0x9DBF, 0x9DA9, 0x9D96, 0x9DA6, 0x9DA7, + 0x9E99, 0x9E9B, 0x9E9A, 0x9EE5, 0x9EE4, 0x9EE7, 0x9EE6, 0x9F30, + 0x9F2E, 0x9F5B, 0x9F60, 0x9F5E, 0x9F5D, 0x9F59, 0x9F91, 0x513A, + 0x5139, 0x5298, 0x5297, 0x56C3, 0x56BD, 0x56BE, 0x5B48, 0x5B47, + 0x5DCB, 0x5DCF, 0x5EF1, 0x61FD, 0x651B, 0x6B02, 0x6AFC, 0x6B03, + 0x6AF8, 0x6B00, 0x7043, 0x7044, 0x704A, 0x7048, 0x7049, 0x7045, + 0x7046, 0x721D, 0x721A, 0x7219, 0x737E, 0x7517, 0x766A, 0x77D0, + 0x792D, 0x7931, 0x792F, 0x7C54, 0x7C53, 0x7CF2, 0x7E8A, 0x7E87, + 0x7E88, 0x7E8B, 0x7E86, 0x7E8D, 0x7F4D, 0x7FBB, 0x8030, 0x81DD, + 0x8618, 0x862A, 0x8626, 0x861F, 0x8623, 0x861C, 0x8619, 0x8627, + 0x862E, 0x8621, 0x8620, 0x8629, 0x861E, 0x8625, 0x8829, 0x881D, + 0x881B, 0x8820, 0x8824, 0x881C, 0x882B, 0x884A, 0x896D, 0x8969, + 0x896E, 0x896B, 0x89FA, 0x8B79, 0x8B78, 0x8B45, 0x8B7A, 0x8B7B, + 0x8D10, 0x8D14, 0x8DAF, 0x8E8E, 0x8E8C, 0x8F5E, 0x8F5B, 0x8F5D, + 0x9146, 0x9144, 0x9145, 0x91B9, 0x943F, 0x943B, 0x9436, 0x9429, + 0x943D, 0x943C, 0x9430, 0x9439, 0x942A, 0x9437, 0x942C, 0x9440, +plane 88 +at 0x00 + 0x9431, 0x95E5, 0x95E4, 0x95E3, 0x9735, 0x973A, 0x97BF, 0x97E1, + 0x9864, 0x98C9, 0x98C6, 0x98C0, 0x9958, 0x9956, 0x9A39, 0x9A3D, + 0x9A46, 0x9A44, 0x9A42, 0x9A41, 0x9A3A, 0x9E1C, 0x7C71, 0x97CA, + 0x9EA3, 0x9C7B, 0x9F97, 0x9750, 0x4E40, 0x4E41, 0x4E5A, 0x4E02, + 0x4E29, 0x5202, 0x5DDC, 0x5342, 0x536A, 0x5B52, 0x5FC4, 0x624C, + 0x72AD, 0x4E12, 0x4E2F, 0x4E96, 0x4ED0, 0x5142, 0x5183, 0x5383, + 0x53B8, 0x5928, 0x5C23, 0x5E01, 0x5F00, 0x706C, 0x9A3F, 0x9ACD, + 0x9B15, 0x9B17, 0x9B18, 0x9B16, 0x9B3A, 0x9B52, 0x9C2B, 0x9C1D, + 0x9C1C, 0x9C2C, 0x9C23, 0x9C28, 0x9C29, 0x9C24, 0x9C21, 0x9DB7, + 0x9DB6, 0x9DBC, 0x9DC1, 0x9DC7, 0x9DCA, 0x9DCF, 0x9DBE, 0x9DC5, + 0x9DC3, 0x9DBB, 0x9DB5, 0x9DCE, 0x9DB9, 0x9DBA, 0x9DAC, 0x9DC8, + 0x9DB1, 0x9DAD, 0x9DCC, 0x9DB3, 0x9DCD, 0x9DB2, 0x9E7A, 0x9E9C, + 0x9EEB, 0x9EEE, 0x9EED, 0x9F1B, 0x9F18, 0x9F1A, 0x9F31, 0x9F4E, + 0x9F65, 0x9F64, 0x9F92, 0x4EB9, 0x56C6, 0x56C5, 0x56CB, 0x5971, + 0x5B4B, 0x5B4C, 0x5DD5, 0x5DD1, 0x5EF2, 0x6521, 0x6520, 0x6526, + 0x6522, 0x6B0B, 0x6B08, 0x6B09, 0x6C0D, 0x7055, 0x7056, 0x7057, + 0x7052, 0x721E, 0x721F, 0x72A9, 0x737F, 0x74D8, 0x74D5, 0x74D9, + 0x74D7, 0x766D, 0x76AD, 0x7935, 0x79B4, 0x7A70, 0x7A71, 0x7C57, + 0x7C5C, 0x7C59, 0x7C5B, 0x7C5A, 0x7CF4, 0x7CF1, 0x7E91, 0x7F4F, + 0x7F87, 0x81DE, 0x826B, 0x8634, 0x8635, 0x8633, 0x862C, 0x8632, + 0x8636, 0x882C, 0x8828, 0x8826, 0x882A, 0x8825, 0x8971, 0x89BF, + 0x89BE, 0x89FB, 0x8B7E, 0x8B84, 0x8B82, 0x8B86, 0x8B85, 0x8B7F, + 0x8D15, 0x8E95, 0x8E94, 0x8E9A, 0x8E92, 0x8E90, 0x8E96, 0x8E97, + 0x8F60, 0x8F62, 0x9147, 0x944C, 0x9450, 0x944A, 0x944B, 0x944F, + 0x9447, 0x9445, 0x9448, 0x9449, 0x9446, 0x973F, 0x97E3, 0x986A, + 0x9869, 0x98CB, 0x9954, 0x995B, 0x9A4E, 0x9A53, 0x9A54, 0x9A4C, + 0x9A4F, 0x9A48, 0x9A4A, 0x722B, 0x5188, 0x8279, 0x8FB6, 0x4E17, + 0x4EE2, 0x4EDB, 0x51AD, 0x51F7, 0x531B, 0x5388, 0x5387, 0x53CF, + 0x53FD, 0x53E7, 0x56DC, 0x56D9, 0x5725, 0x5727, 0x5933, 0x5C13, + 0x5C75, 0x66F1, 0x7F52, 0x4E51, 0x4E6A, 0x4F0C, 0x4EFE, 0x4F1B, + 0x5173, 0x518E, 0x52A5, 0x52A7, 0x9A49, 0x9A52, 0x9A50, 0x9AD0, + 0x9B19, 0x9B2B, 0x9B3B, 0x9B56, 0x9B55, 0x9C46, 0x9C48, 0x9C3F, +plane 89 +at 0x00 + 0x9C44, 0x9C39, 0x9C33, 0x9C41, 0x9C3C, 0x9C37, 0x9C34, 0x9C32, + 0x9C3D, 0x9C36, 0x9DDB, 0x9DD2, 0x9DDE, 0x9DDA, 0x9DCB, 0x9DD0, + 0x9DDC, 0x9DD1, 0x9DDF, 0x9DE9, 0x9DD9, 0x9DD8, 0x9DD6, 0x9DF5, + 0x9DD5, 0x9DDD, 0x9EB6, 0x9EF0, 0x9F35, 0x9F33, 0x9F32, 0x9F42, + 0x9F6B, 0x9F95, 0x9FA2, 0x513D, 0x5299, 0x58E8, 0x58E7, 0x5972, + 0x5B4D, 0x5DD8, 0x882F, 0x5F4F, 0x6201, 0x6203, 0x6204, 0x6529, + 0x6525, 0x6596, 0x66EB, 0x6B11, 0x6B12, 0x6B0F, 0x6BCA, 0x705B, + 0x705A, 0x7222, 0x7382, 0x7381, 0x7383, 0x7670, 0x77D4, 0x7C67, + 0x7C66, 0x7E95, 0x826C, 0x863A, 0x8640, 0x8639, 0x863C, 0x8631, + 0x863B, 0x863E, 0x8830, 0x8832, 0x882E, 0x8833, 0x8976, 0x8974, + 0x8973, 0x89FE, 0x8B8C, 0x8B8E, 0x8B8B, 0x8B88, 0x8C45, 0x8D19, + 0x8E98, 0x8F64, 0x8F63, 0x91BC, 0x9462, 0x9455, 0x945D, 0x9457, + 0x945E, 0x97C4, 0x97C5, 0x9800, 0x9A56, 0x9A59, 0x9B1E, 0x9B1F, + 0x9B20, 0x9C52, 0x9C58, 0x9C50, 0x9C4A, 0x9C4D, 0x9C4B, 0x9C55, + 0x9C59, 0x9C4C, 0x9C4E, 0x9DFB, 0x9DF7, 0x9DEF, 0x9DE3, 0x9DEB, + 0x9DF8, 0x9DE4, 0x9DF6, 0x9DE1, 0x9DEE, 0x9DE6, 0x9DF2, 0x9DF0, + 0x9DE2, 0x9DEC, 0x9DF4, 0x9DF3, 0x9DE8, 0x9DED, 0x9EC2, 0x9ED0, + 0x9EF2, 0x9EF3, 0x9F06, 0x9F1C, 0x9F38, 0x9F37, 0x9F36, 0x9F43, + 0x9F4F, 0x52A4, 0x53BD, 0x5402, 0x572B, 0x591B, 0x5935, 0x5C17, + 0x5C70, 0x5C7D, 0x5DE9, 0x5F19, 0x5F1C, 0x5F75, 0x5FC8, 0x6C12, + 0x72B3, 0x7390, 0x7536, 0x8281, 0x8FB8, 0x4E23, 0x4F2E, 0x514F, + 0x51BA, 0x5222, 0x52AF, 0x52B0, 0x52B1, 0x5364, 0x53D3, 0x593F, + 0x598B, 0x5991, 0x9F71, 0x9F70, 0x9F6E, 0x9F6F, 0x56D3, 0x56CD, + 0x5B4E, 0x5C6D, 0x652D, 0x66ED, 0x66EE, 0x6B13, 0x705F, 0x7061, + 0x705D, 0x7060, 0x7223, 0x74DB, 0x74E5, 0x77D5, 0x7938, 0x79B7, + 0x79B6, 0x7C6A, 0x7E97, 0x7F89, 0x826D, 0x8643, 0x8838, 0x8837, + 0x8835, 0x884B, 0x8B94, 0x8B95, 0x8E9E, 0x8E9F, 0x8EA0, 0x8E9D, + 0x91BE, 0x91BD, 0x91C2, 0x946B, 0x9468, 0x9469, 0x96E5, 0x9746, + 0x9743, 0x9747, 0x97C7, 0x97E5, 0x9A5E, 0x9AD5, 0x9B59, 0x9C63, + 0x9C67, 0x9C66, 0x9C62, 0x9C5E, 0x9C60, 0x9E02, 0x9DFE, 0x9E07, + 0x9E03, 0x9E06, 0x9E05, 0x9E00, 0x9E01, 0x9E09, 0x9DFF, 0x9DFD, + 0x9E04, 0x9EA0, 0x9F1E, 0x9F46, 0x9F74, 0x9F75, 0x9F76, 0x56D4, +plane 90 +at 0x00 + 0x652E, 0x65B8, 0x6B18, 0x6B19, 0x6B17, 0x6B1A, 0x7062, 0x7226, + 0x72AA, 0x77D8, 0x77D9, 0x7939, 0x7C69, 0x7C6B, 0x7CF6, 0x7E9A, + 0x7E98, 0x7E9B, 0x7E99, 0x81E0, 0x81E1, 0x8646, 0x8647, 0x8648, + 0x8979, 0x897A, 0x897C, 0x897B, 0x89FF, 0x8B98, 0x8B99, 0x8EA5, + 0x8EA4, 0x8EA3, 0x946E, 0x946D, 0x946F, 0x9471, 0x9473, 0x9749, + 0x9872, 0x995F, 0x9C68, 0x9C6E, 0x9C6D, 0x9E0B, 0x9E0D, 0x9E10, + 0x9E0F, 0x9E12, 0x9E11, 0x9EA1, 0x9EF5, 0x9F09, 0x9F47, 0x9F78, + 0x9F7B, 0x9F7A, 0x9F79, 0x571E, 0x7066, 0x7C6F, 0x883C, 0x8DB2, + 0x8EA6, 0x91C3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9A60, 0x9C74, + 0x9C73, 0x9C71, 0x9C75, 0x9E14, 0x9E13, 0x9EF6, 0x9F0A, 0x5995, + 0x5B8A, 0x5C87, 0x5E0D, 0x5E8E, 0x5F7A, 0x6290, 0x629A, 0x653C, + 0x653A, 0x6598, 0x6765, 0x79C2, 0x809E, 0x81EB, 0x8289, 0x8296, + 0x8287, 0x8FC0, 0x8FC3, 0x9578, 0x9625, 0x4E75, 0x4E74, 0x4F99, + 0x4F71, 0x5153, 0x51BF, 0x51C0, 0x51EE, 0x523D, 0x52BD, 0x530C, + 0x9FA4, 0x7068, 0x7065, 0x7CF7, 0x866A, 0x883E, 0x883D, 0x883F, + 0x8B9E, 0x8C9C, 0x8EA9, 0x8EC9, 0x974B, 0x9873, 0x9874, 0x98CC, + 0x9961, 0x99AB, 0x9A64, 0x9A66, 0x9A67, 0x9B24, 0x9E15, 0x9E17, + 0x9F48, 0x6207, 0x6B1E, 0x7227, 0x864C, 0x8EA8, 0x9482, 0x9480, + 0x9481, 0x9A69, 0x9A68, 0x9B2E, 0x9E19, 0x7229, 0x864B, 0x8B9F, + 0x9483, 0x9C79, 0x9EB7, 0x7675, 0x9A6B, 0x9C7A, 0x9E1D, 0x7069, + 0x706A, 0x9EA4, 0x9F7E, 0x9F49, 0x9F98, 0x7881, 0x92B9, 0x88CF, + 0x58BB, 0x6052, 0x7CA7, 0x5AFA, 0x2554, 0x2566, 0x2557, 0x2560, + 0x256C, 0x2563, 0x255A, 0x2569, 0x255D, 0x2552, 0x2564, 0x2555, + 0x255E, 0x256A, 0x2561, 0x2558, 0x2567, 0x255B, 0x2553, 0x2565, + 0x2556, 0x255F, 0x256B, 0x2562, 0x2559, 0x2568, 0x255C, 0x2551, + 0x2550, 0x2554, 0x2557, 0x255A, 0x255D, 0x2588, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 91 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0x7F37, 0x53C0, 0x546E, + 0x5483, 0x545E, 0x545D, 0x577E, 0x5779, 0x577A, 0x576C, 0x5787, + 0x591D, 0x5946, 0x5943, 0x5B61, 0x5B66, 0x5B90, 0x5C29, 0x5CB2, + 0x5CC0, 0x601F, 0x5FE2, 0x6616, 0x65F9, 0x6788, 0x679B, 0x676E, + 0x679E, 0x6B24, 0x6B7D, 0x6CE6, 0x6CCB, 0x6CB5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x7097, 0x709B, 0x726B, 0x72D5, 0x7543, + 0x759C, 0x77E4, 0x7ACE, 0x8013, 0x80B7, 0x80B9, 0x81E4, 0x81FD, + 0x820F, 0x82BF, 0x82CA, 0x82C1, 0x8FD0, 0x90AE, 0x9638, 0x4FBC, + 0x4FE9, 0x4FBD, 0x4FE2, 0x5158, 0x52C6, 0x52C8, 0x5328, 0x5329, + 0x57B4, 0x57A9, 0x5B68, 0x5F2B, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 92 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x5F8D, 0x6018, 0x6057, 0x6048, 0x6038, 0x6071, 0x6312, + 0x630A, 0x6323, 0x662A, 0x67E0, 0x67BE, 0x6B29, 0x6D43, 0x70A6, + 0x70C0, 0x722F, 0x7271, 0x74EA, 0x7520, 0x75A9, 0x7685, 0x7706, + 0x76F6, 0x7700, 0x7702, 0x8009, 0x82DA, 0x830A, 0x9655, 0x9652, + 0x4E35, 0x5034, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 93 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0x5001, + 0x500A, 0x5258, 0x532B, 0x54EC, 0x5515, 0x54FE, 0x54E3, 0x5516, + 0x57D3, 0x5959, 0x5A27, 0x5A28, 0x5A10, 0x5A0E, 0x5BAF, 0x5BBA, + 0x5BB1, 0x5CFC, 0x5CF2, 0x5CFE, 0x5DF8, 0x5F2C, 0x6082, 0x6091, + 0x608F, 0x6547, 0x654C, 0x658A, 0x67E1, 0x684A, 0x683F, 0x67BD, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 94 +at 0x00 + 0, 0, 0, 0, 0, 0x70C9, 0x73BA, 0x75C6, + 0x75B7, 0x768C, 0x768D, 0x7717, 0x771C, 0x7714, 0x7B0C, 0x7D23, + 0x7F98, 0x7F90, 0x803A, 0x8226, 0x832E, 0x8355, 0x831A, 0x833D, + 0x8330, 0x8651, 0x8688, 0x898E, 0x898D, 0x8A09, 0x8A14, 0x9007, + 0x9579, 0x9584, 0x9657, 0x96BA, 0x5067, 0x5318, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/cubig5.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/cubig5.map new file mode 100755 index 00000000..5ff26d43 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/cubig5.map @@ -0,0 +1,1861 @@ +# +# Creating compact CJK type1 fonts from Unicode +# Chinese Big5 encoding fonts. +# +plane 01 +at 0x00 + 0x3000, 0xFF0C, 0x3001, 0x3002, 0xFF0E, 0x2027, 0xFF1B, 0xFF1A, + 0xFF1F, 0xFF01, 0xFE30, 0x2026, 0x2025, 0xFE50, 0xFE51, 0xFE52, + 0x00B7, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFF5C, 0x2013, 0xFE31, + 0x2014, 0xFE33, 0x2574, 0xFE34, 0xFE4F, 0xFF08, 0xFF09, 0xFE35, + 0xFE36, 0xFF5B, 0xFF5D, 0xFE37, 0xFE38, 0x3014, 0x3015, 0xFE39, + 0xFE3A, 0x3010, 0x3011, 0xFE3B, 0xFE3C, 0x300A, 0x300B, 0xFE3D, + 0xFE3E, 0x3008, 0x3009, 0xFE3F, 0xFE40, 0x300C, 0x300D, 0xFE41, + 0xFE42, 0x300E, 0x300F, 0xFE43, 0xFE44, 0xFE59, 0xFE5A, 0xFE5B, + 0xFE5C, 0xFE5D, 0xFE5E, 0x2018, 0x2019, 0x201C, 0x201D, 0x301D, + 0x301E, 0x2035, 0x2032, 0xFF03, 0xFF06, 0xFF0A, 0x203B, 0x00A7, + 0x3003, 0x25CB, 0x25CF, 0x25B3, 0x25B2, 0x25CE, 0x2606, 0x2605, + 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25BD, 0x25BC, 0x32A3, 0x2105, + 0x00AF, 0xFFE3, 0xFF3F, 0x02CD, 0xFE49, 0xFE4A, 0xFE4D, 0xFE4E, + 0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, 0xFE61, 0xFF0B, 0xFF0D, 0x00D7, + 0x00F7, 0x00B1, 0x221A, 0xFF1C, 0xFF1E, 0xFF1D, 0x2266, 0x2267, + 0x2260, 0x221E, 0x2252, 0x2261, 0xFE62, 0xFE63, 0xFE64, 0xFE65, + 0xFE66, 0xFF5E, 0x2229, 0x222A, 0x22A5, 0x2220, 0x221F, 0x22BF, + 0x33D2, 0x33D1, 0x222B, 0x222E, 0x2235, 0x2234, 0x2640, 0x2642, + 0x2295, 0x2299, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, 0x2197, + 0x2199, 0x2198, 0x2225, 0x2223, 0xFF0F, 0xFF3C, 0x2215, 0xFE68, + 0xFF04, 0xFFE5, 0x3012, 0xFFE0, 0xFFE1, 0xFF05, 0xFF20, 0x2103, + 0x2109, 0xFE69, 0xFE6A, 0xFE6B, 0x33D5, 0x339C, 0x339D, 0x339E, + 0x33CE, 0x33A1, 0x338E, 0x338F, 0x33C4, 0x00B0, 0x5159, 0x515B, + 0x515E, 0x515D, 0x5161, 0x5163, 0x55E7, 0x74E9, 0x7CCE, 0x2581, + 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x258F, + 0x258E, 0x258D, 0x258C, 0x258B, 0x258A, 0x2589, 0x253C, 0x2534, + 0x252C, 0x2524, 0x251C, 0x2594, 0x2500, 0x2502, 0x2595, 0x250C, + 0x2510, 0x2514, 0x2518, 0x256D, 0x256E, 0x2570, 0x256F, 0x2550, + 0x255E, 0x256A, 0x2561, 0x25E2, 0x25E3, 0x25E5, 0x25E4, 0x2571, + 0x2572, 0x2573, 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, + 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0x2160, 0x2161, 0x2162, 0x2163, + 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x3021, 0x3022, +plane 02 +at 0x00 + 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0x5341, + 0x5344, 0x5345, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, + 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, + 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, + 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF41, 0xFF42, 0xFF43, 0xFF44, + 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, + 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, + 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0x0391, 0x0392, + 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, + 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, + 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, + 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, + 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, + 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x3105, 0x3106, + 0x3107, 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, + 0x310F, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, + 0x3117, 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, + 0x311F, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, + 0x3127, 0x3128, 0x3129, 0x02D9, 0x02C9, 0x02CA, 0x02C7, 0x02CB, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x20AC, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0x4E00, + 0x4E59, 0x4E01, 0x4E03, 0x4E43, 0x4E5D, 0x4E86, 0x4E8C, 0x4EBA, + 0x513F, 0x5165, 0x516B, 0x51E0, 0x5200, 0x5201, 0x529B, 0x5315, + 0x5341, 0x535C, 0x53C8, 0x4E09, 0x4E0B, 0x4E08, 0x4E0A, 0x4E2B, + 0x4E38, 0x51E1, 0x4E45, 0x4E48, 0x4E5F, 0x4E5E, 0x4E8E, 0x4EA1, + 0x5140, 0x5203, 0x52FA, 0x5343, 0x53C9, 0x53E3, 0x571F, 0x58EB, +plane 03 +at 0x00 + 0x5915, 0x5927, 0x5973, 0x5B50, 0x5B51, 0x5B53, 0x5BF8, 0x5C0F, + 0x5C22, 0x5C38, 0x5C71, 0x5DDD, 0x5DE5, 0x5DF1, 0x5DF2, 0x5DF3, + 0x5DFE, 0x5E72, 0x5EFE, 0x5F0B, 0x5F13, 0x624D, 0x4E11, 0x4E10, + 0x4E0D, 0x4E2D, 0x4E30, 0x4E39, 0x4E4B, 0x5C39, 0x4E88, 0x4E91, + 0x4E95, 0x4E92, 0x4E94, 0x4EA2, 0x4EC1, 0x4EC0, 0x4EC3, 0x4EC6, + 0x4EC7, 0x4ECD, 0x4ECA, 0x4ECB, 0x4EC4, 0x5143, 0x5141, 0x5167, + 0x516D, 0x516E, 0x516C, 0x5197, 0x51F6, 0x5206, 0x5207, 0x5208, + 0x52FB, 0x52FE, 0x52FF, 0x5316, 0x5339, 0x5348, 0x5347, 0x5345, + 0x535E, 0x5384, 0x53CB, 0x53CA, 0x53CD, 0x58EC, 0x5929, 0x592B, + 0x592A, 0x592D, 0x5B54, 0x5C11, 0x5C24, 0x5C3A, 0x5C6F, 0x5DF4, + 0x5E7B, 0x5EFF, 0x5F14, 0x5F15, 0x5FC3, 0x6208, 0x6236, 0x624B, + 0x624E, 0x652F, 0x6587, 0x6597, 0x65A4, 0x65B9, 0x65E5, 0x66F0, + 0x6708, 0x6728, 0x6B20, 0x6B62, 0x6B79, 0x6BCB, 0x6BD4, 0x6BDB, + 0x6C0F, 0x6C34, 0x706B, 0x722A, 0x7236, 0x723B, 0x7247, 0x7259, + 0x725B, 0x72AC, 0x738B, 0x4E19, 0x4E16, 0x4E15, 0x4E14, 0x4E18, + 0x4E3B, 0x4E4D, 0x4E4F, 0x4E4E, 0x4EE5, 0x4ED8, 0x4ED4, 0x4ED5, + 0x4ED6, 0x4ED7, 0x4EE3, 0x4EE4, 0x4ED9, 0x4EDE, 0x5145, 0x5144, + 0x5189, 0x518A, 0x51AC, 0x51F9, 0x51FA, 0x51F8, 0x520A, 0x52A0, + 0x529F, 0x5305, 0x5306, 0x5317, 0x531D, 0x4EDF, 0x534A, 0x5349, + 0x5361, 0x5360, 0x536F, 0x536E, 0x53BB, 0x53EF, 0x53E4, 0x53F3, + 0x53EC, 0x53EE, 0x53E9, 0x53E8, 0x53FC, 0x53F8, 0x53F5, 0x53EB, + 0x53E6, 0x53EA, 0x53F2, 0x53F1, 0x53F0, 0x53E5, 0x53ED, 0x53FB, + 0x56DB, 0x56DA, 0x5916, 0x592E, 0x5931, 0x5974, 0x5976, 0x5B55, + 0x5B83, 0x5C3C, 0x5DE8, 0x5DE7, 0x5DE6, 0x5E02, 0x5E03, 0x5E73, + 0x5E7C, 0x5F01, 0x5F18, 0x5F17, 0x5FC5, 0x620A, 0x6253, 0x6254, + 0x6252, 0x6251, 0x65A5, 0x65E6, 0x672E, 0x672C, 0x672A, 0x672B, + 0x672D, 0x6B63, 0x6BCD, 0x6C11, 0x6C10, 0x6C38, 0x6C41, 0x6C40, + 0x6C3E, 0x72AF, 0x7384, 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, + 0x7528, 0x7529, 0x7530, 0x7531, 0x7532, 0x7533, 0x758B, 0x767D, + 0x76AE, 0x76BF, 0x76EE, 0x77DB, 0x77E2, 0x77F3, 0x793A, 0x79BE, + 0x7A74, 0x7ACB, 0x4E1E, 0x4E1F, 0x4E52, 0x4E53, 0x4E69, 0x4E99, + 0x4EA4, 0x4EA6, 0x4EA5, 0x4EFF, 0x4F09, 0x4F19, 0x4F0A, 0x4F15, +plane 04 +at 0x00 + 0x4F0D, 0x4F10, 0x4F11, 0x4F0F, 0x4EF2, 0x4EF6, 0x4EFB, 0x4EF0, + 0x4EF3, 0x4EFD, 0x4F01, 0x4F0B, 0x5149, 0x5147, 0x5146, 0x5148, + 0x5168, 0x5171, 0x518D, 0x51B0, 0x5217, 0x5211, 0x5212, 0x520E, + 0x5216, 0x52A3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, + 0x540F, 0x540C, 0x540A, 0x5410, 0x5401, 0x540B, 0x5404, 0x5411, + 0x540D, 0x5408, 0x5403, 0x540E, 0x5406, 0x5412, 0x56E0, 0x56DE, + 0x56DD, 0x5733, 0x5730, 0x5728, 0x572D, 0x572C, 0x572F, 0x5729, + 0x5919, 0x591A, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597D, + 0x5979, 0x5982, 0x5981, 0x5B57, 0x5B58, 0x5B87, 0x5B88, 0x5B85, + 0x5B89, 0x5BFA, 0x5C16, 0x5C79, 0x5DDE, 0x5E06, 0x5E76, 0x5E74, + 0x5F0F, 0x5F1B, 0x5FD9, 0x5FD6, 0x620E, 0x620C, 0x620D, 0x6210, + 0x6263, 0x625B, 0x6258, 0x6536, 0x65E9, 0x65E8, 0x65EC, 0x65ED, + 0x66F2, 0x66F3, 0x6709, 0x673D, 0x6734, 0x6731, 0x6735, 0x6B21, + 0x6B64, 0x6B7B, 0x6C16, 0x6C5D, 0x6C57, 0x6C59, 0x6C5F, 0x6C60, + 0x6C50, 0x6C55, 0x6C61, 0x6C5B, 0x6C4D, 0x6C4E, 0x7070, 0x725F, + 0x725D, 0x767E, 0x7AF9, 0x7C73, 0x7CF8, 0x7F36, 0x7F8A, 0x7FBD, + 0x8001, 0x8003, 0x800C, 0x8012, 0x8033, 0x807F, 0x8089, 0x808B, + 0x808C, 0x81E3, 0x81EA, 0x81F3, 0x81FC, 0x820C, 0x821B, 0x821F, + 0x826E, 0x8272, 0x827E, 0x866B, 0x8840, 0x884C, 0x8863, 0x897F, + 0x9621, 0x4E32, 0x4EA8, 0x4F4D, 0x4F4F, 0x4F47, 0x4F57, 0x4F5E, + 0x4F34, 0x4F5B, 0x4F55, 0x4F30, 0x4F50, 0x4F51, 0x4F3D, 0x4F3A, + 0x4F38, 0x4F43, 0x4F54, 0x4F3C, 0x4F46, 0x4F63, 0x4F5C, 0x4F60, + 0x4F2F, 0x4F4E, 0x4F36, 0x4F59, 0x4F5D, 0x4F48, 0x4F5A, 0x514C, + 0x514B, 0x514D, 0x5175, 0x51B6, 0x51B7, 0x5225, 0x5224, 0x5229, + 0x522A, 0x5228, 0x52AB, 0x52A9, 0x52AA, 0x52AC, 0x5323, 0x5373, + 0x5375, 0x541D, 0x542D, 0x541E, 0x543E, 0x5426, 0x544E, 0x5427, + 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541B, 0x5429, 0x544A, + 0x5439, 0x543B, 0x5438, 0x542E, 0x5435, 0x5436, 0x5420, 0x543C, + 0x5440, 0x5431, 0x542B, 0x541F, 0x542C, 0x56EA, 0x56F0, 0x56E4, + 0x56EB, 0x574A, 0x5751, 0x5740, 0x574D, 0x5747, 0x574E, 0x573E, + 0x5750, 0x574F, 0x573B, 0x58EF, 0x593E, 0x599D, 0x5992, 0x59A8, + 0x599E, 0x59A3, 0x5999, 0x5996, 0x598D, 0x59A4, 0x5993, 0x598A, +plane 05 +at 0x00 + 0x59A5, 0x5B5D, 0x5B5C, 0x5B5A, 0x5B5B, 0x5B8C, 0x5B8B, 0x5B8F, + 0x5C2C, 0x5C40, 0x5C41, 0x5C3F, 0x5C3E, 0x5C90, 0x5C91, 0x5C94, + 0x5C8C, 0x5DEB, 0x5E0C, 0x5E8F, 0x5E87, 0x5E8A, 0x5EF7, 0x5F04, + 0x5F1F, 0x5F64, 0x5F62, 0x5F77, 0x5F79, 0x5FD8, 0x5FCC, 0x5FD7, + 0x5FCD, 0x5FF1, 0x5FEB, 0x5FF8, 0x5FEA, 0x6212, 0x6211, 0x6284, + 0x6297, 0x6296, 0x6280, 0x6276, 0x6289, 0x626D, 0x628A, 0x627C, + 0x627E, 0x6279, 0x6273, 0x6292, 0x626F, 0x6298, 0x626E, 0x6295, + 0x6293, 0x6291, 0x6286, 0x6539, 0x653B, 0x6538, 0x65F1, 0x66F4, + 0x675F, 0x674E, 0x674F, 0x6750, 0x6751, 0x675C, 0x6756, 0x675E, + 0x6749, 0x6746, 0x6760, 0x6753, 0x6757, 0x6B65, 0x6BCF, 0x6C42, + 0x6C5E, 0x6C99, 0x6C81, 0x6C88, 0x6C89, 0x6C85, 0x6C9B, 0x6C6A, + 0x6C7A, 0x6C90, 0x6C70, 0x6C8C, 0x6C68, 0x6C96, 0x6C92, 0x6C7D, + 0x6C83, 0x6C72, 0x6C7E, 0x6C74, 0x6C86, 0x6C76, 0x6C8D, 0x6C94, + 0x6C98, 0x6C82, 0x7076, 0x707C, 0x707D, 0x7078, 0x7262, 0x7261, + 0x7260, 0x72C4, 0x72C2, 0x7396, 0x752C, 0x752B, 0x7537, 0x7538, + 0x7682, 0x76EF, 0x77E3, 0x79C1, 0x79C0, 0x79BF, 0x7A76, 0x7CFB, + 0x7F55, 0x8096, 0x8093, 0x809D, 0x8098, 0x809B, 0x809A, 0x80B2, + 0x826F, 0x8292, 0x828B, 0x828D, 0x898B, 0x89D2, 0x8A00, 0x8C37, + 0x8C46, 0x8C55, 0x8C9D, 0x8D64, 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, + 0x8F9B, 0x8FB0, 0x8FC2, 0x8FC6, 0x8FC5, 0x8FC4, 0x5DE1, 0x9091, + 0x90A2, 0x90AA, 0x90A6, 0x90A3, 0x9149, 0x91C6, 0x91CC, 0x9632, + 0x962E, 0x9631, 0x962A, 0x962C, 0x4E26, 0x4E56, 0x4E73, 0x4E8B, + 0x4E9B, 0x4E9E, 0x4EAB, 0x4EAC, 0x4F6F, 0x4F9D, 0x4F8D, 0x4F73, + 0x4F7F, 0x4F6C, 0x4F9B, 0x4F8B, 0x4F86, 0x4F83, 0x4F70, 0x4F75, + 0x4F88, 0x4F69, 0x4F7B, 0x4F96, 0x4F7E, 0x4F8F, 0x4F91, 0x4F7A, + 0x5154, 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51BD, + 0x51FD, 0x523B, 0x5238, 0x5237, 0x523A, 0x5230, 0x522E, 0x5236, + 0x5241, 0x52BE, 0x52BB, 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, + 0x5377, 0x5378, 0x5379, 0x53D6, 0x53D4, 0x53D7, 0x5473, 0x5475, + 0x5496, 0x5478, 0x5495, 0x5480, 0x547B, 0x5477, 0x5484, 0x5492, + 0x5486, 0x547C, 0x5490, 0x5471, 0x5476, 0x548C, 0x549A, 0x5462, + 0x5468, 0x548B, 0x547D, 0x548E, 0x56FA, 0x5783, 0x5777, 0x576A, +plane 06 +at 0x00 + 0x5769, 0x5761, 0x5766, 0x5764, 0x577C, 0x591C, 0x5949, 0x5947, + 0x5948, 0x5944, 0x5954, 0x59BE, 0x59BB, 0x59D4, 0x59B9, 0x59AE, + 0x59D1, 0x59C6, 0x59D0, 0x59CD, 0x59CB, 0x59D3, 0x59CA, 0x59AF, + 0x59B3, 0x59D2, 0x59C5, 0x5B5F, 0x5B64, 0x5B63, 0x5B97, 0x5B9A, + 0x5B98, 0x5B9C, 0x5B99, 0x5B9B, 0x5C1A, 0x5C48, 0x5C45, 0x5C46, + 0x5CB7, 0x5CA1, 0x5CB8, 0x5CA9, 0x5CAB, 0x5CB1, 0x5CB3, 0x5E18, + 0x5E1A, 0x5E16, 0x5E15, 0x5E1B, 0x5E11, 0x5E78, 0x5E9A, 0x5E97, + 0x5E9C, 0x5E95, 0x5E96, 0x5EF6, 0x5F26, 0x5F27, 0x5F29, 0x5F80, + 0x5F81, 0x5F7F, 0x5F7C, 0x5FDD, 0x5FE0, 0x5FFD, 0x5FF5, 0x5FFF, + 0x600F, 0x6014, 0x602F, 0x6035, 0x6016, 0x602A, 0x6015, 0x6021, + 0x6027, 0x6029, 0x602B, 0x601B, 0x6216, 0x6215, 0x623F, 0x623E, + 0x6240, 0x627F, 0x62C9, 0x62CC, 0x62C4, 0x62BF, 0x62C2, 0x62B9, + 0x62D2, 0x62DB, 0x62AB, 0x62D3, 0x62D4, 0x62CB, 0x62C8, 0x62A8, + 0x62BD, 0x62BC, 0x62D0, 0x62D9, 0x62C7, 0x62CD, 0x62B5, 0x62DA, + 0x62B1, 0x62D8, 0x62D6, 0x62D7, 0x62C6, 0x62AC, 0x62CE, 0x653E, + 0x65A7, 0x65BC, 0x65FA, 0x6614, 0x6613, 0x660C, 0x6606, 0x6602, + 0x660E, 0x6600, 0x660F, 0x6615, 0x660A, 0x6607, 0x670D, 0x670B, + 0x676D, 0x678B, 0x6795, 0x6771, 0x679C, 0x6773, 0x6777, 0x6787, + 0x679D, 0x6797, 0x676F, 0x6770, 0x677F, 0x6789, 0x677E, 0x6790, + 0x6775, 0x679A, 0x6793, 0x677C, 0x676A, 0x6772, 0x6B23, 0x6B66, + 0x6B67, 0x6B7F, 0x6C13, 0x6C1B, 0x6CE3, 0x6CE8, 0x6CF3, 0x6CB1, + 0x6CCC, 0x6CE5, 0x6CB3, 0x6CBD, 0x6CBE, 0x6CBC, 0x6CE2, 0x6CAB, + 0x6CD5, 0x6CD3, 0x6CB8, 0x6CC4, 0x6CB9, 0x6CC1, 0x6CAE, 0x6CD7, + 0x6CC5, 0x6CF1, 0x6CBF, 0x6CBB, 0x6CE1, 0x6CDB, 0x6CCA, 0x6CAC, + 0x6CEF, 0x6CDC, 0x6CD6, 0x6CE0, 0x7095, 0x708E, 0x7092, 0x708A, + 0x7099, 0x722C, 0x722D, 0x7238, 0x7248, 0x7267, 0x7269, 0x72C0, + 0x72CE, 0x72D9, 0x72D7, 0x72D0, 0x73A9, 0x73A8, 0x739F, 0x73AB, + 0x73A5, 0x753D, 0x759D, 0x7599, 0x759A, 0x7684, 0x76C2, 0x76F2, + 0x76F4, 0x77E5, 0x77FD, 0x793E, 0x7940, 0x7941, 0x79C9, 0x79C8, + 0x7A7A, 0x7A79, 0x7AFA, 0x7CFE, 0x7F54, 0x7F8C, 0x7F8B, 0x8005, + 0x80BA, 0x80A5, 0x80A2, 0x80B1, 0x80A1, 0x80AB, 0x80A9, 0x80B4, + 0x80AA, 0x80AF, 0x81E5, 0x81FE, 0x820D, 0x82B3, 0x829D, 0x8299, +plane 07 +at 0x00 + 0x82AD, 0x82BD, 0x829F, 0x82B9, 0x82B1, 0x82AC, 0x82A5, 0x82AF, + 0x82B8, 0x82A3, 0x82B0, 0x82BE, 0x82B7, 0x864E, 0x8671, 0x521D, + 0x8868, 0x8ECB, 0x8FCE, 0x8FD4, 0x8FD1, 0x90B5, 0x90B8, 0x90B1, + 0x90B6, 0x91C7, 0x91D1, 0x9577, 0x9580, 0x961C, 0x9640, 0x963F, + 0x963B, 0x9644, 0x9642, 0x96B9, 0x96E8, 0x9752, 0x975E, 0x4E9F, + 0x4EAD, 0x4EAE, 0x4FE1, 0x4FB5, 0x4FAF, 0x4FBF, 0x4FE0, 0x4FD1, + 0x4FCF, 0x4FDD, 0x4FC3, 0x4FB6, 0x4FD8, 0x4FDF, 0x4FCA, 0x4FD7, + 0x4FAE, 0x4FD0, 0x4FC4, 0x4FC2, 0x4FDA, 0x4FCE, 0x4FDE, 0x4FB7, + 0x5157, 0x5192, 0x5191, 0x51A0, 0x524E, 0x5243, 0x524A, 0x524D, + 0x524C, 0x524B, 0x5247, 0x52C7, 0x52C9, 0x52C3, 0x52C1, 0x530D, + 0x5357, 0x537B, 0x539A, 0x53DB, 0x54AC, 0x54C0, 0x54A8, 0x54CE, + 0x54C9, 0x54B8, 0x54A6, 0x54B3, 0x54C7, 0x54C2, 0x54BD, 0x54AA, + 0x54C1, 0x54C4, 0x54C8, 0x54AF, 0x54AB, 0x54B1, 0x54BB, 0x54A9, + 0x54A7, 0x54BF, 0x56FF, 0x5782, 0x578B, 0x57A0, 0x57A3, 0x57A2, + 0x57CE, 0x57AE, 0x5793, 0x5955, 0x5951, 0x594F, 0x594E, 0x5950, + 0x59DC, 0x59D8, 0x59FF, 0x59E3, 0x59E8, 0x5A03, 0x59E5, 0x59EA, + 0x59DA, 0x59E6, 0x5A01, 0x59FB, 0x5B69, 0x5BA3, 0x5BA6, 0x5BA4, + 0x5BA2, 0x5BA5, 0x5C01, 0x5C4E, 0x5C4F, 0x5C4D, 0x5C4B, 0x5CD9, + 0x5CD2, 0x5DF7, 0x5E1D, 0x5E25, 0x5E1F, 0x5E7D, 0x5EA0, 0x5EA6, + 0x5EFA, 0x5F08, 0x5F2D, 0x5F65, 0x5F88, 0x5F85, 0x5F8A, 0x5F8B, + 0x5F87, 0x5F8C, 0x5F89, 0x6012, 0x601D, 0x6020, 0x6025, 0x600E, + 0x6028, 0x604D, 0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606C, + 0x606B, 0x606A, 0x6064, 0x6241, 0x62DC, 0x6316, 0x6309, 0x62FC, + 0x62ED, 0x6301, 0x62EE, 0x62FD, 0x6307, 0x62F1, 0x62F7, 0x62EF, + 0x62EC, 0x62FE, 0x62F4, 0x6311, 0x6302, 0x653F, 0x6545, 0x65AB, + 0x65BD, 0x65E2, 0x6625, 0x662D, 0x6620, 0x6627, 0x662F, 0x661F, + 0x6628, 0x6631, 0x6624, 0x66F7, 0x67FF, 0x67D3, 0x67F1, 0x67D4, + 0x67D0, 0x67EC, 0x67B6, 0x67AF, 0x67F5, 0x67E9, 0x67EF, 0x67C4, + 0x67D1, 0x67B4, 0x67DA, 0x67E5, 0x67B8, 0x67CF, 0x67DE, 0x67F3, + 0x67B0, 0x67D9, 0x67E2, 0x67DD, 0x67D2, 0x6B6A, 0x6B83, 0x6B86, + 0x6BB5, 0x6BD2, 0x6BD7, 0x6C1F, 0x6CC9, 0x6D0B, 0x6D32, 0x6D2A, + 0x6D41, 0x6D25, 0x6D0C, 0x6D31, 0x6D1E, 0x6D17, 0x6D3B, 0x6D3D, +plane 08 +at 0x00 + 0x6D3E, 0x6D36, 0x6D1B, 0x6CF5, 0x6D39, 0x6D27, 0x6D38, 0x6D29, + 0x6D2E, 0x6D35, 0x6D0E, 0x6D2B, 0x70AB, 0x70BA, 0x70B3, 0x70AC, + 0x70AF, 0x70AD, 0x70B8, 0x70AE, 0x70A4, 0x7230, 0x7272, 0x726F, + 0x7274, 0x72E9, 0x72E0, 0x72E1, 0x73B7, 0x73CA, 0x73BB, 0x73B2, + 0x73CD, 0x73C0, 0x73B3, 0x751A, 0x752D, 0x754F, 0x754C, 0x754E, + 0x754B, 0x75AB, 0x75A4, 0x75A5, 0x75A2, 0x75A3, 0x7678, 0x7686, + 0x7687, 0x7688, 0x76C8, 0x76C6, 0x76C3, 0x76C5, 0x7701, 0x76F9, + 0x76F8, 0x7709, 0x770B, 0x76FE, 0x76FC, 0x7707, 0x77DC, 0x7802, + 0x7814, 0x780C, 0x780D, 0x7946, 0x7949, 0x7948, 0x7947, 0x79B9, + 0x79BA, 0x79D1, 0x79D2, 0x79CB, 0x7A7F, 0x7A81, 0x7AFF, 0x7AFD, + 0x7C7D, 0x7D02, 0x7D05, 0x7D00, 0x7D09, 0x7D07, 0x7D04, 0x7D06, + 0x7F38, 0x7F8E, 0x7FBF, 0x8004, 0x8010, 0x800D, 0x8011, 0x8036, + 0x80D6, 0x80E5, 0x80DA, 0x80C3, 0x80C4, 0x80CC, 0x80E1, 0x80DB, + 0x80CE, 0x80DE, 0x80E4, 0x80DD, 0x81F4, 0x8222, 0x82E7, 0x8303, + 0x8305, 0x82E3, 0x82DB, 0x82E6, 0x8304, 0x82E5, 0x8302, 0x8309, + 0x82D2, 0x82D7, 0x82F1, 0x8301, 0x82DC, 0x82D4, 0x82D1, 0x82DE, + 0x82D3, 0x82DF, 0x82EF, 0x8306, 0x8650, 0x8679, 0x867B, 0x867A, + 0x884D, 0x886B, 0x8981, 0x89D4, 0x8A08, 0x8A02, 0x8A03, 0x8C9E, + 0x8CA0, 0x8D74, 0x8D73, 0x8DB4, 0x8ECD, 0x8ECC, 0x8FF0, 0x8FE6, + 0x8FE2, 0x8FEA, 0x8FE5, 0x8FED, 0x8FEB, 0x8FE4, 0x8FE8, 0x90CA, + 0x90CE, 0x90C1, 0x90C3, 0x914B, 0x914A, 0x91CD, 0x9582, 0x9650, + 0x964B, 0x964C, 0x964D, 0x9762, 0x9769, 0x97CB, 0x97ED, 0x97F3, + 0x9801, 0x98A8, 0x98DB, 0x98DF, 0x9996, 0x9999, 0x4E58, 0x4EB3, + 0x500C, 0x500D, 0x5023, 0x4FEF, 0x5026, 0x5025, 0x4FF8, 0x5029, + 0x5016, 0x5006, 0x503C, 0x501F, 0x501A, 0x5012, 0x5011, 0x4FFA, + 0x5000, 0x5014, 0x5028, 0x4FF1, 0x5021, 0x500B, 0x5019, 0x5018, + 0x4FF3, 0x4FEE, 0x502D, 0x502A, 0x4FFE, 0x502B, 0x5009, 0x517C, + 0x51A4, 0x51A5, 0x51A2, 0x51CD, 0x51CC, 0x51C6, 0x51CB, 0x5256, + 0x525C, 0x5254, 0x525B, 0x525D, 0x532A, 0x537F, 0x539F, 0x539D, + 0x53DF, 0x54E8, 0x5510, 0x5501, 0x5537, 0x54FC, 0x54E5, 0x54F2, + 0x5506, 0x54FA, 0x5514, 0x54E9, 0x54ED, 0x54E1, 0x5509, 0x54EE, + 0x54EA, 0x54E6, 0x5527, 0x5507, 0x54FD, 0x550F, 0x5703, 0x5704, +plane 09 +at 0x00 + 0x57C2, 0x57D4, 0x57CB, 0x57C3, 0x5809, 0x590F, 0x5957, 0x5958, + 0x595A, 0x5A11, 0x5A18, 0x5A1C, 0x5A1F, 0x5A1B, 0x5A13, 0x59EC, + 0x5A20, 0x5A23, 0x5A29, 0x5A25, 0x5A0C, 0x5A09, 0x5B6B, 0x5C58, + 0x5BB0, 0x5BB3, 0x5BB6, 0x5BB4, 0x5BAE, 0x5BB5, 0x5BB9, 0x5BB8, + 0x5C04, 0x5C51, 0x5C55, 0x5C50, 0x5CED, 0x5CFD, 0x5CFB, 0x5CEA, + 0x5CE8, 0x5CF0, 0x5CF6, 0x5D01, 0x5CF4, 0x5DEE, 0x5E2D, 0x5E2B, + 0x5EAB, 0x5EAD, 0x5EA7, 0x5F31, 0x5F92, 0x5F91, 0x5F90, 0x6059, + 0x6063, 0x6065, 0x6050, 0x6055, 0x606D, 0x6069, 0x606F, 0x6084, + 0x609F, 0x609A, 0x608D, 0x6094, 0x608C, 0x6085, 0x6096, 0x6247, + 0x62F3, 0x6308, 0x62FF, 0x634E, 0x633E, 0x632F, 0x6355, 0x6342, + 0x6346, 0x634F, 0x6349, 0x633A, 0x6350, 0x633D, 0x632A, 0x632B, + 0x6328, 0x634D, 0x634C, 0x6548, 0x6549, 0x6599, 0x65C1, 0x65C5, + 0x6642, 0x6649, 0x664F, 0x6643, 0x6652, 0x664C, 0x6645, 0x6641, + 0x66F8, 0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, 0x6846, + 0x6853, 0x6839, 0x6842, 0x6854, 0x6829, 0x68B3, 0x6817, 0x684C, + 0x6851, 0x683D, 0x67F4, 0x6850, 0x6840, 0x683C, 0x6843, 0x682A, + 0x6845, 0x6813, 0x6818, 0x6841, 0x6B8A, 0x6B89, 0x6BB7, 0x6C23, + 0x6C27, 0x6C28, 0x6C26, 0x6C24, 0x6CF0, 0x6D6A, 0x6D95, 0x6D88, + 0x6D87, 0x6D66, 0x6D78, 0x6D77, 0x6D59, 0x6D93, 0x6D6C, 0x6D89, + 0x6D6E, 0x6D5A, 0x6D74, 0x6D69, 0x6D8C, 0x6D8A, 0x6D79, 0x6D85, + 0x6D65, 0x6D94, 0x70CA, 0x70D8, 0x70E4, 0x70D9, 0x70C8, 0x70CF, + 0x7239, 0x7279, 0x72FC, 0x72F9, 0x72FD, 0x72F8, 0x72F7, 0x7386, + 0x73ED, 0x7409, 0x73EE, 0x73E0, 0x73EA, 0x73DE, 0x7554, 0x755D, + 0x755C, 0x755A, 0x7559, 0x75BE, 0x75C5, 0x75C7, 0x75B2, 0x75B3, + 0x75BD, 0x75BC, 0x75B9, 0x75C2, 0x75B8, 0x768B, 0x76B0, 0x76CA, + 0x76CD, 0x76CE, 0x7729, 0x771F, 0x7720, 0x7728, 0x77E9, 0x7830, + 0x7827, 0x7838, 0x781D, 0x7834, 0x7837, 0x7825, 0x782D, 0x7820, + 0x781F, 0x7832, 0x7955, 0x7950, 0x7960, 0x795F, 0x7956, 0x795E, + 0x795D, 0x7957, 0x795A, 0x79E4, 0x79E3, 0x79E7, 0x79DF, 0x79E6, + 0x79E9, 0x79D8, 0x7A84, 0x7A88, 0x7AD9, 0x7B06, 0x7B11, 0x7C89, + 0x7D21, 0x7D17, 0x7D0B, 0x7D0A, 0x7D20, 0x7D22, 0x7D14, 0x7D10, + 0x7D15, 0x7D1A, 0x7D1C, 0x7D0D, 0x7D19, 0x7D1B, 0x7F3A, 0x7F5F, +plane 10 +at 0x00 + 0x7F94, 0x7FC5, 0x7FC1, 0x8006, 0x8018, 0x8015, 0x8019, 0x8017, + 0x803D, 0x803F, 0x80F1, 0x8102, 0x80F0, 0x8105, 0x80ED, 0x80F4, + 0x8106, 0x80F8, 0x80F3, 0x8108, 0x80FD, 0x810A, 0x80FC, 0x80EF, + 0x81ED, 0x81EC, 0x8200, 0x8210, 0x822A, 0x822B, 0x8228, 0x822C, + 0x82BB, 0x832B, 0x8352, 0x8354, 0x834A, 0x8338, 0x8350, 0x8349, + 0x8335, 0x8334, 0x834F, 0x8332, 0x8339, 0x8336, 0x8317, 0x8340, + 0x8331, 0x8328, 0x8343, 0x8654, 0x868A, 0x86AA, 0x8693, 0x86A4, + 0x86A9, 0x868C, 0x86A3, 0x869C, 0x8870, 0x8877, 0x8881, 0x8882, + 0x887D, 0x8879, 0x8A18, 0x8A10, 0x8A0E, 0x8A0C, 0x8A15, 0x8A0A, + 0x8A17, 0x8A13, 0x8A16, 0x8A0F, 0x8A11, 0x8C48, 0x8C7A, 0x8C79, + 0x8CA1, 0x8CA2, 0x8D77, 0x8EAC, 0x8ED2, 0x8ED4, 0x8ECF, 0x8FB1, + 0x9001, 0x9006, 0x8FF7, 0x9000, 0x8FFA, 0x8FF4, 0x9003, 0x8FFD, + 0x9005, 0x8FF8, 0x9095, 0x90E1, 0x90DD, 0x90E2, 0x9152, 0x914D, + 0x914C, 0x91D8, 0x91DD, 0x91D7, 0x91DC, 0x91D9, 0x9583, 0x9662, + 0x9663, 0x9661, 0x965B, 0x965D, 0x9664, 0x9658, 0x965E, 0x96BB, + 0x98E2, 0x99AC, 0x9AA8, 0x9AD8, 0x9B25, 0x9B32, 0x9B3C, 0x4E7E, + 0x507A, 0x507D, 0x505C, 0x5047, 0x5043, 0x504C, 0x505A, 0x5049, + 0x5065, 0x5076, 0x504E, 0x5055, 0x5075, 0x5074, 0x5077, 0x504F, + 0x500F, 0x506F, 0x506D, 0x515C, 0x5195, 0x51F0, 0x526A, 0x526F, + 0x52D2, 0x52D9, 0x52D8, 0x52D5, 0x5310, 0x530F, 0x5319, 0x533F, + 0x5340, 0x533E, 0x53C3, 0x66FC, 0x5546, 0x556A, 0x5566, 0x5544, + 0x555E, 0x5561, 0x5543, 0x554A, 0x5531, 0x5556, 0x554F, 0x5555, + 0x552F, 0x5564, 0x5538, 0x552E, 0x555C, 0x552C, 0x5563, 0x5533, + 0x5541, 0x5557, 0x5708, 0x570B, 0x5709, 0x57DF, 0x5805, 0x580A, + 0x5806, 0x57E0, 0x57E4, 0x57FA, 0x5802, 0x5835, 0x57F7, 0x57F9, + 0x5920, 0x5962, 0x5A36, 0x5A41, 0x5A49, 0x5A66, 0x5A6A, 0x5A40, + 0x5A3C, 0x5A62, 0x5A5A, 0x5A46, 0x5A4A, 0x5B70, 0x5BC7, 0x5BC5, + 0x5BC4, 0x5BC2, 0x5BBF, 0x5BC6, 0x5C09, 0x5C08, 0x5C07, 0x5C60, + 0x5C5C, 0x5C5D, 0x5D07, 0x5D06, 0x5D0E, 0x5D1B, 0x5D16, 0x5D22, + 0x5D11, 0x5D29, 0x5D14, 0x5D19, 0x5D24, 0x5D27, 0x5D17, 0x5DE2, + 0x5E38, 0x5E36, 0x5E33, 0x5E37, 0x5EB7, 0x5EB8, 0x5EB6, 0x5EB5, + 0x5EBE, 0x5F35, 0x5F37, 0x5F57, 0x5F6C, 0x5F69, 0x5F6B, 0x5F97, +plane 11 +at 0x00 + 0x5F99, 0x5F9E, 0x5F98, 0x5FA1, 0x5FA0, 0x5F9C, 0x607F, 0x60A3, + 0x6089, 0x60A0, 0x60A8, 0x60CB, 0x60B4, 0x60E6, 0x60BD, 0x60C5, + 0x60BB, 0x60B5, 0x60DC, 0x60BC, 0x60D8, 0x60D5, 0x60C6, 0x60DF, + 0x60B8, 0x60DA, 0x60C7, 0x621A, 0x621B, 0x6248, 0x63A0, 0x63A7, + 0x6372, 0x6396, 0x63A2, 0x63A5, 0x6377, 0x6367, 0x6398, 0x63AA, + 0x6371, 0x63A9, 0x6389, 0x6383, 0x639B, 0x636B, 0x63A8, 0x6384, + 0x6388, 0x6399, 0x63A1, 0x63AC, 0x6392, 0x638F, 0x6380, 0x637B, + 0x6369, 0x6368, 0x637A, 0x655D, 0x6556, 0x6551, 0x6559, 0x6557, + 0x555F, 0x654F, 0x6558, 0x6555, 0x6554, 0x659C, 0x659B, 0x65AC, + 0x65CF, 0x65CB, 0x65CC, 0x65CE, 0x665D, 0x665A, 0x6664, 0x6668, + 0x6666, 0x665E, 0x66F9, 0x52D7, 0x671B, 0x6881, 0x68AF, 0x68A2, + 0x6893, 0x68B5, 0x687F, 0x6876, 0x68B1, 0x68A7, 0x6897, 0x68B0, + 0x6883, 0x68C4, 0x68AD, 0x6886, 0x6885, 0x6894, 0x689D, 0x68A8, + 0x689F, 0x68A1, 0x6882, 0x6B32, 0x6BBA, 0x6BEB, 0x6BEC, 0x6C2B, + 0x6D8E, 0x6DBC, 0x6DF3, 0x6DD9, 0x6DB2, 0x6DE1, 0x6DCC, 0x6DE4, + 0x6DFB, 0x6DFA, 0x6E05, 0x6DC7, 0x6DCB, 0x6DAF, 0x6DD1, 0x6DAE, + 0x6DDE, 0x6DF9, 0x6DB8, 0x6DF7, 0x6DF5, 0x6DC5, 0x6DD2, 0x6E1A, + 0x6DB5, 0x6DDA, 0x6DEB, 0x6DD8, 0x6DEA, 0x6DF1, 0x6DEE, 0x6DE8, + 0x6DC6, 0x6DC4, 0x6DAA, 0x6DEC, 0x6DBF, 0x6DE6, 0x70F9, 0x7109, + 0x710A, 0x70FD, 0x70EF, 0x723D, 0x727D, 0x7281, 0x731C, 0x731B, + 0x7316, 0x7313, 0x7319, 0x7387, 0x7405, 0x740A, 0x7403, 0x7406, + 0x73FE, 0x740D, 0x74E0, 0x74F6, 0x74F7, 0x751C, 0x7522, 0x7565, + 0x7566, 0x7562, 0x7570, 0x758F, 0x75D4, 0x75D5, 0x75B5, 0x75CA, + 0x75CD, 0x768E, 0x76D4, 0x76D2, 0x76DB, 0x7737, 0x773E, 0x773C, + 0x7736, 0x7738, 0x773A, 0x786B, 0x7843, 0x784E, 0x7965, 0x7968, + 0x796D, 0x79FB, 0x7A92, 0x7A95, 0x7B20, 0x7B28, 0x7B1B, 0x7B2C, + 0x7B26, 0x7B19, 0x7B1E, 0x7B2E, 0x7C92, 0x7C97, 0x7C95, 0x7D46, + 0x7D43, 0x7D71, 0x7D2E, 0x7D39, 0x7D3C, 0x7D40, 0x7D30, 0x7D33, + 0x7D44, 0x7D2F, 0x7D42, 0x7D32, 0x7D31, 0x7F3D, 0x7F9E, 0x7F9A, + 0x7FCC, 0x7FCE, 0x7FD2, 0x801C, 0x804A, 0x8046, 0x812F, 0x8116, + 0x8123, 0x812B, 0x8129, 0x8130, 0x8124, 0x8202, 0x8235, 0x8237, + 0x8236, 0x8239, 0x838E, 0x839E, 0x8398, 0x8378, 0x83A2, 0x8396, +plane 12 +at 0x00 + 0x83BD, 0x83AB, 0x8392, 0x838A, 0x8393, 0x8389, 0x83A0, 0x8377, + 0x837B, 0x837C, 0x8386, 0x83A7, 0x8655, 0x5F6A, 0x86C7, 0x86C0, + 0x86B6, 0x86C4, 0x86B5, 0x86C6, 0x86CB, 0x86B1, 0x86AF, 0x86C9, + 0x8853, 0x889E, 0x8888, 0x88AB, 0x8892, 0x8896, 0x888D, 0x888B, + 0x8993, 0x898F, 0x8A2A, 0x8A1D, 0x8A23, 0x8A25, 0x8A31, 0x8A2D, + 0x8A1F, 0x8A1B, 0x8A22, 0x8C49, 0x8C5A, 0x8CA9, 0x8CAC, 0x8CAB, + 0x8CA8, 0x8CAA, 0x8CA7, 0x8D67, 0x8D66, 0x8DBE, 0x8DBA, 0x8EDB, + 0x8EDF, 0x9019, 0x900D, 0x901A, 0x9017, 0x9023, 0x901F, 0x901D, + 0x9010, 0x9015, 0x901E, 0x9020, 0x900F, 0x9022, 0x9016, 0x901B, + 0x9014, 0x90E8, 0x90ED, 0x90FD, 0x9157, 0x91CE, 0x91F5, 0x91E6, + 0x91E3, 0x91E7, 0x91ED, 0x91E9, 0x9589, 0x966A, 0x9675, 0x9673, + 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, 0x966C, 0x96C0, 0x96EA, + 0x96E9, 0x7AE0, 0x7ADF, 0x9802, 0x9803, 0x9B5A, 0x9CE5, 0x9E75, + 0x9E7F, 0x9EA5, 0x9EBB, 0x50A2, 0x508D, 0x5085, 0x5099, 0x5091, + 0x5080, 0x5096, 0x5098, 0x509A, 0x6700, 0x51F1, 0x5272, 0x5274, + 0x5275, 0x5269, 0x52DE, 0x52DD, 0x52DB, 0x535A, 0x53A5, 0x557B, + 0x5580, 0x55A7, 0x557C, 0x558A, 0x559D, 0x5598, 0x5582, 0x559C, + 0x55AA, 0x5594, 0x5587, 0x558B, 0x5583, 0x55B3, 0x55AE, 0x559F, + 0x553E, 0x55B2, 0x559A, 0x55BB, 0x55AC, 0x55B1, 0x557E, 0x5589, + 0x55AB, 0x5599, 0x570D, 0x582F, 0x582A, 0x5834, 0x5824, 0x5830, + 0x5831, 0x5821, 0x581D, 0x5820, 0x58F9, 0x58FA, 0x5960, 0x5A77, + 0x5A9A, 0x5A7F, 0x5A92, 0x5A9B, 0x5AA7, 0x5B73, 0x5B71, 0x5BD2, + 0x5BCC, 0x5BD3, 0x5BD0, 0x5C0A, 0x5C0B, 0x5C31, 0x5D4C, 0x5D50, + 0x5D34, 0x5D47, 0x5DFD, 0x5E45, 0x5E3D, 0x5E40, 0x5E43, 0x5E7E, + 0x5ECA, 0x5EC1, 0x5EC2, 0x5EC4, 0x5F3C, 0x5F6D, 0x5FA9, 0x5FAA, + 0x5FA8, 0x60D1, 0x60E1, 0x60B2, 0x60B6, 0x60E0, 0x611C, 0x6123, + 0x60FA, 0x6115, 0x60F0, 0x60FB, 0x60F4, 0x6168, 0x60F1, 0x610E, + 0x60F6, 0x6109, 0x6100, 0x6112, 0x621F, 0x6249, 0x63A3, 0x638C, + 0x63CF, 0x63C0, 0x63E9, 0x63C9, 0x63C6, 0x63CD, 0x63D2, 0x63E3, + 0x63D0, 0x63E1, 0x63D6, 0x63ED, 0x63EE, 0x6376, 0x63F4, 0x63EA, + 0x63DB, 0x6452, 0x63DA, 0x63F9, 0x655E, 0x6566, 0x6562, 0x6563, + 0x6591, 0x6590, 0x65AF, 0x666E, 0x6670, 0x6674, 0x6676, 0x666F, +plane 13 +at 0x00 + 0x6691, 0x667A, 0x667E, 0x6677, 0x66FE, 0x66FF, 0x671F, 0x671D, + 0x68FA, 0x68D5, 0x68E0, 0x68D8, 0x68D7, 0x6905, 0x68DF, 0x68F5, + 0x68EE, 0x68E7, 0x68F9, 0x68D2, 0x68F2, 0x68E3, 0x68CB, 0x68CD, + 0x690D, 0x6912, 0x690E, 0x68C9, 0x68DA, 0x696E, 0x68FB, 0x6B3E, + 0x6B3A, 0x6B3D, 0x6B98, 0x6B96, 0x6BBC, 0x6BEF, 0x6C2E, 0x6C2F, + 0x6C2C, 0x6E2F, 0x6E38, 0x6E54, 0x6E21, 0x6E32, 0x6E67, 0x6E4A, + 0x6E20, 0x6E25, 0x6E23, 0x6E1B, 0x6E5B, 0x6E58, 0x6E24, 0x6E56, + 0x6E6E, 0x6E2D, 0x6E26, 0x6E6F, 0x6E34, 0x6E4D, 0x6E3A, 0x6E2C, + 0x6E43, 0x6E1D, 0x6E3E, 0x6ECB, 0x6E89, 0x6E19, 0x6E4E, 0x6E63, + 0x6E44, 0x6E72, 0x6E69, 0x6E5F, 0x7119, 0x711A, 0x7126, 0x7130, + 0x7121, 0x7136, 0x716E, 0x711C, 0x724C, 0x7284, 0x7280, 0x7336, + 0x7325, 0x7334, 0x7329, 0x743A, 0x742A, 0x7433, 0x7422, 0x7425, + 0x7435, 0x7436, 0x7434, 0x742F, 0x741B, 0x7426, 0x7428, 0x7525, + 0x7526, 0x756B, 0x756A, 0x75E2, 0x75DB, 0x75E3, 0x75D9, 0x75D8, + 0x75DE, 0x75E0, 0x767B, 0x767C, 0x7696, 0x7693, 0x76B4, 0x76DC, + 0x774F, 0x77ED, 0x785D, 0x786C, 0x786F, 0x7A0D, 0x7A08, 0x7A0B, + 0x7A05, 0x7A00, 0x7A98, 0x7A97, 0x7A96, 0x7AE5, 0x7AE3, 0x7B49, + 0x7B56, 0x7B46, 0x7B50, 0x7B52, 0x7B54, 0x7B4D, 0x7B4B, 0x7B4F, + 0x7B51, 0x7C9F, 0x7CA5, 0x7D5E, 0x7D50, 0x7D68, 0x7D55, 0x7D2B, + 0x7D6E, 0x7D72, 0x7D61, 0x7D66, 0x7D62, 0x7D70, 0x7D73, 0x5584, + 0x7FD4, 0x7FD5, 0x800B, 0x8052, 0x8085, 0x8155, 0x8154, 0x814B, + 0x8151, 0x814E, 0x8139, 0x8146, 0x813E, 0x814C, 0x8153, 0x8174, + 0x8212, 0x821C, 0x83E9, 0x8403, 0x83F8, 0x840D, 0x83E0, 0x83C5, + 0x840B, 0x83C1, 0x83EF, 0x83F1, 0x83F4, 0x8457, 0x840A, 0x83F0, + 0x840C, 0x83CC, 0x83FD, 0x83F2, 0x83CA, 0x8438, 0x840E, 0x8404, + 0x83DC, 0x8407, 0x83D4, 0x83DF, 0x865B, 0x86DF, 0x86D9, 0x86ED, + 0x86D4, 0x86DB, 0x86E4, 0x86D0, 0x86DE, 0x8857, 0x88C1, 0x88C2, + 0x88B1, 0x8983, 0x8996, 0x8A3B, 0x8A60, 0x8A55, 0x8A5E, 0x8A3C, + 0x8A41, 0x8A54, 0x8A5B, 0x8A50, 0x8A46, 0x8A34, 0x8A3A, 0x8A36, + 0x8A56, 0x8C61, 0x8C82, 0x8CAF, 0x8CBC, 0x8CB3, 0x8CBD, 0x8CC1, + 0x8CBB, 0x8CC0, 0x8CB4, 0x8CB7, 0x8CB6, 0x8CBF, 0x8CB8, 0x8D8A, + 0x8D85, 0x8D81, 0x8DCE, 0x8DDD, 0x8DCB, 0x8DDA, 0x8DD1, 0x8DCC, +plane 14 +at 0x00 + 0x8DDB, 0x8DC6, 0x8EFB, 0x8EF8, 0x8EFC, 0x8F9C, 0x902E, 0x9035, + 0x9031, 0x9038, 0x9032, 0x9036, 0x9102, 0x90F5, 0x9109, 0x90FE, + 0x9163, 0x9165, 0x91CF, 0x9214, 0x9215, 0x9223, 0x9209, 0x921E, + 0x920D, 0x9210, 0x9207, 0x9211, 0x9594, 0x958F, 0x958B, 0x9591, + 0x9593, 0x9592, 0x958E, 0x968A, 0x968E, 0x968B, 0x967D, 0x9685, + 0x9686, 0x968D, 0x9672, 0x9684, 0x96C1, 0x96C5, 0x96C4, 0x96C6, + 0x96C7, 0x96EF, 0x96F2, 0x97CC, 0x9805, 0x9806, 0x9808, 0x98E7, + 0x98EA, 0x98EF, 0x98E9, 0x98F2, 0x98ED, 0x99AE, 0x99AD, 0x9EC3, + 0x9ECD, 0x9ED1, 0x4E82, 0x50AD, 0x50B5, 0x50B2, 0x50B3, 0x50C5, + 0x50BE, 0x50AC, 0x50B7, 0x50BB, 0x50AF, 0x50C7, 0x527F, 0x5277, + 0x527D, 0x52DF, 0x52E6, 0x52E4, 0x52E2, 0x52E3, 0x532F, 0x55DF, + 0x55E8, 0x55D3, 0x55E6, 0x55CE, 0x55DC, 0x55C7, 0x55D1, 0x55E3, + 0x55E4, 0x55EF, 0x55DA, 0x55E1, 0x55C5, 0x55C6, 0x55E5, 0x55C9, + 0x5712, 0x5713, 0x585E, 0x5851, 0x5858, 0x5857, 0x585A, 0x5854, + 0x586B, 0x584C, 0x586D, 0x584A, 0x5862, 0x5852, 0x584B, 0x5967, + 0x5AC1, 0x5AC9, 0x5ACC, 0x5ABE, 0x5ABD, 0x5ABC, 0x5AB3, 0x5AC2, + 0x5AB2, 0x5D69, 0x5D6F, 0x5E4C, 0x5E79, 0x5EC9, 0x5EC8, 0x5F12, + 0x5F59, 0x5FAC, 0x5FAE, 0x611A, 0x610F, 0x6148, 0x611F, 0x60F3, + 0x611B, 0x60F9, 0x6101, 0x6108, 0x614E, 0x614C, 0x6144, 0x614D, + 0x613E, 0x6134, 0x6127, 0x610D, 0x6106, 0x6137, 0x6221, 0x6222, + 0x6413, 0x643E, 0x641E, 0x642A, 0x642D, 0x643D, 0x642C, 0x640F, + 0x641C, 0x6414, 0x640D, 0x6436, 0x6416, 0x6417, 0x6406, 0x656C, + 0x659F, 0x65B0, 0x6697, 0x6689, 0x6687, 0x6688, 0x6696, 0x6684, + 0x6698, 0x668D, 0x6703, 0x6994, 0x696D, 0x695A, 0x6977, 0x6960, + 0x6954, 0x6975, 0x6930, 0x6982, 0x694A, 0x6968, 0x696B, 0x695E, + 0x6953, 0x6979, 0x6986, 0x695D, 0x6963, 0x695B, 0x6B47, 0x6B72, + 0x6BC0, 0x6BBF, 0x6BD3, 0x6BFD, 0x6EA2, 0x6EAF, 0x6ED3, 0x6EB6, + 0x6EC2, 0x6E90, 0x6E9D, 0x6EC7, 0x6EC5, 0x6EA5, 0x6E98, 0x6EBC, + 0x6EBA, 0x6EAB, 0x6ED1, 0x6E96, 0x6E9C, 0x6EC4, 0x6ED4, 0x6EAA, + 0x6EA7, 0x6EB4, 0x714E, 0x7159, 0x7169, 0x7164, 0x7149, 0x7167, + 0x715C, 0x716C, 0x7166, 0x714C, 0x7165, 0x715E, 0x7146, 0x7168, + 0x7156, 0x723A, 0x7252, 0x7337, 0x7345, 0x733F, 0x733E, 0x746F, +plane 15 +at 0x00 + 0x745A, 0x7455, 0x745F, 0x745E, 0x7441, 0x743F, 0x7459, 0x745B, + 0x745C, 0x7576, 0x7578, 0x7600, 0x75F0, 0x7601, 0x75F2, 0x75F1, + 0x75FA, 0x75FF, 0x75F4, 0x75F3, 0x76DE, 0x76DF, 0x775B, 0x776B, + 0x7766, 0x775E, 0x7763, 0x7779, 0x776A, 0x776C, 0x775C, 0x7765, + 0x7768, 0x7762, 0x77EE, 0x788E, 0x78B0, 0x7897, 0x7898, 0x788C, + 0x7889, 0x787C, 0x7891, 0x7893, 0x787F, 0x797A, 0x797F, 0x7981, + 0x842C, 0x79BD, 0x7A1C, 0x7A1A, 0x7A20, 0x7A14, 0x7A1F, 0x7A1E, + 0x7A9F, 0x7AA0, 0x7B77, 0x7BC0, 0x7B60, 0x7B6E, 0x7B67, 0x7CB1, + 0x7CB3, 0x7CB5, 0x7D93, 0x7D79, 0x7D91, 0x7D81, 0x7D8F, 0x7D5B, + 0x7F6E, 0x7F69, 0x7F6A, 0x7F72, 0x7FA9, 0x7FA8, 0x7FA4, 0x8056, + 0x8058, 0x8086, 0x8084, 0x8171, 0x8170, 0x8178, 0x8165, 0x816E, + 0x8173, 0x816B, 0x8179, 0x817A, 0x8166, 0x8205, 0x8247, 0x8482, + 0x8477, 0x843D, 0x8431, 0x8475, 0x8466, 0x846B, 0x8449, 0x846C, + 0x845B, 0x843C, 0x8435, 0x8461, 0x8463, 0x8469, 0x846D, 0x8446, + 0x865E, 0x865C, 0x865F, 0x86F9, 0x8713, 0x8708, 0x8707, 0x8700, + 0x86FE, 0x86FB, 0x8702, 0x8703, 0x8706, 0x870A, 0x8859, 0x88DF, + 0x88D4, 0x88D9, 0x88DC, 0x88D8, 0x88DD, 0x88E1, 0x88CA, 0x88D5, + 0x88D2, 0x899C, 0x89E3, 0x8A6B, 0x8A72, 0x8A73, 0x8A66, 0x8A69, + 0x8A70, 0x8A87, 0x8A7C, 0x8A63, 0x8AA0, 0x8A71, 0x8A85, 0x8A6D, + 0x8A62, 0x8A6E, 0x8A6C, 0x8A79, 0x8A7B, 0x8A3E, 0x8A68, 0x8C62, + 0x8C8A, 0x8C89, 0x8CCA, 0x8CC7, 0x8CC8, 0x8CC4, 0x8CB2, 0x8CC3, + 0x8CC2, 0x8CC5, 0x8DE1, 0x8DDF, 0x8DE8, 0x8DEF, 0x8DF3, 0x8DFA, + 0x8DEA, 0x8DE4, 0x8DE6, 0x8EB2, 0x8F03, 0x8F09, 0x8EFE, 0x8F0A, + 0x8F9F, 0x8FB2, 0x904B, 0x904A, 0x9053, 0x9042, 0x9054, 0x903C, + 0x9055, 0x9050, 0x9047, 0x904F, 0x904E, 0x904D, 0x9051, 0x903E, + 0x9041, 0x9112, 0x9117, 0x916C, 0x916A, 0x9169, 0x91C9, 0x9237, + 0x9257, 0x9238, 0x923D, 0x9240, 0x923E, 0x925B, 0x924B, 0x9264, + 0x9251, 0x9234, 0x9249, 0x924D, 0x9245, 0x9239, 0x923F, 0x925A, + 0x9598, 0x9698, 0x9694, 0x9695, 0x96CD, 0x96CB, 0x96C9, 0x96CA, + 0x96F7, 0x96FB, 0x96F9, 0x96F6, 0x9756, 0x9774, 0x9776, 0x9810, + 0x9811, 0x9813, 0x980A, 0x9812, 0x980C, 0x98FC, 0x98F4, 0x98FD, + 0x98FE, 0x99B3, 0x99B1, 0x99B4, 0x9AE1, 0x9CE9, 0x9E82, 0x9F0E, +plane 16 +at 0x00 + 0x9F13, 0x9F20, 0x50E7, 0x50EE, 0x50E5, 0x50D6, 0x50ED, 0x50DA, + 0x50D5, 0x50CF, 0x50D1, 0x50F1, 0x50CE, 0x50E9, 0x5162, 0x51F3, + 0x5283, 0x5282, 0x5331, 0x53AD, 0x55FE, 0x5600, 0x561B, 0x5617, + 0x55FD, 0x5614, 0x5606, 0x5609, 0x560D, 0x560E, 0x55F7, 0x5616, + 0x561F, 0x5608, 0x5610, 0x55F6, 0x5718, 0x5716, 0x5875, 0x587E, + 0x5883, 0x5893, 0x588A, 0x5879, 0x5885, 0x587D, 0x58FD, 0x5925, + 0x5922, 0x5924, 0x596A, 0x5969, 0x5AE1, 0x5AE6, 0x5AE9, 0x5AD7, + 0x5AD6, 0x5AD8, 0x5AE3, 0x5B75, 0x5BDE, 0x5BE7, 0x5BE1, 0x5BE5, + 0x5BE6, 0x5BE8, 0x5BE2, 0x5BE4, 0x5BDF, 0x5C0D, 0x5C62, 0x5D84, + 0x5D87, 0x5E5B, 0x5E63, 0x5E55, 0x5E57, 0x5E54, 0x5ED3, 0x5ED6, + 0x5F0A, 0x5F46, 0x5F70, 0x5FB9, 0x6147, 0x613F, 0x614B, 0x6177, + 0x6162, 0x6163, 0x615F, 0x615A, 0x6158, 0x6175, 0x622A, 0x6487, + 0x6458, 0x6454, 0x64A4, 0x6478, 0x645F, 0x647A, 0x6451, 0x6467, + 0x6434, 0x646D, 0x647B, 0x6572, 0x65A1, 0x65D7, 0x65D6, 0x66A2, + 0x66A8, 0x669D, 0x699C, 0x69A8, 0x6995, 0x69C1, 0x69AE, 0x69D3, + 0x69CB, 0x699B, 0x69B7, 0x69BB, 0x69AB, 0x69B4, 0x69D0, 0x69CD, + 0x69AD, 0x69CC, 0x69A6, 0x69C3, 0x69A3, 0x6B49, 0x6B4C, 0x6C33, + 0x6F33, 0x6F14, 0x6EFE, 0x6F13, 0x6EF4, 0x6F29, 0x6F3E, 0x6F20, + 0x6F2C, 0x6F0F, 0x6F02, 0x6F22, 0x6EFF, 0x6EEF, 0x6F06, 0x6F31, + 0x6F38, 0x6F32, 0x6F23, 0x6F15, 0x6F2B, 0x6F2F, 0x6F88, 0x6F2A, + 0x6EEC, 0x6F01, 0x6EF2, 0x6ECC, 0x6EF7, 0x7194, 0x7199, 0x717D, + 0x718A, 0x7184, 0x7192, 0x723E, 0x7292, 0x7296, 0x7344, 0x7350, + 0x7464, 0x7463, 0x746A, 0x7470, 0x746D, 0x7504, 0x7591, 0x7627, + 0x760D, 0x760B, 0x7609, 0x7613, 0x76E1, 0x76E3, 0x7784, 0x777D, + 0x777F, 0x7761, 0x78C1, 0x789F, 0x78A7, 0x78B3, 0x78A9, 0x78A3, + 0x798E, 0x798F, 0x798D, 0x7A2E, 0x7A31, 0x7AAA, 0x7AA9, 0x7AED, + 0x7AEF, 0x7BA1, 0x7B95, 0x7B8B, 0x7B75, 0x7B97, 0x7B9D, 0x7B94, + 0x7B8F, 0x7BB8, 0x7B87, 0x7B84, 0x7CB9, 0x7CBD, 0x7CBE, 0x7DBB, + 0x7DB0, 0x7D9C, 0x7DBD, 0x7DBE, 0x7DA0, 0x7DCA, 0x7DB4, 0x7DB2, + 0x7DB1, 0x7DBA, 0x7DA2, 0x7DBF, 0x7DB5, 0x7DB8, 0x7DAD, 0x7DD2, + 0x7DC7, 0x7DAC, 0x7F70, 0x7FE0, 0x7FE1, 0x7FDF, 0x805E, 0x805A, + 0x8087, 0x8150, 0x8180, 0x818F, 0x8188, 0x818A, 0x817F, 0x8182, +plane 17 +at 0x00 + 0x81E7, 0x81FA, 0x8207, 0x8214, 0x821E, 0x824B, 0x84C9, 0x84BF, + 0x84C6, 0x84C4, 0x8499, 0x849E, 0x84B2, 0x849C, 0x84CB, 0x84B8, + 0x84C0, 0x84D3, 0x8490, 0x84BC, 0x84D1, 0x84CA, 0x873F, 0x871C, + 0x873B, 0x8722, 0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, + 0x88F3, 0x8902, 0x88F4, 0x88F9, 0x88F8, 0x88FD, 0x88E8, 0x891A, + 0x88EF, 0x8AA6, 0x8A8C, 0x8A9E, 0x8AA3, 0x8A8D, 0x8AA1, 0x8A93, + 0x8AA4, 0x8AAA, 0x8AA5, 0x8AA8, 0x8A98, 0x8A91, 0x8A9A, 0x8AA7, + 0x8C6A, 0x8C8D, 0x8C8C, 0x8CD3, 0x8CD1, 0x8CD2, 0x8D6B, 0x8D99, + 0x8D95, 0x8DFC, 0x8F14, 0x8F12, 0x8F15, 0x8F13, 0x8FA3, 0x9060, + 0x9058, 0x905C, 0x9063, 0x9059, 0x905E, 0x9062, 0x905D, 0x905B, + 0x9119, 0x9118, 0x911E, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, + 0x9280, 0x9285, 0x9298, 0x9296, 0x927B, 0x9293, 0x929C, 0x92A8, + 0x927C, 0x9291, 0x95A1, 0x95A8, 0x95A9, 0x95A3, 0x95A5, 0x95A4, + 0x9699, 0x969C, 0x969B, 0x96CC, 0x96D2, 0x9700, 0x977C, 0x9785, + 0x97F6, 0x9817, 0x9818, 0x98AF, 0x98B1, 0x9903, 0x9905, 0x990C, + 0x9909, 0x99C1, 0x9AAF, 0x9AB0, 0x9AE6, 0x9B41, 0x9B42, 0x9CF4, + 0x9CF6, 0x9CF3, 0x9EBC, 0x9F3B, 0x9F4A, 0x5104, 0x5100, 0x50FB, + 0x50F5, 0x50F9, 0x5102, 0x5108, 0x5109, 0x5105, 0x51DC, 0x5287, + 0x5288, 0x5289, 0x528D, 0x528A, 0x52F0, 0x53B2, 0x562E, 0x563B, + 0x5639, 0x5632, 0x563F, 0x5634, 0x5629, 0x5653, 0x564E, 0x5657, + 0x5674, 0x5636, 0x562F, 0x5630, 0x5880, 0x589F, 0x589E, 0x58B3, + 0x589C, 0x58AE, 0x58A9, 0x58A6, 0x596D, 0x5B09, 0x5AFB, 0x5B0B, + 0x5AF5, 0x5B0C, 0x5B08, 0x5BEE, 0x5BEC, 0x5BE9, 0x5BEB, 0x5C64, + 0x5C65, 0x5D9D, 0x5D94, 0x5E62, 0x5E5F, 0x5E61, 0x5EE2, 0x5EDA, + 0x5EDF, 0x5EDD, 0x5EE3, 0x5EE0, 0x5F48, 0x5F71, 0x5FB7, 0x5FB5, + 0x6176, 0x6167, 0x616E, 0x615D, 0x6155, 0x6182, 0x617C, 0x6170, + 0x616B, 0x617E, 0x61A7, 0x6190, 0x61AB, 0x618E, 0x61AC, 0x619A, + 0x61A4, 0x6194, 0x61AE, 0x622E, 0x6469, 0x646F, 0x6479, 0x649E, + 0x64B2, 0x6488, 0x6490, 0x64B0, 0x64A5, 0x6493, 0x6495, 0x64A9, + 0x6492, 0x64AE, 0x64AD, 0x64AB, 0x649A, 0x64AC, 0x6499, 0x64A2, + 0x64B3, 0x6575, 0x6577, 0x6578, 0x66AE, 0x66AB, 0x66B4, 0x66B1, + 0x6A23, 0x6A1F, 0x69E8, 0x6A01, 0x6A1E, 0x6A19, 0x69FD, 0x6A21, +plane 18 +at 0x00 + 0x6A13, 0x6A0A, 0x69F3, 0x6A02, 0x6A05, 0x69ED, 0x6A11, 0x6B50, + 0x6B4E, 0x6BA4, 0x6BC5, 0x6BC6, 0x6F3F, 0x6F7C, 0x6F84, 0x6F51, + 0x6F66, 0x6F54, 0x6F86, 0x6F6D, 0x6F5B, 0x6F78, 0x6F6E, 0x6F8E, + 0x6F7A, 0x6F70, 0x6F64, 0x6F97, 0x6F58, 0x6ED5, 0x6F6F, 0x6F60, + 0x6F5F, 0x719F, 0x71AC, 0x71B1, 0x71A8, 0x7256, 0x729B, 0x734E, + 0x7357, 0x7469, 0x748B, 0x7483, 0x747E, 0x7480, 0x757F, 0x7620, + 0x7629, 0x761F, 0x7624, 0x7626, 0x7621, 0x7622, 0x769A, 0x76BA, + 0x76E4, 0x778E, 0x7787, 0x778C, 0x7791, 0x778B, 0x78CB, 0x78C5, + 0x78BA, 0x78CA, 0x78BE, 0x78D5, 0x78BC, 0x78D0, 0x7A3F, 0x7A3C, + 0x7A40, 0x7A3D, 0x7A37, 0x7A3B, 0x7AAF, 0x7AAE, 0x7BAD, 0x7BB1, + 0x7BC4, 0x7BB4, 0x7BC6, 0x7BC7, 0x7BC1, 0x7BA0, 0x7BCC, 0x7CCA, + 0x7DE0, 0x7DF4, 0x7DEF, 0x7DFB, 0x7DD8, 0x7DEC, 0x7DDD, 0x7DE8, + 0x7DE3, 0x7DDA, 0x7DDE, 0x7DE9, 0x7D9E, 0x7DD9, 0x7DF2, 0x7DF9, + 0x7F75, 0x7F77, 0x7FAF, 0x7FE9, 0x8026, 0x819B, 0x819C, 0x819D, + 0x81A0, 0x819A, 0x8198, 0x8517, 0x853D, 0x851A, 0x84EE, 0x852C, + 0x852D, 0x8513, 0x8511, 0x8523, 0x8521, 0x8514, 0x84EC, 0x8525, + 0x84FF, 0x8506, 0x8782, 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, + 0x8768, 0x8759, 0x8757, 0x874C, 0x8753, 0x885B, 0x885D, 0x8910, + 0x8907, 0x8912, 0x8913, 0x8915, 0x890A, 0x8ABC, 0x8AD2, 0x8AC7, + 0x8AC4, 0x8A95, 0x8ACB, 0x8AF8, 0x8AB2, 0x8AC9, 0x8AC2, 0x8ABF, + 0x8AB0, 0x8AD6, 0x8ACD, 0x8AB6, 0x8AB9, 0x8ADB, 0x8C4C, 0x8C4E, + 0x8C6C, 0x8CE0, 0x8CDE, 0x8CE6, 0x8CE4, 0x8CEC, 0x8CED, 0x8CE2, + 0x8CE3, 0x8CDC, 0x8CEA, 0x8CE1, 0x8D6D, 0x8D9F, 0x8DA3, 0x8E2B, + 0x8E10, 0x8E1D, 0x8E22, 0x8E0F, 0x8E29, 0x8E1F, 0x8E21, 0x8E1E, + 0x8EBA, 0x8F1D, 0x8F1B, 0x8F1F, 0x8F29, 0x8F26, 0x8F2A, 0x8F1C, + 0x8F1E, 0x8F25, 0x9069, 0x906E, 0x9068, 0x906D, 0x9077, 0x9130, + 0x912D, 0x9127, 0x9131, 0x9187, 0x9189, 0x918B, 0x9183, 0x92C5, + 0x92BB, 0x92B7, 0x92EA, 0x92AC, 0x92E4, 0x92C1, 0x92B3, 0x92BC, + 0x92D2, 0x92C7, 0x92F0, 0x92B2, 0x95AD, 0x95B1, 0x9704, 0x9706, + 0x9707, 0x9709, 0x9760, 0x978D, 0x978B, 0x978F, 0x9821, 0x982B, + 0x981C, 0x98B3, 0x990A, 0x9913, 0x9912, 0x9918, 0x99DD, 0x99D0, + 0x99DF, 0x99DB, 0x99D1, 0x99D5, 0x99D2, 0x99D9, 0x9AB7, 0x9AEE, +plane 19 +at 0x00 + 0x9AEF, 0x9B27, 0x9B45, 0x9B44, 0x9B77, 0x9B6F, 0x9D06, 0x9D09, + 0x9D03, 0x9EA9, 0x9EBE, 0x9ECE, 0x58A8, 0x9F52, 0x5112, 0x5118, + 0x5114, 0x5110, 0x5115, 0x5180, 0x51AA, 0x51DD, 0x5291, 0x5293, + 0x52F3, 0x5659, 0x566B, 0x5679, 0x5669, 0x5664, 0x5678, 0x566A, + 0x5668, 0x5665, 0x5671, 0x566F, 0x566C, 0x5662, 0x5676, 0x58C1, + 0x58BE, 0x58C7, 0x58C5, 0x596E, 0x5B1D, 0x5B34, 0x5B78, 0x5BF0, + 0x5C0E, 0x5F4A, 0x61B2, 0x6191, 0x61A9, 0x618A, 0x61CD, 0x61B6, + 0x61BE, 0x61CA, 0x61C8, 0x6230, 0x64C5, 0x64C1, 0x64CB, 0x64BB, + 0x64BC, 0x64DA, 0x64C4, 0x64C7, 0x64C2, 0x64CD, 0x64BF, 0x64D2, + 0x64D4, 0x64BE, 0x6574, 0x66C6, 0x66C9, 0x66B9, 0x66C4, 0x66C7, + 0x66B8, 0x6A3D, 0x6A38, 0x6A3A, 0x6A59, 0x6A6B, 0x6A58, 0x6A39, + 0x6A44, 0x6A62, 0x6A61, 0x6A4B, 0x6A47, 0x6A35, 0x6A5F, 0x6A48, + 0x6B59, 0x6B77, 0x6C05, 0x6FC2, 0x6FB1, 0x6FA1, 0x6FC3, 0x6FA4, + 0x6FC1, 0x6FA7, 0x6FB3, 0x6FC0, 0x6FB9, 0x6FB6, 0x6FA6, 0x6FA0, + 0x6FB4, 0x71BE, 0x71C9, 0x71D0, 0x71D2, 0x71C8, 0x71D5, 0x71B9, + 0x71CE, 0x71D9, 0x71DC, 0x71C3, 0x71C4, 0x7368, 0x749C, 0x74A3, + 0x7498, 0x749F, 0x749E, 0x74E2, 0x750C, 0x750D, 0x7634, 0x7638, + 0x763A, 0x76E7, 0x76E5, 0x77A0, 0x779E, 0x779F, 0x77A5, 0x78E8, + 0x78DA, 0x78EC, 0x78E7, 0x79A6, 0x7A4D, 0x7A4E, 0x7A46, 0x7A4C, + 0x7A4B, 0x7ABA, 0x7BD9, 0x7C11, 0x7BC9, 0x7BE4, 0x7BDB, 0x7BE1, + 0x7BE9, 0x7BE6, 0x7CD5, 0x7CD6, 0x7E0A, 0x7E11, 0x7E08, 0x7E1B, + 0x7E23, 0x7E1E, 0x7E1D, 0x7E09, 0x7E10, 0x7F79, 0x7FB2, 0x7FF0, + 0x7FF1, 0x7FEE, 0x8028, 0x81B3, 0x81A9, 0x81A8, 0x81FB, 0x8208, + 0x8258, 0x8259, 0x854A, 0x8559, 0x8548, 0x8568, 0x8569, 0x8543, + 0x8549, 0x856D, 0x856A, 0x855E, 0x8783, 0x879F, 0x879E, 0x87A2, + 0x878D, 0x8861, 0x892A, 0x8932, 0x8925, 0x892B, 0x8921, 0x89AA, + 0x89A6, 0x8AE6, 0x8AFA, 0x8AEB, 0x8AF1, 0x8B00, 0x8ADC, 0x8AE7, + 0x8AEE, 0x8AFE, 0x8B01, 0x8B02, 0x8AF7, 0x8AED, 0x8AF3, 0x8AF6, + 0x8AFC, 0x8C6B, 0x8C6D, 0x8C93, 0x8CF4, 0x8E44, 0x8E31, 0x8E34, + 0x8E42, 0x8E39, 0x8E35, 0x8F3B, 0x8F2F, 0x8F38, 0x8F33, 0x8FA8, + 0x8FA6, 0x9075, 0x9074, 0x9078, 0x9072, 0x907C, 0x907A, 0x9134, + 0x9192, 0x9320, 0x9336, 0x92F8, 0x9333, 0x932F, 0x9322, 0x92FC, +plane 20 +at 0x00 + 0x932B, 0x9304, 0x931A, 0x9310, 0x9326, 0x9321, 0x9315, 0x932E, + 0x9319, 0x95BB, 0x96A7, 0x96A8, 0x96AA, 0x96D5, 0x970E, 0x9711, + 0x9716, 0x970D, 0x9713, 0x970F, 0x975B, 0x975C, 0x9766, 0x9798, + 0x9830, 0x9838, 0x983B, 0x9837, 0x982D, 0x9839, 0x9824, 0x9910, + 0x9928, 0x991E, 0x991B, 0x9921, 0x991A, 0x99ED, 0x99E2, 0x99F1, + 0x9AB8, 0x9ABC, 0x9AFB, 0x9AED, 0x9B28, 0x9B91, 0x9D15, 0x9D23, + 0x9D26, 0x9D28, 0x9D12, 0x9D1B, 0x9ED8, 0x9ED4, 0x9F8D, 0x9F9C, + 0x512A, 0x511F, 0x5121, 0x5132, 0x52F5, 0x568E, 0x5680, 0x5690, + 0x5685, 0x5687, 0x568F, 0x58D5, 0x58D3, 0x58D1, 0x58CE, 0x5B30, + 0x5B2A, 0x5B24, 0x5B7A, 0x5C37, 0x5C68, 0x5DBC, 0x5DBA, 0x5DBD, + 0x5DB8, 0x5E6B, 0x5F4C, 0x5FBD, 0x61C9, 0x61C2, 0x61C7, 0x61E6, + 0x61CB, 0x6232, 0x6234, 0x64CE, 0x64CA, 0x64D8, 0x64E0, 0x64F0, + 0x64E6, 0x64EC, 0x64F1, 0x64E2, 0x64ED, 0x6582, 0x6583, 0x66D9, + 0x66D6, 0x6A80, 0x6A94, 0x6A84, 0x6AA2, 0x6A9C, 0x6ADB, 0x6AA3, + 0x6A7E, 0x6A97, 0x6A90, 0x6AA0, 0x6B5C, 0x6BAE, 0x6BDA, 0x6C08, + 0x6FD8, 0x6FF1, 0x6FDF, 0x6FE0, 0x6FDB, 0x6FE4, 0x6FEB, 0x6FEF, + 0x6F80, 0x6FEC, 0x6FE1, 0x6FE9, 0x6FD5, 0x6FEE, 0x6FF0, 0x71E7, + 0x71DF, 0x71EE, 0x71E6, 0x71E5, 0x71ED, 0x71EC, 0x71F4, 0x71E0, + 0x7235, 0x7246, 0x7370, 0x7372, 0x74A9, 0x74B0, 0x74A6, 0x74A8, + 0x7646, 0x7642, 0x764C, 0x76EA, 0x77B3, 0x77AA, 0x77B0, 0x77AC, + 0x77A7, 0x77AD, 0x77EF, 0x78F7, 0x78FA, 0x78F4, 0x78EF, 0x7901, + 0x79A7, 0x79AA, 0x7A57, 0x7ABF, 0x7C07, 0x7C0D, 0x7BFE, 0x7BF7, + 0x7C0C, 0x7BE0, 0x7CE0, 0x7CDC, 0x7CDE, 0x7CE2, 0x7CDF, 0x7CD9, + 0x7CDD, 0x7E2E, 0x7E3E, 0x7E46, 0x7E37, 0x7E32, 0x7E43, 0x7E2B, + 0x7E3D, 0x7E31, 0x7E45, 0x7E41, 0x7E34, 0x7E39, 0x7E48, 0x7E35, + 0x7E3F, 0x7E2F, 0x7F44, 0x7FF3, 0x7FFC, 0x8071, 0x8072, 0x8070, + 0x806F, 0x8073, 0x81C6, 0x81C3, 0x81BA, 0x81C2, 0x81C0, 0x81BF, + 0x81BD, 0x81C9, 0x81BE, 0x81E8, 0x8209, 0x8271, 0x85AA, 0x8584, + 0x857E, 0x859C, 0x8591, 0x8594, 0x85AF, 0x859B, 0x8587, 0x85A8, + 0x858A, 0x8667, 0x87C0, 0x87D1, 0x87B3, 0x87D2, 0x87C6, 0x87AB, + 0x87BB, 0x87BA, 0x87C8, 0x87CB, 0x893B, 0x8936, 0x8944, 0x8938, + 0x893D, 0x89AC, 0x8B0E, 0x8B17, 0x8B19, 0x8B1B, 0x8B0A, 0x8B20, +plane 21 +at 0x00 + 0x8B1D, 0x8B04, 0x8B10, 0x8C41, 0x8C3F, 0x8C73, 0x8CFA, 0x8CFD, + 0x8CFC, 0x8CF8, 0x8CFB, 0x8DA8, 0x8E49, 0x8E4B, 0x8E48, 0x8E4A, + 0x8F44, 0x8F3E, 0x8F42, 0x8F45, 0x8F3F, 0x907F, 0x907D, 0x9084, + 0x9081, 0x9082, 0x9080, 0x9139, 0x91A3, 0x919E, 0x919C, 0x934D, + 0x9382, 0x9328, 0x9375, 0x934A, 0x9365, 0x934B, 0x9318, 0x937E, + 0x936C, 0x935B, 0x9370, 0x935A, 0x9354, 0x95CA, 0x95CB, 0x95CC, + 0x95C8, 0x95C6, 0x96B1, 0x96B8, 0x96D6, 0x971C, 0x971E, 0x97A0, + 0x97D3, 0x9846, 0x98B6, 0x9935, 0x9A01, 0x99FF, 0x9BAE, 0x9BAB, + 0x9BAA, 0x9BAD, 0x9D3B, 0x9D3F, 0x9E8B, 0x9ECF, 0x9EDE, 0x9EDC, + 0x9EDD, 0x9EDB, 0x9F3E, 0x9F4B, 0x53E2, 0x5695, 0x56AE, 0x58D9, + 0x58D8, 0x5B38, 0x5F5D, 0x61E3, 0x6233, 0x64F4, 0x64F2, 0x64FE, + 0x6506, 0x64FA, 0x64FB, 0x64F7, 0x65B7, 0x66DC, 0x6726, 0x6AB3, + 0x6AAC, 0x6AC3, 0x6ABB, 0x6AB8, 0x6AC2, 0x6AAE, 0x6AAF, 0x6B5F, + 0x6B78, 0x6BAF, 0x7009, 0x700B, 0x6FFE, 0x7006, 0x6FFA, 0x7011, + 0x700F, 0x71FB, 0x71FC, 0x71FE, 0x71F8, 0x7377, 0x7375, 0x74A7, + 0x74BF, 0x7515, 0x7656, 0x7658, 0x7652, 0x77BD, 0x77BF, 0x77BB, + 0x77BC, 0x790E, 0x79AE, 0x7A61, 0x7A62, 0x7A60, 0x7AC4, 0x7AC5, + 0x7C2B, 0x7C27, 0x7C2A, 0x7C1E, 0x7C23, 0x7C21, 0x7CE7, 0x7E54, + 0x7E55, 0x7E5E, 0x7E5A, 0x7E61, 0x7E52, 0x7E59, 0x7F48, 0x7FF9, + 0x7FFB, 0x8077, 0x8076, 0x81CD, 0x81CF, 0x820A, 0x85CF, 0x85A9, + 0x85CD, 0x85D0, 0x85C9, 0x85B0, 0x85BA, 0x85B9, 0x85A6, 0x87EF, + 0x87EC, 0x87F2, 0x87E0, 0x8986, 0x89B2, 0x89F4, 0x8B28, 0x8B39, + 0x8B2C, 0x8B2B, 0x8C50, 0x8D05, 0x8E59, 0x8E63, 0x8E66, 0x8E64, + 0x8E5F, 0x8E55, 0x8EC0, 0x8F49, 0x8F4D, 0x9087, 0x9083, 0x9088, + 0x91AB, 0x91AC, 0x91D0, 0x9394, 0x938A, 0x9396, 0x93A2, 0x93B3, + 0x93AE, 0x93AC, 0x93B0, 0x9398, 0x939A, 0x9397, 0x95D4, 0x95D6, + 0x95D0, 0x95D5, 0x96E2, 0x96DC, 0x96D9, 0x96DB, 0x96DE, 0x9724, + 0x97A3, 0x97A6, 0x97AD, 0x97F9, 0x984D, 0x984F, 0x984C, 0x984E, + 0x9853, 0x98BA, 0x993E, 0x993F, 0x993D, 0x992E, 0x99A5, 0x9A0E, + 0x9AC1, 0x9B03, 0x9B06, 0x9B4F, 0x9B4E, 0x9B4D, 0x9BCA, 0x9BC9, + 0x9BFD, 0x9BC8, 0x9BC0, 0x9D51, 0x9D5D, 0x9D60, 0x9EE0, 0x9F15, + 0x9F2C, 0x5133, 0x56A5, 0x58DE, 0x58DF, 0x58E2, 0x5BF5, 0x9F90, +plane 22 +at 0x00 + 0x5EEC, 0x61F2, 0x61F7, 0x61F6, 0x61F5, 0x6500, 0x650F, 0x66E0, + 0x66DD, 0x6AE5, 0x6ADD, 0x6ADA, 0x6AD3, 0x701B, 0x701F, 0x7028, + 0x701A, 0x701D, 0x7015, 0x7018, 0x7206, 0x720D, 0x7258, 0x72A2, + 0x7378, 0x737A, 0x74BD, 0x74CA, 0x74E3, 0x7587, 0x7586, 0x765F, + 0x7661, 0x77C7, 0x7919, 0x79B1, 0x7A6B, 0x7A69, 0x7C3E, 0x7C3F, + 0x7C38, 0x7C3D, 0x7C37, 0x7C40, 0x7E6B, 0x7E6D, 0x7E79, 0x7E69, + 0x7E6A, 0x7F85, 0x7E73, 0x7FB6, 0x7FB9, 0x7FB8, 0x81D8, 0x85E9, + 0x85DD, 0x85EA, 0x85D5, 0x85E4, 0x85E5, 0x85F7, 0x87FB, 0x8805, + 0x880D, 0x87F9, 0x87FE, 0x8960, 0x895F, 0x8956, 0x895E, 0x8B41, + 0x8B5C, 0x8B58, 0x8B49, 0x8B5A, 0x8B4E, 0x8B4F, 0x8B46, 0x8B59, + 0x8D08, 0x8D0A, 0x8E7C, 0x8E72, 0x8E87, 0x8E76, 0x8E6C, 0x8E7A, + 0x8E74, 0x8F54, 0x8F4E, 0x8FAD, 0x908A, 0x908B, 0x91B1, 0x91AE, + 0x93E1, 0x93D1, 0x93DF, 0x93C3, 0x93C8, 0x93DC, 0x93DD, 0x93D6, + 0x93E2, 0x93CD, 0x93D8, 0x93E4, 0x93D7, 0x93E8, 0x95DC, 0x96B4, + 0x96E3, 0x972A, 0x9727, 0x9761, 0x97DC, 0x97FB, 0x985E, 0x9858, + 0x985B, 0x98BC, 0x9945, 0x9949, 0x9A16, 0x9A19, 0x9B0D, 0x9BE8, + 0x9BE7, 0x9BD6, 0x9BDB, 0x9D89, 0x9D61, 0x9D72, 0x9D6A, 0x9D6C, + 0x9E92, 0x9E97, 0x9E93, 0x9EB4, 0x52F8, 0x56A8, 0x56B7, 0x56B6, + 0x56B4, 0x56BC, 0x58E4, 0x5B40, 0x5B43, 0x5B7D, 0x5BF6, 0x5DC9, + 0x61F8, 0x61FA, 0x6518, 0x6514, 0x6519, 0x66E6, 0x6727, 0x6AEC, + 0x703E, 0x7030, 0x7032, 0x7210, 0x737B, 0x74CF, 0x7662, 0x7665, + 0x7926, 0x792A, 0x792C, 0x792B, 0x7AC7, 0x7AF6, 0x7C4C, 0x7C43, + 0x7C4D, 0x7CEF, 0x7CF0, 0x8FAE, 0x7E7D, 0x7E7C, 0x7E82, 0x7F4C, + 0x8000, 0x81DA, 0x8266, 0x85FB, 0x85F9, 0x8611, 0x85FA, 0x8606, + 0x860B, 0x8607, 0x860A, 0x8814, 0x8815, 0x8964, 0x89BA, 0x89F8, + 0x8B70, 0x8B6C, 0x8B66, 0x8B6F, 0x8B5F, 0x8B6B, 0x8D0F, 0x8D0D, + 0x8E89, 0x8E81, 0x8E85, 0x8E82, 0x91B4, 0x91CB, 0x9418, 0x9403, + 0x93FD, 0x95E1, 0x9730, 0x98C4, 0x9952, 0x9951, 0x99A8, 0x9A2B, + 0x9A30, 0x9A37, 0x9A35, 0x9C13, 0x9C0D, 0x9E79, 0x9EB5, 0x9EE8, + 0x9F2F, 0x9F5F, 0x9F63, 0x9F61, 0x5137, 0x5138, 0x56C1, 0x56C0, + 0x56C2, 0x5914, 0x5C6C, 0x5DCD, 0x61FC, 0x61FE, 0x651D, 0x651C, + 0x6595, 0x66E9, 0x6AFB, 0x6B04, 0x6AFA, 0x6BB2, 0x704C, 0x721B, +plane 23 +at 0x00 + 0x72A7, 0x74D6, 0x74D4, 0x7669, 0x77D3, 0x7C50, 0x7E8F, 0x7E8C, + 0x7FBC, 0x8617, 0x862D, 0x861A, 0x8823, 0x8822, 0x8821, 0x881F, + 0x896A, 0x896C, 0x89BD, 0x8B74, 0x8B77, 0x8B7D, 0x8D13, 0x8E8A, + 0x8E8D, 0x8E8B, 0x8F5F, 0x8FAF, 0x91BA, 0x942E, 0x9433, 0x9435, + 0x943A, 0x9438, 0x9432, 0x942B, 0x95E2, 0x9738, 0x9739, 0x9732, + 0x97FF, 0x9867, 0x9865, 0x9957, 0x9A45, 0x9A43, 0x9A40, 0x9A3E, + 0x9ACF, 0x9B54, 0x9B51, 0x9C2D, 0x9C25, 0x9DAF, 0x9DB4, 0x9DC2, + 0x9DB8, 0x9E9D, 0x9EEF, 0x9F19, 0x9F5C, 0x9F66, 0x9F67, 0x513C, + 0x513B, 0x56C8, 0x56CA, 0x56C9, 0x5B7F, 0x5DD4, 0x5DD2, 0x5F4E, + 0x61FF, 0x6524, 0x6B0A, 0x6B61, 0x7051, 0x7058, 0x7380, 0x74E4, + 0x758A, 0x766E, 0x766C, 0x79B3, 0x7C60, 0x7C5F, 0x807E, 0x807D, + 0x81DF, 0x8972, 0x896F, 0x89FC, 0x8B80, 0x8D16, 0x8D17, 0x8E91, + 0x8E93, 0x8F61, 0x9148, 0x9444, 0x9451, 0x9452, 0x973D, 0x973E, + 0x97C3, 0x97C1, 0x986B, 0x9955, 0x9A55, 0x9A4D, 0x9AD2, 0x9B1A, + 0x9C49, 0x9C31, 0x9C3E, 0x9C3B, 0x9DD3, 0x9DD7, 0x9F34, 0x9F6C, + 0x9F6A, 0x9F94, 0x56CC, 0x5DD6, 0x6200, 0x6523, 0x652B, 0x652A, + 0x66EC, 0x6B10, 0x74DA, 0x7ACA, 0x7C64, 0x7C63, 0x7C65, 0x7E93, + 0x7E96, 0x7E94, 0x81E2, 0x8638, 0x863F, 0x8831, 0x8B8A, 0x9090, + 0x908F, 0x9463, 0x9460, 0x9464, 0x9768, 0x986F, 0x995C, 0x9A5A, + 0x9A5B, 0x9A57, 0x9AD3, 0x9AD4, 0x9AD1, 0x9C54, 0x9C57, 0x9C56, + 0x9DE5, 0x9E9F, 0x9EF4, 0x56D1, 0x58E9, 0x652C, 0x705E, 0x7671, + 0x7672, 0x77D7, 0x7F50, 0x7F88, 0x8836, 0x8839, 0x8862, 0x8B93, + 0x8B92, 0x8B96, 0x8277, 0x8D1B, 0x91C0, 0x946A, 0x9742, 0x9748, + 0x9744, 0x97C6, 0x9870, 0x9A5F, 0x9B22, 0x9B58, 0x9C5F, 0x9DF9, + 0x9DFA, 0x9E7C, 0x9E7D, 0x9F07, 0x9F77, 0x9F72, 0x5EF3, 0x6B16, + 0x7063, 0x7C6C, 0x7C6E, 0x883B, 0x89C0, 0x8EA1, 0x91C1, 0x9472, + 0x9470, 0x9871, 0x995E, 0x9AD6, 0x9B23, 0x9ECC, 0x7064, 0x77DA, + 0x8B9A, 0x9477, 0x97C9, 0x9A62, 0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, + 0x91C5, 0x947D, 0x947E, 0x947C, 0x9C77, 0x9C78, 0x9EF7, 0x8C54, + 0x947F, 0x9E1A, 0x7228, 0x9A6A, 0x9B31, 0x9E1B, 0x9E1E, 0x7C72, + 0xF6B1, 0xF6B2, 0xF6B3, 0xF6B4, 0xF6B5, 0xF6B6, 0xF6B7, 0xF6B8, + 0xF6B9, 0xF6BA, 0xF6BB, 0xF6BC, 0xF6BD, 0xF6BE, 0xF6BF, 0xF6C0, +plane 24 +at 0x00 + 0xF6C1, 0xF6C2, 0xF6C3, 0xF6C4, 0xF6C5, 0xF6C6, 0xF6C7, 0xF6C8, + 0xF6C9, 0xF6CA, 0xF6CB, 0xF6CC, 0xF6CD, 0xF6CE, 0xF6CF, 0xF6D0, + 0xF6D1, 0xF6D2, 0xF6D3, 0xF6D4, 0xF6D5, 0xF6D6, 0xF6D7, 0xF6D8, + 0xF6D9, 0xF6DA, 0xF6DB, 0xF6DC, 0xF6DD, 0xF6DE, 0xF6DF, 0xF6E0, + 0xF6E1, 0xF6E2, 0xF6E3, 0xF6E4, 0xF6E5, 0xF6E6, 0xF6E7, 0xF6E8, + 0xF6E9, 0xF6EA, 0xF6EB, 0xF6EC, 0xF6ED, 0xF6EE, 0xF6EF, 0xF6F0, + 0xF6F1, 0xF6F2, 0xF6F3, 0xF6F4, 0xF6F5, 0xF6F6, 0xF6F7, 0xF6F8, + 0xF6F9, 0xF6FA, 0xF6FB, 0xF6FC, 0xF6FD, 0xF6FE, 0xF6FF, 0xF700, + 0xF701, 0xF702, 0xF703, 0xF704, 0xF705, 0xF706, 0xF707, 0xF708, + 0xF709, 0xF70A, 0xF70B, 0xF70C, 0xF70D, 0xF70E, 0xF70F, 0xF710, + 0xF711, 0xF712, 0xF713, 0xF714, 0xF715, 0xF716, 0xF717, 0xF718, + 0xF719, 0xF71A, 0xF71B, 0xF71C, 0xF71D, 0xF71E, 0xF71F, 0xF720, + 0xF721, 0xF722, 0xF723, 0xF724, 0xF725, 0xF726, 0xF727, 0xF728, + 0xF729, 0xF72A, 0xF72B, 0xF72C, 0xF72D, 0xF72E, 0xF72F, 0xF730, + 0xF731, 0xF732, 0xF733, 0xF734, 0xF735, 0xF736, 0xF737, 0xF738, + 0xF739, 0xF73A, 0xF73B, 0xF73C, 0xF73D, 0xF73E, 0xF73F, 0xF740, + 0xF741, 0xF742, 0xF743, 0xF744, 0xF745, 0xF746, 0xF747, 0xF748, + 0xF749, 0xF74A, 0xF74B, 0xF74C, 0xF74D, 0xF74E, 0xF74F, 0xF750, + 0xF751, 0xF752, 0xF753, 0xF754, 0xF755, 0xF756, 0xF757, 0xF758, + 0xF759, 0xF75A, 0xF75B, 0xF75C, 0xF75D, 0xF75E, 0xF75F, 0xF760, + 0xF761, 0xF762, 0xF763, 0xF764, 0xF765, 0xF766, 0xF767, 0xF768, + 0xF769, 0xF76A, 0xF76B, 0xF76C, 0xF76D, 0xF76E, 0xF76F, 0xF770, + 0xF771, 0xF772, 0xF773, 0xF774, 0xF775, 0xF776, 0xF777, 0xF778, + 0xF779, 0xF77A, 0xF77B, 0xF77C, 0xF77D, 0xF77E, 0xF77F, 0xF780, + 0xF781, 0xF782, 0xF783, 0xF784, 0xF785, 0xF786, 0xF787, 0xF788, + 0xF789, 0xF78A, 0xF78B, 0xF78C, 0xF78D, 0xF78E, 0xF78F, 0xF790, + 0xF791, 0xF792, 0xF793, 0xF794, 0xF795, 0xF796, 0xF797, 0xF798, + 0xF799, 0xF79A, 0xF79B, 0xF79C, 0xF79D, 0xF79E, 0xF79F, 0xF7A0, + 0xF7A1, 0xF7A2, 0xF7A3, 0xF7A4, 0xF7A5, 0xF7A6, 0xF7A7, 0xF7A8, + 0xF7A9, 0xF7AA, 0xF7AB, 0xF7AC, 0xF7AD, 0xF7AE, 0xF7AF, 0xF7B0, + 0xF7B1, 0xF7B2, 0xF7B3, 0xF7B4, 0xF7B5, 0xF7B6, 0xF7B7, 0xF7B8, + 0xF7B9, 0xF7BA, 0xF7BB, 0xF7BC, 0xF7BD, 0xF7BE, 0xF7BF, 0xF7C0, +plane 25 +at 0x00 + 0xF7C1, 0xF7C2, 0xF7C3, 0xF7C4, 0xF7C5, 0xF7C6, 0xF7C7, 0xF7C8, + 0xF7C9, 0xF7CA, 0xF7CB, 0xF7CC, 0xF7CD, 0xF7CE, 0xF7CF, 0xF7D0, + 0xF7D1, 0xF7D2, 0xF7D3, 0xF7D4, 0xF7D5, 0xF7D6, 0xF7D7, 0xF7D8, + 0xF7D9, 0xF7DA, 0xF7DB, 0xF7DC, 0xF7DD, 0xF7DE, 0xF7DF, 0xF7E0, + 0xF7E1, 0xF7E2, 0xF7E3, 0xF7E4, 0xF7E5, 0xF7E6, 0xF7E7, 0xF7E8, + 0xF7E9, 0xF7EA, 0xF7EB, 0xF7EC, 0xF7ED, 0xF7EE, 0xF7EF, 0xF7F0, + 0xF7F1, 0xF7F2, 0xF7F3, 0xF7F4, 0xF7F5, 0xF7F6, 0xF7F7, 0xF7F8, + 0xF7F9, 0xF7FA, 0xF7FB, 0xF7FC, 0xF7FD, 0xF7FE, 0xF7FF, 0xF800, + 0xF801, 0xF802, 0xF803, 0xF804, 0xF805, 0xF806, 0xF807, 0xF808, + 0xF809, 0xF80A, 0xF80B, 0xF80C, 0xF80D, 0xF80E, 0xF80F, 0xF810, + 0xF811, 0xF812, 0xF813, 0xF814, 0xF815, 0xF816, 0xF817, 0xF818, + 0xF819, 0xF81A, 0xF81B, 0xF81C, 0xF81D, 0xF81E, 0xF81F, 0xF820, + 0xF821, 0xF822, 0xF823, 0xF824, 0xF825, 0xF826, 0xF827, 0xF828, + 0xF829, 0xF82A, 0xF82B, 0xF82C, 0xF82D, 0xF82E, 0xF82F, 0xF830, + 0xF831, 0xF832, 0xF833, 0xF834, 0xF835, 0xF836, 0xF837, 0xF838, + 0xF839, 0xF83A, 0xF83B, 0xF83C, 0xF83D, 0xF83E, 0xF83F, 0xF840, + 0xF841, 0xF842, 0xF843, 0xF844, 0xF845, 0xF846, 0xF847, 0xF848, + 0x4E42, 0x4E5C, 0x51F5, 0x531A, 0x5382, 0x4E07, 0x4E0C, 0x4E47, + 0x4E8D, 0x56D7, 0xFA0C, 0x5C6E, 0x5F73, 0x4E0F, 0x5187, 0x4E0E, + 0x4E2E, 0x4E93, 0x4EC2, 0x4EC9, 0x4EC8, 0x5198, 0x52FC, 0x536C, + 0x53B9, 0x5720, 0x5903, 0x592C, 0x5C10, 0x5DFF, 0x65E1, 0x6BB3, + 0x6BCC, 0x6C14, 0x723F, 0x4E31, 0x4E3C, 0x4EE8, 0x4EDC, 0x4EE9, + 0x4EE1, 0x4EDD, 0x4EDA, 0x520C, 0x531C, 0x534C, 0x5722, 0x5723, + 0x5917, 0x592F, 0x5B81, 0x5B84, 0x5C12, 0x5C3B, 0x5C74, 0x5C73, + 0x5E04, 0x5E80, 0x5E82, 0x5FC9, 0x6209, 0x6250, 0x6C15, 0x6C36, + 0x6C43, 0x6C3F, 0x6C3B, 0x72AE, 0x72B0, 0x738A, 0x79B8, 0x808A, + 0x961E, 0x4F0E, 0x4F18, 0x4F2C, 0x4EF5, 0x4F14, 0x4EF1, 0x4F00, + 0x4EF7, 0x4F08, 0x4F1D, 0x4F02, 0x4F05, 0x4F22, 0x4F13, 0x4F04, + 0x4EF4, 0x4F12, 0x51B1, 0x5213, 0x5209, 0x5210, 0x52A6, 0x5322, + 0x531F, 0x534D, 0x538A, 0x5407, 0x56E1, 0x56DF, 0x572E, 0x572A, + 0x5734, 0x593C, 0x5980, 0x597C, 0x5985, 0x597B, 0x597E, 0x5977, + 0x597F, 0x5B56, 0x5C15, 0x5C25, 0x5C7C, 0x5C7A, 0x5C7B, 0x5C7E, +plane 26 +at 0x00 + 0x5DDF, 0x5E75, 0x5E84, 0x5F02, 0x5F1A, 0x5F74, 0x5FD5, 0x5FD4, + 0x5FCF, 0x625C, 0x625E, 0x6264, 0x6261, 0x6266, 0x6262, 0x6259, + 0x6260, 0x625A, 0x6265, 0x65EF, 0x65EE, 0x673E, 0x6739, 0x6738, + 0x673B, 0x673A, 0x673F, 0x673C, 0x6733, 0x6C18, 0x6C46, 0x6C52, + 0x6C5C, 0x6C4F, 0x6C4A, 0x6C54, 0x6C4B, 0x6C4C, 0x7071, 0x725E, + 0x72B4, 0x72B5, 0x738E, 0x752A, 0x767F, 0x7A75, 0x7F51, 0x8278, + 0x827C, 0x8280, 0x827D, 0x827F, 0x864D, 0x897E, 0x9099, 0x9097, + 0x9098, 0x909B, 0x9094, 0x9622, 0x9624, 0x9620, 0x9623, 0x4F56, + 0x4F3B, 0x4F62, 0x4F49, 0x4F53, 0x4F64, 0x4F3E, 0x4F67, 0x4F52, + 0x4F5F, 0x4F41, 0x4F58, 0x4F2D, 0x4F33, 0x4F3F, 0x4F61, 0x518F, + 0x51B9, 0x521C, 0x521E, 0x5221, 0x52AD, 0x52AE, 0x5309, 0x5363, + 0x5372, 0x538E, 0x538F, 0x5430, 0x5437, 0x542A, 0x5454, 0x5445, + 0x5419, 0x541C, 0x5425, 0x5418, 0x543D, 0x544F, 0x5441, 0x5428, + 0x5424, 0x5447, 0x56EE, 0x56E7, 0x56E5, 0x5741, 0x5745, 0x574C, + 0x5749, 0x574B, 0x5752, 0x5906, 0x5940, 0x59A6, 0x5998, 0x59A0, + 0x5997, 0x598E, 0x59A2, 0x5990, 0x598F, 0x59A7, 0x59A1, 0x5B8E, + 0x5B92, 0x5C28, 0x5C2A, 0x5C8D, 0x5C8F, 0x5C88, 0x5C8B, 0x5C89, + 0x5C92, 0x5C8A, 0x5C86, 0x5C93, 0x5C95, 0x5DE0, 0x5E0A, 0x5E0E, + 0x5E8B, 0x5E89, 0x5E8C, 0x5E88, 0x5E8D, 0x5F05, 0x5F1D, 0x5F78, + 0x5F76, 0x5FD2, 0x5FD1, 0x5FD0, 0x5FED, 0x5FE8, 0x5FEE, 0x5FF3, + 0x5FE1, 0x5FE4, 0x5FE3, 0x5FFA, 0x5FEF, 0x5FF7, 0x5FFB, 0x6000, + 0x5FF4, 0x623A, 0x6283, 0x628C, 0x628E, 0x628F, 0x6294, 0x6287, + 0x6271, 0x627B, 0x627A, 0x6270, 0x6281, 0x6288, 0x6277, 0x627D, + 0x6272, 0x6274, 0x6537, 0x65F0, 0x65F4, 0x65F3, 0x65F2, 0x65F5, + 0x6745, 0x6747, 0x6759, 0x6755, 0x674C, 0x6748, 0x675D, 0x674D, + 0x675A, 0x674B, 0x6BD0, 0x6C19, 0x6C1A, 0x6C78, 0x6C67, 0x6C6B, + 0x6C84, 0x6C8B, 0x6C8F, 0x6C71, 0x6C6F, 0x6C69, 0x6C9A, 0x6C6D, + 0x6C87, 0x6C95, 0x6C9C, 0x6C66, 0x6C73, 0x6C65, 0x6C7B, 0x6C8E, + 0x7074, 0x707A, 0x7263, 0x72BF, 0x72BD, 0x72C3, 0x72C6, 0x72C1, + 0x72BA, 0x72C5, 0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753A, + 0x7539, 0x7594, 0x7595, 0x7681, 0x793D, 0x8034, 0x8095, 0x8099, + 0x8090, 0x8092, 0x809C, 0x8290, 0x828F, 0x8285, 0x828E, 0x8291, +plane 27 +at 0x00 + 0x8293, 0x828A, 0x8283, 0x8284, 0x8C78, 0x8FC9, 0x8FBF, 0x909F, + 0x90A1, 0x90A5, 0x909E, 0x90A7, 0x90A0, 0x9630, 0x9628, 0x962F, + 0x962D, 0x4E33, 0x4F98, 0x4F7C, 0x4F85, 0x4F7D, 0x4F80, 0x4F87, + 0x4F76, 0x4F74, 0x4F89, 0x4F84, 0x4F77, 0x4F4C, 0x4F97, 0x4F6A, + 0x4F9A, 0x4F79, 0x4F81, 0x4F78, 0x4F90, 0x4F9C, 0x4F94, 0x4F9E, + 0x4F92, 0x4F82, 0x4F95, 0x4F6B, 0x4F6E, 0x519E, 0x51BC, 0x51BE, + 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, 0x52BC, 0x530A, 0x530B, + 0x533C, 0x5392, 0x5394, 0x5487, 0x547F, 0x5481, 0x5491, 0x5482, + 0x5488, 0x546B, 0x547A, 0x547E, 0x5465, 0x546C, 0x5474, 0x5466, + 0x548D, 0x546F, 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, + 0x56F7, 0x56F9, 0x576F, 0x5772, 0x576D, 0x576B, 0x5771, 0x5770, + 0x5776, 0x5780, 0x5775, 0x577B, 0x5773, 0x5774, 0x5762, 0x5768, + 0x577D, 0x590C, 0x5945, 0x59B5, 0x59BA, 0x59CF, 0x59CE, 0x59B2, + 0x59CC, 0x59C1, 0x59B6, 0x59BC, 0x59C3, 0x59D6, 0x59B1, 0x59BD, + 0x59C0, 0x59C8, 0x59B4, 0x59C7, 0x5B62, 0x5B65, 0x5B93, 0x5B95, + 0x5C44, 0x5C47, 0x5CAE, 0x5CA4, 0x5CA0, 0x5CB5, 0x5CAF, 0x5CA8, + 0x5CAC, 0x5C9F, 0x5CA3, 0x5CAD, 0x5CA2, 0x5CAA, 0x5CA7, 0x5C9D, + 0x5CA5, 0x5CB6, 0x5CB0, 0x5CA6, 0x5E17, 0x5E14, 0x5E19, 0x5F28, + 0x5F22, 0x5F23, 0x5F24, 0x5F54, 0x5F82, 0x5F7E, 0x5F7D, 0x5FDE, + 0x5FE5, 0x602D, 0x6026, 0x6019, 0x6032, 0x600B, 0x6034, 0x600A, + 0x6017, 0x6033, 0x601A, 0x601E, 0x602C, 0x6022, 0x600D, 0x6010, + 0x602E, 0x6013, 0x6011, 0x600C, 0x6009, 0x601C, 0x6214, 0x623D, + 0x62AD, 0x62B4, 0x62D1, 0x62BE, 0x62AA, 0x62B6, 0x62CA, 0x62AE, + 0x62B3, 0x62AF, 0x62BB, 0x62A9, 0x62B0, 0x62B8, 0x653D, 0x65A8, + 0x65BB, 0x6609, 0x65FC, 0x6604, 0x6612, 0x6608, 0x65FB, 0x6603, + 0x660B, 0x660D, 0x6605, 0x65FD, 0x6611, 0x6610, 0x66F6, 0x670A, + 0x6785, 0x676C, 0x678E, 0x6792, 0x6776, 0x677B, 0x6798, 0x6786, + 0x6784, 0x6774, 0x678D, 0x678C, 0x677A, 0x679F, 0x6791, 0x6799, + 0x6783, 0x677D, 0x6781, 0x6778, 0x6779, 0x6794, 0x6B25, 0x6B80, + 0x6B7E, 0x6BDE, 0x6C1D, 0x6C93, 0x6CEC, 0x6CEB, 0x6CEE, 0x6CD9, + 0x6CB6, 0x6CD4, 0x6CAD, 0x6CE7, 0x6CB7, 0x6CD0, 0x6CC2, 0x6CBA, + 0x6CC3, 0x6CC6, 0x6CED, 0x6CF2, 0x6CD2, 0x6CDD, 0x6CB4, 0x6C8A, +plane 28 +at 0x00 + 0x6C9D, 0x6C80, 0x6CDE, 0x6CC0, 0x6D30, 0x6CCD, 0x6CC7, 0x6CB0, + 0x6CF9, 0x6CCF, 0x6CE9, 0x6CD1, 0x7094, 0x7098, 0x7085, 0x7093, + 0x7086, 0x7084, 0x7091, 0x7096, 0x7082, 0x709A, 0x7083, 0x726A, + 0x72D6, 0x72CB, 0x72D8, 0x72C9, 0x72DC, 0x72D2, 0x72D4, 0x72DA, + 0x72CC, 0x72D1, 0x73A4, 0x73A1, 0x73AD, 0x73A6, 0x73A2, 0x73A0, + 0x73AC, 0x739D, 0x74DD, 0x74E8, 0x753F, 0x7540, 0x753E, 0x758C, + 0x7598, 0x76AF, 0x76F3, 0x76F1, 0x76F0, 0x76F5, 0x77F8, 0x77FC, + 0x77F9, 0x77FB, 0x77FA, 0x77F7, 0x7942, 0x793F, 0x79C5, 0x7A78, + 0x7A7B, 0x7AFB, 0x7C75, 0x7CFD, 0x8035, 0x808F, 0x80AE, 0x80A3, + 0x80B8, 0x80B5, 0x80AD, 0x8220, 0x82A0, 0x82C0, 0x82AB, 0x829A, + 0x8298, 0x829B, 0x82B5, 0x82A7, 0x82AE, 0x82BC, 0x829E, 0x82BA, + 0x82B4, 0x82A8, 0x82A1, 0x82A9, 0x82C2, 0x82A4, 0x82C3, 0x82B6, + 0x82A2, 0x8670, 0x866F, 0x866D, 0x866E, 0x8C56, 0x8FD2, 0x8FCB, + 0x8FD3, 0x8FCD, 0x8FD6, 0x8FD5, 0x8FD7, 0x90B2, 0x90B4, 0x90AF, + 0x90B3, 0x90B0, 0x9639, 0x963D, 0x963C, 0x963A, 0x9643, 0x4FCD, + 0x4FC5, 0x4FD3, 0x4FB2, 0x4FC9, 0x4FCB, 0x4FC1, 0x4FD4, 0x4FDC, + 0x4FD9, 0x4FBB, 0x4FB3, 0x4FDB, 0x4FC7, 0x4FD6, 0x4FBA, 0x4FC0, + 0x4FB9, 0x4FEC, 0x5244, 0x5249, 0x52C0, 0x52C2, 0x533D, 0x537C, + 0x5397, 0x5396, 0x5399, 0x5398, 0x54BA, 0x54A1, 0x54AD, 0x54A5, + 0x54CF, 0x54C3, 0x830D, 0x54B7, 0x54AE, 0x54D6, 0x54B6, 0x54C5, + 0x54C6, 0x54A0, 0x5470, 0x54BC, 0x54A2, 0x54BE, 0x5472, 0x54DE, + 0x54B0, 0x57B5, 0x579E, 0x579F, 0x57A4, 0x578C, 0x5797, 0x579D, + 0x579B, 0x5794, 0x5798, 0x578F, 0x5799, 0x57A5, 0x579A, 0x5795, + 0x58F4, 0x590D, 0x5953, 0x59E1, 0x59DE, 0x59EE, 0x5A00, 0x59F1, + 0x59DD, 0x59FA, 0x59FD, 0x59FC, 0x59F6, 0x59E4, 0x59F2, 0x59F7, + 0x59DB, 0x59E9, 0x59F3, 0x59F5, 0x59E0, 0x59FE, 0x59F4, 0x59ED, + 0x5BA8, 0x5C4C, 0x5CD0, 0x5CD8, 0x5CCC, 0x5CD7, 0x5CCB, 0x5CDB, + 0x5CDE, 0x5CDA, 0x5CC9, 0x5CC7, 0x5CCA, 0x5CD6, 0x5CD3, 0x5CD4, + 0x5CCF, 0x5CC8, 0x5CC6, 0x5CCE, 0x5CDF, 0x5CF8, 0x5DF9, 0x5E21, + 0x5E22, 0x5E23, 0x5E20, 0x5E24, 0x5EB0, 0x5EA4, 0x5EA2, 0x5E9B, + 0x5EA3, 0x5EA5, 0x5F07, 0x5F2E, 0x5F56, 0x5F86, 0x6037, 0x6039, + 0x6054, 0x6072, 0x605E, 0x6045, 0x6053, 0x6047, 0x6049, 0x605B, +plane 29 +at 0x00 + 0x604C, 0x6040, 0x6042, 0x605F, 0x6024, 0x6044, 0x6058, 0x6066, + 0x606E, 0x6242, 0x6243, 0x62CF, 0x630D, 0x630B, 0x62F5, 0x630E, + 0x6303, 0x62EB, 0x62F9, 0x630F, 0x630C, 0x62F8, 0x62F6, 0x6300, + 0x6313, 0x6314, 0x62FA, 0x6315, 0x62FB, 0x62F0, 0x6541, 0x6543, + 0x65AA, 0x65BF, 0x6636, 0x6621, 0x6632, 0x6635, 0x661C, 0x6626, + 0x6622, 0x6633, 0x662B, 0x663A, 0x661D, 0x6634, 0x6639, 0x662E, + 0x670F, 0x6710, 0x67C1, 0x67F2, 0x67C8, 0x67BA, 0x67DC, 0x67BB, + 0x67F8, 0x67D8, 0x67C0, 0x67B7, 0x67C5, 0x67EB, 0x67E4, 0x67DF, + 0x67B5, 0x67CD, 0x67B3, 0x67F7, 0x67F6, 0x67EE, 0x67E3, 0x67C2, + 0x67B9, 0x67CE, 0x67E7, 0x67F0, 0x67B2, 0x67FC, 0x67C6, 0x67ED, + 0x67CC, 0x67AE, 0x67E6, 0x67DB, 0x67FA, 0x67C9, 0x67CA, 0x67C3, + 0x67EA, 0x67CB, 0x6B28, 0x6B82, 0x6B84, 0x6BB6, 0x6BD6, 0x6BD8, + 0x6BE0, 0x6C20, 0x6C21, 0x6D28, 0x6D34, 0x6D2D, 0x6D1F, 0x6D3C, + 0x6D3F, 0x6D12, 0x6D0A, 0x6CDA, 0x6D33, 0x6D04, 0x6D19, 0x6D3A, + 0x6D1A, 0x6D11, 0x6D00, 0x6D1D, 0x6D42, 0x6D01, 0x6D18, 0x6D37, + 0x6D03, 0x6D0F, 0x6D40, 0x6D07, 0x6D20, 0x6D2C, 0x6D08, 0x6D22, + 0x6D09, 0x6D10, 0x70B7, 0x709F, 0x70BE, 0x70B1, 0x70B0, 0x70A1, + 0x70B4, 0x70B5, 0x70A9, 0x7241, 0x7249, 0x724A, 0x726C, 0x7270, + 0x7273, 0x726E, 0x72CA, 0x72E4, 0x72E8, 0x72EB, 0x72DF, 0x72EA, + 0x72E6, 0x72E3, 0x7385, 0x73CC, 0x73C2, 0x73C8, 0x73C5, 0x73B9, + 0x73B6, 0x73B5, 0x73B4, 0x73EB, 0x73BF, 0x73C7, 0x73BE, 0x73C3, + 0x73C6, 0x73B8, 0x73CB, 0x74EC, 0x74EE, 0x752E, 0x7547, 0x7548, + 0x75A7, 0x75AA, 0x7679, 0x76C4, 0x7708, 0x7703, 0x7704, 0x7705, + 0x770A, 0x76F7, 0x76FB, 0x76FA, 0x77E7, 0x77E8, 0x7806, 0x7811, + 0x7812, 0x7805, 0x7810, 0x780F, 0x780E, 0x7809, 0x7803, 0x7813, + 0x794A, 0x794C, 0x794B, 0x7945, 0x7944, 0x79D5, 0x79CD, 0x79CF, + 0x79D6, 0x79CE, 0x7A80, 0x7A7E, 0x7AD1, 0x7B00, 0x7B01, 0x7C7A, + 0x7C78, 0x7C79, 0x7C7F, 0x7C80, 0x7C81, 0x7D03, 0x7D08, 0x7D01, + 0x7F58, 0x7F91, 0x7F8D, 0x7FBE, 0x8007, 0x800E, 0x800F, 0x8014, + 0x8037, 0x80D8, 0x80C7, 0x80E0, 0x80D1, 0x80C8, 0x80C2, 0x80D0, + 0x80C5, 0x80E3, 0x80D9, 0x80DC, 0x80CA, 0x80D5, 0x80C9, 0x80CF, + 0x80D7, 0x80E6, 0x80CD, 0x81FF, 0x8221, 0x8294, 0x82D9, 0x82FE, +plane 30 +at 0x00 + 0x82F9, 0x8307, 0x82E8, 0x8300, 0x82D5, 0x833A, 0x82EB, 0x82D6, + 0x82F4, 0x82EC, 0x82E1, 0x82F2, 0x82F5, 0x830C, 0x82FB, 0x82F6, + 0x82F0, 0x82EA, 0x82E4, 0x82E0, 0x82FA, 0x82F3, 0x82ED, 0x8677, + 0x8674, 0x867C, 0x8673, 0x8841, 0x884E, 0x8867, 0x886A, 0x8869, + 0x89D3, 0x8A04, 0x8A07, 0x8D72, 0x8FE3, 0x8FE1, 0x8FEE, 0x8FE0, + 0x90F1, 0x90BD, 0x90BF, 0x90D5, 0x90C5, 0x90BE, 0x90C7, 0x90CB, + 0x90C8, 0x91D4, 0x91D3, 0x9654, 0x964F, 0x9651, 0x9653, 0x964A, + 0x964E, 0x501E, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501B, + 0x4FF5, 0x4FF4, 0x5033, 0x5037, 0x502C, 0x4FF6, 0x4FF7, 0x5017, + 0x501C, 0x5020, 0x5027, 0x5035, 0x502F, 0x5031, 0x500E, 0x515A, + 0x5194, 0x5193, 0x51CA, 0x51C4, 0x51C5, 0x51C8, 0x51CE, 0x5261, + 0x525A, 0x5252, 0x525E, 0x525F, 0x5255, 0x5262, 0x52CD, 0x530E, + 0x539E, 0x5526, 0x54E2, 0x5517, 0x5512, 0x54E7, 0x54F3, 0x54E4, + 0x551A, 0x54FF, 0x5504, 0x5508, 0x54EB, 0x5511, 0x5505, 0x54F1, + 0x550A, 0x54FB, 0x54F7, 0x54F8, 0x54E0, 0x550E, 0x5503, 0x550B, + 0x5701, 0x5702, 0x57CC, 0x5832, 0x57D5, 0x57D2, 0x57BA, 0x57C6, + 0x57BD, 0x57BC, 0x57B8, 0x57B6, 0x57BF, 0x57C7, 0x57D0, 0x57B9, + 0x57C1, 0x590E, 0x594A, 0x5A19, 0x5A16, 0x5A2D, 0x5A2E, 0x5A15, + 0x5A0F, 0x5A17, 0x5A0A, 0x5A1E, 0x5A33, 0x5B6C, 0x5BA7, 0x5BAD, + 0x5BAC, 0x5C03, 0x5C56, 0x5C54, 0x5CEC, 0x5CFF, 0x5CEE, 0x5CF1, + 0x5CF7, 0x5D00, 0x5CF9, 0x5E29, 0x5E28, 0x5EA8, 0x5EAE, 0x5EAA, + 0x5EAC, 0x5F33, 0x5F30, 0x5F67, 0x605D, 0x605A, 0x6067, 0x6041, + 0x60A2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609D, 0x6083, 0x6095, + 0x609B, 0x6097, 0x6087, 0x609C, 0x608E, 0x6219, 0x6246, 0x62F2, + 0x6310, 0x6356, 0x632C, 0x6344, 0x6345, 0x6336, 0x6343, 0x63E4, + 0x6339, 0x634B, 0x634A, 0x633C, 0x6329, 0x6341, 0x6334, 0x6358, + 0x6354, 0x6359, 0x632D, 0x6347, 0x6333, 0x635A, 0x6351, 0x6338, + 0x6357, 0x6340, 0x6348, 0x654A, 0x6546, 0x65C6, 0x65C3, 0x65C4, + 0x65C2, 0x664A, 0x665F, 0x6647, 0x6651, 0x6712, 0x6713, 0x681F, + 0x681A, 0x6849, 0x6832, 0x6833, 0x683B, 0x684B, 0x684F, 0x6816, + 0x6831, 0x681C, 0x6835, 0x682B, 0x682D, 0x682F, 0x684E, 0x6844, + 0x6834, 0x681D, 0x6812, 0x6814, 0x6826, 0x6828, 0x682E, 0x684D, +plane 31 +at 0x00 + 0x683A, 0x6825, 0x6820, 0x6B2C, 0x6B2F, 0x6B2D, 0x6B31, 0x6B34, + 0x6B6D, 0x8082, 0x6B88, 0x6BE6, 0x6BE4, 0x6BE8, 0x6BE3, 0x6BE2, + 0x6BE7, 0x6C25, 0x6D7A, 0x6D63, 0x6D64, 0x6D76, 0x6D0D, 0x6D61, + 0x6D92, 0x6D58, 0x6D62, 0x6D6D, 0x6D6F, 0x6D91, 0x6D8D, 0x6DEF, + 0x6D7F, 0x6D86, 0x6D5E, 0x6D67, 0x6D60, 0x6D97, 0x6D70, 0x6D7C, + 0x6D5F, 0x6D82, 0x6D98, 0x6D2F, 0x6D68, 0x6D8B, 0x6D7E, 0x6D80, + 0x6D84, 0x6D16, 0x6D83, 0x6D7B, 0x6D7D, 0x6D75, 0x6D90, 0x70DC, + 0x70D3, 0x70D1, 0x70DD, 0x70CB, 0x7F39, 0x70E2, 0x70D7, 0x70D2, + 0x70DE, 0x70E0, 0x70D4, 0x70CD, 0x70C5, 0x70C6, 0x70C7, 0x70DA, + 0x70CE, 0x70E1, 0x7242, 0x7278, 0x7277, 0x7276, 0x7300, 0x72FA, + 0x72F4, 0x72FE, 0x72F6, 0x72F3, 0x72FB, 0x7301, 0x73D3, 0x73D9, + 0x73E5, 0x73D6, 0x73BC, 0x73E7, 0x73E3, 0x73E9, 0x73DC, 0x73D2, + 0x73DB, 0x73D4, 0x73DD, 0x73DA, 0x73D7, 0x73D8, 0x73E8, 0x74DE, + 0x74DF, 0x74F4, 0x74F5, 0x7521, 0x755B, 0x755F, 0x75B0, 0x75C1, + 0x75BB, 0x75C4, 0x75C0, 0x75BF, 0x75B6, 0x75BA, 0x768A, 0x76C9, + 0x771D, 0x771B, 0x7710, 0x7713, 0x7712, 0x7723, 0x7711, 0x7715, + 0x7719, 0x771A, 0x7722, 0x7727, 0x7823, 0x782C, 0x7822, 0x7835, + 0x782F, 0x7828, 0x782E, 0x782B, 0x7821, 0x7829, 0x7833, 0x782A, + 0x7831, 0x7954, 0x795B, 0x794F, 0x795C, 0x7953, 0x7952, 0x7951, + 0x79EB, 0x79EC, 0x79E0, 0x79EE, 0x79ED, 0x79EA, 0x79DC, 0x79DE, + 0x79DD, 0x7A86, 0x7A89, 0x7A85, 0x7A8B, 0x7A8C, 0x7A8A, 0x7A87, + 0x7AD8, 0x7B10, 0x7B04, 0x7B13, 0x7B05, 0x7B0F, 0x7B08, 0x7B0A, + 0x7B0E, 0x7B09, 0x7B12, 0x7C84, 0x7C91, 0x7C8A, 0x7C8C, 0x7C88, + 0x7C8D, 0x7C85, 0x7D1E, 0x7D1D, 0x7D11, 0x7D0E, 0x7D18, 0x7D16, + 0x7D13, 0x7D1F, 0x7D12, 0x7D0F, 0x7D0C, 0x7F5C, 0x7F61, 0x7F5E, + 0x7F60, 0x7F5D, 0x7F5B, 0x7F96, 0x7F92, 0x7FC3, 0x7FC2, 0x7FC0, + 0x8016, 0x803E, 0x8039, 0x80FA, 0x80F2, 0x80F9, 0x80F5, 0x8101, + 0x80FB, 0x8100, 0x8201, 0x822F, 0x8225, 0x8333, 0x832D, 0x8344, + 0x8319, 0x8351, 0x8325, 0x8356, 0x833F, 0x8341, 0x8326, 0x831C, + 0x8322, 0x8342, 0x834E, 0x831B, 0x832A, 0x8308, 0x833C, 0x834D, + 0x8316, 0x8324, 0x8320, 0x8337, 0x832F, 0x8329, 0x8347, 0x8345, + 0x834C, 0x8353, 0x831E, 0x832C, 0x834B, 0x8327, 0x8348, 0x8653, +plane 32 +at 0x00 + 0x8652, 0x86A2, 0x86A8, 0x8696, 0x868D, 0x8691, 0x869E, 0x8687, + 0x8697, 0x8686, 0x868B, 0x869A, 0x8685, 0x86A5, 0x8699, 0x86A1, + 0x86A7, 0x8695, 0x8698, 0x868E, 0x869D, 0x8690, 0x8694, 0x8843, + 0x8844, 0x886D, 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887F, + 0x886F, 0x8883, 0x887E, 0x8874, 0x887C, 0x8A12, 0x8C47, 0x8C57, + 0x8C7B, 0x8CA4, 0x8CA3, 0x8D76, 0x8D78, 0x8DB5, 0x8DB7, 0x8DB6, + 0x8ED1, 0x8ED3, 0x8FFE, 0x8FF5, 0x9002, 0x8FFF, 0x8FFB, 0x9004, + 0x8FFC, 0x8FF6, 0x90D6, 0x90E0, 0x90D9, 0x90DA, 0x90E3, 0x90DF, + 0x90E5, 0x90D8, 0x90DB, 0x90D7, 0x90DC, 0x90E4, 0x9150, 0x914E, + 0x914F, 0x91D5, 0x91E2, 0x91DA, 0x965C, 0x965F, 0x96BC, 0x98E3, + 0x9ADF, 0x9B2F, 0x4E7F, 0x5070, 0x506A, 0x5061, 0x505E, 0x5060, + 0x5053, 0x504B, 0x505D, 0x5072, 0x5048, 0x504D, 0x5041, 0x505B, + 0x504A, 0x5062, 0x5015, 0x5045, 0x505F, 0x5069, 0x506B, 0x5063, + 0x5064, 0x5046, 0x5040, 0x506E, 0x5073, 0x5057, 0x5051, 0x51D0, + 0x526B, 0x526D, 0x526C, 0x526E, 0x52D6, 0x52D3, 0x532D, 0x539C, + 0x5575, 0x5576, 0x553C, 0x554D, 0x5550, 0x5534, 0x552A, 0x5551, + 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, 0x550C, 0x5532, + 0x5565, 0x554E, 0x5539, 0x5548, 0x552D, 0x553B, 0x5540, 0x554B, + 0x570A, 0x5707, 0x57FB, 0x5814, 0x57E2, 0x57F6, 0x57DC, 0x57F4, + 0x5800, 0x57ED, 0x57FD, 0x5808, 0x57F8, 0x580B, 0x57F3, 0x57CF, + 0x5807, 0x57EE, 0x57E3, 0x57F2, 0x57E5, 0x57EC, 0x57E1, 0x580E, + 0x57FC, 0x5810, 0x57E7, 0x5801, 0x580C, 0x57F1, 0x57E9, 0x57F0, + 0x580D, 0x5804, 0x595C, 0x5A60, 0x5A58, 0x5A55, 0x5A67, 0x5A5E, + 0x5A38, 0x5A35, 0x5A6D, 0x5A50, 0x5A5F, 0x5A65, 0x5A6C, 0x5A53, + 0x5A64, 0x5A57, 0x5A43, 0x5A5D, 0x5A52, 0x5A44, 0x5A5B, 0x5A48, + 0x5A8E, 0x5A3E, 0x5A4D, 0x5A39, 0x5A4C, 0x5A70, 0x5A69, 0x5A47, + 0x5A51, 0x5A56, 0x5A42, 0x5A5C, 0x5B72, 0x5B6E, 0x5BC1, 0x5BC0, + 0x5C59, 0x5D1E, 0x5D0B, 0x5D1D, 0x5D1A, 0x5D20, 0x5D0C, 0x5D28, + 0x5D0D, 0x5D26, 0x5D25, 0x5D0F, 0x5D30, 0x5D12, 0x5D23, 0x5D1F, + 0x5D2E, 0x5E3E, 0x5E34, 0x5EB1, 0x5EB4, 0x5EB9, 0x5EB2, 0x5EB3, + 0x5F36, 0x5F38, 0x5F9B, 0x5F96, 0x5F9F, 0x608A, 0x6090, 0x6086, + 0x60BE, 0x60B0, 0x60BA, 0x60D3, 0x60D4, 0x60CF, 0x60E4, 0x60D9, +plane 33 +at 0x00 + 0x60DD, 0x60C8, 0x60B1, 0x60DB, 0x60B7, 0x60CA, 0x60BF, 0x60C3, + 0x60CD, 0x60C0, 0x6332, 0x6365, 0x638A, 0x6382, 0x637D, 0x63BD, + 0x639E, 0x63AD, 0x639D, 0x6397, 0x63AB, 0x638E, 0x636F, 0x6387, + 0x6390, 0x636E, 0x63AF, 0x6375, 0x639C, 0x636D, 0x63AE, 0x637C, + 0x63A4, 0x633B, 0x639F, 0x6378, 0x6385, 0x6381, 0x6391, 0x638D, + 0x6370, 0x6553, 0x65CD, 0x6665, 0x6661, 0x665B, 0x6659, 0x665C, + 0x6662, 0x6718, 0x6879, 0x6887, 0x6890, 0x689C, 0x686D, 0x686E, + 0x68AE, 0x68AB, 0x6956, 0x686F, 0x68A3, 0x68AC, 0x68A9, 0x6875, + 0x6874, 0x68B2, 0x688F, 0x6877, 0x6892, 0x687C, 0x686B, 0x6872, + 0x68AA, 0x6880, 0x6871, 0x687E, 0x689B, 0x6896, 0x688B, 0x68A0, + 0x6889, 0x68A4, 0x6878, 0x687B, 0x6891, 0x688C, 0x688A, 0x687D, + 0x6B36, 0x6B33, 0x6B37, 0x6B38, 0x6B91, 0x6B8F, 0x6B8D, 0x6B8E, + 0x6B8C, 0x6C2A, 0x6DC0, 0x6DAB, 0x6DB4, 0x6DB3, 0x6E74, 0x6DAC, + 0x6DE9, 0x6DE2, 0x6DB7, 0x6DF6, 0x6DD4, 0x6E00, 0x6DC8, 0x6DE0, + 0x6DDF, 0x6DD6, 0x6DBE, 0x6DE5, 0x6DDC, 0x6DDD, 0x6DDB, 0x6DF4, + 0x6DCA, 0x6DBD, 0x6DED, 0x6DF0, 0x6DBA, 0x6DD5, 0x6DC2, 0x6DCF, + 0x6DC9, 0x6DD0, 0x6DF2, 0x6DD3, 0x6DFD, 0x6DD7, 0x6DCD, 0x6DE3, + 0x6DBB, 0x70FA, 0x710D, 0x70F7, 0x7117, 0x70F4, 0x710C, 0x70F0, + 0x7104, 0x70F3, 0x7110, 0x70FC, 0x70FF, 0x7106, 0x7113, 0x7100, + 0x70F8, 0x70F6, 0x710B, 0x7102, 0x710E, 0x727E, 0x727B, 0x727C, + 0x727F, 0x731D, 0x7317, 0x7307, 0x7311, 0x7318, 0x730A, 0x7308, + 0x72FF, 0x730F, 0x731E, 0x7388, 0x73F6, 0x73F8, 0x73F5, 0x7404, + 0x7401, 0x73FD, 0x7407, 0x7400, 0x73FA, 0x73FC, 0x73FF, 0x740C, + 0x740B, 0x73F4, 0x7408, 0x7564, 0x7563, 0x75CE, 0x75D2, 0x75CF, + 0x75CB, 0x75CC, 0x75D1, 0x75D0, 0x768F, 0x7689, 0x76D3, 0x7739, + 0x772F, 0x772D, 0x7731, 0x7732, 0x7734, 0x7733, 0x773D, 0x7725, + 0x773B, 0x7735, 0x7848, 0x7852, 0x7849, 0x784D, 0x784A, 0x784C, + 0x7826, 0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796A, 0x7963, + 0x796B, 0x7961, 0x79BB, 0x79FA, 0x79F8, 0x79F6, 0x79F7, 0x7A8F, + 0x7A94, 0x7A90, 0x7B35, 0x7B47, 0x7B34, 0x7B25, 0x7B30, 0x7B22, + 0x7B24, 0x7B33, 0x7B18, 0x7B2A, 0x7B1D, 0x7B31, 0x7B2B, 0x7B2D, + 0x7B2F, 0x7B32, 0x7B38, 0x7B1A, 0x7B23, 0x7C94, 0x7C98, 0x7C96, +plane 34 +at 0x00 + 0x7CA3, 0x7D35, 0x7D3D, 0x7D38, 0x7D36, 0x7D3A, 0x7D45, 0x7D2C, + 0x7D29, 0x7D41, 0x7D47, 0x7D3E, 0x7D3F, 0x7D4A, 0x7D3B, 0x7D28, + 0x7F63, 0x7F95, 0x7F9C, 0x7F9D, 0x7F9B, 0x7FCA, 0x7FCB, 0x7FCD, + 0x7FD0, 0x7FD1, 0x7FC7, 0x7FCF, 0x7FC9, 0x801F, 0x801E, 0x801B, + 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119, 0x811B, 0x812D, + 0x811F, 0x812C, 0x811E, 0x8121, 0x8115, 0x8127, 0x811D, 0x8122, + 0x8211, 0x8238, 0x8233, 0x823A, 0x8234, 0x8232, 0x8274, 0x8390, + 0x83A3, 0x83A8, 0x838D, 0x837A, 0x8373, 0x83A4, 0x8374, 0x838F, + 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83A9, 0x837D, 0x8383, + 0x838C, 0x839D, 0x839B, 0x83AA, 0x838B, 0x837E, 0x83A5, 0x83AF, + 0x8388, 0x8397, 0x83B0, 0x837F, 0x83A6, 0x8387, 0x83AE, 0x8376, + 0x839A, 0x8659, 0x8656, 0x86BF, 0x86B7, 0x86C2, 0x86C1, 0x86C5, + 0x86BA, 0x86B0, 0x86C8, 0x86B9, 0x86B3, 0x86B8, 0x86CC, 0x86B4, + 0x86BB, 0x86BC, 0x86C3, 0x86BD, 0x86BE, 0x8852, 0x8889, 0x8895, + 0x88A8, 0x88A2, 0x88AA, 0x889A, 0x8891, 0x88A1, 0x889F, 0x8898, + 0x88A7, 0x8899, 0x889B, 0x8897, 0x88A4, 0x88AC, 0x888C, 0x8893, + 0x888E, 0x8982, 0x89D6, 0x89D9, 0x89D5, 0x8A30, 0x8A27, 0x8A2C, + 0x8A1E, 0x8C39, 0x8C3B, 0x8C5C, 0x8C5D, 0x8C7D, 0x8CA5, 0x8D7D, + 0x8D7B, 0x8D79, 0x8DBC, 0x8DC2, 0x8DB9, 0x8DBF, 0x8DC1, 0x8ED8, + 0x8EDE, 0x8EDD, 0x8EDC, 0x8ED7, 0x8EE0, 0x8EE1, 0x9024, 0x900B, + 0x9011, 0x901C, 0x900C, 0x9021, 0x90EF, 0x90EA, 0x90F0, 0x90F4, + 0x90F2, 0x90F3, 0x90D4, 0x90EB, 0x90EC, 0x90E9, 0x9156, 0x9158, + 0x915A, 0x9153, 0x9155, 0x91EC, 0x91F4, 0x91F1, 0x91F3, 0x91F8, + 0x91E4, 0x91F9, 0x91EA, 0x91EB, 0x91F7, 0x91E8, 0x91EE, 0x957A, + 0x9586, 0x9588, 0x967C, 0x966D, 0x966B, 0x9671, 0x966F, 0x96BF, + 0x976A, 0x9804, 0x98E5, 0x9997, 0x509B, 0x5095, 0x5094, 0x509E, + 0x508B, 0x50A3, 0x5083, 0x508C, 0x508E, 0x509D, 0x5068, 0x509C, + 0x5092, 0x5082, 0x5087, 0x515F, 0x51D4, 0x5312, 0x5311, 0x53A4, + 0x53A7, 0x5591, 0x55A8, 0x55A5, 0x55AD, 0x5577, 0x5645, 0x55A2, + 0x5593, 0x5588, 0x558F, 0x55B5, 0x5581, 0x55A3, 0x5592, 0x55A4, + 0x557D, 0x558C, 0x55A6, 0x557F, 0x5595, 0x55A1, 0x558E, 0x570C, + 0x5829, 0x5837, 0x5819, 0x581E, 0x5827, 0x5823, 0x5828, 0x57F5, +plane 35 +at 0x00 + 0x5848, 0x5825, 0x581C, 0x581B, 0x5833, 0x583F, 0x5836, 0x582E, + 0x5839, 0x5838, 0x582D, 0x582C, 0x583B, 0x5961, 0x5AAF, 0x5A94, + 0x5A9F, 0x5A7A, 0x5AA2, 0x5A9E, 0x5A78, 0x5AA6, 0x5A7C, 0x5AA5, + 0x5AAC, 0x5A95, 0x5AAE, 0x5A37, 0x5A84, 0x5A8A, 0x5A97, 0x5A83, + 0x5A8B, 0x5AA9, 0x5A7B, 0x5A7D, 0x5A8C, 0x5A9C, 0x5A8F, 0x5A93, + 0x5A9D, 0x5BEA, 0x5BCD, 0x5BCB, 0x5BD4, 0x5BD1, 0x5BCA, 0x5BCE, + 0x5C0C, 0x5C30, 0x5D37, 0x5D43, 0x5D6B, 0x5D41, 0x5D4B, 0x5D3F, + 0x5D35, 0x5D51, 0x5D4E, 0x5D55, 0x5D33, 0x5D3A, 0x5D52, 0x5D3D, + 0x5D31, 0x5D59, 0x5D42, 0x5D39, 0x5D49, 0x5D38, 0x5D3C, 0x5D32, + 0x5D36, 0x5D40, 0x5D45, 0x5E44, 0x5E41, 0x5F58, 0x5FA6, 0x5FA5, + 0x5FAB, 0x60C9, 0x60B9, 0x60CC, 0x60E2, 0x60CE, 0x60C4, 0x6114, + 0x60F2, 0x610A, 0x6116, 0x6105, 0x60F5, 0x6113, 0x60F8, 0x60FC, + 0x60FE, 0x60C1, 0x6103, 0x6118, 0x611D, 0x6110, 0x60FF, 0x6104, + 0x610B, 0x624A, 0x6394, 0x63B1, 0x63B0, 0x63CE, 0x63E5, 0x63E8, + 0x63EF, 0x63C3, 0x649D, 0x63F3, 0x63CA, 0x63E0, 0x63F6, 0x63D5, + 0x63F2, 0x63F5, 0x6461, 0x63DF, 0x63BE, 0x63DD, 0x63DC, 0x63C4, + 0x63D8, 0x63D3, 0x63C2, 0x63C7, 0x63CC, 0x63CB, 0x63C8, 0x63F0, + 0x63D7, 0x63D9, 0x6532, 0x6567, 0x656A, 0x6564, 0x655C, 0x6568, + 0x6565, 0x658C, 0x659D, 0x659E, 0x65AE, 0x65D0, 0x65D2, 0x667C, + 0x666C, 0x667B, 0x6680, 0x6671, 0x6679, 0x666A, 0x6672, 0x6701, + 0x690C, 0x68D3, 0x6904, 0x68DC, 0x692A, 0x68EC, 0x68EA, 0x68F1, + 0x690F, 0x68D6, 0x68F7, 0x68EB, 0x68E4, 0x68F6, 0x6913, 0x6910, + 0x68F3, 0x68E1, 0x6907, 0x68CC, 0x6908, 0x6970, 0x68B4, 0x6911, + 0x68EF, 0x68C6, 0x6914, 0x68F8, 0x68D0, 0x68FD, 0x68FC, 0x68E8, + 0x690B, 0x690A, 0x6917, 0x68CE, 0x68C8, 0x68DD, 0x68DE, 0x68E6, + 0x68F4, 0x68D1, 0x6906, 0x68D4, 0x68E9, 0x6915, 0x6925, 0x68C7, + 0x6B39, 0x6B3B, 0x6B3F, 0x6B3C, 0x6B94, 0x6B97, 0x6B99, 0x6B95, + 0x6BBD, 0x6BF0, 0x6BF2, 0x6BF3, 0x6C30, 0x6DFC, 0x6E46, 0x6E47, + 0x6E1F, 0x6E49, 0x6E88, 0x6E3C, 0x6E3D, 0x6E45, 0x6E62, 0x6E2B, + 0x6E3F, 0x6E41, 0x6E5D, 0x6E73, 0x6E1C, 0x6E33, 0x6E4B, 0x6E40, + 0x6E51, 0x6E3B, 0x6E03, 0x6E2E, 0x6E5E, 0x6E68, 0x6E5C, 0x6E61, + 0x6E31, 0x6E28, 0x6E60, 0x6E71, 0x6E6B, 0x6E39, 0x6E22, 0x6E30, +plane 36 +at 0x00 + 0x6E53, 0x6E65, 0x6E27, 0x6E78, 0x6E64, 0x6E77, 0x6E55, 0x6E79, + 0x6E52, 0x6E66, 0x6E35, 0x6E36, 0x6E5A, 0x7120, 0x711E, 0x712F, + 0x70FB, 0x712E, 0x7131, 0x7123, 0x7125, 0x7122, 0x7132, 0x711F, + 0x7128, 0x713A, 0x711B, 0x724B, 0x725A, 0x7288, 0x7289, 0x7286, + 0x7285, 0x728B, 0x7312, 0x730B, 0x7330, 0x7322, 0x7331, 0x7333, + 0x7327, 0x7332, 0x732D, 0x7326, 0x7323, 0x7335, 0x730C, 0x742E, + 0x742C, 0x7430, 0x742B, 0x7416, 0x741A, 0x7421, 0x742D, 0x7431, + 0x7424, 0x7423, 0x741D, 0x7429, 0x7420, 0x7432, 0x74FB, 0x752F, + 0x756F, 0x756C, 0x75E7, 0x75DA, 0x75E1, 0x75E6, 0x75DD, 0x75DF, + 0x75E4, 0x75D7, 0x7695, 0x7692, 0x76DA, 0x7746, 0x7747, 0x7744, + 0x774D, 0x7745, 0x774A, 0x774E, 0x774B, 0x774C, 0x77DE, 0x77EC, + 0x7860, 0x7864, 0x7865, 0x785C, 0x786D, 0x7871, 0x786A, 0x786E, + 0x7870, 0x7869, 0x7868, 0x785E, 0x7862, 0x7974, 0x7973, 0x7972, + 0x7970, 0x7A02, 0x7A0A, 0x7A03, 0x7A0C, 0x7A04, 0x7A99, 0x7AE6, + 0x7AE4, 0x7B4A, 0x7B3B, 0x7B44, 0x7B48, 0x7B4C, 0x7B4E, 0x7B40, + 0x7B58, 0x7B45, 0x7CA2, 0x7C9E, 0x7CA8, 0x7CA1, 0x7D58, 0x7D6F, + 0x7D63, 0x7D53, 0x7D56, 0x7D67, 0x7D6A, 0x7D4F, 0x7D6D, 0x7D5C, + 0x7D6B, 0x7D52, 0x7D54, 0x7D69, 0x7D51, 0x7D5F, 0x7D4E, 0x7F3E, + 0x7F3F, 0x7F65, 0x7F66, 0x7FA2, 0x7FA0, 0x7FA1, 0x7FD7, 0x8051, + 0x804F, 0x8050, 0x80FE, 0x80D4, 0x8143, 0x814A, 0x8152, 0x814F, + 0x8147, 0x813D, 0x814D, 0x813A, 0x81E6, 0x81EE, 0x81F7, 0x81F8, + 0x81F9, 0x8204, 0x823C, 0x823D, 0x823F, 0x8275, 0x833B, 0x83CF, + 0x83F9, 0x8423, 0x83C0, 0x83E8, 0x8412, 0x83E7, 0x83E4, 0x83FC, + 0x83F6, 0x8410, 0x83C6, 0x83C8, 0x83EB, 0x83E3, 0x83BF, 0x8401, + 0x83DD, 0x83E5, 0x83D8, 0x83FF, 0x83E1, 0x83CB, 0x83CE, 0x83D6, + 0x83F5, 0x83C9, 0x8409, 0x840F, 0x83DE, 0x8411, 0x8406, 0x83C2, + 0x83F3, 0x83D5, 0x83FA, 0x83C7, 0x83D1, 0x83EA, 0x8413, 0x83C3, + 0x83EC, 0x83EE, 0x83C4, 0x83FB, 0x83D7, 0x83E2, 0x841B, 0x83DB, + 0x83FE, 0x86D8, 0x86E2, 0x86E6, 0x86D3, 0x86E3, 0x86DA, 0x86EA, + 0x86DD, 0x86EB, 0x86DC, 0x86EC, 0x86E9, 0x86D7, 0x86E8, 0x86D1, + 0x8848, 0x8856, 0x8855, 0x88BA, 0x88D7, 0x88B9, 0x88B8, 0x88C0, + 0x88BE, 0x88B6, 0x88BC, 0x88B7, 0x88BD, 0x88B2, 0x8901, 0x88C9, +plane 37 +at 0x00 + 0x8995, 0x8998, 0x8997, 0x89DD, 0x89DA, 0x89DB, 0x8A4E, 0x8A4D, + 0x8A39, 0x8A59, 0x8A40, 0x8A57, 0x8A58, 0x8A44, 0x8A45, 0x8A52, + 0x8A48, 0x8A51, 0x8A4A, 0x8A4C, 0x8A4F, 0x8C5F, 0x8C81, 0x8C80, + 0x8CBA, 0x8CBE, 0x8CB0, 0x8CB9, 0x8CB5, 0x8D84, 0x8D80, 0x8D89, + 0x8DD8, 0x8DD3, 0x8DCD, 0x8DC7, 0x8DD6, 0x8DDC, 0x8DCF, 0x8DD5, + 0x8DD9, 0x8DC8, 0x8DD7, 0x8DC5, 0x8EEF, 0x8EF7, 0x8EFA, 0x8EF9, + 0x8EE6, 0x8EEE, 0x8EE5, 0x8EF5, 0x8EE7, 0x8EE8, 0x8EF6, 0x8EEB, + 0x8EF1, 0x8EEC, 0x8EF4, 0x8EE9, 0x902D, 0x9034, 0x902F, 0x9106, + 0x912C, 0x9104, 0x90FF, 0x90FC, 0x9108, 0x90F9, 0x90FB, 0x9101, + 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915F, 0x9162, + 0x9160, 0x9201, 0x920A, 0x9225, 0x9203, 0x921A, 0x9226, 0x920F, + 0x920C, 0x9200, 0x9212, 0x91FF, 0x91FD, 0x9206, 0x9204, 0x9227, + 0x9202, 0x921C, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216, 0x957B, + 0x958D, 0x958C, 0x9590, 0x9687, 0x967E, 0x9688, 0x9689, 0x9683, + 0x9680, 0x96C2, 0x96C8, 0x96C3, 0x96F1, 0x96F0, 0x976C, 0x9770, + 0x976E, 0x9807, 0x98A9, 0x98EB, 0x9CE6, 0x9EF9, 0x4E83, 0x4E84, + 0x4EB6, 0x50BD, 0x50BF, 0x50C6, 0x50AE, 0x50C4, 0x50CA, 0x50B4, + 0x50C8, 0x50C2, 0x50B0, 0x50C1, 0x50BA, 0x50B1, 0x50CB, 0x50C9, + 0x50B6, 0x50B8, 0x51D7, 0x527A, 0x5278, 0x527B, 0x527C, 0x55C3, + 0x55DB, 0x55CC, 0x55D0, 0x55CB, 0x55CA, 0x55DD, 0x55C0, 0x55D4, + 0x55C4, 0x55E9, 0x55BF, 0x55D2, 0x558D, 0x55CF, 0x55D5, 0x55E2, + 0x55D6, 0x55C8, 0x55F2, 0x55CD, 0x55D9, 0x55C2, 0x5714, 0x5853, + 0x5868, 0x5864, 0x584F, 0x584D, 0x5849, 0x586F, 0x5855, 0x584E, + 0x585D, 0x5859, 0x5865, 0x585B, 0x583D, 0x5863, 0x5871, 0x58FC, + 0x5AC7, 0x5AC4, 0x5ACB, 0x5ABA, 0x5AB8, 0x5AB1, 0x5AB5, 0x5AB0, + 0x5ABF, 0x5AC8, 0x5ABB, 0x5AC6, 0x5AB7, 0x5AC0, 0x5ACA, 0x5AB4, + 0x5AB6, 0x5ACD, 0x5AB9, 0x5A90, 0x5BD6, 0x5BD8, 0x5BD9, 0x5C1F, + 0x5C33, 0x5D71, 0x5D63, 0x5D4A, 0x5D65, 0x5D72, 0x5D6C, 0x5D5E, + 0x5D68, 0x5D67, 0x5D62, 0x5DF0, 0x5E4F, 0x5E4E, 0x5E4A, 0x5E4D, + 0x5E4B, 0x5EC5, 0x5ECC, 0x5EC6, 0x5ECB, 0x5EC7, 0x5F40, 0x5FAF, + 0x5FAD, 0x60F7, 0x6149, 0x614A, 0x612B, 0x6145, 0x6136, 0x6132, + 0x612E, 0x6146, 0x612F, 0x614F, 0x6129, 0x6140, 0x6220, 0x9168, +plane 38 +at 0x00 + 0x6223, 0x6225, 0x6224, 0x63C5, 0x63F1, 0x63EB, 0x6410, 0x6412, + 0x6409, 0x6420, 0x6424, 0x6433, 0x6443, 0x641F, 0x6415, 0x6418, + 0x6439, 0x6437, 0x6422, 0x6423, 0x640C, 0x6426, 0x6430, 0x6428, + 0x6441, 0x6435, 0x642F, 0x640A, 0x641A, 0x6440, 0x6425, 0x6427, + 0x640B, 0x63E7, 0x641B, 0x642E, 0x6421, 0x640E, 0x656F, 0x6592, + 0x65D3, 0x6686, 0x668C, 0x6695, 0x6690, 0x668B, 0x668A, 0x6699, + 0x6694, 0x6678, 0x6720, 0x6966, 0x695F, 0x6938, 0x694E, 0x6962, + 0x6971, 0x693F, 0x6945, 0x696A, 0x6939, 0x6942, 0x6957, 0x6959, + 0x697A, 0x6948, 0x6949, 0x6935, 0x696C, 0x6933, 0x693D, 0x6965, + 0x68F0, 0x6978, 0x6934, 0x6969, 0x6940, 0x696F, 0x6944, 0x6976, + 0x6958, 0x6941, 0x6974, 0x694C, 0x693B, 0x694B, 0x6937, 0x695C, + 0x694F, 0x6951, 0x6932, 0x6952, 0x692F, 0x697B, 0x693C, 0x6B46, + 0x6B45, 0x6B43, 0x6B42, 0x6B48, 0x6B41, 0x6B9B, 0xFA0D, 0x6BFB, + 0x6BFC, 0x6BF9, 0x6BF7, 0x6BF8, 0x6E9B, 0x6ED6, 0x6EC8, 0x6E8F, + 0x6EC0, 0x6E9F, 0x6E93, 0x6E94, 0x6EA0, 0x6EB1, 0x6EB9, 0x6EC6, + 0x6ED2, 0x6EBD, 0x6EC1, 0x6E9E, 0x6EC9, 0x6EB7, 0x6EB0, 0x6ECD, + 0x6EA6, 0x6ECF, 0x6EB2, 0x6EBE, 0x6EC3, 0x6EDC, 0x6ED8, 0x6E99, + 0x6E92, 0x6E8E, 0x6E8D, 0x6EA4, 0x6EA1, 0x6EBF, 0x6EB3, 0x6ED0, + 0x6ECA, 0x6E97, 0x6EAE, 0x6EA3, 0x7147, 0x7154, 0x7152, 0x7163, + 0x7160, 0x7141, 0x715D, 0x7162, 0x7172, 0x7178, 0x716A, 0x7161, + 0x7142, 0x7158, 0x7143, 0x714B, 0x7170, 0x715F, 0x7150, 0x7153, + 0x7144, 0x714D, 0x715A, 0x724F, 0x728D, 0x728C, 0x7291, 0x7290, + 0x728E, 0x733C, 0x7342, 0x733B, 0x733A, 0x7340, 0x734A, 0x7349, + 0x7444, 0x744A, 0x744B, 0x7452, 0x7451, 0x7457, 0x7440, 0x744F, + 0x7450, 0x744E, 0x7442, 0x7446, 0x744D, 0x7454, 0x74E1, 0x74FF, + 0x74FE, 0x74FD, 0x751D, 0x7579, 0x7577, 0x6983, 0x75EF, 0x760F, + 0x7603, 0x75F7, 0x75FE, 0x75FC, 0x75F9, 0x75F8, 0x7610, 0x75FB, + 0x75F6, 0x75ED, 0x75F5, 0x75FD, 0x7699, 0x76B5, 0x76DD, 0x7755, + 0x775F, 0x7760, 0x7752, 0x7756, 0x775A, 0x7769, 0x7767, 0x7754, + 0x7759, 0x776D, 0x77E0, 0x7887, 0x789A, 0x7894, 0x788F, 0x7884, + 0x7895, 0x7885, 0x7886, 0x78A1, 0x7883, 0x7879, 0x7899, 0x7880, + 0x7896, 0x787B, 0x797C, 0x7982, 0x797D, 0x7979, 0x7A11, 0x7A18, +plane 39 +at 0x00 + 0x7A19, 0x7A12, 0x7A17, 0x7A15, 0x7A22, 0x7A13, 0x7A1B, 0x7A10, + 0x7AA3, 0x7AA2, 0x7A9E, 0x7AEB, 0x7B66, 0x7B64, 0x7B6D, 0x7B74, + 0x7B69, 0x7B72, 0x7B65, 0x7B73, 0x7B71, 0x7B70, 0x7B61, 0x7B78, + 0x7B76, 0x7B63, 0x7CB2, 0x7CB4, 0x7CAF, 0x7D88, 0x7D86, 0x7D80, + 0x7D8D, 0x7D7F, 0x7D85, 0x7D7A, 0x7D8E, 0x7D7B, 0x7D83, 0x7D7C, + 0x7D8C, 0x7D94, 0x7D84, 0x7D7D, 0x7D92, 0x7F6D, 0x7F6B, 0x7F67, + 0x7F68, 0x7F6C, 0x7FA6, 0x7FA5, 0x7FA7, 0x7FDB, 0x7FDC, 0x8021, + 0x8164, 0x8160, 0x8177, 0x815C, 0x8169, 0x815B, 0x8162, 0x8172, + 0x6721, 0x815E, 0x8176, 0x8167, 0x816F, 0x8144, 0x8161, 0x821D, + 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84F1, 0x843F, 0x8456, + 0x8476, 0x8479, 0x848F, 0x848D, 0x8465, 0x8451, 0x8440, 0x8486, + 0x8467, 0x8430, 0x844D, 0x847D, 0x845A, 0x8459, 0x8474, 0x8473, + 0x845D, 0x8507, 0x845E, 0x8437, 0x843A, 0x8434, 0x847A, 0x8443, + 0x8478, 0x8432, 0x8445, 0x8429, 0x83D9, 0x844B, 0x842F, 0x8442, + 0x842D, 0x845F, 0x8470, 0x8439, 0x844E, 0x844C, 0x8452, 0x846F, + 0x84C5, 0x848E, 0x843B, 0x8447, 0x8436, 0x8433, 0x8468, 0x847E, + 0x8444, 0x842B, 0x8460, 0x8454, 0x846E, 0x8450, 0x870B, 0x8704, + 0x86F7, 0x870C, 0x86FA, 0x86D6, 0x86F5, 0x874D, 0x86F8, 0x870E, + 0x8709, 0x8701, 0x86F6, 0x870D, 0x8705, 0x88D6, 0x88CB, 0x88CD, + 0x88CE, 0x88DE, 0x88DB, 0x88DA, 0x88CC, 0x88D0, 0x8985, 0x899B, + 0x89DF, 0x89E5, 0x89E4, 0x89E1, 0x89E0, 0x89E2, 0x89DC, 0x89E6, + 0x8A76, 0x8A86, 0x8A7F, 0x8A61, 0x8A3F, 0x8A77, 0x8A82, 0x8A84, + 0x8A75, 0x8A83, 0x8A81, 0x8A74, 0x8A7A, 0x8C3C, 0x8C4B, 0x8C4A, + 0x8C65, 0x8C64, 0x8C66, 0x8C86, 0x8C84, 0x8C85, 0x8CCC, 0x8D68, + 0x8D69, 0x8D91, 0x8D8C, 0x8D8E, 0x8D8F, 0x8D8D, 0x8D93, 0x8D94, + 0x8D90, 0x8D92, 0x8DF0, 0x8DE0, 0x8DEC, 0x8DF1, 0x8DEE, 0x8DD0, + 0x8DE9, 0x8DE3, 0x8DE2, 0x8DE7, 0x8DF2, 0x8DEB, 0x8DF4, 0x8F06, + 0x8EFF, 0x8F01, 0x8F00, 0x8F05, 0x8F07, 0x8F08, 0x8F02, 0x8F0B, + 0x9052, 0x903F, 0x9044, 0x9049, 0x903D, 0x9110, 0x910D, 0x910F, + 0x9111, 0x9116, 0x9114, 0x910B, 0x910E, 0x916E, 0x916F, 0x9248, + 0x9252, 0x9230, 0x923A, 0x9266, 0x9233, 0x9265, 0x925E, 0x9283, + 0x922E, 0x924A, 0x9246, 0x926D, 0x926C, 0x924F, 0x9260, 0x9267, +plane 40 +at 0x00 + 0x926F, 0x9236, 0x9261, 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, + 0x9272, 0x924E, 0x9253, 0x924C, 0x9256, 0x9232, 0x959F, 0x959C, + 0x959E, 0x959B, 0x9692, 0x9693, 0x9691, 0x9697, 0x96CE, 0x96FA, + 0x96FD, 0x96F8, 0x96F5, 0x9773, 0x9777, 0x9778, 0x9772, 0x980F, + 0x980D, 0x980E, 0x98AC, 0x98F6, 0x98F9, 0x99AF, 0x99B2, 0x99B0, + 0x99B5, 0x9AAD, 0x9AAB, 0x9B5B, 0x9CEA, 0x9CED, 0x9CE7, 0x9E80, + 0x9EFD, 0x50E6, 0x50D4, 0x50D7, 0x50E8, 0x50F3, 0x50DB, 0x50EA, + 0x50DD, 0x50E4, 0x50D3, 0x50EC, 0x50F0, 0x50EF, 0x50E3, 0x50E0, + 0x51D8, 0x5280, 0x5281, 0x52E9, 0x52EB, 0x5330, 0x53AC, 0x5627, + 0x5615, 0x560C, 0x5612, 0x55FC, 0x560F, 0x561C, 0x5601, 0x5613, + 0x5602, 0x55FA, 0x561D, 0x5604, 0x55FF, 0x55F9, 0x5889, 0x587C, + 0x5890, 0x5898, 0x5886, 0x5881, 0x587F, 0x5874, 0x588B, 0x587A, + 0x5887, 0x5891, 0x588E, 0x5876, 0x5882, 0x5888, 0x587B, 0x5894, + 0x588F, 0x58FE, 0x596B, 0x5ADC, 0x5AEE, 0x5AE5, 0x5AD5, 0x5AEA, + 0x5ADA, 0x5AED, 0x5AEB, 0x5AF3, 0x5AE2, 0x5AE0, 0x5ADB, 0x5AEC, + 0x5ADE, 0x5ADD, 0x5AD9, 0x5AE8, 0x5ADF, 0x5B77, 0x5BE0, 0x5BE3, + 0x5C63, 0x5D82, 0x5D80, 0x5D7D, 0x5D86, 0x5D7A, 0x5D81, 0x5D77, + 0x5D8A, 0x5D89, 0x5D88, 0x5D7E, 0x5D7C, 0x5D8D, 0x5D79, 0x5D7F, + 0x5E58, 0x5E59, 0x5E53, 0x5ED8, 0x5ED1, 0x5ED7, 0x5ECE, 0x5EDC, + 0x5ED5, 0x5ED9, 0x5ED2, 0x5ED4, 0x5F44, 0x5F43, 0x5F6F, 0x5FB6, + 0x612C, 0x6128, 0x6141, 0x615E, 0x6171, 0x6173, 0x6152, 0x6153, + 0x6172, 0x616C, 0x6180, 0x6174, 0x6154, 0x617A, 0x615B, 0x6165, + 0x613B, 0x616A, 0x6161, 0x6156, 0x6229, 0x6227, 0x622B, 0x642B, + 0x644D, 0x645B, 0x645D, 0x6474, 0x6476, 0x6472, 0x6473, 0x647D, + 0x6475, 0x6466, 0x64A6, 0x644E, 0x6482, 0x645E, 0x645C, 0x644B, + 0x6453, 0x6460, 0x6450, 0x647F, 0x643F, 0x646C, 0x646B, 0x6459, + 0x6465, 0x6477, 0x6573, 0x65A0, 0x66A1, 0x66A0, 0x669F, 0x6705, + 0x6704, 0x6722, 0x69B1, 0x69B6, 0x69C9, 0x69A0, 0x69CE, 0x6996, + 0x69B0, 0x69AC, 0x69BC, 0x6991, 0x6999, 0x698E, 0x69A7, 0x698D, + 0x69A9, 0x69BE, 0x69AF, 0x69BF, 0x69C4, 0x69BD, 0x69A4, 0x69D4, + 0x69B9, 0x69CA, 0x699A, 0x69CF, 0x69B3, 0x6993, 0x69AA, 0x69A1, + 0x699E, 0x69D9, 0x6997, 0x6990, 0x69C2, 0x69B5, 0x69A5, 0x69C6, +plane 41 +at 0x00 + 0x6B4A, 0x6B4D, 0x6B4B, 0x6B9E, 0x6B9F, 0x6BA0, 0x6BC3, 0x6BC4, + 0x6BFE, 0x6ECE, 0x6EF5, 0x6EF1, 0x6F03, 0x6F25, 0x6EF8, 0x6F37, + 0x6EFB, 0x6F2E, 0x6F09, 0x6F4E, 0x6F19, 0x6F1A, 0x6F27, 0x6F18, + 0x6F3B, 0x6F12, 0x6EED, 0x6F0A, 0x6F36, 0x6F73, 0x6EF9, 0x6EEE, + 0x6F2D, 0x6F40, 0x6F30, 0x6F3C, 0x6F35, 0x6EEB, 0x6F07, 0x6F0E, + 0x6F43, 0x6F05, 0x6EFD, 0x6EF6, 0x6F39, 0x6F1C, 0x6EFC, 0x6F3A, + 0x6F1F, 0x6F0D, 0x6F1E, 0x6F08, 0x6F21, 0x7187, 0x7190, 0x7189, + 0x7180, 0x7185, 0x7182, 0x718F, 0x717B, 0x7186, 0x7181, 0x7197, + 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, 0x7343, 0x734D, 0x7351, + 0x734C, 0x7462, 0x7473, 0x7471, 0x7475, 0x7472, 0x7467, 0x746E, + 0x7500, 0x7502, 0x7503, 0x757D, 0x7590, 0x7616, 0x7608, 0x760C, + 0x7615, 0x7611, 0x760A, 0x7614, 0x76B8, 0x7781, 0x777C, 0x7785, + 0x7782, 0x776E, 0x7780, 0x776F, 0x777E, 0x7783, 0x78B2, 0x78AA, + 0x78B4, 0x78AD, 0x78A8, 0x787E, 0x78AB, 0x789E, 0x78A5, 0x78A0, + 0x78AC, 0x78A2, 0x78A4, 0x7998, 0x798A, 0x798B, 0x7996, 0x7995, + 0x7994, 0x7993, 0x7997, 0x7988, 0x7992, 0x7990, 0x7A2B, 0x7A4A, + 0x7A30, 0x7A2F, 0x7A28, 0x7A26, 0x7AA8, 0x7AAB, 0x7AAC, 0x7AEE, + 0x7B88, 0x7B9C, 0x7B8A, 0x7B91, 0x7B90, 0x7B96, 0x7B8D, 0x7B8C, + 0x7B9B, 0x7B8E, 0x7B85, 0x7B98, 0x5284, 0x7B99, 0x7BA4, 0x7B82, + 0x7CBB, 0x7CBF, 0x7CBC, 0x7CBA, 0x7DA7, 0x7DB7, 0x7DC2, 0x7DA3, + 0x7DAA, 0x7DC1, 0x7DC0, 0x7DC5, 0x7D9D, 0x7DCE, 0x7DC4, 0x7DC6, + 0x7DCB, 0x7DCC, 0x7DAF, 0x7DB9, 0x7D96, 0x7DBC, 0x7D9F, 0x7DA6, + 0x7DAE, 0x7DA9, 0x7DA1, 0x7DC9, 0x7F73, 0x7FE2, 0x7FE3, 0x7FE5, + 0x7FDE, 0x8024, 0x805D, 0x805C, 0x8189, 0x8186, 0x8183, 0x8187, + 0x818D, 0x818C, 0x818B, 0x8215, 0x8497, 0x84A4, 0x84A1, 0x849F, + 0x84BA, 0x84CE, 0x84C2, 0x84AC, 0x84AE, 0x84AB, 0x84B9, 0x84B4, + 0x84C1, 0x84CD, 0x84AA, 0x849A, 0x84B1, 0x84D0, 0x849D, 0x84A7, + 0x84BB, 0x84A2, 0x8494, 0x84C7, 0x84CC, 0x849B, 0x84A9, 0x84AF, + 0x84A8, 0x84D6, 0x8498, 0x84B6, 0x84CF, 0x84A0, 0x84D7, 0x84D4, + 0x84D2, 0x84DB, 0x84B0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, + 0x876B, 0x8740, 0x872E, 0x871E, 0x8721, 0x8719, 0x871B, 0x8743, + 0x872C, 0x8741, 0x873E, 0x8746, 0x8720, 0x8732, 0x872A, 0x872D, +plane 42 +at 0x00 + 0x873C, 0x8712, 0x873A, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727, + 0x8738, 0x8724, 0x871A, 0x8730, 0x8711, 0x88F7, 0x88E7, 0x88F1, + 0x88F2, 0x88FA, 0x88FE, 0x88EE, 0x88FC, 0x88F6, 0x88FB, 0x88F0, + 0x88EC, 0x88EB, 0x899D, 0x89A1, 0x899F, 0x899E, 0x89E9, 0x89EB, + 0x89E8, 0x8AAB, 0x8A99, 0x8A8B, 0x8A92, 0x8A8F, 0x8A96, 0x8C3D, + 0x8C68, 0x8C69, 0x8CD5, 0x8CCF, 0x8CD7, 0x8D96, 0x8E09, 0x8E02, + 0x8DFF, 0x8E0D, 0x8DFD, 0x8E0A, 0x8E03, 0x8E07, 0x8E06, 0x8E05, + 0x8DFE, 0x8E00, 0x8E04, 0x8F10, 0x8F11, 0x8F0E, 0x8F0D, 0x9123, + 0x911C, 0x9120, 0x9122, 0x911F, 0x911D, 0x911A, 0x9124, 0x9121, + 0x911B, 0x917A, 0x9172, 0x9179, 0x9173, 0x92A5, 0x92A4, 0x9276, + 0x929B, 0x927A, 0x92A0, 0x9294, 0x92AA, 0x928D, 0x92A6, 0x929A, + 0x92AB, 0x9279, 0x9297, 0x927F, 0x92A3, 0x92EE, 0x928E, 0x9282, + 0x9295, 0x92A2, 0x927D, 0x9288, 0x92A1, 0x928A, 0x9286, 0x928C, + 0x9299, 0x92A7, 0x927E, 0x9287, 0x92A9, 0x929D, 0x928B, 0x922D, + 0x969E, 0x96A1, 0x96FF, 0x9758, 0x977D, 0x977A, 0x977E, 0x9783, + 0x9780, 0x9782, 0x977B, 0x9784, 0x9781, 0x977F, 0x97CE, 0x97CD, + 0x9816, 0x98AD, 0x98AE, 0x9902, 0x9900, 0x9907, 0x999D, 0x999C, + 0x99C3, 0x99B9, 0x99BB, 0x99BA, 0x99C2, 0x99BD, 0x99C7, 0x9AB1, + 0x9AE3, 0x9AE7, 0x9B3E, 0x9B3F, 0x9B60, 0x9B61, 0x9B5F, 0x9CF1, + 0x9CF2, 0x9CF5, 0x9EA7, 0x50FF, 0x5103, 0x5130, 0x50F8, 0x5106, + 0x5107, 0x50F6, 0x50FE, 0x510B, 0x510C, 0x50FD, 0x510A, 0x528B, + 0x528C, 0x52F1, 0x52EF, 0x5648, 0x5642, 0x564C, 0x5635, 0x5641, + 0x564A, 0x5649, 0x5646, 0x5658, 0x565A, 0x5640, 0x5633, 0x563D, + 0x562C, 0x563E, 0x5638, 0x562A, 0x563A, 0x571A, 0x58AB, 0x589D, + 0x58B1, 0x58A0, 0x58A3, 0x58AF, 0x58AC, 0x58A5, 0x58A1, 0x58FF, + 0x5AFF, 0x5AF4, 0x5AFD, 0x5AF7, 0x5AF6, 0x5B03, 0x5AF8, 0x5B02, + 0x5AF9, 0x5B01, 0x5B07, 0x5B05, 0x5B0F, 0x5C67, 0x5D99, 0x5D97, + 0x5D9F, 0x5D92, 0x5DA2, 0x5D93, 0x5D95, 0x5DA0, 0x5D9C, 0x5DA1, + 0x5D9A, 0x5D9E, 0x5E69, 0x5E5D, 0x5E60, 0x5E5C, 0x7DF3, 0x5EDB, + 0x5EDE, 0x5EE1, 0x5F49, 0x5FB2, 0x618B, 0x6183, 0x6179, 0x61B1, + 0x61B0, 0x61A2, 0x6189, 0x619B, 0x6193, 0x61AF, 0x61AD, 0x619F, + 0x6192, 0x61AA, 0x61A1, 0x618D, 0x6166, 0x61B3, 0x622D, 0x646E, +plane 43 +at 0x00 + 0x6470, 0x6496, 0x64A0, 0x6485, 0x6497, 0x649C, 0x648F, 0x648B, + 0x648A, 0x648C, 0x64A3, 0x649F, 0x6468, 0x64B1, 0x6498, 0x6576, + 0x657A, 0x6579, 0x657B, 0x65B2, 0x65B3, 0x66B5, 0x66B0, 0x66A9, + 0x66B2, 0x66B7, 0x66AA, 0x66AF, 0x6A00, 0x6A06, 0x6A17, 0x69E5, + 0x69F8, 0x6A15, 0x69F1, 0x69E4, 0x6A20, 0x69FF, 0x69EC, 0x69E2, + 0x6A1B, 0x6A1D, 0x69FE, 0x6A27, 0x69F2, 0x69EE, 0x6A14, 0x69F7, + 0x69E7, 0x6A40, 0x6A08, 0x69E6, 0x69FB, 0x6A0D, 0x69FC, 0x69EB, + 0x6A09, 0x6A04, 0x6A18, 0x6A25, 0x6A0F, 0x69F6, 0x6A26, 0x6A07, + 0x69F4, 0x6A16, 0x6B51, 0x6BA5, 0x6BA3, 0x6BA2, 0x6BA6, 0x6C01, + 0x6C00, 0x6BFF, 0x6C02, 0x6F41, 0x6F26, 0x6F7E, 0x6F87, 0x6FC6, + 0x6F92, 0x6F8D, 0x6F89, 0x6F8C, 0x6F62, 0x6F4F, 0x6F85, 0x6F5A, + 0x6F96, 0x6F76, 0x6F6C, 0x6F82, 0x6F55, 0x6F72, 0x6F52, 0x6F50, + 0x6F57, 0x6F94, 0x6F93, 0x6F5D, 0x6F00, 0x6F61, 0x6F6B, 0x6F7D, + 0x6F67, 0x6F90, 0x6F53, 0x6F8B, 0x6F69, 0x6F7F, 0x6F95, 0x6F63, + 0x6F77, 0x6F6A, 0x6F7B, 0x71B2, 0x71AF, 0x719B, 0x71B0, 0x71A0, + 0x719A, 0x71A9, 0x71B5, 0x719D, 0x71A5, 0x719E, 0x71A4, 0x71A1, + 0x71AA, 0x719C, 0x71A7, 0x71B3, 0x7298, 0x729A, 0x7358, 0x7352, + 0x735E, 0x735F, 0x7360, 0x735D, 0x735B, 0x7361, 0x735A, 0x7359, + 0x7362, 0x7487, 0x7489, 0x748A, 0x7486, 0x7481, 0x747D, 0x7485, + 0x7488, 0x747C, 0x7479, 0x7508, 0x7507, 0x757E, 0x7625, 0x761E, + 0x7619, 0x761D, 0x761C, 0x7623, 0x761A, 0x7628, 0x761B, 0x769C, + 0x769D, 0x769E, 0x769B, 0x778D, 0x778F, 0x7789, 0x7788, 0x78CD, + 0x78BB, 0x78CF, 0x78CC, 0x78D1, 0x78CE, 0x78D4, 0x78C8, 0x78C3, + 0x78C4, 0x78C9, 0x799A, 0x79A1, 0x79A0, 0x799C, 0x79A2, 0x799B, + 0x6B76, 0x7A39, 0x7AB2, 0x7AB4, 0x7AB3, 0x7BB7, 0x7BCB, 0x7BBE, + 0x7BAC, 0x7BCE, 0x7BAF, 0x7BB9, 0x7BCA, 0x7BB5, 0x7CC5, 0x7CC8, + 0x7CCC, 0x7CCB, 0x7DF7, 0x7DDB, 0x7DEA, 0x7DE7, 0x7DD7, 0x7DE1, + 0x7E03, 0x7DFA, 0x7DE6, 0x7DF6, 0x7DF1, 0x7DF0, 0x7DEE, 0x7DDF, + 0x7F76, 0x7FAC, 0x7FB0, 0x7FAD, 0x7FED, 0x7FEB, 0x7FEA, 0x7FEC, + 0x7FE6, 0x7FE8, 0x8064, 0x8067, 0x81A3, 0x819F, 0x819E, 0x8195, + 0x81A2, 0x8199, 0x8197, 0x8216, 0x824F, 0x8253, 0x8252, 0x8250, + 0x824E, 0x8251, 0x8524, 0x853B, 0x850F, 0x8500, 0x8529, 0x850E, +plane 44 +at 0x00 + 0x8509, 0x850D, 0x851F, 0x850A, 0x8527, 0x851C, 0x84FB, 0x852B, + 0x84FA, 0x8508, 0x850C, 0x84F4, 0x852A, 0x84F2, 0x8515, 0x84F7, + 0x84EB, 0x84F3, 0x84FC, 0x8512, 0x84EA, 0x84E9, 0x8516, 0x84FE, + 0x8528, 0x851D, 0x852E, 0x8502, 0x84FD, 0x851E, 0x84F6, 0x8531, + 0x8526, 0x84E7, 0x84E8, 0x84F0, 0x84EF, 0x84F9, 0x8518, 0x8520, + 0x8530, 0x850B, 0x8519, 0x852F, 0x8662, 0x8756, 0x8763, 0x8764, + 0x8777, 0x87E1, 0x8773, 0x8758, 0x8754, 0x875B, 0x8752, 0x8761, + 0x875A, 0x8751, 0x875E, 0x876D, 0x876A, 0x8750, 0x874E, 0x875F, + 0x875D, 0x876F, 0x876C, 0x877A, 0x876E, 0x875C, 0x8765, 0x874F, + 0x877B, 0x8775, 0x8762, 0x8767, 0x8769, 0x885A, 0x8905, 0x890C, + 0x8914, 0x890B, 0x8917, 0x8918, 0x8919, 0x8906, 0x8916, 0x8911, + 0x890E, 0x8909, 0x89A2, 0x89A4, 0x89A3, 0x89ED, 0x89F0, 0x89EC, + 0x8ACF, 0x8AC6, 0x8AB8, 0x8AD3, 0x8AD1, 0x8AD4, 0x8AD5, 0x8ABB, + 0x8AD7, 0x8ABE, 0x8AC0, 0x8AC5, 0x8AD8, 0x8AC3, 0x8ABA, 0x8ABD, + 0x8AD9, 0x8C3E, 0x8C4D, 0x8C8F, 0x8CE5, 0x8CDF, 0x8CD9, 0x8CE8, + 0x8CDA, 0x8CDD, 0x8CE7, 0x8DA0, 0x8D9C, 0x8DA1, 0x8D9B, 0x8E20, + 0x8E23, 0x8E25, 0x8E24, 0x8E2E, 0x8E15, 0x8E1B, 0x8E16, 0x8E11, + 0x8E19, 0x8E26, 0x8E27, 0x8E14, 0x8E12, 0x8E18, 0x8E13, 0x8E1C, + 0x8E17, 0x8E1A, 0x8F2C, 0x8F24, 0x8F18, 0x8F1A, 0x8F20, 0x8F23, + 0x8F16, 0x8F17, 0x9073, 0x9070, 0x906F, 0x9067, 0x906B, 0x912F, + 0x912B, 0x9129, 0x912A, 0x9132, 0x9126, 0x912E, 0x9185, 0x9186, + 0x918A, 0x9181, 0x9182, 0x9184, 0x9180, 0x92D0, 0x92C3, 0x92C4, + 0x92C0, 0x92D9, 0x92B6, 0x92CF, 0x92F1, 0x92DF, 0x92D8, 0x92E9, + 0x92D7, 0x92DD, 0x92CC, 0x92EF, 0x92C2, 0x92E8, 0x92CA, 0x92C8, + 0x92CE, 0x92E6, 0x92CD, 0x92D5, 0x92C9, 0x92E0, 0x92DE, 0x92E7, + 0x92D1, 0x92D3, 0x92B5, 0x92E1, 0x92C6, 0x92B4, 0x957C, 0x95AC, + 0x95AB, 0x95AE, 0x95B0, 0x96A4, 0x96A2, 0x96D3, 0x9705, 0x9708, + 0x9702, 0x975A, 0x978A, 0x978E, 0x9788, 0x97D0, 0x97CF, 0x981E, + 0x981D, 0x9826, 0x9829, 0x9828, 0x9820, 0x981B, 0x9827, 0x98B2, + 0x9908, 0x98FA, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99DC, + 0x99CD, 0x99CF, 0x99D3, 0x99D4, 0x99CE, 0x99C9, 0x99D6, 0x99D8, + 0x99CB, 0x99D7, 0x99CC, 0x9AB3, 0x9AEC, 0x9AEB, 0x9AF3, 0x9AF2, +plane 45 +at 0x00 + 0x9AF1, 0x9B46, 0x9B43, 0x9B67, 0x9B74, 0x9B71, 0x9B66, 0x9B76, + 0x9B75, 0x9B70, 0x9B68, 0x9B64, 0x9B6C, 0x9CFC, 0x9CFA, 0x9CFD, + 0x9CFF, 0x9CF7, 0x9D07, 0x9D00, 0x9CF9, 0x9CFB, 0x9D08, 0x9D05, + 0x9D04, 0x9E83, 0x9ED3, 0x9F0F, 0x9F10, 0x511C, 0x5113, 0x5117, + 0x511A, 0x5111, 0x51DE, 0x5334, 0x53E1, 0x5670, 0x5660, 0x566E, + 0x5673, 0x5666, 0x5663, 0x566D, 0x5672, 0x565E, 0x5677, 0x571C, + 0x571B, 0x58C8, 0x58BD, 0x58C9, 0x58BF, 0x58BA, 0x58C2, 0x58BC, + 0x58C6, 0x5B17, 0x5B19, 0x5B1B, 0x5B21, 0x5B14, 0x5B13, 0x5B10, + 0x5B16, 0x5B28, 0x5B1A, 0x5B20, 0x5B1E, 0x5BEF, 0x5DAC, 0x5DB1, + 0x5DA9, 0x5DA7, 0x5DB5, 0x5DB0, 0x5DAE, 0x5DAA, 0x5DA8, 0x5DB2, + 0x5DAD, 0x5DAF, 0x5DB4, 0x5E67, 0x5E68, 0x5E66, 0x5E6F, 0x5EE9, + 0x5EE7, 0x5EE6, 0x5EE8, 0x5EE5, 0x5F4B, 0x5FBC, 0x619D, 0x61A8, + 0x6196, 0x61C5, 0x61B4, 0x61C6, 0x61C1, 0x61CC, 0x61BA, 0x61BF, + 0x61B8, 0x618C, 0x64D7, 0x64D6, 0x64D0, 0x64CF, 0x64C9, 0x64BD, + 0x6489, 0x64C3, 0x64DB, 0x64F3, 0x64D9, 0x6533, 0x657F, 0x657C, + 0x65A2, 0x66C8, 0x66BE, 0x66C0, 0x66CA, 0x66CB, 0x66CF, 0x66BD, + 0x66BB, 0x66BA, 0x66CC, 0x6723, 0x6A34, 0x6A66, 0x6A49, 0x6A67, + 0x6A32, 0x6A68, 0x6A3E, 0x6A5D, 0x6A6D, 0x6A76, 0x6A5B, 0x6A51, + 0x6A28, 0x6A5A, 0x6A3B, 0x6A3F, 0x6A41, 0x6A6A, 0x6A64, 0x6A50, + 0x6A4F, 0x6A54, 0x6A6F, 0x6A69, 0x6A60, 0x6A3C, 0x6A5E, 0x6A56, + 0x6A55, 0x6A4D, 0x6A4E, 0x6A46, 0x6B55, 0x6B54, 0x6B56, 0x6BA7, + 0x6BAA, 0x6BAB, 0x6BC8, 0x6BC7, 0x6C04, 0x6C03, 0x6C06, 0x6FAD, + 0x6FCB, 0x6FA3, 0x6FC7, 0x6FBC, 0x6FCE, 0x6FC8, 0x6F5E, 0x6FC4, + 0x6FBD, 0x6F9E, 0x6FCA, 0x6FA8, 0x7004, 0x6FA5, 0x6FAE, 0x6FBA, + 0x6FAC, 0x6FAA, 0x6FCF, 0x6FBF, 0x6FB8, 0x6FA2, 0x6FC9, 0x6FAB, + 0x6FCD, 0x6FAF, 0x6FB2, 0x6FB0, 0x71C5, 0x71C2, 0x71BF, 0x71B8, + 0x71D6, 0x71C0, 0x71C1, 0x71CB, 0x71D4, 0x71CA, 0x71C7, 0x71CF, + 0x71BD, 0x71D8, 0x71BC, 0x71C6, 0x71DA, 0x71DB, 0x729D, 0x729E, + 0x7369, 0x7366, 0x7367, 0x736C, 0x7365, 0x736B, 0x736A, 0x747F, + 0x749A, 0x74A0, 0x7494, 0x7492, 0x7495, 0x74A1, 0x750B, 0x7580, + 0x762F, 0x762D, 0x7631, 0x763D, 0x7633, 0x763C, 0x7635, 0x7632, + 0x7630, 0x76BB, 0x76E6, 0x779A, 0x779D, 0x77A1, 0x779C, 0x779B, +plane 46 +at 0x00 + 0x77A2, 0x77A3, 0x7795, 0x7799, 0x7797, 0x78DD, 0x78E9, 0x78E5, + 0x78EA, 0x78DE, 0x78E3, 0x78DB, 0x78E1, 0x78E2, 0x78ED, 0x78DF, + 0x78E0, 0x79A4, 0x7A44, 0x7A48, 0x7A47, 0x7AB6, 0x7AB8, 0x7AB5, + 0x7AB1, 0x7AB7, 0x7BDE, 0x7BE3, 0x7BE7, 0x7BDD, 0x7BD5, 0x7BE5, + 0x7BDA, 0x7BE8, 0x7BF9, 0x7BD4, 0x7BEA, 0x7BE2, 0x7BDC, 0x7BEB, + 0x7BD8, 0x7BDF, 0x7CD2, 0x7CD4, 0x7CD7, 0x7CD0, 0x7CD1, 0x7E12, + 0x7E21, 0x7E17, 0x7E0C, 0x7E1F, 0x7E20, 0x7E13, 0x7E0E, 0x7E1C, + 0x7E15, 0x7E1A, 0x7E22, 0x7E0B, 0x7E0F, 0x7E16, 0x7E0D, 0x7E14, + 0x7E25, 0x7E24, 0x7F43, 0x7F7B, 0x7F7C, 0x7F7A, 0x7FB1, 0x7FEF, + 0x802A, 0x8029, 0x806C, 0x81B1, 0x81A6, 0x81AE, 0x81B9, 0x81B5, + 0x81AB, 0x81B0, 0x81AC, 0x81B4, 0x81B2, 0x81B7, 0x81A7, 0x81F2, + 0x8255, 0x8256, 0x8257, 0x8556, 0x8545, 0x856B, 0x854D, 0x8553, + 0x8561, 0x8558, 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, + 0x8551, 0x8547, 0x8563, 0x853E, 0x855B, 0x8571, 0x854E, 0x856E, + 0x8575, 0x8555, 0x8567, 0x8560, 0x858C, 0x8566, 0x855D, 0x8554, + 0x8565, 0x856C, 0x8663, 0x8665, 0x8664, 0x879B, 0x878F, 0x8797, + 0x8793, 0x8792, 0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, + 0x87A3, 0x8785, 0x8790, 0x8791, 0x879D, 0x8784, 0x8794, 0x879C, + 0x879A, 0x8789, 0x891E, 0x8926, 0x8930, 0x892D, 0x892E, 0x8927, + 0x8931, 0x8922, 0x8929, 0x8923, 0x892F, 0x892C, 0x891F, 0x89F1, + 0x8AE0, 0x8AE2, 0x8AF2, 0x8AF4, 0x8AF5, 0x8ADD, 0x8B14, 0x8AE4, + 0x8ADF, 0x8AF0, 0x8AC8, 0x8ADE, 0x8AE1, 0x8AE8, 0x8AFF, 0x8AEF, + 0x8AFB, 0x8C91, 0x8C92, 0x8C90, 0x8CF5, 0x8CEE, 0x8CF1, 0x8CF0, + 0x8CF3, 0x8D6C, 0x8D6E, 0x8DA5, 0x8DA7, 0x8E33, 0x8E3E, 0x8E38, + 0x8E40, 0x8E45, 0x8E36, 0x8E3C, 0x8E3D, 0x8E41, 0x8E30, 0x8E3F, + 0x8EBD, 0x8F36, 0x8F2E, 0x8F35, 0x8F32, 0x8F39, 0x8F37, 0x8F34, + 0x9076, 0x9079, 0x907B, 0x9086, 0x90FA, 0x9133, 0x9135, 0x9136, + 0x9193, 0x9190, 0x9191, 0x918D, 0x918F, 0x9327, 0x931E, 0x9308, + 0x931F, 0x9306, 0x930F, 0x937A, 0x9338, 0x933C, 0x931B, 0x9323, + 0x9312, 0x9301, 0x9346, 0x932D, 0x930E, 0x930D, 0x92CB, 0x931D, + 0x92FA, 0x9325, 0x9313, 0x92F9, 0x92F7, 0x9334, 0x9302, 0x9324, + 0x92FF, 0x9329, 0x9339, 0x9335, 0x932A, 0x9314, 0x930C, 0x930B, +plane 47 +at 0x00 + 0x92FE, 0x9309, 0x9300, 0x92FB, 0x9316, 0x95BC, 0x95CD, 0x95BE, + 0x95B9, 0x95BA, 0x95B6, 0x95BF, 0x95B5, 0x95BD, 0x96A9, 0x96D4, + 0x970B, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97F0, 0x97F8, + 0x9835, 0x982F, 0x9832, 0x9924, 0x991F, 0x9927, 0x9929, 0x999E, + 0x99EE, 0x99EC, 0x99E5, 0x99E4, 0x99F0, 0x99E3, 0x99EA, 0x99E9, + 0x99E7, 0x9AB9, 0x9ABF, 0x9AB4, 0x9ABB, 0x9AF6, 0x9AFA, 0x9AF9, + 0x9AF7, 0x9B33, 0x9B80, 0x9B85, 0x9B87, 0x9B7C, 0x9B7E, 0x9B7B, + 0x9B82, 0x9B93, 0x9B92, 0x9B90, 0x9B7A, 0x9B95, 0x9B7D, 0x9B88, + 0x9D25, 0x9D17, 0x9D20, 0x9D1E, 0x9D14, 0x9D29, 0x9D1D, 0x9D18, + 0x9D22, 0x9D10, 0x9D19, 0x9D1F, 0x9E88, 0x9E86, 0x9E87, 0x9EAE, + 0x9EAD, 0x9ED5, 0x9ED6, 0x9EFA, 0x9F12, 0x9F3D, 0x5126, 0x5125, + 0x5122, 0x5124, 0x5120, 0x5129, 0x52F4, 0x5693, 0x568C, 0x568D, + 0x5686, 0x5684, 0x5683, 0x567E, 0x5682, 0x567F, 0x5681, 0x58D6, + 0x58D4, 0x58CF, 0x58D2, 0x5B2D, 0x5B25, 0x5B32, 0x5B23, 0x5B2C, + 0x5B27, 0x5B26, 0x5B2F, 0x5B2E, 0x5B7B, 0x5BF1, 0x5BF2, 0x5DB7, + 0x5E6C, 0x5E6A, 0x5FBE, 0x5FBB, 0x61C3, 0x61B5, 0x61BC, 0x61E7, + 0x61E0, 0x61E5, 0x61E4, 0x61E8, 0x61DE, 0x64EF, 0x64E9, 0x64E3, + 0x64EB, 0x64E4, 0x64E8, 0x6581, 0x6580, 0x65B6, 0x65DA, 0x66D2, + 0x6A8D, 0x6A96, 0x6A81, 0x6AA5, 0x6A89, 0x6A9F, 0x6A9B, 0x6AA1, + 0x6A9E, 0x6A87, 0x6A93, 0x6A8E, 0x6A95, 0x6A83, 0x6AA8, 0x6AA4, + 0x6A91, 0x6A7F, 0x6AA6, 0x6A9A, 0x6A85, 0x6A8C, 0x6A92, 0x6B5B, + 0x6BAD, 0x6C09, 0x6FCC, 0x6FA9, 0x6FF4, 0x6FD4, 0x6FE3, 0x6FDC, + 0x6FED, 0x6FE7, 0x6FE6, 0x6FDE, 0x6FF2, 0x6FDD, 0x6FE2, 0x6FE8, + 0x71E1, 0x71F1, 0x71E8, 0x71F2, 0x71E4, 0x71F0, 0x71E2, 0x7373, + 0x736E, 0x736F, 0x7497, 0x74B2, 0x74AB, 0x7490, 0x74AA, 0x74AD, + 0x74B1, 0x74A5, 0x74AF, 0x7510, 0x7511, 0x7512, 0x750F, 0x7584, + 0x7643, 0x7648, 0x7649, 0x7647, 0x76A4, 0x76E9, 0x77B5, 0x77AB, + 0x77B2, 0x77B7, 0x77B6, 0x77B4, 0x77B1, 0x77A8, 0x77F0, 0x78F3, + 0x78FD, 0x7902, 0x78FB, 0x78FC, 0x78F2, 0x7905, 0x78F9, 0x78FE, + 0x7904, 0x79AB, 0x79A8, 0x7A5C, 0x7A5B, 0x7A56, 0x7A58, 0x7A54, + 0x7A5A, 0x7ABE, 0x7AC0, 0x7AC1, 0x7C05, 0x7C0F, 0x7BF2, 0x7C00, + 0x7BFF, 0x7BFB, 0x7C0E, 0x7BF4, 0x7C0B, 0x7BF3, 0x7C02, 0x7C09, +plane 48 +at 0x00 + 0x7C03, 0x7C01, 0x7BF8, 0x7BFD, 0x7C06, 0x7BF0, 0x7BF1, 0x7C10, + 0x7C0A, 0x7CE8, 0x7E2D, 0x7E3C, 0x7E42, 0x7E33, 0x9848, 0x7E38, + 0x7E2A, 0x7E49, 0x7E40, 0x7E47, 0x7E29, 0x7E4C, 0x7E30, 0x7E3B, + 0x7E36, 0x7E44, 0x7E3A, 0x7F45, 0x7F7F, 0x7F7E, 0x7F7D, 0x7FF4, + 0x7FF2, 0x802C, 0x81BB, 0x81C4, 0x81CC, 0x81CA, 0x81C5, 0x81C7, + 0x81BC, 0x81E9, 0x825B, 0x825A, 0x825C, 0x8583, 0x8580, 0x858F, + 0x85A7, 0x8595, 0x85A0, 0x858B, 0x85A3, 0x857B, 0x85A4, 0x859A, + 0x859E, 0x8577, 0x857C, 0x8589, 0x85A1, 0x857A, 0x8578, 0x8557, + 0x858E, 0x8596, 0x8586, 0x858D, 0x8599, 0x859D, 0x8581, 0x85A2, + 0x8582, 0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859F, + 0x8668, 0x87BE, 0x87AA, 0x87AD, 0x87C5, 0x87B0, 0x87AC, 0x87B9, + 0x87B5, 0x87BC, 0x87AE, 0x87C9, 0x87C3, 0x87C2, 0x87CC, 0x87B7, + 0x87AF, 0x87C4, 0x87CA, 0x87B4, 0x87B6, 0x87BF, 0x87B8, 0x87BD, + 0x87DE, 0x87B2, 0x8935, 0x8933, 0x893C, 0x893E, 0x8941, 0x8952, + 0x8937, 0x8942, 0x89AD, 0x89AF, 0x89AE, 0x89F2, 0x89F3, 0x8B1E, + 0x8B18, 0x8B16, 0x8B11, 0x8B05, 0x8B0B, 0x8B22, 0x8B0F, 0x8B12, + 0x8B15, 0x8B07, 0x8B0D, 0x8B08, 0x8B06, 0x8B1C, 0x8B13, 0x8B1A, + 0x8C4F, 0x8C70, 0x8C72, 0x8C71, 0x8C6F, 0x8C95, 0x8C94, 0x8CF9, + 0x8D6F, 0x8E4E, 0x8E4D, 0x8E53, 0x8E50, 0x8E4C, 0x8E47, 0x8F43, + 0x8F40, 0x9085, 0x907E, 0x9138, 0x919A, 0x91A2, 0x919B, 0x9199, + 0x919F, 0x91A1, 0x919D, 0x91A0, 0x93A1, 0x9383, 0x93AF, 0x9364, + 0x9356, 0x9347, 0x937C, 0x9358, 0x935C, 0x9376, 0x9349, 0x9350, + 0x9351, 0x9360, 0x936D, 0x938F, 0x934C, 0x936A, 0x9379, 0x9357, + 0x9355, 0x9352, 0x934F, 0x9371, 0x9377, 0x937B, 0x9361, 0x935E, + 0x9363, 0x9367, 0x9380, 0x934E, 0x9359, 0x95C7, 0x95C0, 0x95C9, + 0x95C3, 0x95C5, 0x95B7, 0x96AE, 0x96B0, 0x96AC, 0x9720, 0x971F, + 0x9718, 0x971D, 0x9719, 0x979A, 0x97A1, 0x979C, 0x979E, 0x979D, + 0x97D5, 0x97D4, 0x97F1, 0x9841, 0x9844, 0x984A, 0x9849, 0x9845, + 0x9843, 0x9925, 0x992B, 0x992C, 0x992A, 0x9933, 0x9932, 0x992F, + 0x992D, 0x9931, 0x9930, 0x9998, 0x99A3, 0x99A1, 0x9A02, 0x99FA, + 0x99F4, 0x99F7, 0x99F9, 0x99F8, 0x99F6, 0x99FB, 0x99FD, 0x99FE, + 0x99FC, 0x9A03, 0x9ABE, 0x9AFE, 0x9AFD, 0x9B01, 0x9AFC, 0x9B48, +plane 49 +at 0x00 + 0x9B9A, 0x9BA8, 0x9B9E, 0x9B9B, 0x9BA6, 0x9BA1, 0x9BA5, 0x9BA4, + 0x9B86, 0x9BA2, 0x9BA0, 0x9BAF, 0x9D33, 0x9D41, 0x9D67, 0x9D36, + 0x9D2E, 0x9D2F, 0x9D31, 0x9D38, 0x9D30, 0x9D45, 0x9D42, 0x9D43, + 0x9D3E, 0x9D37, 0x9D40, 0x9D3D, 0x7FF5, 0x9D2D, 0x9E8A, 0x9E89, + 0x9E8D, 0x9EB0, 0x9EC8, 0x9EDA, 0x9EFB, 0x9EFF, 0x9F24, 0x9F23, + 0x9F22, 0x9F54, 0x9FA0, 0x5131, 0x512D, 0x512E, 0x5698, 0x569C, + 0x5697, 0x569A, 0x569D, 0x5699, 0x5970, 0x5B3C, 0x5C69, 0x5C6A, + 0x5DC0, 0x5E6D, 0x5E6E, 0x61D8, 0x61DF, 0x61ED, 0x61EE, 0x61F1, + 0x61EA, 0x61F0, 0x61EB, 0x61D6, 0x61E9, 0x64FF, 0x6504, 0x64FD, + 0x64F8, 0x6501, 0x6503, 0x64FC, 0x6594, 0x65DB, 0x66DA, 0x66DB, + 0x66D8, 0x6AC5, 0x6AB9, 0x6ABD, 0x6AE1, 0x6AC6, 0x6ABA, 0x6AB6, + 0x6AB7, 0x6AC7, 0x6AB4, 0x6AAD, 0x6B5E, 0x6BC9, 0x6C0B, 0x7007, + 0x700C, 0x700D, 0x7001, 0x7005, 0x7014, 0x700E, 0x6FFF, 0x7000, + 0x6FFB, 0x7026, 0x6FFC, 0x6FF7, 0x700A, 0x7201, 0x71FF, 0x71F9, + 0x7203, 0x71FD, 0x7376, 0x74B8, 0x74C0, 0x74B5, 0x74C1, 0x74BE, + 0x74B6, 0x74BB, 0x74C2, 0x7514, 0x7513, 0x765C, 0x7664, 0x7659, + 0x7650, 0x7653, 0x7657, 0x765A, 0x76A6, 0x76BD, 0x76EC, 0x77C2, + 0x77BA, 0x78FF, 0x790C, 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, + 0x7911, 0x79AD, 0x79AC, 0x7A5F, 0x7C1C, 0x7C29, 0x7C19, 0x7C20, + 0x7C1F, 0x7C2D, 0x7C1D, 0x7C26, 0x7C28, 0x7C22, 0x7C25, 0x7C30, + 0x7E5C, 0x7E50, 0x7E56, 0x7E63, 0x7E58, 0x7E62, 0x7E5F, 0x7E51, + 0x7E60, 0x7E57, 0x7E53, 0x7FB5, 0x7FB3, 0x7FF7, 0x7FF8, 0x8075, + 0x81D1, 0x81D2, 0x81D0, 0x825F, 0x825E, 0x85B4, 0x85C6, 0x85C0, + 0x85C3, 0x85C2, 0x85B3, 0x85B5, 0x85BD, 0x85C7, 0x85C4, 0x85BF, + 0x85CB, 0x85CE, 0x85C8, 0x85C5, 0x85B1, 0x85B6, 0x85D2, 0x8624, + 0x85B8, 0x85B7, 0x85BE, 0x8669, 0x87E7, 0x87E6, 0x87E2, 0x87DB, + 0x87EB, 0x87EA, 0x87E5, 0x87DF, 0x87F3, 0x87E4, 0x87D4, 0x87DC, + 0x87D3, 0x87ED, 0x87D8, 0x87E3, 0x87A4, 0x87D7, 0x87D9, 0x8801, + 0x87F4, 0x87E8, 0x87DD, 0x8953, 0x894B, 0x894F, 0x894C, 0x8946, + 0x8950, 0x8951, 0x8949, 0x8B2A, 0x8B27, 0x8B23, 0x8B33, 0x8B30, + 0x8B35, 0x8B47, 0x8B2F, 0x8B3C, 0x8B3E, 0x8B31, 0x8B25, 0x8B37, + 0x8B26, 0x8B36, 0x8B2E, 0x8B24, 0x8B3B, 0x8B3D, 0x8B3A, 0x8C42, +plane 50 +at 0x00 + 0x8C75, 0x8C99, 0x8C98, 0x8C97, 0x8CFE, 0x8D04, 0x8D02, 0x8D00, + 0x8E5C, 0x8E62, 0x8E60, 0x8E57, 0x8E56, 0x8E5E, 0x8E65, 0x8E67, + 0x8E5B, 0x8E5A, 0x8E61, 0x8E5D, 0x8E69, 0x8E54, 0x8F46, 0x8F47, + 0x8F48, 0x8F4B, 0x9128, 0x913A, 0x913B, 0x913E, 0x91A8, 0x91A5, + 0x91A7, 0x91AF, 0x91AA, 0x93B5, 0x938C, 0x9392, 0x93B7, 0x939B, + 0x939D, 0x9389, 0x93A7, 0x938E, 0x93AA, 0x939E, 0x93A6, 0x9395, + 0x9388, 0x9399, 0x939F, 0x938D, 0x93B1, 0x9391, 0x93B2, 0x93A4, + 0x93A8, 0x93B4, 0x93A3, 0x93A5, 0x95D2, 0x95D3, 0x95D1, 0x96B3, + 0x96D7, 0x96DA, 0x5DC2, 0x96DF, 0x96D8, 0x96DD, 0x9723, 0x9722, + 0x9725, 0x97AC, 0x97AE, 0x97A8, 0x97AB, 0x97A4, 0x97AA, 0x97A2, + 0x97A5, 0x97D7, 0x97D9, 0x97D6, 0x97D8, 0x97FA, 0x9850, 0x9851, + 0x9852, 0x98B8, 0x9941, 0x993C, 0x993A, 0x9A0F, 0x9A0B, 0x9A09, + 0x9A0D, 0x9A04, 0x9A11, 0x9A0A, 0x9A05, 0x9A07, 0x9A06, 0x9AC0, + 0x9ADC, 0x9B08, 0x9B04, 0x9B05, 0x9B29, 0x9B35, 0x9B4A, 0x9B4C, + 0x9B4B, 0x9BC7, 0x9BC6, 0x9BC3, 0x9BBF, 0x9BC1, 0x9BB5, 0x9BB8, + 0x9BD3, 0x9BB6, 0x9BC4, 0x9BB9, 0x9BBD, 0x9D5C, 0x9D53, 0x9D4F, + 0x9D4A, 0x9D5B, 0x9D4B, 0x9D59, 0x9D56, 0x9D4C, 0x9D57, 0x9D52, + 0x9D54, 0x9D5F, 0x9D58, 0x9D5A, 0x9E8E, 0x9E8C, 0x9EDF, 0x9F01, + 0x9F00, 0x9F16, 0x9F25, 0x9F2B, 0x9F2A, 0x9F29, 0x9F28, 0x9F4C, + 0x9F55, 0x5134, 0x5135, 0x5296, 0x52F7, 0x53B4, 0x56AB, 0x56AD, + 0x56A6, 0x56A7, 0x56AA, 0x56AC, 0x58DA, 0x58DD, 0x58DB, 0x5912, + 0x5B3D, 0x5B3E, 0x5B3F, 0x5DC3, 0x5E70, 0x5FBF, 0x61FB, 0x6507, + 0x6510, 0x650D, 0x6509, 0x650C, 0x650E, 0x6584, 0x65DE, 0x65DD, + 0x66DE, 0x6AE7, 0x6AE0, 0x6ACC, 0x6AD1, 0x6AD9, 0x6ACB, 0x6ADF, + 0x6ADC, 0x6AD0, 0x6AEB, 0x6ACF, 0x6ACD, 0x6ADE, 0x6B60, 0x6BB0, + 0x6C0C, 0x7019, 0x7027, 0x7020, 0x7016, 0x702B, 0x7021, 0x7022, + 0x7023, 0x7029, 0x7017, 0x7024, 0x701C, 0x702A, 0x720C, 0x720A, + 0x7207, 0x7202, 0x7205, 0x72A5, 0x72A6, 0x72A4, 0x72A3, 0x72A1, + 0x74CB, 0x74C5, 0x74B7, 0x74C3, 0x7516, 0x7660, 0x77C9, 0x77CA, + 0x77C4, 0x77F1, 0x791D, 0x791B, 0x7921, 0x791C, 0x7917, 0x791E, + 0x79B0, 0x7A67, 0x7A68, 0x7C33, 0x7C3C, 0x7C39, 0x7C2C, 0x7C3B, + 0x7CEC, 0x7CEA, 0x7E76, 0x7E75, 0x7E78, 0x7E70, 0x7E77, 0x7E6F, +plane 51 +at 0x00 + 0x7E7A, 0x7E72, 0x7E74, 0x7E68, 0x7F4B, 0x7F4A, 0x7F83, 0x7F86, + 0x7FB7, 0x7FFD, 0x7FFE, 0x8078, 0x81D7, 0x81D5, 0x8264, 0x8261, + 0x8263, 0x85EB, 0x85F1, 0x85ED, 0x85D9, 0x85E1, 0x85E8, 0x85DA, + 0x85D7, 0x85EC, 0x85F2, 0x85F8, 0x85D8, 0x85DF, 0x85E3, 0x85DC, + 0x85D1, 0x85F0, 0x85E6, 0x85EF, 0x85DE, 0x85E2, 0x8800, 0x87FA, + 0x8803, 0x87F6, 0x87F7, 0x8809, 0x880C, 0x880B, 0x8806, 0x87FC, + 0x8808, 0x87FF, 0x880A, 0x8802, 0x8962, 0x895A, 0x895B, 0x8957, + 0x8961, 0x895C, 0x8958, 0x895D, 0x8959, 0x8988, 0x89B7, 0x89B6, + 0x89F6, 0x8B50, 0x8B48, 0x8B4A, 0x8B40, 0x8B53, 0x8B56, 0x8B54, + 0x8B4B, 0x8B55, 0x8B51, 0x8B42, 0x8B52, 0x8B57, 0x8C43, 0x8C77, + 0x8C76, 0x8C9A, 0x8D06, 0x8D07, 0x8D09, 0x8DAC, 0x8DAA, 0x8DAD, + 0x8DAB, 0x8E6D, 0x8E78, 0x8E73, 0x8E6A, 0x8E6F, 0x8E7B, 0x8EC2, + 0x8F52, 0x8F51, 0x8F4F, 0x8F50, 0x8F53, 0x8FB4, 0x9140, 0x913F, + 0x91B0, 0x91AD, 0x93DE, 0x93C7, 0x93CF, 0x93C2, 0x93DA, 0x93D0, + 0x93F9, 0x93EC, 0x93CC, 0x93D9, 0x93A9, 0x93E6, 0x93CA, 0x93D4, + 0x93EE, 0x93E3, 0x93D5, 0x93C4, 0x93CE, 0x93C0, 0x93D2, 0x93E7, + 0x957D, 0x95DA, 0x95DB, 0x96E1, 0x9729, 0x972B, 0x972C, 0x9728, + 0x9726, 0x97B3, 0x97B7, 0x97B6, 0x97DD, 0x97DE, 0x97DF, 0x985C, + 0x9859, 0x985D, 0x9857, 0x98BF, 0x98BD, 0x98BB, 0x98BE, 0x9948, + 0x9947, 0x9943, 0x99A6, 0x99A7, 0x9A1A, 0x9A15, 0x9A25, 0x9A1D, + 0x9A24, 0x9A1B, 0x9A22, 0x9A20, 0x9A27, 0x9A23, 0x9A1E, 0x9A1C, + 0x9A14, 0x9AC2, 0x9B0B, 0x9B0A, 0x9B0E, 0x9B0C, 0x9B37, 0x9BEA, + 0x9BEB, 0x9BE0, 0x9BDE, 0x9BE4, 0x9BE6, 0x9BE2, 0x9BF0, 0x9BD4, + 0x9BD7, 0x9BEC, 0x9BDC, 0x9BD9, 0x9BE5, 0x9BD5, 0x9BE1, 0x9BDA, + 0x9D77, 0x9D81, 0x9D8A, 0x9D84, 0x9D88, 0x9D71, 0x9D80, 0x9D78, + 0x9D86, 0x9D8B, 0x9D8C, 0x9D7D, 0x9D6B, 0x9D74, 0x9D75, 0x9D70, + 0x9D69, 0x9D85, 0x9D73, 0x9D7B, 0x9D82, 0x9D6F, 0x9D79, 0x9D7F, + 0x9D87, 0x9D68, 0x9E94, 0x9E91, 0x9EC0, 0x9EFC, 0x9F2D, 0x9F40, + 0x9F41, 0x9F4D, 0x9F56, 0x9F57, 0x9F58, 0x5337, 0x56B2, 0x56B5, + 0x56B3, 0x58E3, 0x5B45, 0x5DC6, 0x5DC7, 0x5EEE, 0x5EEF, 0x5FC0, + 0x5FC1, 0x61F9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65DF, 0x66E8, + 0x66E3, 0x66E4, 0x6AF3, 0x6AF0, 0x6AEA, 0x6AE8, 0x6AF9, 0x6AF1, +plane 52 +at 0x00 + 0x6AEE, 0x6AEF, 0x703C, 0x7035, 0x702F, 0x7037, 0x7034, 0x7031, + 0x7042, 0x7038, 0x703F, 0x703A, 0x7039, 0x7040, 0x703B, 0x7033, + 0x7041, 0x7213, 0x7214, 0x72A8, 0x737D, 0x737C, 0x74BA, 0x76AB, + 0x76AA, 0x76BE, 0x76ED, 0x77CC, 0x77CE, 0x77CF, 0x77CD, 0x77F2, + 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, 0x79B2, 0x7A6E, + 0x7A6C, 0x7A6D, 0x7AF7, 0x7C49, 0x7C48, 0x7C4A, 0x7C47, 0x7C45, + 0x7CEE, 0x7E7B, 0x7E7E, 0x7E81, 0x7E80, 0x7FBA, 0x7FFF, 0x8079, + 0x81DB, 0x81D9, 0x820B, 0x8268, 0x8269, 0x8622, 0x85FF, 0x8601, + 0x85FE, 0x861B, 0x8600, 0x85F6, 0x8604, 0x8609, 0x8605, 0x860C, + 0x85FD, 0x8819, 0x8810, 0x8811, 0x8817, 0x8813, 0x8816, 0x8963, + 0x8966, 0x89B9, 0x89F7, 0x8B60, 0x8B6A, 0x8B5D, 0x8B68, 0x8B63, + 0x8B65, 0x8B67, 0x8B6D, 0x8DAE, 0x8E86, 0x8E88, 0x8E84, 0x8F59, + 0x8F56, 0x8F57, 0x8F55, 0x8F58, 0x8F5A, 0x908D, 0x9143, 0x9141, + 0x91B7, 0x91B5, 0x91B2, 0x91B3, 0x940B, 0x9413, 0x93FB, 0x9420, + 0x940F, 0x9414, 0x93FE, 0x9415, 0x9410, 0x9428, 0x9419, 0x940D, + 0x93F5, 0x9400, 0x93F7, 0x9407, 0x940E, 0x9416, 0x9412, 0x93FA, + 0x9409, 0x93F8, 0x940A, 0x93FF, 0x93FC, 0x940C, 0x93F6, 0x9411, + 0x9406, 0x95DE, 0x95E0, 0x95DF, 0x972E, 0x972F, 0x97B9, 0x97BB, + 0x97FD, 0x97FE, 0x9860, 0x9862, 0x9863, 0x985F, 0x98C1, 0x98C2, + 0x9950, 0x994E, 0x9959, 0x994C, 0x994B, 0x9953, 0x9A32, 0x9A34, + 0x9A31, 0x9A2C, 0x9A2A, 0x9A36, 0x9A29, 0x9A2E, 0x9A38, 0x9A2D, + 0x9AC7, 0x9ACA, 0x9AC6, 0x9B10, 0x9B12, 0x9B11, 0x9C0B, 0x9C08, + 0x9BF7, 0x9C05, 0x9C12, 0x9BF8, 0x9C40, 0x9C07, 0x9C0E, 0x9C06, + 0x9C17, 0x9C14, 0x9C09, 0x9D9F, 0x9D99, 0x9DA4, 0x9D9D, 0x9D92, + 0x9D98, 0x9D90, 0x9D9B, 0x9DA0, 0x9D94, 0x9D9C, 0x9DAA, 0x9D97, + 0x9DA1, 0x9D9A, 0x9DA2, 0x9DA8, 0x9D9E, 0x9DA3, 0x9DBF, 0x9DA9, + 0x9D96, 0x9DA6, 0x9DA7, 0x9E99, 0x9E9B, 0x9E9A, 0x9EE5, 0x9EE4, + 0x9EE7, 0x9EE6, 0x9F30, 0x9F2E, 0x9F5B, 0x9F60, 0x9F5E, 0x9F5D, + 0x9F59, 0x9F91, 0x513A, 0x5139, 0x5298, 0x5297, 0x56C3, 0x56BD, + 0x56BE, 0x5B48, 0x5B47, 0x5DCB, 0x5DCF, 0x5EF1, 0x61FD, 0x651B, + 0x6B02, 0x6AFC, 0x6B03, 0x6AF8, 0x6B00, 0x7043, 0x7044, 0x704A, + 0x7048, 0x7049, 0x7045, 0x7046, 0x721D, 0x721A, 0x7219, 0x737E, +plane 53 +at 0x00 + 0x7517, 0x766A, 0x77D0, 0x792D, 0x7931, 0x792F, 0x7C54, 0x7C53, + 0x7CF2, 0x7E8A, 0x7E87, 0x7E88, 0x7E8B, 0x7E86, 0x7E8D, 0x7F4D, + 0x7FBB, 0x8030, 0x81DD, 0x8618, 0x862A, 0x8626, 0x861F, 0x8623, + 0x861C, 0x8619, 0x8627, 0x862E, 0x8621, 0x8620, 0x8629, 0x861E, + 0x8625, 0x8829, 0x881D, 0x881B, 0x8820, 0x8824, 0x881C, 0x882B, + 0x884A, 0x896D, 0x8969, 0x896E, 0x896B, 0x89FA, 0x8B79, 0x8B78, + 0x8B45, 0x8B7A, 0x8B7B, 0x8D10, 0x8D14, 0x8DAF, 0x8E8E, 0x8E8C, + 0x8F5E, 0x8F5B, 0x8F5D, 0x9146, 0x9144, 0x9145, 0x91B9, 0x943F, + 0x943B, 0x9436, 0x9429, 0x943D, 0x943C, 0x9430, 0x9439, 0x942A, + 0x9437, 0x942C, 0x9440, 0x9431, 0x95E5, 0x95E4, 0x95E3, 0x9735, + 0x973A, 0x97BF, 0x97E1, 0x9864, 0x98C9, 0x98C6, 0x98C0, 0x9958, + 0x9956, 0x9A39, 0x9A3D, 0x9A46, 0x9A44, 0x9A42, 0x9A41, 0x9A3A, + 0x9A3F, 0x9ACD, 0x9B15, 0x9B17, 0x9B18, 0x9B16, 0x9B3A, 0x9B52, + 0x9C2B, 0x9C1D, 0x9C1C, 0x9C2C, 0x9C23, 0x9C28, 0x9C29, 0x9C24, + 0x9C21, 0x9DB7, 0x9DB6, 0x9DBC, 0x9DC1, 0x9DC7, 0x9DCA, 0x9DCF, + 0x9DBE, 0x9DC5, 0x9DC3, 0x9DBB, 0x9DB5, 0x9DCE, 0x9DB9, 0x9DBA, + 0x9DAC, 0x9DC8, 0x9DB1, 0x9DAD, 0x9DCC, 0x9DB3, 0x9DCD, 0x9DB2, + 0x9E7A, 0x9E9C, 0x9EEB, 0x9EEE, 0x9EED, 0x9F1B, 0x9F18, 0x9F1A, + 0x9F31, 0x9F4E, 0x9F65, 0x9F64, 0x9F92, 0x4EB9, 0x56C6, 0x56C5, + 0x56CB, 0x5971, 0x5B4B, 0x5B4C, 0x5DD5, 0x5DD1, 0x5EF2, 0x6521, + 0x6520, 0x6526, 0x6522, 0x6B0B, 0x6B08, 0x6B09, 0x6C0D, 0x7055, + 0x7056, 0x7057, 0x7052, 0x721E, 0x721F, 0x72A9, 0x737F, 0x74D8, + 0x74D5, 0x74D9, 0x74D7, 0x766D, 0x76AD, 0x7935, 0x79B4, 0x7A70, + 0x7A71, 0x7C57, 0x7C5C, 0x7C59, 0x7C5B, 0x7C5A, 0x7CF4, 0x7CF1, + 0x7E91, 0x7F4F, 0x7F87, 0x81DE, 0x826B, 0x8634, 0x8635, 0x8633, + 0x862C, 0x8632, 0x8636, 0x882C, 0x8828, 0x8826, 0x882A, 0x8825, + 0x8971, 0x89BF, 0x89BE, 0x89FB, 0x8B7E, 0x8B84, 0x8B82, 0x8B86, + 0x8B85, 0x8B7F, 0x8D15, 0x8E95, 0x8E94, 0x8E9A, 0x8E92, 0x8E90, + 0x8E96, 0x8E97, 0x8F60, 0x8F62, 0x9147, 0x944C, 0x9450, 0x944A, + 0x944B, 0x944F, 0x9447, 0x9445, 0x9448, 0x9449, 0x9446, 0x973F, + 0x97E3, 0x986A, 0x9869, 0x98CB, 0x9954, 0x995B, 0x9A4E, 0x9A53, + 0x9A54, 0x9A4C, 0x9A4F, 0x9A48, 0x9A4A, 0x9A49, 0x9A52, 0x9A50, +plane 54 +at 0x00 + 0x9AD0, 0x9B19, 0x9B2B, 0x9B3B, 0x9B56, 0x9B55, 0x9C46, 0x9C48, + 0x9C3F, 0x9C44, 0x9C39, 0x9C33, 0x9C41, 0x9C3C, 0x9C37, 0x9C34, + 0x9C32, 0x9C3D, 0x9C36, 0x9DDB, 0x9DD2, 0x9DDE, 0x9DDA, 0x9DCB, + 0x9DD0, 0x9DDC, 0x9DD1, 0x9DDF, 0x9DE9, 0x9DD9, 0x9DD8, 0x9DD6, + 0x9DF5, 0x9DD5, 0x9DDD, 0x9EB6, 0x9EF0, 0x9F35, 0x9F33, 0x9F32, + 0x9F42, 0x9F6B, 0x9F95, 0x9FA2, 0x513D, 0x5299, 0x58E8, 0x58E7, + 0x5972, 0x5B4D, 0x5DD8, 0x882F, 0x5F4F, 0x6201, 0x6203, 0x6204, + 0x6529, 0x6525, 0x6596, 0x66EB, 0x6B11, 0x6B12, 0x6B0F, 0x6BCA, + 0x705B, 0x705A, 0x7222, 0x7382, 0x7381, 0x7383, 0x7670, 0x77D4, + 0x7C67, 0x7C66, 0x7E95, 0x826C, 0x863A, 0x8640, 0x8639, 0x863C, + 0x8631, 0x863B, 0x863E, 0x8830, 0x8832, 0x882E, 0x8833, 0x8976, + 0x8974, 0x8973, 0x89FE, 0x8B8C, 0x8B8E, 0x8B8B, 0x8B88, 0x8C45, + 0x8D19, 0x8E98, 0x8F64, 0x8F63, 0x91BC, 0x9462, 0x9455, 0x945D, + 0x9457, 0x945E, 0x97C4, 0x97C5, 0x9800, 0x9A56, 0x9A59, 0x9B1E, + 0x9B1F, 0x9B20, 0x9C52, 0x9C58, 0x9C50, 0x9C4A, 0x9C4D, 0x9C4B, + 0x9C55, 0x9C59, 0x9C4C, 0x9C4E, 0x9DFB, 0x9DF7, 0x9DEF, 0x9DE3, + 0x9DEB, 0x9DF8, 0x9DE4, 0x9DF6, 0x9DE1, 0x9DEE, 0x9DE6, 0x9DF2, + 0x9DF0, 0x9DE2, 0x9DEC, 0x9DF4, 0x9DF3, 0x9DE8, 0x9DED, 0x9EC2, + 0x9ED0, 0x9EF2, 0x9EF3, 0x9F06, 0x9F1C, 0x9F38, 0x9F37, 0x9F36, + 0x9F43, 0x9F4F, 0x9F71, 0x9F70, 0x9F6E, 0x9F6F, 0x56D3, 0x56CD, + 0x5B4E, 0x5C6D, 0x652D, 0x66ED, 0x66EE, 0x6B13, 0x705F, 0x7061, + 0x705D, 0x7060, 0x7223, 0x74DB, 0x74E5, 0x77D5, 0x7938, 0x79B7, + 0x79B6, 0x7C6A, 0x7E97, 0x7F89, 0x826D, 0x8643, 0x8838, 0x8837, + 0x8835, 0x884B, 0x8B94, 0x8B95, 0x8E9E, 0x8E9F, 0x8EA0, 0x8E9D, + 0x91BE, 0x91BD, 0x91C2, 0x946B, 0x9468, 0x9469, 0x96E5, 0x9746, + 0x9743, 0x9747, 0x97C7, 0x97E5, 0x9A5E, 0x9AD5, 0x9B59, 0x9C63, + 0x9C67, 0x9C66, 0x9C62, 0x9C5E, 0x9C60, 0x9E02, 0x9DFE, 0x9E07, + 0x9E03, 0x9E06, 0x9E05, 0x9E00, 0x9E01, 0x9E09, 0x9DFF, 0x9DFD, + 0x9E04, 0x9EA0, 0x9F1E, 0x9F46, 0x9F74, 0x9F75, 0x9F76, 0x56D4, + 0x652E, 0x65B8, 0x6B18, 0x6B19, 0x6B17, 0x6B1A, 0x7062, 0x7226, + 0x72AA, 0x77D8, 0x77D9, 0x7939, 0x7C69, 0x7C6B, 0x7CF6, 0x7E9A, + 0x7E98, 0x7E9B, 0x7E99, 0x81E0, 0x81E1, 0x8646, 0x8647, 0x8648, +plane 55 +at 0x00 + 0x8979, 0x897A, 0x897C, 0x897B, 0x89FF, 0x8B98, 0x8B99, 0x8EA5, + 0x8EA4, 0x8EA3, 0x946E, 0x946D, 0x946F, 0x9471, 0x9473, 0x9749, + 0x9872, 0x995F, 0x9C68, 0x9C6E, 0x9C6D, 0x9E0B, 0x9E0D, 0x9E10, + 0x9E0F, 0x9E12, 0x9E11, 0x9EA1, 0x9EF5, 0x9F09, 0x9F47, 0x9F78, + 0x9F7B, 0x9F7A, 0x9F79, 0x571E, 0x7066, 0x7C6F, 0x883C, 0x8DB2, + 0x8EA6, 0x91C3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9A60, 0x9C74, + 0x9C73, 0x9C71, 0x9C75, 0x9E14, 0x9E13, 0x9EF6, 0x9F0A, 0x9FA4, + 0x7068, 0x7065, 0x7CF7, 0x866A, 0x883E, 0x883D, 0x883F, 0x8B9E, + 0x8C9C, 0x8EA9, 0x8EC9, 0x974B, 0x9873, 0x9874, 0x98CC, 0x9961, + 0x99AB, 0x9A64, 0x9A66, 0x9A67, 0x9B24, 0x9E15, 0x9E17, 0x9F48, + 0x6207, 0x6B1E, 0x7227, 0x864C, 0x8EA8, 0x9482, 0x9480, 0x9481, + 0x9A69, 0x9A68, 0x9B2E, 0x9E19, 0x7229, 0x864B, 0x8B9F, 0x9483, + 0x9C79, 0x9EB7, 0x7675, 0x9A6B, 0x9C7A, 0x9E1D, 0x7069, 0x706A, + 0x9EA4, 0x9F7E, 0x9F49, 0x9F98, 0x7881, 0x92B9, 0x88CF, 0x58BB, + 0x6052, 0x7CA7, 0x5AFA, 0x2554, 0x2566, 0x2557, 0x2560, 0x256C, + 0x2563, 0x255A, 0x2569, 0x255D, 0x2552, 0x2564, 0x2555, 0x255E, + 0x256A, 0x2561, 0x2558, 0x2567, 0x255B, 0x2553, 0x2565, 0x2556, + 0x255F, 0x256B, 0x2562, 0x2559, 0x2568, 0x255C, 0x2551, 0x2550, + 0x256D, 0x256E, 0x2570, 0x256F, 0x2593, 0, 0, 0, diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/cugb.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/cugb.map new file mode 100755 index 00000000..46adc115 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/cugb.map @@ -0,0 +1,1181 @@ +# +# For Unicode GB 2312-80 Chinese font to create compact +# CJK fonts Type1 fonts. +# +plane 01 +at 0x00 + 0x3000, 0x3001, 0x3002, 0x00B7, 0x02C9, 0x02C7, 0x00A8, 0x3003, + 0x3005, 0x2014, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x2019, 0x201C, + 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, + 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x3011, 0x00B1, + 0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F, 0x222A, + 0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220, 0x2312, + 0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D, 0x221D, + 0x2260, 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235, 0x2234, + 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04, 0x00A4, + 0xFFE0, 0xFFE1, 0x2030, 0x00A7, 0x2116, 0x2606, 0x2605, 0x25CB, + 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2, + 0x203B, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x2488, 0x2489, + 0x248A, 0x248B, 0x248C, 0x248D, 0x248E, 0x248F, 0x2490, 0x2491, + 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, 0x2498, 0x2499, + 0x249A, 0x249B, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, + 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480, 0x2481, + 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x2460, 0x2461, + 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, + 0, 0, 0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, + 0x3226, 0x3227, 0x3228, 0x3229, 0, 0, 0x2160, 0x2161, + 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, + 0x216A, 0x216B, 0, 0, 0xFF01, 0xFF02, 0xFF03, 0xFFE5, + 0xFF05, 0xFF06, 0xFF07, 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, + 0xFF0D, 0xFF0E, 0xFF0F, 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, + 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, + 0xFF1D, 0xFF1E, 0xFF1F, 0xFF20, 0xFF21, 0xFF22, 0xFF23, 0xFF24, + 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, + 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, + 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFF3C, + 0xFF3D, 0xFF3E, 0xFF3F, 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, +plane 02 +at 0x00 + 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, + 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, + 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, + 0xFF5D, 0xFFE3, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, + 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, + 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, + 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, + 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, + 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, + 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, + 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, + 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, + 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, + 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, + 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, + 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, + 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, + 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, + 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, + 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, + 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, + 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, + 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, + 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0, 0, + 0, 0, 0, 0, 0, 0, 0x0391, 0x0392, + 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, + 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, + 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0, 0, + 0, 0, 0, 0, 0, 0, 0x03B1, 0x03B2, + 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, +plane 03 +at 0x00 + 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, + 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0x0410, 0x0411, 0x0412, 0x0413, + 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, + 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, + 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, + 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0x0430, 0x0431, 0x0432, 0x0433, + 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, + 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, + 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, + 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, + 0x011B, 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, + 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, + 0x01DA, 0x01DC, 0x00FC, 0x00EA, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x3105, 0x3106, + 0x3107, 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, + 0x310F, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, + 0x3117, 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, + 0x311F, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, + 0x3127, 0x3128, 0x3129, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, + 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, 0x250C, +plane 04 +at 0x00 + 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, + 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, 0x251C, + 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, + 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, + 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, + 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, + 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, + 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, 0x254B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 05 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 06 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x554A, 0x963F, 0x57C3, 0x6328, 0x54CE, 0x5509, + 0x54C0, 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E, 0x788D, 0x7231, + 0x9698, 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309, 0x6697, 0x5CB8, + 0x80FA, 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9, 0x6556, 0x71AC, + 0x7FF1, 0x8884, 0x50B2, 0x5965, 0x61CA, 0x6FB3, 0x82AD, 0x634C, + 0x6252, 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4, 0x5DF4, 0x62D4, + 0x8DCB, 0x9776, 0x628A, 0x8019, 0x575D, 0x9738, 0x7F62, 0x7238, + 0x767D, 0x67CF, 0x767E, 0x6446, 0x4F70, 0x8D25, 0x62DC, 0x7A17, + 0x6591, 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881, 0x677F, 0x7248, + 0x626E, 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E, 0x7ECA, 0x90A6, + 0x5E2E, 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2, 0x78C5, 0x868C, + 0x9551, 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305, 0x8912, 0x5265, + 0x8584, 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D, 0x62B1, 0x62A5, + 0x66B4, 0x8C79, 0x9C8D, 0x7206, 0x676F, 0x7891, 0x60B2, 0x5351, + 0x5317, 0x8F88, 0x80CC, 0x8D1D, 0x94A1, 0x500D, 0x72C8, 0x5907, + 0x60EB, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C, 0x7B28, 0x5D29, +plane 07 +at 0x00 + 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C, 0x9F3B, 0x6BD4, + 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D, 0x6BD5, 0x6BD9, + 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D, 0x5F0A, 0x5FC5, + 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD, 0x8FB9, 0x7F16, + 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8, 0x8FA9, 0x8FAB, + 0x904D, 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6, 0x618B, 0x522B, + 0x762A, 0x5F6C, 0x658C, 0x6FD2, 0x6EE8, 0x5BBE, 0x6448, 0x5175, + 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x997C, 0x70B3, 0x75C5, 0x5E76, + 0x73BB, 0x83E0, 0x64AD, 0x62E8, 0x94B5, 0x6CE2, 0x535A, 0x52C3, + 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B, 0x8236, 0x8116, 0x818A, + 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C, 0x54FA, 0x8865, 0x57E0, + 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, 0x6016, 0x64E6, 0x731C, + 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C, 0x8E29, 0x91C7, 0x5F69, + 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695, 0x6B8B, 0x60ED, 0x60E8, + 0x707F, 0x82CD, 0x8231, 0x4ED3, 0x6CA7, 0x85CF, 0x64CD, 0x7CD9, + 0x69FD, 0x66F9, 0x8349, 0x5395, 0x7B56, 0x4FA7, 0x518C, 0x6D4B, + 0x5C42, 0x8E6D, 0x63D2, 0x53C9, 0x832C, 0x8336, 0x67E5, 0x78B4, + 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8BE7, 0x62C6, 0x67F4, 0x8C7A, + 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17, 0x7F20, 0x94F2, 0x4EA7, + 0x9610, 0x98A4, 0x660C, 0x7316, 0x573A, 0x5C1D, 0x5E38, 0x957F, + 0x507F, 0x80A0, 0x5382, 0x655E, 0x7545, 0x5531, 0x5021, 0x8D85, + 0x6284, 0x949E, 0x671D, 0x5632, 0x6F6E, 0x5DE2, 0x5435, 0x7092, + 0x8F66, 0x626F, 0x64A4, 0x63A3, 0x5F7B, 0x6F88, 0x90F4, 0x81E3, + 0x8FB0, 0x5C18, 0x6668, 0x5FF1, 0x6C89, 0x9648, 0x8D81, 0x886C, + 0x6491, 0x79F0, 0x57CE, 0x6A59, 0x6210, 0x5448, 0x4E58, 0x7A0B, + 0x60E9, 0x6F84, 0x8BDA, 0x627F, 0x901E, 0x9A8B, 0x79E4, 0x5403, + 0x75F4, 0x6301, 0x5319, 0x6C60, 0x8FDF, 0x5F1B, 0x9A70, 0x803B, + 0x9F7F, 0x4F88, 0x5C3A, 0x8D64, 0x7FC5, 0x65A5, 0x70BD, 0x5145, + 0x51B2, 0x866B, 0x5D07, 0x5BA0, 0x62BD, 0x916C, 0x7574, 0x8E0C, + 0x7A20, 0x6101, 0x7B79, 0x4EC7, 0x7EF8, 0x7785, 0x4E11, 0x81ED, + 0x521D, 0x51FA, 0x6A71, 0x53A8, 0x8E87, 0x9504, 0x96CF, 0x6EC1, + 0x9664, 0x695A, 0x7840, 0x50A8, 0x77D7, 0x6410, 0x89E6, 0x5904, +plane 08 +at 0x00 + 0x63E3, 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239, 0x5598, 0x4E32, + 0x75AE, 0x7A97, 0x5E62, 0x5E8A, 0x95EF, 0x521B, 0x5439, 0x708A, + 0x6376, 0x9524, 0x5782, 0x6625, 0x693F, 0x9187, 0x5507, 0x6DF3, + 0x7EAF, 0x8822, 0x6233, 0x7EF0, 0x75B5, 0x8328, 0x78C1, 0x96CC, + 0x8F9E, 0x6148, 0x74F7, 0x8BCD, 0x6B64, 0x523A, 0x8D50, 0x6B21, + 0x806A, 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B, 0x51D1, 0x7C97, + 0x918B, 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C, 0x6467, 0x5D14, + 0x50AC, 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0, 0x6751, 0x5B58, + 0x5BF8, 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B, 0x9519, 0x642D, + 0x8FBE, 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6B79, 0x50A3, + 0x6234, 0x5E26, 0x6B86, 0x4EE3, 0x8D37, 0x888B, 0x5F85, 0x902E, + 0x6020, 0x803D, 0x62C5, 0x4E39, 0x5355, 0x90F8, 0x63B8, 0x80C6, + 0x65E6, 0x6C2E, 0x4F46, 0x60EE, 0x6DE1, 0x8BDE, 0x5F39, 0x86CB, + 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, 0x5200, 0x6363, 0x8E48, + 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B, 0x60BC, 0x9053, + 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F, 0x767B, 0x7B49, + 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4, 0x8FEA, 0x654C, + 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5, 0x5E95, 0x5730, + 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14, 0x98A0, 0x6382, + 0x6EC7, 0x7898, 0x70B9, 0x5178, 0x975B, 0x57AB, 0x7535, 0x4F43, + 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6DC0, 0x6BBF, 0x7889, 0x53FC, + 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x9493, 0x8C03, 0x8DCC, + 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, 0x53E0, 0x4E01, 0x76EF, + 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D, 0x5B9A, 0x8BA2, 0x4E22, + 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8, 0x680B, 0x4F97, 0x606B, + 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597, 0x9661, 0x8C46, 0x9017, + 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A, 0x72EC, 0x8BFB, 0x5835, + 0x7779, 0x8D4C, 0x675C, 0x9540, 0x809A, 0x5EA6, 0x6E21, 0x5992, + 0x7AEF, 0x77ED, 0x953B, 0x6BB5, 0x65AD, 0x7F0E, 0x5806, 0x5151, + 0x961F, 0x5BF9, 0x58A9, 0x5428, 0x8E72, 0x6566, 0x987F, 0x56E4, + 0x949D, 0x76FE, 0x9041, 0x6387, 0x54C6, 0x591A, 0x593A, 0x579B, + 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241, 0x60F0, 0x5815, 0x86FE, +plane 09 +at 0x00 + 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9, 0x5A25, 0x6076, 0x5384, + 0x627C, 0x904F, 0x9102, 0x997F, 0x6069, 0x800C, 0x513F, 0x8033, + 0x5C14, 0x9975, 0x6D31, 0x4E8C, 0x8D30, 0x53D1, 0x7F5A, 0x7B4F, + 0x4F10, 0x4E4F, 0x9600, 0x6CD5, 0x73D0, 0x85E9, 0x5E06, 0x756A, + 0x7FFB, 0x6A0A, 0x77FE, 0x9492, 0x7E41, 0x51E1, 0x70E6, 0x53CD, + 0x8FD4, 0x8303, 0x8D29, 0x72AF, 0x996D, 0x6CDB, 0x574A, 0x82B3, + 0x65B9, 0x80AA, 0x623F, 0x9632, 0x59A8, 0x4EFF, 0x8BBF, 0x7EBA, + 0x653E, 0x83F2, 0x975E, 0x5561, 0x98DE, 0x80A5, 0x532A, 0x8BFD, + 0x5420, 0x80BA, 0x5E9F, 0x6CB8, 0x8D39, 0x82AC, 0x915A, 0x5429, + 0x6C1B, 0x5206, 0x7EB7, 0x575F, 0x711A, 0x6C7E, 0x7C89, 0x594B, + 0x4EFD, 0x5FFF, 0x6124, 0x7CAA, 0x4E30, 0x5C01, 0x67AB, 0x8702, + 0x5CF0, 0x950B, 0x98CE, 0x75AF, 0x70FD, 0x9022, 0x51AF, 0x7F1D, + 0x8BBD, 0x5949, 0x51E4, 0x4F5B, 0x5426, 0x592B, 0x6577, 0x80A4, + 0x5B75, 0x6276, 0x62C2, 0x8F90, 0x5E45, 0x6C1F, 0x7B26, 0x4F0F, + 0x4FD8, 0x670D, 0x6D6E, 0x6DAA, 0x798F, 0x88B1, 0x5F17, 0x752B, + 0x629A, 0x8F85, 0x4FEF, 0x91DC, 0x65A7, 0x812F, 0x8151, 0x5E9C, + 0x8150, 0x8D74, 0x526F, 0x8986, 0x8D4B, 0x590D, 0x5085, 0x4ED8, + 0x961C, 0x7236, 0x8179, 0x8D1F, 0x5BCC, 0x8BA3, 0x9644, 0x5987, + 0x7F1A, 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539, 0x6982, 0x9499, + 0x76D6, 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1, 0x7AFF, 0x809D, + 0x8D76, 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188, 0x521A, 0x94A2, + 0x7F38, 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760, 0x7BD9, 0x768B, + 0x9AD8, 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550, 0x7A3F, 0x544A, + 0x54E5, 0x6B4C, 0x6401, 0x6208, 0x9E3D, 0x80F3, 0x7599, 0x5272, + 0x9769, 0x845B, 0x683C, 0x86E4, 0x9601, 0x9694, 0x94EC, 0x4E2A, + 0x5404, 0x7ED9, 0x6839, 0x8DDF, 0x8015, 0x66F4, 0x5E9A, 0x7FB9, + 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F, 0x606D, 0x9F9A, + 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9, 0x6C5E, 0x62F1, + 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF, 0x72D7, 0x57A2, + 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495, 0x7B8D, 0x4F30, + 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA, 0x9AA8, 0x8C37, + 0x80A1, 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E, 0x74DC, 0x5250, +plane 10 +at 0x00 + 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A, 0x68FA, 0x5173, + 0x5B98, 0x51A0, 0x89C2, 0x7BA1, 0x9986, 0x7F50, 0x60EF, 0x704C, + 0x8D2F, 0x5149, 0x5E7F, 0x901B, 0x7470, 0x89C4, 0x572D, 0x7845, + 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, 0x8BE1, 0x7678, 0x6842, + 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA, 0x68CD, 0x9505, + 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8, 0x9AB8, 0x5B69, + 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87, 0x9163, 0x61A8, 0x90AF, + 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD, 0x558A, 0x7F55, 0x7FF0, + 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D, 0x710A, 0x6C57, 0x6C49, + 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E, 0x8C6A, 0x6BEB, 0x90DD, + 0x597D, 0x8017, 0x53F7, 0x6D69, 0x5475, 0x559D, 0x8377, 0x83CF, + 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408, 0x76D2, 0x8C89, 0x9602, + 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64, 0x8D3A, 0x563F, 0x9ED1, + 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC, 0x4EA8, 0x6A2A, 0x8861, + 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679, 0x9E3F, 0x6D2A, 0x5B8F, + 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334, 0x543C, 0x539A, 0x5019, + 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A, 0x58F6, 0x846B, 0x80E1, + 0x8774, 0x72D0, 0x7CCA, 0x6E56, 0x5F27, 0x864E, 0x552C, 0x62A4, + 0x4E92, 0x6CAA, 0x6237, 0x82B1, 0x54D7, 0x534E, 0x733E, 0x6ED1, + 0x753B, 0x5212, 0x5316, 0x8BDD, 0x69D0, 0x5F8A, 0x6000, 0x6DEE, + 0x574F, 0x6B22, 0x73AF, 0x6853, 0x8FD8, 0x7F13, 0x6362, 0x60A3, + 0x5524, 0x75EA, 0x8C62, 0x7115, 0x6DA3, 0x5BA6, 0x5E7B, 0x8352, + 0x614C, 0x9EC4, 0x78FA, 0x8757, 0x7C27, 0x7687, 0x51F0, 0x60F6, + 0x714C, 0x6643, 0x5E4C, 0x604D, 0x8C0E, 0x7070, 0x6325, 0x8F89, + 0x5FBD, 0x6062, 0x86D4, 0x56DE, 0x6BC1, 0x6094, 0x6167, 0x5349, + 0x60E0, 0x6666, 0x8D3F, 0x79FD, 0x4F1A, 0x70E9, 0x6C47, 0x8BB3, + 0x8BF2, 0x7ED8, 0x8364, 0x660F, 0x5A5A, 0x9B42, 0x6D51, 0x6DF7, + 0x8C41, 0x6D3B, 0x4F19, 0x706B, 0x83B7, 0x6216, 0x60D1, 0x970D, + 0x8D27, 0x7978, 0x51FB, 0x573E, 0x57FA, 0x673A, 0x7578, 0x7A3D, + 0x79EF, 0x7B95, 0x808C, 0x9965, 0x8FF9, 0x6FC0, 0x8BA5, 0x9E21, + 0x59EC, 0x7EE9, 0x7F09, 0x5409, 0x6781, 0x68D8, 0x8F91, 0x7C4D, + 0x96C6, 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373, 0x5AC9, 0x7EA7, +plane 11 +at 0x00 + 0x6324, 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280, 0x5180, 0x5B63, + 0x4F0E, 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4, 0x5BC2, 0x8BA1, + 0x8BB0, 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7, 0x7EAA, 0x5609, + 0x67B7, 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A, 0x988A, 0x8D3E, + 0x7532, 0x94BE, 0x5047, 0x7A3C, 0x4EF7, 0x67B6, 0x9A7E, 0x5AC1, + 0x6B7C, 0x76D1, 0x575A, 0x5C16, 0x7B3A, 0x95F4, 0x714E, 0x517C, + 0x80A9, 0x8270, 0x5978, 0x7F04, 0x8327, 0x68C0, 0x67EC, 0x78B1, + 0x7877, 0x62E3, 0x6361, 0x7B80, 0x4FED, 0x526A, 0x51CF, 0x8350, + 0x69DB, 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E, 0x7BAD, 0x4EF6, + 0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85, 0x6DA7, 0x5EFA, + 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586, 0x848B, 0x6868, + 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549, 0x6912, 0x7901, + 0x7126, 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84, 0x5A07, 0x56BC, + 0x6405, 0x94F0, 0x77EB, 0x4FA5, 0x811A, 0x72E1, 0x89D2, 0x997A, + 0x7F34, 0x7EDE, 0x527F, 0x6559, 0x9175, 0x8F7F, 0x8F83, 0x53EB, + 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857, 0x9636, 0x622A, + 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, 0x776B, 0x7AED, 0x6D01, + 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5, 0x754C, 0x501F, + 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B, 0x65A4, 0x91D1, + 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5, 0x8C28, 0x8FDB, + 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78, 0x5C3D, 0x52B2, + 0x8346, 0x5162, 0x830E, 0x775B, 0x6676, 0x9CB8, 0x4EAC, 0x60CA, + 0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, 0x8B66, 0x666F, 0x9888, 0x9759, + 0x5883, 0x656C, 0x955C, 0x5F84, 0x75C9, 0x9756, 0x7ADF, 0x7ADE, + 0x51C0, 0x70AF, 0x7A98, 0x63EA, 0x7A76, 0x7EA0, 0x7396, 0x97ED, + 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9, 0x6551, 0x65E7, 0x81FC, + 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0, 0x62D8, 0x72D9, 0x75BD, + 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480, 0x77E9, 0x4E3E, 0x6CAE, + 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177, 0x8DDD, 0x8E1E, 0x952F, + 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267, 0x6350, 0x9E43, 0x5A1F, + 0x5026, 0x7737, 0x5377, 0x7EE2, 0x6485, 0x652B, 0x6289, 0x6398, + 0x5014, 0x7235, 0x89C9, 0x51B3, 0x8BC0, 0x7EDD, 0x5747, 0x83CC, +plane 12 +at 0x00 + 0x94A7, 0x519B, 0x541B, 0x5CFB, 0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, + 0x9A8F, 0x5580, 0x5496, 0x5361, 0x54AF, 0x5F00, 0x63E9, 0x6977, + 0x51EF, 0x6168, 0x520A, 0x582A, 0x52D8, 0x574E, 0x780D, 0x770B, + 0x5EB7, 0x6177, 0x7CE0, 0x625B, 0x6297, 0x4EA2, 0x7095, 0x8003, + 0x62F7, 0x70E4, 0x9760, 0x5777, 0x82DB, 0x67EF, 0x68F5, 0x78D5, + 0x9897, 0x79D1, 0x58F3, 0x54B3, 0x53EF, 0x6E34, 0x514B, 0x523B, + 0x5BA2, 0x8BFE, 0x80AF, 0x5543, 0x57A6, 0x6073, 0x5751, 0x542D, + 0x7A7A, 0x6050, 0x5B54, 0x63A7, 0x62A0, 0x53E3, 0x6263, 0x5BC7, + 0x67AF, 0x54ED, 0x7A9F, 0x82E6, 0x9177, 0x5E93, 0x88E4, 0x5938, + 0x57AE, 0x630E, 0x8DE8, 0x80EF, 0x5757, 0x7B77, 0x4FA9, 0x5FEB, + 0x5BBD, 0x6B3E, 0x5321, 0x7B50, 0x72C2, 0x6846, 0x77FF, 0x7736, + 0x65F7, 0x51B5, 0x4E8F, 0x76D4, 0x5CBF, 0x7AA5, 0x8475, 0x594E, + 0x9B41, 0x5080, 0x9988, 0x6127, 0x6E83, 0x5764, 0x6606, 0x6346, + 0x56F0, 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783, 0x62C9, 0x5587, + 0x8721, 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765, 0x8D56, 0x84DD, + 0x5A6A, 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170, 0x6F9C, 0x8C30, + 0x63FD, 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5, 0x7405, 0x6994, + 0x72FC, 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x635E, 0x52B3, 0x7262, + 0x8001, 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6D9D, 0x52D2, 0x4E50, + 0x96F7, 0x956D, 0x857E, 0x78CA, 0x7D2F, 0x5121, 0x5792, 0x64C2, + 0x808B, 0x7C7B, 0x6CEA, 0x68F1, 0x695E, 0x51B7, 0x5398, 0x68A8, + 0x7281, 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13, 0x7406, 0x674E, + 0x91CC, 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F, 0x6817, 0x4E3D, + 0x5389, 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088, 0x4F8B, 0x4FD0, + 0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B, 0x7483, 0x54E9, + 0x4FE9, 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9, 0x601C, 0x6D9F, + 0x5E18, 0x655B, 0x8138, 0x94FE, 0x604B, 0x70BC, 0x7EC3, 0x7CAE, + 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x4E24, 0x8F86, 0x91CF, 0x667E, + 0x4EAE, 0x8C05, 0x64A9, 0x804A, 0x50DA, 0x7597, 0x71CE, 0x5BE5, + 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, 0x5ED6, 0x6599, 0x5217, + 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797, 0x78F7, 0x9716, + 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41, 0x541D, 0x62CE, +plane 13 +at 0x00 + 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36, 0x7F9A, 0x51CC, + 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4, 0x6E9C, 0x7409, + 0x69B4, 0x786B, 0x998F, 0x7559, 0x5218, 0x7624, 0x6D41, 0x67F3, + 0x516D, 0x9F99, 0x804B, 0x5499, 0x7B3C, 0x7ABF, 0x9686, 0x5784, + 0x62E2, 0x9647, 0x697C, 0x5A04, 0x6402, 0x7BD3, 0x6F0F, 0x964B, + 0x82A6, 0x5362, 0x9885, 0x5E90, 0x7089, 0x63B3, 0x5364, 0x864F, + 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF, 0x8D42, 0x9E7F, 0x6F5E, + 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74, 0x5415, 0x94DD, 0x4FA3, + 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651, 0x6C2F, 0x5F8B, 0x7387, + 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A, 0x6EE6, 0x5375, 0x4E71, + 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26, 0x4ED1, 0x6CA6, 0x7EB6, + 0x8BBA, 0x841D, 0x87BA, 0x7F57, 0x903B, 0x9523, 0x7BA9, 0x9AA1, + 0x88F8, 0x843D, 0x6D1B, 0x9A86, 0x7EDC, 0x5988, 0x9EBB, 0x739B, + 0x7801, 0x8682, 0x9A6C, 0x9A82, 0x561B, 0x5417, 0x57CB, 0x4E70, + 0x9EA6, 0x5356, 0x8FC8, 0x8109, 0x7792, 0x9992, 0x86EE, 0x6EE1, + 0x8513, 0x66FC, 0x6162, 0x6F2B, 0x8C29, 0x8292, 0x832B, 0x76F2, + 0x6C13, 0x5FD9, 0x83BD, 0x732B, 0x8305, 0x951A, 0x6BDB, 0x77DB, + 0x94C6, 0x536F, 0x8302, 0x5192, 0x5E3D, 0x8C8C, 0x8D38, 0x4E48, + 0x73AB, 0x679A, 0x6885, 0x9176, 0x9709, 0x7164, 0x6CA1, 0x7709, + 0x5A92, 0x9541, 0x6BCF, 0x7F8E, 0x6627, 0x5BD0, 0x59B9, 0x5A9A, + 0x95E8, 0x95F7, 0x4EEC, 0x840C, 0x8499, 0x6AAC, 0x76DF, 0x9530, + 0x731B, 0x68A6, 0x5B5F, 0x772F, 0x919A, 0x9761, 0x7CDC, 0x8FF7, + 0x8C1C, 0x5F25, 0x7C73, 0x79D8, 0x89C5, 0x6CCC, 0x871C, 0x5BC6, + 0x5E42, 0x68C9, 0x7720, 0x7EF5, 0x5195, 0x514D, 0x52C9, 0x5A29, + 0x7F05, 0x9762, 0x82D7, 0x63CF, 0x7784, 0x85D0, 0x79D2, 0x6E3A, + 0x5E99, 0x5999, 0x8511, 0x706D, 0x6C11, 0x62BF, 0x76BF, 0x654F, + 0x60AF, 0x95FD, 0x660E, 0x879F, 0x9E23, 0x94ED, 0x540D, 0x547D, + 0x8C2C, 0x6478, 0x6479, 0x8611, 0x6A21, 0x819C, 0x78E8, 0x6469, + 0x9B54, 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8, 0x6CAB, 0x6F20, + 0x5BDE, 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7, 0x7261, 0x4EA9, + 0x59C6, 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF, 0x6155, 0x6728, + 0x76EE, 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA, 0x5450, 0x94A0, +plane 14 +at 0x00 + 0x90A3, 0x5A1C, 0x7EB3, 0x6C16, 0x4E43, 0x5976, 0x8010, 0x5948, + 0x5357, 0x7537, 0x96BE, 0x56CA, 0x6320, 0x8111, 0x607C, 0x95F9, + 0x6DD6, 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD, 0x59AE, 0x9713, + 0x502A, 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F, 0x817B, 0x9006, + 0x6EBA, 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5, 0x637B, 0x5FF5, + 0x5A18, 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042, 0x5B7D, 0x556E, + 0x954A, 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE, 0x51DD, 0x5B81, + 0x62E7, 0x6CDE, 0x725B, 0x626D, 0x94AE, 0x7EBD, 0x8113, 0x6D53, + 0x519C, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973, 0x6696, 0x8650, + 0x759F, 0x632A, 0x61E6, 0x7CEF, 0x8BFA, 0x54E6, 0x6B27, 0x9E25, + 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, 0x556A, 0x8DB4, 0x722C, + 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C, 0x5F98, 0x6E43, + 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC, 0x7554, 0x5224, + 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6, 0x629B, 0x5486, + 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478, 0x80DA, 0x57F9, + 0x88F4, 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B, 0x55B7, 0x76C6, + 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC, 0x68DA, 0x787C, + 0x7BF7, 0x81A8, 0x670B, 0x9E4F, 0x6367, 0x78B0, 0x576F, 0x7812, + 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7, 0x5564, 0x813E, + 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB, 0x5C41, 0x8B6C, 0x7BC7, + 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02, 0x74E2, 0x7968, 0x6487, + 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1, 0x8058, 0x4E52, 0x576A, + 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6, 0x8BC4, 0x5C4F, 0x5761, + 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44, 0x8FEB, 0x7C95, 0x5256, + 0x6251, 0x94FA, 0x4EC6, 0x8386, 0x8461, 0x83E9, 0x84B2, 0x57D4, + 0x6734, 0x5703, 0x666E, 0x6D66, 0x8C31, 0x66DD, 0x7011, 0x671F, + 0x6B3A, 0x6816, 0x621A, 0x59BB, 0x4E03, 0x51C4, 0x6F06, 0x67D2, + 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67, 0x7566, 0x5D0E, 0x8110, + 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91, 0x8D77, 0x5C82, 0x4E5E, + 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668, 0x6C14, 0x8FC4, 0x5F03, + 0x6C7D, 0x6CE3, 0x8BAB, 0x6390, 0x6070, 0x6D3D, 0x7275, 0x6266, + 0x948E, 0x94C5, 0x5343, 0x8FC1, 0x7B7E, 0x4EDF, 0x8C26, 0x4E7E, +plane 15 +at 0x00 + 0x9ED4, 0x94B1, 0x94B3, 0x524D, 0x6F5C, 0x9063, 0x6D45, 0x8C34, + 0x5811, 0x5D4C, 0x6B20, 0x6B49, 0x67AA, 0x545B, 0x8154, 0x7F8C, + 0x5899, 0x8537, 0x5F3A, 0x62A2, 0x6A47, 0x9539, 0x6572, 0x6084, + 0x6865, 0x77A7, 0x4E54, 0x4FA8, 0x5DE7, 0x9798, 0x64AC, 0x7FD8, + 0x5CED, 0x4FCF, 0x7A8D, 0x5207, 0x8304, 0x4E14, 0x602F, 0x7A83, + 0x94A6, 0x4FB5, 0x4EB2, 0x79E6, 0x7434, 0x52E4, 0x82B9, 0x64D2, + 0x79BD, 0x5BDD, 0x6C81, 0x9752, 0x8F7B, 0x6C22, 0x503E, 0x537F, + 0x6E05, 0x64CE, 0x6674, 0x6C30, 0x60C5, 0x9877, 0x8BF7, 0x5E86, + 0x743C, 0x7A77, 0x79CB, 0x4E18, 0x90B1, 0x7403, 0x6C42, 0x56DA, + 0x914B, 0x6CC5, 0x8D8B, 0x533A, 0x86C6, 0x66F2, 0x8EAF, 0x5C48, + 0x9A71, 0x6E20, 0x53D6, 0x5A36, 0x9F8B, 0x8DA3, 0x53BB, 0x5708, + 0x98A7, 0x6743, 0x919B, 0x6CC9, 0x5168, 0x75CA, 0x62F3, 0x72AC, + 0x5238, 0x529D, 0x7F3A, 0x7094, 0x7638, 0x5374, 0x9E4A, 0x69B7, + 0x786E, 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3, 0x5189, 0x67D3, + 0x74E4, 0x58E4, 0x6518, 0x56B7, 0x8BA9, 0x9976, 0x6270, 0x7ED5, + 0x60F9, 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD, 0x97E7, 0x4EFB, + 0x8BA4, 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD, 0x65E5, 0x620E, + 0x8338, 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6, 0x5BB9, 0x7ED2, + 0x5197, 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5B7A, + 0x5982, 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925, 0x8F6F, 0x962E, + 0x854A, 0x745E, 0x9510, 0x95F0, 0x6DA6, 0x82E5, 0x5F31, 0x6492, + 0x6D12, 0x8428, 0x816E, 0x9CC3, 0x585E, 0x8D5B, 0x4E09, 0x53C1, + 0x4F1E, 0x6563, 0x6851, 0x55D3, 0x4E27, 0x6414, 0x9A9A, 0x626B, + 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, 0x50E7, 0x838E, 0x7802, + 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565, 0x715E, 0x7B5B, + 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220, 0x717D, 0x886B, + 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584, 0x6C55, 0x6247, + 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C, 0x4E0A, 0x5C1A, + 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D, 0x52FA, 0x97F6, + 0x5C11, 0x54E8, 0x90B5, 0x7ECD, 0x5962, 0x8D4A, 0x86C7, 0x820C, + 0x820D, 0x8D66, 0x6444, 0x5C04, 0x6151, 0x6D89, 0x793E, 0x8BBE, + 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1, 0x5A20, 0x7EC5, +plane 16 +at 0x00 + 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, 0x80BE, 0x614E, 0x6E17, + 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3, 0x7701, 0x76DB, + 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931, 0x72EE, 0x65BD, 0x6E7F, + 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3, 0x62FE, 0x65F6, 0x4EC0, + 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2, 0x77E2, 0x4F7F, 0x5C4E, + 0x9A76, 0x59CB, 0x5F0F, 0x793A, 0x58EB, 0x4E16, 0x67FF, 0x4E8B, + 0x62ED, 0x8A93, 0x901D, 0x52BF, 0x662F, 0x55DC, 0x566C, 0x9002, + 0x4ED5, 0x4F8D, 0x91CA, 0x9970, 0x6C0F, 0x5E02, 0x6043, 0x5BA4, + 0x89C6, 0x8BD5, 0x6536, 0x624B, 0x9996, 0x5B88, 0x5BFF, 0x6388, + 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C, 0x67A2, 0x68B3, 0x6B8A, + 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1, 0x758F, 0x4E66, 0x8D4E, + 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9, 0x7F72, 0x8700, 0x9ECD, + 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811, 0x675F, 0x620D, 0x7AD6, + 0x5885, 0x5EB6, 0x6570, 0x6F31, 0x6055, 0x5237, 0x800D, 0x6454, + 0x8870, 0x7529, 0x5E05, 0x6813, 0x62F4, 0x971C, 0x53CC, 0x723D, + 0x8C01, 0x6C34, 0x7761, 0x7A0E, 0x542E, 0x77AC, 0x987A, 0x821C, + 0x8BF4, 0x7855, 0x6714, 0x70C1, 0x65AF, 0x6495, 0x5636, 0x601D, + 0x79C1, 0x53F8, 0x4E1D, 0x6B7B, 0x8086, 0x5BFA, 0x55E3, 0x56DB, + 0x4F3A, 0x4F3C, 0x9972, 0x5DF3, 0x677E, 0x8038, 0x6002, 0x9882, + 0x9001, 0x5B8B, 0x8BBC, 0x8BF5, 0x641C, 0x8258, 0x64DE, 0x55FD, + 0x82CF, 0x9165, 0x4FD7, 0x7D20, 0x901F, 0x7C9F, 0x50F3, 0x5851, + 0x6EAF, 0x5BBF, 0x8BC9, 0x8083, 0x9178, 0x849C, 0x7B97, 0x867D, + 0x968B, 0x968F, 0x7EE5, 0x9AD3, 0x788E, 0x5C81, 0x7A57, 0x9042, + 0x96A7, 0x795F, 0x5B59, 0x635F, 0x7B0B, 0x84D1, 0x68AD, 0x5506, + 0x7F29, 0x7410, 0x7D22, 0x9501, 0x6240, 0x584C, 0x4ED6, 0x5B83, + 0x5979, 0x5854, 0x736D, 0x631E, 0x8E4B, 0x8E0F, 0x80CE, 0x82D4, + 0x62AC, 0x53F0, 0x6CF0, 0x915E, 0x592A, 0x6001, 0x6C70, 0x574D, + 0x644A, 0x8D2A, 0x762B, 0x6EE9, 0x575B, 0x6A80, 0x75F0, 0x6F6D, + 0x8C2D, 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3, 0x63A2, 0x53F9, + 0x70AD, 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0, 0x819B, 0x5510, + 0x7CD6, 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB, 0x638F, 0x6D9B, + 0x6ED4, 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8, 0x9676, 0x8BA8, +plane 17 +at 0x00 + 0x5957, 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A, 0x68AF, 0x5254, + 0x8E22, 0x9511, 0x63D0, 0x9898, 0x8E44, 0x557C, 0x4F53, 0x66FF, + 0x568F, 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929, 0x6DFB, 0x586B, + 0x7530, 0x751C, 0x606C, 0x8214, 0x8146, 0x6311, 0x6761, 0x8FE2, + 0x773A, 0x8DF3, 0x8D34, 0x94C1, 0x5E16, 0x5385, 0x542C, 0x70C3, + 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A, 0x8247, 0x901A, + 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64, 0x7AE5, 0x6876, + 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295, 0x5934, 0x900F, + 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014, 0x6D82, 0x5C60, + 0x571F, 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8, 0x9893, 0x817F, + 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0, 0x62D6, 0x6258, + 0x8131, 0x9E35, 0x9640, 0x9A6E, 0x9A7C, 0x692D, 0x59A5, 0x62D3, + 0x553E, 0x6316, 0x54C7, 0x86D9, 0x6D3C, 0x5A03, 0x74E6, 0x889C, + 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, 0x73A9, 0x987D, 0x4E38, + 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696, 0x60CB, 0x5B9B, + 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1, 0x6789, 0x7F51, + 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01, 0x5DCD, 0x5FAE, + 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4, 0x552F, 0x60DF, 0x4E3A, + 0x6F4D, 0x7EF4, 0x82C7, 0x840E, 0x59D4, 0x4F1F, 0x4F2A, 0x5C3E, + 0x7EAC, 0x672A, 0x851A, 0x5473, 0x754F, 0x80C3, 0x5582, 0x9B4F, + 0x4F4D, 0x6E2D, 0x8C13, 0x5C09, 0x6170, 0x536B, 0x761F, 0x6E29, + 0x868A, 0x6587, 0x95FB, 0x7EB9, 0x543B, 0x7A33, 0x7D0A, 0x95EE, + 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717, 0x6DA1, 0x7A9D, 0x6211, + 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB, 0x545C, 0x94A8, 0x4E4C, + 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C, 0x68A7, 0x543E, 0x5434, + 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348, 0x821E, 0x4F0D, 0x4FAE, + 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269, 0x52FF, 0x52A1, 0x609F, + 0x8BEF, 0x6614, 0x7199, 0x6790, 0x897F, 0x7852, 0x77FD, 0x6670, + 0x563B, 0x5438, 0x9521, 0x727A, 0x7A00, 0x606F, 0x5E0C, 0x6089, + 0x819D, 0x5915, 0x60DC, 0x7184, 0x70EF, 0x6EAA, 0x6C50, 0x7280, + 0x6A84, 0x88AD, 0x5E2D, 0x4E60, 0x5AB3, 0x559C, 0x94E3, 0x6D17, + 0x7CFB, 0x9699, 0x620F, 0x7EC6, 0x778E, 0x867E, 0x5323, 0x971E, +plane 18 +at 0x00 + 0x8F96, 0x6687, 0x5CE1, 0x4FA0, 0x72ED, 0x4E0B, 0x53A6, 0x590F, + 0x5413, 0x6380, 0x9528, 0x5148, 0x4ED9, 0x9C9C, 0x7EA4, 0x54B8, + 0x8D24, 0x8854, 0x8237, 0x95F2, 0x6D8E, 0x5F26, 0x5ACC, 0x663E, + 0x9669, 0x73B0, 0x732E, 0x53BF, 0x817A, 0x9985, 0x7FA1, 0x5BAA, + 0x9677, 0x9650, 0x7EBF, 0x76F8, 0x53A2, 0x9576, 0x9999, 0x7BB1, + 0x8944, 0x6E58, 0x4E61, 0x7FD4, 0x7965, 0x8BE6, 0x60F3, 0x54CD, + 0x4EAB, 0x9879, 0x5DF7, 0x6A61, 0x50CF, 0x5411, 0x8C61, 0x8427, + 0x785D, 0x9704, 0x524A, 0x54EE, 0x56A3, 0x9500, 0x6D88, 0x5BB5, + 0x6DC6, 0x6653, 0x5C0F, 0x5B5D, 0x6821, 0x8096, 0x5578, 0x7B11, + 0x6548, 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B, 0x534F, 0x631F, + 0x643A, 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199, 0x68B0, 0x5378, + 0x87F9, 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51, 0x85AA, 0x82AF, + 0x950C, 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3, 0x4FE1, 0x8845, + 0x661F, 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211, 0x578B, 0x5F62, + 0x90A2, 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027, 0x59D3, 0x5144, + 0x51F6, 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A, 0x4F11, 0x4FEE, + 0x7F9E, 0x673D, 0x55C5, 0x9508, 0x79C0, 0x8896, 0x7EE3, 0x589F, + 0x620C, 0x9700, 0x865A, 0x5618, 0x987B, 0x5F90, 0x8BB8, 0x84C4, + 0x9157, 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064, 0x7D6E, 0x5A7F, + 0x7EEA, 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC, 0x65CB, 0x7384, + 0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B, 0x5B66, 0x7A74, + 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC, 0x8BE2, 0x5BFB, + 0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF, 0x900A, 0x8FC5, + 0x538B, 0x62BC, 0x9E26, 0x9E2D, 0x5440, 0x4E2B, 0x82BD, 0x7259, + 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x54D1, 0x4E9A, 0x8BB6, + 0x7109, 0x54BD, 0x9609, 0x70DF, 0x6DF9, 0x76D0, 0x4E25, 0x7814, + 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, 0x960E, 0x708E, 0x6CBF, + 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273, 0x5830, 0x71D5, + 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130, 0x5BB4, 0x8C1A, + 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768, 0x626C, 0x4F6F, + 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0, 0x75D2, 0x517B, + 0x6837, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476, 0x6447, 0x5C27, +plane 19 +at 0x00 + 0x9065, 0x7A91, 0x8C23, 0x59DA, 0x54AC, 0x8200, 0x836F, 0x8981, + 0x8000, 0x6930, 0x564E, 0x8036, 0x7237, 0x91CE, 0x51B6, 0x4E5F, + 0x9875, 0x6396, 0x4E1A, 0x53F6, 0x66F3, 0x814B, 0x591C, 0x6DB2, + 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1, 0x4F9D, 0x4F0A, 0x8863, + 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA, 0x80F0, 0x7591, 0x6C82, + 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681, 0x501A, 0x5DF2, 0x4E59, + 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613, 0x9091, 0x5C79, 0x4EBF, + 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB, 0x4EA6, 0x88D4, 0x610F, + 0x6BC5, 0x5FC6, 0x4E49, 0x76CA, 0x6EA2, 0x8BE3, 0x8BAE, 0x8C0A, + 0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, 0x7ECE, 0x8335, 0x836B, 0x56E0, + 0x6BB7, 0x97F3, 0x9634, 0x59FB, 0x541F, 0x94F6, 0x6DEB, 0x5BC5, + 0x996E, 0x5C39, 0x5F15, 0x9690, 0x5370, 0x82F1, 0x6A31, 0x5A74, + 0x9E70, 0x5E94, 0x7F28, 0x83B9, 0x8424, 0x8425, 0x8367, 0x8747, + 0x8FCE, 0x8D62, 0x76C8, 0x5F71, 0x9896, 0x786C, 0x6620, 0x54DF, + 0x62E5, 0x4F63, 0x81C3, 0x75C8, 0x5EB8, 0x96CD, 0x8E0A, 0x86F9, + 0x548F, 0x6CF3, 0x6D8C, 0x6C38, 0x607F, 0x52C7, 0x7528, 0x5E7D, + 0x4F18, 0x60A0, 0x5FE7, 0x5C24, 0x7531, 0x90AE, 0x94C0, 0x72B9, + 0x6CB9, 0x6E38, 0x9149, 0x6709, 0x53CB, 0x53F3, 0x4F51, 0x91C9, + 0x8BF1, 0x53C8, 0x5E7C, 0x8FC2, 0x6DE4, 0x4E8E, 0x76C2, 0x6986, + 0x865E, 0x611A, 0x8206, 0x4F59, 0x4FDE, 0x903E, 0x9C7C, 0x6109, + 0x6E1D, 0x6E14, 0x9685, 0x4E88, 0x5A31, 0x96E8, 0x4E0E, 0x5C7F, + 0x79B9, 0x5B87, 0x8BED, 0x7FBD, 0x7389, 0x57DF, 0x828B, 0x90C1, + 0x5401, 0x9047, 0x55BB, 0x5CEA, 0x5FA1, 0x6108, 0x6B32, 0x72F1, + 0x80B2, 0x8A89, 0x6D74, 0x5BD3, 0x88D5, 0x9884, 0x8C6B, 0x9A6D, + 0x9E33, 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881, 0x539F, 0x63F4, + 0x8F95, 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90, 0x7F18, 0x8FDC, + 0x82D1, 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6, 0x8D8A, 0x8DC3, + 0x94A5, 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x9605, 0x8018, 0x4E91, + 0x90E7, 0x5300, 0x9668, 0x5141, 0x8FD0, 0x8574, 0x915D, 0x6655, + 0x97F5, 0x5B55, 0x531D, 0x7838, 0x6742, 0x683D, 0x54C9, 0x707E, + 0x5BB0, 0x8F7D, 0x518D, 0x5728, 0x54B1, 0x6512, 0x6682, 0x8D5E, + 0x8D43, 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF, 0x85FB, 0x67A3, +plane 20 +at 0x00 + 0x65E9, 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020, 0x7682, 0x7076, + 0x71E5, 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C, 0x600E, 0x589E, + 0x618E, 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23, 0x672D, 0x8F67, + 0x94E1, 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B, 0x4E4D, 0x70B8, + 0x8BC8, 0x6458, 0x658B, 0x5B85, 0x7A84, 0x503A, 0x5BE8, 0x77BB, + 0x6BE1, 0x8A79, 0x7C98, 0x6CBE, 0x76CF, 0x65A9, 0x8F97, 0x5D2D, + 0x5C55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7AD9, 0x6E5B, 0x7EFD, + 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, 0x638C, 0x6DA8, 0x6756, + 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634, 0x969C, 0x62DB, + 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69, 0x5146, 0x8087, + 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99, 0x8005, 0x9517, + 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F, 0x7504, 0x7827, + 0x81FB, 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9, 0x8BCA, 0x9707, + 0x632F, 0x9547, 0x9635, 0x84B8, 0x6323, 0x7741, 0x5F81, 0x72F0, + 0x4E89, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F, 0x5E27, 0x75C7, + 0x90D1, 0x8BC1, 0x829D, 0x679D, 0x652F, 0x5431, 0x8718, 0x77E5, + 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7, 0x804C, 0x76F4, 0x690D, + 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740, 0x6307, 0x6B62, 0x8DBE, + 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A, 0x63B7, 0x81F3, 0x81F4, + 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A, 0x79E9, 0x7A1A, 0x8D28, + 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92, 0x4E2D, 0x76C5, 0x5FE0, + 0x949F, 0x8877, 0x7EC8, 0x79CD, 0x80BF, 0x91CD, 0x4EF2, 0x4F17, + 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8BCC, 0x7CA5, 0x8F74, 0x8098, + 0x5E1A, 0x5492, 0x76B1, 0x5B99, 0x663C, 0x9AA4, 0x73E0, 0x682A, + 0x86DB, 0x6731, 0x732A, 0x8BF8, 0x8BDB, 0x9010, 0x7AF9, 0x70DB, + 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B, 0x8457, 0x67F1, 0x52A9, + 0x86C0, 0x8D2E, 0x94F8, 0x7B51, 0x4F4F, 0x6CE8, 0x795D, 0x9A7B, + 0x6293, 0x722A, 0x62FD, 0x4E13, 0x7816, 0x8F6C, 0x64B0, 0x8D5A, + 0x7BC6, 0x6869, 0x5E84, 0x88C5, 0x5986, 0x649E, 0x58EE, 0x72B6, + 0x690E, 0x9525, 0x8FFD, 0x8D58, 0x5760, 0x7F00, 0x8C06, 0x51C6, + 0x6349, 0x62D9, 0x5353, 0x684C, 0x7422, 0x8301, 0x914C, 0x5544, + 0x7740, 0x707C, 0x6D4A, 0x5179, 0x54A8, 0x8D44, 0x59FF, 0x6ECB, +plane 21 +at 0x00 + 0x6DC4, 0x5B5C, 0x7D2B, 0x4ED4, 0x7C7D, 0x6ED3, 0x5B50, 0x81EA, + 0x6E0D, 0x5B57, 0x9B03, 0x68D5, 0x8E2A, 0x5B97, 0x7EFC, 0x603B, + 0x7EB5, 0x90B9, 0x8D70, 0x594F, 0x63CD, 0x79DF, 0x8DB3, 0x5352, + 0x65CF, 0x7956, 0x8BC5, 0x963B, 0x7EC4, 0x94BB, 0x7E82, 0x5634, + 0x9189, 0x6700, 0x7F6A, 0x5C0A, 0x9075, 0x6628, 0x5DE6, 0x4F50, + 0x67DE, 0x505A, 0x4F5C, 0x5750, 0x5EA7, 0, 0, 0, + 0, 0, 0x4E8D, 0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, + 0x4E15, 0x4E98, 0x4E1E, 0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, + 0x4E3F, 0x5315, 0x4E47, 0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, + 0x80E4, 0x9997, 0x6BD3, 0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, + 0x4E5C, 0x4E69, 0x4E93, 0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, + 0x538D, 0x539D, 0x53A3, 0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, + 0x53F5, 0x5326, 0x532E, 0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, + 0x5208, 0x520E, 0x522D, 0x5233, 0x523F, 0x5240, 0x524C, 0x525E, + 0x5261, 0x525C, 0x84AF, 0x527D, 0x5282, 0x5281, 0x5290, 0x5293, + 0x5182, 0x7F54, 0x4EBB, 0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, + 0x4EEB, 0x4EDE, 0x4F1B, 0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x4F25, + 0x4F27, 0x4F09, 0x4F2B, 0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D, + 0x4F5F, 0x4F57, 0x4F32, 0x4F3D, 0x4F76, 0x4F74, 0x4F91, 0x4F89, + 0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC, 0x4F94, + 0x4FE6, 0x4FE8, 0x4FEA, 0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC, 0x4FD1, + 0x4FDF, 0x4FF8, 0x5029, 0x504C, 0x4FF3, 0x502C, 0x500F, 0x502E, + 0x502D, 0x4FFE, 0x501C, 0x500C, 0x5025, 0x5028, 0x507E, 0x5043, + 0x5055, 0x5048, 0x504E, 0x506C, 0x507B, 0x50A5, 0x50A7, 0x50A9, + 0x50BA, 0x50D6, 0x5106, 0x50ED, 0x50EC, 0x50E6, 0x50EE, 0x5107, + 0x510B, 0x4EDD, 0x6C3D, 0x4F58, 0x4F65, 0x4FCE, 0x9FA0, 0x6C46, + 0x7C74, 0x516E, 0x5DFD, 0x9EC9, 0x9998, 0x5181, 0x5914, 0x52F9, + 0x530D, 0x8A07, 0x5310, 0x51EB, 0x5919, 0x5155, 0x4EA0, 0x5156, + 0x4EB3, 0x886E, 0x88A4, 0x4EB5, 0x8114, 0x88D2, 0x7980, 0x5B34, + 0x8803, 0x7FB8, 0x51AB, 0x51B1, 0x51BD, 0x51BC, 0x51C7, 0x5196, + 0x51A2, 0x51A5, 0x8BA0, 0x8BA6, 0x8BA7, 0x8BAA, 0x8BB4, 0x8BB5, + 0x8BB7, 0x8BC2, 0x8BC3, 0x8BCB, 0x8BCF, 0x8BCE, 0x8BD2, 0x8BD3, +plane 22 +at 0x00 + 0x8BD4, 0x8BD6, 0x8BD8, 0x8BD9, 0x8BDC, 0x8BDF, 0x8BE0, 0x8BE4, + 0x8BE8, 0x8BE9, 0x8BEE, 0x8BF0, 0x8BF3, 0x8BF6, 0x8BF9, 0x8BFC, + 0x8BFF, 0x8C00, 0x8C02, 0x8C04, 0x8C07, 0x8C0C, 0x8C0F, 0x8C11, + 0x8C12, 0x8C14, 0x8C15, 0x8C16, 0x8C19, 0x8C1B, 0x8C18, 0x8C1D, + 0x8C1F, 0x8C20, 0x8C21, 0x8C25, 0x8C27, 0x8C2A, 0x8C2B, 0x8C2E, + 0x8C2F, 0x8C32, 0x8C33, 0x8C35, 0x8C36, 0x5369, 0x537A, 0x961D, + 0x9622, 0x9621, 0x9631, 0x962A, 0x963D, 0x963C, 0x9642, 0x9649, + 0x9654, 0x965F, 0x9667, 0x966C, 0x9672, 0x9674, 0x9688, 0x968D, + 0x9697, 0x96B0, 0x9097, 0x909B, 0x909D, 0x9099, 0x90AC, 0x90A1, + 0x90B4, 0x90B3, 0x90B6, 0x90BA, 0x90B8, 0x90B0, 0x90CF, 0x90C5, + 0x90BE, 0x90D0, 0x90C4, 0x90C7, 0x90D3, 0x90E6, 0x90E2, 0x90DC, + 0x90D7, 0x90DB, 0x90EB, 0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, + 0x9123, 0x9131, 0x912F, 0x9139, 0x9143, 0x9146, 0x520D, 0x5942, + 0x52A2, 0x52AC, 0x52AD, 0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, + 0x53DF, 0x71EE, 0x77CD, 0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, + 0x5F01, 0x755A, 0x5DEF, 0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, + 0x58C5, 0x58D1, 0x5729, 0x572C, 0x572A, 0x5733, 0x5739, 0x572E, + 0x572F, 0x575C, 0x573B, 0x5742, 0x5769, 0x5785, 0x576B, 0x5786, + 0x577C, 0x577B, 0x5768, 0x576D, 0x5776, 0x5773, 0x57AD, 0x57A4, + 0x578C, 0x57B2, 0x57CF, 0x57A7, 0x57B4, 0x5793, 0x57A0, 0x57D5, + 0x57D8, 0x57DA, 0x57D9, 0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, + 0x57E4, 0x57DD, 0x580B, 0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, + 0x5819, 0x5844, 0x5820, 0x5865, 0x586C, 0x5881, 0x5889, 0x589A, + 0x5880, 0x99A8, 0x9F19, 0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, + 0x828A, 0x82A8, 0x8284, 0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, + 0x82B8, 0x82BE, 0x82B0, 0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, + 0x82AE, 0x82CB, 0x82CC, 0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, + 0x829F, 0x82C4, 0x82CE, 0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, + 0x830F, 0x8307, 0x82DC, 0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, + 0x82D3, 0x8311, 0x831A, 0x8306, 0x8314, 0x8315, 0x82E0, 0x82D5, + 0x831C, 0x8351, 0x835B, 0x835C, 0x8308, 0x8392, 0x833C, 0x8334, + 0x8331, 0x839B, 0x835E, 0x832F, 0x834F, 0x8347, 0x8343, 0x835F, +plane 23 +at 0x00 + 0x8340, 0x8317, 0x8360, 0x832D, 0x833A, 0x8333, 0x8366, 0x8365, + 0x8368, 0x831B, 0x8369, 0x836C, 0x836A, 0x836D, 0x836E, 0x83B0, + 0x8378, 0x83B3, 0x83B4, 0x83A0, 0x83AA, 0x8393, 0x839C, 0x8385, + 0x837C, 0x83B6, 0x83A9, 0x837D, 0x83B8, 0x837B, 0x8398, 0x839E, + 0x83A8, 0x83BA, 0x83BC, 0x83C1, 0x8401, 0x83E5, 0x83D8, 0x5807, + 0x8418, 0x840B, 0x83DD, 0x83FD, 0x83D6, 0x841C, 0x8438, 0x8411, + 0x8406, 0x83D4, 0x83DF, 0x840F, 0x8403, 0x83F8, 0x83F9, 0x83EA, + 0x83C5, 0x83C0, 0x8426, 0x83F0, 0x83E1, 0x845C, 0x8451, 0x845A, + 0x8459, 0x8473, 0x8487, 0x8488, 0x847A, 0x8489, 0x8478, 0x843C, + 0x8446, 0x8469, 0x8476, 0x848C, 0x848E, 0x8431, 0x846D, 0x84C1, + 0x84CD, 0x84D0, 0x84E6, 0x84BD, 0x84D3, 0x84CA, 0x84BF, 0x84BA, + 0x84E0, 0x84A1, 0x84B9, 0x84B4, 0x8497, 0x84E5, 0x84E3, 0x850C, + 0x750D, 0x8538, 0x84F0, 0x8539, 0x851F, 0x853A, 0x8556, 0x853B, + 0x84FF, 0x84FC, 0x8559, 0x8548, 0x8568, 0x8564, 0x855E, 0x857A, + 0x77A2, 0x8543, 0x8572, 0x857B, 0x85A4, 0x85A8, 0x8587, 0x858F, + 0x8579, 0x85AE, 0x859C, 0x8585, 0x85B9, 0x85B7, 0x85B0, 0x85D3, + 0x85C1, 0x85DC, 0x85FF, 0x8627, 0x8605, 0x8629, 0x8616, 0x863C, + 0x5EFE, 0x5F08, 0x593C, 0x5941, 0x8037, 0x5955, 0x595A, 0x5958, + 0x530F, 0x5C22, 0x5C25, 0x5C2C, 0x5C34, 0x624C, 0x626A, 0x629F, + 0x62BB, 0x62CA, 0x62DA, 0x62D7, 0x62EE, 0x6322, 0x62F6, 0x6339, + 0x634B, 0x6343, 0x63AD, 0x63F6, 0x6371, 0x637A, 0x638E, 0x63B4, + 0x636D, 0x63AC, 0x638A, 0x6369, 0x63AE, 0x63BC, 0x63F2, 0x63F8, + 0x63E0, 0x63FF, 0x63C4, 0x63DE, 0x63CE, 0x6452, 0x63C6, 0x63BE, + 0x6445, 0x6441, 0x640B, 0x641B, 0x6420, 0x640C, 0x6426, 0x6421, + 0x645E, 0x6484, 0x646D, 0x6496, 0x647A, 0x64B7, 0x64B8, 0x6499, + 0x64BA, 0x64C0, 0x64D0, 0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, + 0x652E, 0x5F0B, 0x5FD2, 0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, + 0x53E9, 0x53E8, 0x53FB, 0x5412, 0x5416, 0x5406, 0x544B, 0x5452, + 0x5453, 0x5454, 0x5456, 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, + 0x5432, 0x5482, 0x5494, 0x5477, 0x5471, 0x5464, 0x549A, 0x549B, + 0x5484, 0x5476, 0x5466, 0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, + 0x54D2, 0x54A7, 0x54A6, 0x54D3, 0x54D4, 0x5472, 0x54A3, 0x54D5, +plane 24 +at 0x00 + 0x54BB, 0x54BF, 0x54CC, 0x54D9, 0x54DA, 0x54DC, 0x54A9, 0x54AA, + 0x54A4, 0x54DD, 0x54CF, 0x54DE, 0x551B, 0x54E7, 0x5520, 0x54FD, + 0x5514, 0x54F3, 0x5522, 0x5523, 0x550F, 0x5511, 0x5527, 0x552A, + 0x5567, 0x558F, 0x55B5, 0x5549, 0x556D, 0x5541, 0x5555, 0x553F, + 0x5550, 0x553C, 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, + 0x5530, 0x555C, 0x558B, 0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, + 0x5581, 0x559F, 0x557E, 0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, + 0x55BE, 0x5594, 0x5599, 0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, + 0x55EB, 0x55EC, 0x55D4, 0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, + 0x55F2, 0x55F3, 0x55CC, 0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F94, + 0x561E, 0x5608, 0x560C, 0x5601, 0x5624, 0x5623, 0x55FE, 0x5600, + 0x5627, 0x562D, 0x5658, 0x5639, 0x5657, 0x562C, 0x564D, 0x5662, + 0x5659, 0x565C, 0x564C, 0x5654, 0x5686, 0x5664, 0x5671, 0x566B, + 0x567B, 0x567C, 0x5685, 0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, + 0x56E1, 0x56F5, 0x56EB, 0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, + 0x571C, 0x5E0F, 0x5E19, 0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C, + 0x5E37, 0x5E44, 0x5E54, 0x5E5B, 0x5E5E, 0x5E61, 0x5C8C, 0x5C7A, + 0x5C8D, 0x5C90, 0x5C96, 0x5C88, 0x5C98, 0x5C99, 0x5C91, 0x5C9A, + 0x5C9C, 0x5CB5, 0x5CA2, 0x5CBD, 0x5CAC, 0x5CAB, 0x5CB1, 0x5CA3, + 0x5CC1, 0x5CB7, 0x5CC4, 0x5CD2, 0x5CE4, 0x5CCB, 0x5CE5, 0x5D02, + 0x5D03, 0x5D27, 0x5D26, 0x5D2E, 0x5D24, 0x5D1E, 0x5D06, 0x5D1B, + 0x5D58, 0x5D3E, 0x5D34, 0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F, 0x5D5D, + 0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, 0x5D74, 0x5D82, 0x5D99, 0x5D9D, + 0x8C73, 0x5DB7, 0x5DC5, 0x5F73, 0x5F77, 0x5F82, 0x5F87, 0x5F89, + 0x5F8C, 0x5F95, 0x5F99, 0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5, 0x5FBC, + 0x8862, 0x5F61, 0x72AD, 0x72B0, 0x72B4, 0x72B7, 0x72B8, 0x72C3, + 0x72C1, 0x72CE, 0x72CD, 0x72D2, 0x72E8, 0x72EF, 0x72E9, 0x72F2, + 0x72F4, 0x72F7, 0x7301, 0x72F3, 0x7303, 0x72FA, 0x72FB, 0x7317, + 0x7313, 0x7321, 0x730A, 0x731E, 0x731D, 0x7315, 0x7322, 0x7339, + 0x7325, 0x732C, 0x7338, 0x7331, 0x7350, 0x734D, 0x7357, 0x7360, + 0x736C, 0x736F, 0x737E, 0x821B, 0x5925, 0x98E7, 0x5924, 0x5902, + 0x9963, 0x9967, 0x9968, 0x9969, 0x996A, 0x996B, 0x996C, 0x9974, +plane 25 +at 0x00 + 0x9977, 0x997D, 0x9980, 0x9984, 0x9987, 0x998A, 0x998D, 0x9990, + 0x9991, 0x9993, 0x9994, 0x9995, 0x5E80, 0x5E91, 0x5E8B, 0x5E96, + 0x5EA5, 0x5EA0, 0x5EB9, 0x5EB5, 0x5EBE, 0x5EB3, 0x8D53, 0x5ED2, + 0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, 0x81BA, 0x5FC4, 0x5FC9, 0x5FD6, + 0x5FCF, 0x6003, 0x5FEE, 0x6004, 0x5FE1, 0x5FE4, 0x5FFE, 0x6005, + 0x6006, 0x5FEA, 0x5FED, 0x5FF8, 0x6019, 0x6035, 0x6026, 0x601B, + 0x600F, 0x600D, 0x6029, 0x602B, 0x600A, 0x603F, 0x6021, 0x6078, + 0x6079, 0x607B, 0x607A, 0x6042, 0x606A, 0x607D, 0x6096, 0x609A, + 0x60AD, 0x609D, 0x6083, 0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, + 0x60B1, 0x60DD, 0x60D8, 0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, + 0x6115, 0x6123, 0x60F4, 0x6100, 0x610E, 0x612B, 0x614A, 0x6175, + 0x61AC, 0x6194, 0x61A7, 0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, + 0x95E9, 0x95EB, 0x95F1, 0x95F3, 0x95F5, 0x95F6, 0x95FC, 0x95FE, + 0x9603, 0x9604, 0x9606, 0x9608, 0x960A, 0x960B, 0x960C, 0x960D, + 0x960F, 0x9612, 0x9615, 0x9616, 0x9617, 0x9619, 0x961A, 0x4E2C, + 0x723F, 0x6215, 0x6C35, 0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, + 0x6C90, 0x6C94, 0x6C8C, 0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, + 0x6CA9, 0x6CD0, 0x6CD4, 0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, + 0x6CB2, 0x6CE0, 0x6CD6, 0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, + 0x6CEF, 0x6CFE, 0x6D39, 0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, + 0x6D04, 0x6D19, 0x6D0E, 0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, + 0x6D4F, 0x6D52, 0x6D54, 0x6D33, 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, + 0x6D5E, 0x6D93, 0x6D94, 0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, + 0x6DC7, 0x6DC5, 0x6DDE, 0x6E0E, 0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, + 0x6DDD, 0x6DD9, 0x6E16, 0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, + 0x6E4E, 0x6E6B, 0x6EB2, 0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, + 0x6E25, 0x6E44, 0x6EDF, 0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, + 0x6EA5, 0x6EA7, 0x6EBD, 0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, + 0x6E8F, 0x6EC2, 0x6E9F, 0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, + 0x6EF9, 0x6F2F, 0x6F36, 0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, + 0x6F89, 0x6F8D, 0x6F8C, 0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1, + 0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE, 0x6FDE, +plane 26 +at 0x00 + 0x6FE0, 0x6FEF, 0x701A, 0x7023, 0x701B, 0x7039, 0x7035, 0x704F, + 0x705E, 0x5B80, 0x5B84, 0x5B95, 0x5B93, 0x5BA5, 0x5BB8, 0x752F, + 0x9A9E, 0x6434, 0x5BE4, 0x5BEE, 0x8930, 0x5BF0, 0x8E47, 0x8B07, + 0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9, 0x8FE6, + 0x8FF3, 0x8FE8, 0x9005, 0x9004, 0x900B, 0x9026, 0x9011, 0x900D, + 0x9016, 0x9021, 0x9035, 0x9036, 0x902D, 0x902F, 0x9044, 0x9051, + 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905B, 0x66B9, 0x9074, + 0x907D, 0x9082, 0x9088, 0x9083, 0x908B, 0x5F50, 0x5F57, 0x5F56, + 0x5F58, 0x5C3B, 0x54AB, 0x5C50, 0x5C59, 0x5B71, 0x5C63, 0x5C66, + 0x7FBC, 0x5F2A, 0x5F29, 0x5F2D, 0x8274, 0x5F3C, 0x9B3B, 0x5C6E, + 0x5981, 0x5983, 0x598D, 0x59A9, 0x59AA, 0x59A3, 0x5997, 0x59CA, + 0x59AB, 0x599E, 0x59A4, 0x59D2, 0x59B2, 0x59AF, 0x59D7, 0x59BE, + 0x5A05, 0x5A06, 0x59DD, 0x5A08, 0x59E3, 0x59D8, 0x59F9, 0x5A0C, + 0x5A09, 0x5A32, 0x5A34, 0x5A11, 0x5A23, 0x5A13, 0x5A40, 0x5A67, + 0x5A4A, 0x5A55, 0x5A3C, 0x5A62, 0x5A75, 0x80EC, 0x5AAA, 0x5A9B, + 0x5A77, 0x5A7A, 0x5ABE, 0x5AEB, 0x5AB2, 0x5AD2, 0x5AD4, 0x5AB8, + 0x5AE0, 0x5AE3, 0x5AF1, 0x5AD6, 0x5AE6, 0x5AD8, 0x5ADC, 0x5B09, + 0x5B17, 0x5B16, 0x5B32, 0x5B37, 0x5B40, 0x5C15, 0x5C1C, 0x5B5A, + 0x5B65, 0x5B73, 0x5B51, 0x5B53, 0x5B62, 0x9A75, 0x9A77, 0x9A78, + 0x9A7A, 0x9A7F, 0x9A7D, 0x9A80, 0x9A81, 0x9A85, 0x9A88, 0x9A8A, + 0x9A90, 0x9A92, 0x9A93, 0x9A96, 0x9A98, 0x9A9B, 0x9A9C, 0x9A9D, + 0x9A9F, 0x9AA0, 0x9AA2, 0x9AA3, 0x9AA5, 0x9AA7, 0x7E9F, 0x7EA1, + 0x7EA3, 0x7EA5, 0x7EA8, 0x7EA9, 0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, + 0x7EC1, 0x7EC2, 0x7EC9, 0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, + 0x7EDB, 0x7EE0, 0x7EE1, 0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, + 0x7EF2, 0x7F0D, 0x7EF6, 0x7EFA, 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, + 0x7F03, 0x7F07, 0x7F08, 0x7F0B, 0x7F0C, 0x7F0F, 0x7F11, 0x7F12, + 0x7F17, 0x7F19, 0x7F1C, 0x7F1B, 0x7F1F, 0x7F21, 0x7F22, 0x7F23, + 0x7F24, 0x7F25, 0x7F26, 0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, + 0x7F2F, 0x7F30, 0x7F31, 0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, + 0x5DDB, 0x753E, 0x9095, 0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, + 0x73CF, 0x73C2, 0x73D1, 0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, +plane 27 +at 0x00 + 0x73E5, 0x73D9, 0x987C, 0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, + 0x73F2, 0x740F, 0x742A, 0x745B, 0x7426, 0x7425, 0x7428, 0x7430, + 0x742E, 0x742C, 0x741B, 0x741A, 0x7441, 0x745C, 0x7457, 0x7455, + 0x7459, 0x7477, 0x746D, 0x747E, 0x749C, 0x748E, 0x7480, 0x7481, + 0x7487, 0x748B, 0x749E, 0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74D2, + 0x74BA, 0x97EA, 0x97EB, 0x97EC, 0x674C, 0x6753, 0x675E, 0x6748, + 0x6769, 0x67A5, 0x6787, 0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, + 0x67A8, 0x679E, 0x67AD, 0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, + 0x67D8, 0x680A, 0x67E9, 0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, + 0x67B3, 0x67DD, 0x6800, 0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, + 0x67FD, 0x6832, 0x6833, 0x6860, 0x6861, 0x684E, 0x6862, 0x6844, + 0x6864, 0x6883, 0x681D, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, + 0x683E, 0x684A, 0x6849, 0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, + 0x6893, 0x686B, 0x68C2, 0x696E, 0x68FC, 0x691F, 0x6920, 0x68F9, + 0x6924, 0x68F0, 0x690B, 0x6901, 0x6957, 0x68E3, 0x6910, 0x6971, + 0x6939, 0x6960, 0x6942, 0x695D, 0x6984, 0x696B, 0x6980, 0x6998, + 0x6978, 0x6934, 0x69CC, 0x6987, 0x6988, 0x69CE, 0x6989, 0x6966, + 0x6963, 0x6979, 0x699B, 0x69A7, 0x69BB, 0x69AB, 0x69AD, 0x69D4, + 0x69B1, 0x69C1, 0x69CA, 0x69DF, 0x6995, 0x69E0, 0x698D, 0x69FF, + 0x6A2F, 0x69ED, 0x6A17, 0x6A18, 0x6A65, 0x69F2, 0x6A44, 0x6A3E, + 0x6AA0, 0x6A50, 0x6A5B, 0x6A35, 0x6A8E, 0x6A79, 0x6A3D, 0x6A28, + 0x6A58, 0x6A7C, 0x6A91, 0x6A90, 0x6AA9, 0x6A97, 0x6AAB, 0x7337, + 0x7352, 0x6B81, 0x6B82, 0x6B87, 0x6B84, 0x6B92, 0x6B93, 0x6B8D, + 0x6B9A, 0x6B9B, 0x6BA1, 0x6BAA, 0x8F6B, 0x8F6D, 0x8F71, 0x8F72, + 0x8F73, 0x8F75, 0x8F76, 0x8F78, 0x8F77, 0x8F79, 0x8F7A, 0x8F7C, + 0x8F7E, 0x8F81, 0x8F82, 0x8F84, 0x8F87, 0x8F8B, 0x8F8D, 0x8F8E, + 0x8F8F, 0x8F98, 0x8F9A, 0x8ECE, 0x620B, 0x6217, 0x621B, 0x621F, + 0x6222, 0x6221, 0x6225, 0x6224, 0x622C, 0x81E7, 0x74EF, 0x74F4, + 0x74FF, 0x750F, 0x7511, 0x7513, 0x6534, 0x65EE, 0x65EF, 0x65F0, + 0x660A, 0x6619, 0x6772, 0x6603, 0x6615, 0x6600, 0x7085, 0x66F7, + 0x661D, 0x6634, 0x6631, 0x6636, 0x6635, 0x8006, 0x665F, 0x6654, + 0x6641, 0x664F, 0x6656, 0x6661, 0x6657, 0x6677, 0x6684, 0x668C, +plane 28 +at 0x00 + 0x66A7, 0x669D, 0x66BE, 0x66DB, 0x66DC, 0x66E6, 0x66E9, 0x8D32, + 0x8D33, 0x8D36, 0x8D3B, 0x8D3D, 0x8D40, 0x8D45, 0x8D46, 0x8D48, + 0x8D49, 0x8D47, 0x8D4D, 0x8D55, 0x8D59, 0x89C7, 0x89CA, 0x89CB, + 0x89CC, 0x89CE, 0x89CF, 0x89D0, 0x89D1, 0x726E, 0x729F, 0x725D, + 0x7266, 0x726F, 0x727E, 0x727F, 0x7284, 0x728B, 0x728D, 0x728F, + 0x7292, 0x6308, 0x6332, 0x63B0, 0x643F, 0x64D8, 0x8004, 0x6BEA, + 0x6BF3, 0x6BFD, 0x6BF5, 0x6BF9, 0x6C05, 0x6C07, 0x6C06, 0x6C0D, + 0x6C15, 0x6C18, 0x6C19, 0x6C1A, 0x6C21, 0x6C29, 0x6C24, 0x6C2A, + 0x6C32, 0x6535, 0x6555, 0x656B, 0x724D, 0x7252, 0x7256, 0x7230, + 0x8662, 0x5216, 0x809F, 0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, + 0x80B1, 0x80AB, 0x80AD, 0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, + 0x80EA, 0x80DB, 0x80C2, 0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, + 0x80DD, 0x80EB, 0x80F1, 0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, + 0x80FC, 0x6715, 0x8112, 0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, + 0x8132, 0x8148, 0x814C, 0x8153, 0x8174, 0x8159, 0x815A, 0x8171, + 0x8160, 0x8169, 0x817C, 0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, + 0x8188, 0x8182, 0x8191, 0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, + 0x81CA, 0x81BB, 0x81C1, 0x81A6, 0x6B24, 0x6B37, 0x6B39, 0x6B43, + 0x6B46, 0x6B59, 0x98D1, 0x98D2, 0x98D3, 0x98D5, 0x98D9, 0x98DA, + 0x6BB3, 0x5F40, 0x6BC2, 0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, + 0x65C6, 0x65C4, 0x65C3, 0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, + 0x709C, 0x7096, 0x709D, 0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, + 0x70E8, 0x70CA, 0x7110, 0x7113, 0x7116, 0x712F, 0x7131, 0x7173, + 0x715C, 0x7168, 0x7145, 0x7172, 0x714A, 0x7178, 0x717A, 0x7198, + 0x71B3, 0x71B5, 0x71A8, 0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, + 0x721D, 0x7228, 0x706C, 0x7118, 0x7166, 0x71B9, 0x623E, 0x623D, + 0x6243, 0x6248, 0x6249, 0x793B, 0x7940, 0x7946, 0x7949, 0x795B, + 0x795C, 0x7953, 0x795A, 0x7962, 0x7957, 0x7960, 0x796F, 0x7967, + 0x797A, 0x7985, 0x798A, 0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0, + 0x603C, 0x605D, 0x605A, 0x6067, 0x6041, 0x6059, 0x6063, 0x60AB, + 0x6106, 0x610D, 0x615D, 0x61A9, 0x619D, 0x61CB, 0x61D1, 0x6206, + 0x8080, 0x807F, 0x6C93, 0x6CF6, 0x6DFC, 0x77F6, 0x77F8, 0x7800, +plane 29 +at 0x00 + 0x7809, 0x7817, 0x7818, 0x7811, 0x65AB, 0x782D, 0x781C, 0x781D, + 0x7839, 0x783A, 0x783B, 0x781F, 0x783C, 0x7825, 0x782C, 0x7823, + 0x7829, 0x784E, 0x786D, 0x7856, 0x7857, 0x7826, 0x7850, 0x7847, + 0x784C, 0x786A, 0x789B, 0x7893, 0x789A, 0x7887, 0x789C, 0x78A1, + 0x78A3, 0x78B2, 0x78B9, 0x78A5, 0x78D4, 0x78D9, 0x78C9, 0x78EC, + 0x78F2, 0x7905, 0x78F4, 0x7913, 0x7924, 0x791E, 0x7934, 0x9F9B, + 0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, 0x7704, 0x770D, 0x76F9, 0x7707, + 0x7708, 0x771A, 0x7722, 0x7719, 0x772D, 0x7726, 0x7735, 0x7738, + 0x7750, 0x7751, 0x7747, 0x7743, 0x775A, 0x7768, 0x7762, 0x7765, + 0x777F, 0x778D, 0x777D, 0x7780, 0x778C, 0x7791, 0x779F, 0x77A0, + 0x77B0, 0x77B5, 0x77BD, 0x753A, 0x7540, 0x754E, 0x754B, 0x7548, + 0x755B, 0x7572, 0x7579, 0x7583, 0x7F58, 0x7F61, 0x7F5F, 0x8A48, + 0x7F68, 0x7F74, 0x7F71, 0x7F79, 0x7F81, 0x7F7E, 0x76CD, 0x76E5, + 0x8832, 0x9485, 0x9486, 0x9487, 0x948B, 0x948A, 0x948C, 0x948D, + 0x948F, 0x9490, 0x9494, 0x9497, 0x9495, 0x949A, 0x949B, 0x949C, + 0x94A3, 0x94A4, 0x94AB, 0x94AA, 0x94AD, 0x94AC, 0x94AF, 0x94B0, + 0x94B2, 0x94B4, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BC, + 0x94BD, 0x94BF, 0x94C4, 0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, + 0x94CD, 0x94CE, 0x94D0, 0x94D1, 0x94D2, 0x94D5, 0x94D6, 0x94D7, + 0x94D9, 0x94D8, 0x94DB, 0x94DE, 0x94DF, 0x94E0, 0x94E2, 0x94E4, + 0x94E5, 0x94E7, 0x94E8, 0x94EA, 0x94E9, 0x94EB, 0x94EE, 0x94EF, + 0x94F3, 0x94F4, 0x94F5, 0x94F7, 0x94F9, 0x94FC, 0x94FD, 0x94FF, + 0x9503, 0x9502, 0x9506, 0x9507, 0x9509, 0x950A, 0x950D, 0x950E, + 0x950F, 0x9512, 0x9513, 0x9514, 0x9515, 0x9516, 0x9518, 0x951B, + 0x951D, 0x951E, 0x951F, 0x9522, 0x952A, 0x952B, 0x9529, 0x952C, + 0x9531, 0x9532, 0x9534, 0x9536, 0x9537, 0x9538, 0x953C, 0x953E, + 0x953F, 0x9542, 0x9535, 0x9544, 0x9545, 0x9546, 0x9549, 0x954C, + 0x954E, 0x954F, 0x9552, 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, + 0x9559, 0x955B, 0x955E, 0x955F, 0x955D, 0x9561, 0x9562, 0x9564, + 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956A, 0x956B, 0x956C, + 0x956F, 0x9571, 0x9572, 0x9573, 0x953A, 0x77E7, 0x77EC, 0x96C9, + 0x79D5, 0x79ED, 0x79E3, 0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, +plane 30 +at 0x00 + 0x7A1E, 0x7A14, 0x7A39, 0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, + 0x7688, 0x768E, 0x7693, 0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, + 0x9E20, 0x9E22, 0x9E28, 0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, + 0x9E31, 0x9E36, 0x9E38, 0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, + 0x9E42, 0x9E44, 0x9E46, 0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, + 0x9E4E, 0x9E51, 0x9E55, 0x9E57, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, + 0x9E63, 0x9E66, 0x9E67, 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, + 0x9E71, 0x9E6D, 0x9E73, 0x7592, 0x7594, 0x7596, 0x75A0, 0x759D, + 0x75AC, 0x75A3, 0x75B3, 0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, + 0x75C3, 0x75C2, 0x75D6, 0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, + 0x75EB, 0x75E7, 0x7603, 0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, + 0x7605, 0x760C, 0x7617, 0x760A, 0x7625, 0x7618, 0x7615, 0x7619, + 0x761B, 0x763C, 0x7622, 0x7620, 0x7640, 0x762D, 0x7630, 0x763F, + 0x7635, 0x7643, 0x763E, 0x7633, 0x764D, 0x765E, 0x7654, 0x765C, + 0x7656, 0x766B, 0x766F, 0x7FCA, 0x7AE6, 0x7A78, 0x7A79, 0x7A80, + 0x7A86, 0x7A88, 0x7A95, 0x7AA6, 0x7AA0, 0x7AAC, 0x7AA8, 0x7AAD, + 0x7AB3, 0x8864, 0x8869, 0x8872, 0x887D, 0x887F, 0x8882, 0x88A2, + 0x88C6, 0x88B7, 0x88BC, 0x88C9, 0x88E2, 0x88CE, 0x88E3, 0x88E5, + 0x88F1, 0x891A, 0x88FC, 0x88E8, 0x88FE, 0x88F0, 0x8921, 0x8919, + 0x8913, 0x891B, 0x890A, 0x8934, 0x892B, 0x8936, 0x8941, 0x8966, + 0x897B, 0x758B, 0x80E5, 0x76B2, 0x76B4, 0x77DC, 0x8012, 0x8014, + 0x8016, 0x801C, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, 0x8029, + 0x8028, 0x8031, 0x800B, 0x8035, 0x8043, 0x8046, 0x804D, 0x8052, + 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883, 0x9889, 0x988C, + 0x988D, 0x988F, 0x9894, 0x989A, 0x989B, 0x989E, 0x989F, 0x98A1, + 0x98A2, 0x98A5, 0x98A6, 0x864D, 0x8654, 0x866C, 0x866E, 0x867F, + 0x867A, 0x867C, 0x867B, 0x86A8, 0x868D, 0x868B, 0x86AC, 0x869D, + 0x86A7, 0x86A3, 0x86AA, 0x8693, 0x86A9, 0x86B6, 0x86C4, 0x86B5, + 0x86CE, 0x86B0, 0x86BA, 0x86B1, 0x86AF, 0x86C9, 0x86CF, 0x86B4, + 0x86E9, 0x86F1, 0x86F2, 0x86ED, 0x86F3, 0x86D0, 0x8713, 0x86DE, + 0x86F4, 0x86DF, 0x86D8, 0x86D1, 0x8703, 0x8707, 0x86F8, 0x8708, + 0x870A, 0x870D, 0x8709, 0x8723, 0x873B, 0x871E, 0x8725, 0x872E, +plane 31 +at 0x00 + 0x871A, 0x873E, 0x8748, 0x8734, 0x8731, 0x8729, 0x8737, 0x873F, + 0x8782, 0x8722, 0x877D, 0x877E, 0x877B, 0x8760, 0x8770, 0x874C, + 0x876E, 0x878B, 0x8753, 0x8763, 0x877C, 0x8764, 0x8759, 0x8765, + 0x8793, 0x87AF, 0x87A8, 0x87D2, 0x87C6, 0x8788, 0x8785, 0x87AD, + 0x8797, 0x8783, 0x87AB, 0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, + 0x87D3, 0x87BD, 0x87D1, 0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, + 0x87EE, 0x8816, 0x8813, 0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, + 0x883C, 0x7F36, 0x7F42, 0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, + 0x7B08, 0x7B03, 0x7B04, 0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, + 0x7B38, 0x7B2A, 0x7B19, 0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, + 0x7B33, 0x7B3E, 0x7B1E, 0x7B58, 0x7B5A, 0x7B45, 0x7B75, 0x7B4C, + 0x7B5D, 0x7B60, 0x7B6E, 0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, + 0x7BA6, 0x7BA7, 0x7BB8, 0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, + 0x7B9C, 0x7BA2, 0x7BAB, 0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, + 0x7BDA, 0x7BE5, 0x7BE6, 0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, + 0x7C16, 0x7C0B, 0x7C1F, 0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, + 0x81FE, 0x8201, 0x8202, 0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, + 0x8223, 0x822D, 0x822F, 0x8228, 0x822B, 0x8238, 0x823B, 0x8233, + 0x8234, 0x823E, 0x8244, 0x8249, 0x824B, 0x824F, 0x825A, 0x825F, + 0x8268, 0x887E, 0x8885, 0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, + 0x7F9F, 0x7FA7, 0x7FAF, 0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, + 0x7C9D, 0x7C9C, 0x7C9E, 0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, + 0x7CC7, 0x7CCC, 0x7CCD, 0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, + 0x66A8, 0x7FBF, 0x7FCE, 0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, + 0x7FEE, 0x7FF3, 0x7CF8, 0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, + 0x9EB8, 0x9EB4, 0x8D73, 0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, + 0x8D6D, 0x8C47, 0x8C49, 0x914A, 0x9150, 0x914E, 0x914F, 0x9164, + 0x9162, 0x9161, 0x9170, 0x9169, 0x916F, 0x917D, 0x917E, 0x9172, + 0x9174, 0x9179, 0x918C, 0x9185, 0x9190, 0x918D, 0x9191, 0x91A2, + 0x91A3, 0x91AA, 0x91AD, 0x91AE, 0x91AF, 0x91B5, 0x91B4, 0x91BA, + 0x8C55, 0x9E7E, 0x8DB8, 0x8DEB, 0x8E05, 0x8E59, 0x8E69, 0x8DB5, + 0x8DBF, 0x8DBC, 0x8DBA, 0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA, 0x8DDE, +plane 32 +at 0x00 + 0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8, 0x8DE3, + 0x8DF9, 0x8DFB, 0x8DE4, 0x8E09, 0x8DFD, 0x8E14, 0x8E1D, 0x8E1F, + 0x8E2C, 0x8E2E, 0x8E23, 0x8E2F, 0x8E3A, 0x8E40, 0x8E39, 0x8E35, + 0x8E3D, 0x8E31, 0x8E49, 0x8E41, 0x8E42, 0x8E51, 0x8E52, 0x8E4A, + 0x8E70, 0x8E76, 0x8E7C, 0x8E6F, 0x8E74, 0x8E85, 0x8E8F, 0x8E94, + 0x8E90, 0x8E9C, 0x8E9E, 0x8C78, 0x8C82, 0x8C8A, 0x8C85, 0x8C98, + 0x8C94, 0x659B, 0x89D6, 0x89DE, 0x89DA, 0x89DC, 0x89E5, 0x89EB, + 0x89EF, 0x8A3E, 0x8B26, 0x9753, 0x96E9, 0x96F3, 0x96EF, 0x9706, + 0x9701, 0x9708, 0x970F, 0x970E, 0x972A, 0x972D, 0x9730, 0x973E, + 0x9F80, 0x9F83, 0x9F85, 0x9F86, 0x9F87, 0x9F88, 0x9F89, 0x9F8A, + 0x9F8C, 0x9EFE, 0x9F0B, 0x9F0D, 0x96B9, 0x96BC, 0x96BD, 0x96CE, + 0x96D2, 0x77BF, 0x96E0, 0x928E, 0x92AE, 0x92C8, 0x933E, 0x936A, + 0x93CA, 0x938F, 0x943E, 0x946B, 0x9C7F, 0x9C82, 0x9C85, 0x9C86, + 0x9C87, 0x9C88, 0x7A23, 0x9C8B, 0x9C8E, 0x9C90, 0x9C91, 0x9C92, + 0x9C94, 0x9C95, 0x9C9A, 0x9C9B, 0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1, + 0x9CA2, 0x9CA3, 0x9CA5, 0x9CA6, 0x9CA7, 0x9CA8, 0x9CA9, 0x9CAB, + 0x9CAD, 0x9CAE, 0x9CB0, 0x9CB1, 0x9CB2, 0x9CB3, 0x9CB4, 0x9CB5, + 0x9CB6, 0x9CB7, 0x9CBA, 0x9CBB, 0x9CBC, 0x9CBD, 0x9CC4, 0x9CC5, + 0x9CC6, 0x9CC7, 0x9CCA, 0x9CCB, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, + 0x9CD0, 0x9CD3, 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, + 0x9CDD, 0x9CDF, 0x9CE2, 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, + 0x97AF, 0x97AB, 0x97A3, 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, + 0x9E58, 0x9AB6, 0x9ABA, 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, + 0x9ACB, 0x9ACC, 0x9AD1, 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, + 0x9B4D, 0x9B51, 0x98E8, 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, + 0x9AE1, 0x9AE6, 0x9AEF, 0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, + 0x9B0F, 0x9B13, 0x9B1F, 0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, + 0x9E87, 0x9E88, 0x9E8B, 0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, + 0x9EDC, 0x9EDD, 0x9EE0, 0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, + 0x9EEA, 0x9EEF, 0x9F22, 0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, + 0x9F3E, 0x9F44, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 33 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 34 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 35 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + +# # diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/cugbk.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/cugbk.map new file mode 100755 index 00000000..34889ff5 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/cugbk.map @@ -0,0 +1,3185 @@ +# +# For Creating Unicode GBK encoding Chinese Type1 +# compact CJK fonts. +# +plane 01 +at 0x00 + 0x4E02, 0x4E04, 0x4E05, 0x4E06, 0x4E0F, 0x4E12, 0x4E17, 0x4E1F, + 0x4E20, 0x4E21, 0x4E23, 0x4E26, 0x4E29, 0x4E2E, 0x4E2F, 0x4E31, + 0x4E33, 0x4E35, 0x4E37, 0x4E3C, 0x4E40, 0x4E41, 0x4E42, 0x4E44, + 0x4E46, 0x4E4A, 0x4E51, 0x4E55, 0x4E57, 0x4E5A, 0x4E5B, 0x4E62, + 0x4E63, 0x4E64, 0x4E65, 0x4E67, 0x4E68, 0x4E6A, 0x4E6B, 0x4E6C, + 0x4E6D, 0x4E6E, 0x4E6F, 0x4E72, 0x4E74, 0x4E75, 0x4E76, 0x4E77, + 0x4E78, 0x4E79, 0x4E7A, 0x4E7B, 0x4E7C, 0x4E7D, 0x4E7F, 0x4E80, + 0x4E81, 0x4E82, 0x4E83, 0x4E84, 0x4E85, 0x4E87, 0x4E8A, 0x4E90, + 0x4E96, 0x4E97, 0x4E99, 0x4E9C, 0x4E9D, 0x4E9E, 0x4EA3, 0x4EAA, + 0x4EAF, 0x4EB0, 0x4EB1, 0x4EB4, 0x4EB6, 0x4EB7, 0x4EB8, 0x4EB9, + 0x4EBC, 0x4EBD, 0x4EBE, 0x4EC8, 0x4ECC, 0x4ECF, 0x4ED0, 0x4ED2, + 0x4EDA, 0x4EDB, 0x4EDC, 0x4EE0, 0x4EE2, 0x4EE6, 0x4EE7, 0x4EE9, + 0x4EED, 0x4EEE, 0x4EEF, 0x4EF1, 0x4EF4, 0x4EF8, 0x4EF9, 0x4EFA, + 0x4EFC, 0x4EFE, 0x4F00, 0x4F02, 0x4F03, 0x4F04, 0x4F05, 0x4F06, + 0x4F07, 0x4F08, 0x4F0B, 0x4F0C, 0x4F12, 0x4F13, 0x4F14, 0x4F15, + 0x4F16, 0x4F1C, 0x4F1D, 0x4F21, 0x4F23, 0x4F28, 0x4F29, 0x4F2C, + 0x4F2D, 0x4F2E, 0x4F31, 0x4F33, 0x4F35, 0x4F37, 0x4F39, 0x4F3B, + 0x4F3E, 0x4F3F, 0x4F40, 0x4F41, 0x4F42, 0x4F44, 0x4F45, 0x4F47, + 0x4F48, 0x4F49, 0x4F4A, 0x4F4B, 0x4F4C, 0x4F52, 0x4F54, 0x4F56, + 0x4F61, 0x4F62, 0x4F66, 0x4F68, 0x4F6A, 0x4F6B, 0x4F6D, 0x4F6E, + 0x4F71, 0x4F72, 0x4F75, 0x4F77, 0x4F78, 0x4F79, 0x4F7A, 0x4F7D, + 0x4F80, 0x4F81, 0x4F82, 0x4F85, 0x4F86, 0x4F87, 0x4F8A, 0x4F8C, + 0x4F8E, 0x4F90, 0x4F92, 0x4F93, 0x4F95, 0x4F96, 0x4F98, 0x4F99, + 0x4F9A, 0x4F9C, 0x4F9E, 0x4F9F, 0x4FA1, 0x4FA2, 0x4FA4, 0x4FAB, + 0x4FAD, 0x4FB0, 0x4FB1, 0x4FB2, 0x4FB3, 0x4FB4, 0x4FB6, 0x4FB7, + 0x4FB8, 0x4FB9, 0x4FBA, 0x4FBB, 0x4FBC, 0x4FBD, 0x4FBE, 0x4FC0, + 0x4FC1, 0x4FC2, 0x4FC6, 0x4FC7, 0x4FC8, 0x4FC9, 0x4FCB, 0x4FCC, + 0x4FCD, 0x4FD2, 0x4FD3, 0x4FD4, 0x4FD5, 0x4FD6, 0x4FD9, 0x4FDB, + 0x4FE0, 0x4FE2, 0x4FE4, 0x4FE5, 0x4FE7, 0x4FEB, 0x4FEC, 0x4FF0, + 0x4FF2, 0x4FF4, 0x4FF5, 0x4FF6, 0x4FF7, 0x4FF9, 0x4FFB, 0x4FFC, + 0x4FFD, 0x4FFF, 0x5000, 0x5001, 0x5002, 0x5003, 0x5004, 0x5005, + 0x5006, 0x5007, 0x5008, 0x5009, 0x500A, 0x500B, 0x500E, 0x5010, +plane 02 +at 0x00 + 0x5011, 0x5013, 0x5015, 0x5016, 0x5017, 0x501B, 0x501D, 0x501E, + 0x5020, 0x5022, 0x5023, 0x5024, 0x5027, 0x502B, 0x502F, 0x5030, + 0x5031, 0x5032, 0x5033, 0x5034, 0x5035, 0x5036, 0x5037, 0x5038, + 0x5039, 0x503B, 0x503D, 0x503F, 0x5040, 0x5041, 0x5042, 0x5044, + 0x5045, 0x5046, 0x5049, 0x504A, 0x504B, 0x504D, 0x5050, 0x5051, + 0x5052, 0x5053, 0x5054, 0x5056, 0x5057, 0x5058, 0x5059, 0x505B, + 0x505D, 0x505E, 0x505F, 0x5060, 0x5061, 0x5062, 0x5063, 0x5064, + 0x5066, 0x5067, 0x5068, 0x5069, 0x506A, 0x506B, 0x506D, 0x506E, + 0x506F, 0x5070, 0x5071, 0x5072, 0x5073, 0x5074, 0x5075, 0x5078, + 0x5079, 0x507A, 0x507C, 0x507D, 0x5081, 0x5082, 0x5083, 0x5084, + 0x5086, 0x5087, 0x5089, 0x508A, 0x508B, 0x508C, 0x508E, 0x508F, + 0x5090, 0x5091, 0x5092, 0x5093, 0x5094, 0x5095, 0x5096, 0x5097, + 0x5098, 0x5099, 0x509A, 0x509B, 0x509C, 0x509D, 0x509E, 0x509F, + 0x50A0, 0x50A1, 0x50A2, 0x50A4, 0x50A6, 0x50AA, 0x50AB, 0x50AD, + 0x50AE, 0x50AF, 0x50B0, 0x50B1, 0x50B3, 0x50B4, 0x50B5, 0x50B6, + 0x50B7, 0x50B8, 0x50B9, 0x50BC, 0x50BD, 0x50BE, 0x50BF, 0x50C0, + 0x50C1, 0x50C2, 0x50C3, 0x50C4, 0x50C5, 0x50C6, 0x50C7, 0x50C8, + 0x50C9, 0x50CA, 0x50CB, 0x50CC, 0x50CD, 0x50CE, 0x50D0, 0x50D1, + 0x50D2, 0x50D3, 0x50D4, 0x50D5, 0x50D7, 0x50D8, 0x50D9, 0x50DB, + 0x50DC, 0x50DD, 0x50DE, 0x50DF, 0x50E0, 0x50E1, 0x50E2, 0x50E3, + 0x50E4, 0x50E5, 0x50E8, 0x50E9, 0x50EA, 0x50EB, 0x50EF, 0x50F0, + 0x50F1, 0x50F2, 0x50F4, 0x50F6, 0x50F7, 0x50F8, 0x50F9, 0x50FA, + 0x50FC, 0x50FD, 0x50FE, 0x50FF, 0x5100, 0x5101, 0x5102, 0x5103, + 0x5104, 0x5105, 0x5108, 0x5109, 0x510A, 0x510C, 0x510D, 0x510E, + 0x510F, 0x5110, 0x5111, 0x5113, 0x5114, 0x5115, 0x5116, 0x5117, + 0x5118, 0x5119, 0x511A, 0x511B, 0x511C, 0x511D, 0x511E, 0x511F, + 0x5120, 0x5122, 0x5123, 0x5124, 0x5125, 0x5126, 0x5127, 0x5128, + 0x5129, 0x512A, 0x512B, 0x512C, 0x512D, 0x512E, 0x512F, 0x5130, + 0x5131, 0x5132, 0x5133, 0x5134, 0x5135, 0x5136, 0x5137, 0x5138, + 0x5139, 0x513A, 0x513B, 0x513C, 0x513D, 0x513E, 0x5142, 0x5147, + 0x514A, 0x514C, 0x514E, 0x514F, 0x5150, 0x5152, 0x5153, 0x5157, + 0x5158, 0x5159, 0x515B, 0x515D, 0x515E, 0x515F, 0x5160, 0x5161, +plane 03 +at 0x00 + 0x5163, 0x5164, 0x5166, 0x5167, 0x5169, 0x516A, 0x516F, 0x5172, + 0x517A, 0x517E, 0x517F, 0x5183, 0x5184, 0x5186, 0x5187, 0x518A, + 0x518B, 0x518E, 0x518F, 0x5190, 0x5191, 0x5193, 0x5194, 0x5198, + 0x519A, 0x519D, 0x519E, 0x519F, 0x51A1, 0x51A3, 0x51A6, 0x51A7, + 0x51A8, 0x51A9, 0x51AA, 0x51AD, 0x51AE, 0x51B4, 0x51B8, 0x51B9, + 0x51BA, 0x51BE, 0x51BF, 0x51C1, 0x51C2, 0x51C3, 0x51C5, 0x51C8, + 0x51CA, 0x51CD, 0x51CE, 0x51D0, 0x51D2, 0x51D3, 0x51D4, 0x51D5, + 0x51D6, 0x51D7, 0x51D8, 0x51D9, 0x51DA, 0x51DC, 0x51DE, 0x51DF, + 0x51E2, 0x51E3, 0x51E5, 0x51E6, 0x51E7, 0x51E8, 0x51E9, 0x51EA, + 0x51EC, 0x51EE, 0x51F1, 0x51F2, 0x51F4, 0x51F7, 0x51FE, 0x5204, + 0x5205, 0x5209, 0x520B, 0x520C, 0x520F, 0x5210, 0x5213, 0x5214, + 0x5215, 0x521C, 0x521E, 0x521F, 0x5221, 0x5222, 0x5223, 0x5225, + 0x5226, 0x5227, 0x522A, 0x522C, 0x522F, 0x5231, 0x5232, 0x5234, + 0x5235, 0x523C, 0x523E, 0x5244, 0x5245, 0x5246, 0x5247, 0x5248, + 0x5249, 0x524B, 0x524E, 0x524F, 0x5252, 0x5253, 0x5255, 0x5257, + 0x5258, 0x5259, 0x525A, 0x525B, 0x525D, 0x525F, 0x5260, 0x5262, + 0x5263, 0x5264, 0x5266, 0x5268, 0x526B, 0x526C, 0x526D, 0x526E, + 0x5270, 0x5271, 0x5273, 0x5274, 0x5275, 0x5276, 0x5277, 0x5278, + 0x5279, 0x527A, 0x527B, 0x527C, 0x527E, 0x5280, 0x5283, 0x5284, + 0x5285, 0x5286, 0x5287, 0x5289, 0x528A, 0x528B, 0x528C, 0x528D, + 0x528E, 0x528F, 0x5291, 0x5292, 0x5294, 0x5295, 0x5296, 0x5297, + 0x5298, 0x5299, 0x529A, 0x529C, 0x52A4, 0x52A5, 0x52A6, 0x52A7, + 0x52AE, 0x52AF, 0x52B0, 0x52B4, 0x52B5, 0x52B6, 0x52B7, 0x52B8, + 0x52B9, 0x52BA, 0x52BB, 0x52BC, 0x52BD, 0x52C0, 0x52C1, 0x52C2, + 0x52C4, 0x52C5, 0x52C6, 0x52C8, 0x52CA, 0x52CC, 0x52CD, 0x52CE, + 0x52CF, 0x52D1, 0x52D3, 0x52D4, 0x52D5, 0x52D7, 0x52D9, 0x52DA, + 0x52DB, 0x52DC, 0x52DD, 0x52DE, 0x52E0, 0x52E1, 0x52E2, 0x52E3, + 0x52E5, 0x52E6, 0x52E7, 0x52E8, 0x52E9, 0x52EA, 0x52EB, 0x52EC, + 0x52ED, 0x52EE, 0x52EF, 0x52F1, 0x52F2, 0x52F3, 0x52F4, 0x52F5, + 0x52F6, 0x52F7, 0x52F8, 0x52FB, 0x52FC, 0x52FD, 0x5301, 0x5302, + 0x5303, 0x5304, 0x5307, 0x5309, 0x530A, 0x530B, 0x530C, 0x530E, + 0x5311, 0x5312, 0x5313, 0x5314, 0x5318, 0x531B, 0x531C, 0x531E, +plane 04 +at 0x00 + 0x531F, 0x5322, 0x5324, 0x5325, 0x5327, 0x5328, 0x5329, 0x532B, + 0x532C, 0x532D, 0x532F, 0x5330, 0x5331, 0x5332, 0x5333, 0x5334, + 0x5335, 0x5336, 0x5337, 0x5338, 0x533C, 0x533D, 0x5340, 0x5342, + 0x5344, 0x5346, 0x534B, 0x534C, 0x534D, 0x5350, 0x5354, 0x5358, + 0x5359, 0x535B, 0x535D, 0x5365, 0x5368, 0x536A, 0x536C, 0x536D, + 0x5372, 0x5376, 0x5379, 0x537B, 0x537C, 0x537D, 0x537E, 0x5380, + 0x5381, 0x5383, 0x5387, 0x5388, 0x538A, 0x538E, 0x538F, 0x5390, + 0x5391, 0x5392, 0x5393, 0x5394, 0x5396, 0x5397, 0x5399, 0x539B, + 0x539C, 0x539E, 0x53A0, 0x53A1, 0x53A4, 0x53A7, 0x53AA, 0x53AB, + 0x53AC, 0x53AD, 0x53AF, 0x53B0, 0x53B1, 0x53B2, 0x53B3, 0x53B4, + 0x53B5, 0x53B7, 0x53B8, 0x53B9, 0x53BA, 0x53BC, 0x53BD, 0x53BE, + 0x53C0, 0x53C3, 0x53C4, 0x53C5, 0x53C6, 0x53C7, 0x53CE, 0x53CF, + 0x53D0, 0x53D2, 0x53D3, 0x53D5, 0x53DA, 0x53DC, 0x53DD, 0x53DE, + 0x53E1, 0x53E2, 0x53E7, 0x53F4, 0x53FA, 0x53FE, 0x53FF, 0x5400, + 0x5402, 0x5405, 0x5407, 0x540B, 0x5414, 0x5418, 0x5419, 0x541A, + 0x541C, 0x5422, 0x5424, 0x5425, 0x542A, 0x5430, 0x5433, 0x5436, + 0x5437, 0x543A, 0x543D, 0x543F, 0x5441, 0x5442, 0x5444, 0x5445, + 0x5447, 0x5449, 0x544C, 0x544D, 0x544E, 0x544F, 0x5451, 0x545A, + 0x545D, 0x545E, 0x545F, 0x5460, 0x5461, 0x5463, 0x5465, 0x5467, + 0x5469, 0x546A, 0x546B, 0x546C, 0x546D, 0x546E, 0x546F, 0x5470, + 0x5474, 0x5479, 0x547A, 0x547E, 0x547F, 0x5481, 0x5483, 0x5485, + 0x5487, 0x5488, 0x5489, 0x548A, 0x548D, 0x5491, 0x5493, 0x5497, + 0x5498, 0x549C, 0x549E, 0x549F, 0x54A0, 0x54A1, 0x54A2, 0x54A5, + 0x54AE, 0x54B0, 0x54B2, 0x54B5, 0x54B6, 0x54B7, 0x54B9, 0x54BA, + 0x54BC, 0x54BE, 0x54C3, 0x54C5, 0x54CA, 0x54CB, 0x54D6, 0x54D8, + 0x54DB, 0x54E0, 0x54E1, 0x54E2, 0x54E3, 0x54E4, 0x54EB, 0x54EC, + 0x54EF, 0x54F0, 0x54F1, 0x54F4, 0x54F5, 0x54F6, 0x54F7, 0x54F8, + 0x54F9, 0x54FB, 0x54FE, 0x5500, 0x5502, 0x5503, 0x5504, 0x5505, + 0x5508, 0x550A, 0x550B, 0x550C, 0x550D, 0x550E, 0x5512, 0x5513, + 0x5515, 0x5516, 0x5517, 0x5518, 0x5519, 0x551A, 0x551C, 0x551D, + 0x551E, 0x551F, 0x5521, 0x5525, 0x5526, 0x5528, 0x5529, 0x552B, + 0x552D, 0x5532, 0x5534, 0x5535, 0x5536, 0x5538, 0x5539, 0x553A, +plane 05 +at 0x00 + 0x553B, 0x553D, 0x5540, 0x5542, 0x5545, 0x5547, 0x5548, 0x554B, + 0x554C, 0x554D, 0x554E, 0x554F, 0x5551, 0x5552, 0x5553, 0x5554, + 0x5557, 0x5558, 0x5559, 0x555A, 0x555B, 0x555D, 0x555E, 0x555F, + 0x5560, 0x5562, 0x5563, 0x5568, 0x5569, 0x556B, 0x556F, 0x5570, + 0x5571, 0x5572, 0x5573, 0x5574, 0x5579, 0x557A, 0x557D, 0x557F, + 0x5585, 0x5586, 0x558C, 0x558D, 0x558E, 0x5590, 0x5592, 0x5593, + 0x5595, 0x5596, 0x5597, 0x559A, 0x559B, 0x559E, 0x55A0, 0x55A1, + 0x55A2, 0x55A3, 0x55A4, 0x55A5, 0x55A6, 0x55A8, 0x55A9, 0x55AA, + 0x55AB, 0x55AC, 0x55AD, 0x55AE, 0x55AF, 0x55B0, 0x55B2, 0x55B4, + 0x55B6, 0x55B8, 0x55BA, 0x55BC, 0x55BF, 0x55C0, 0x55C1, 0x55C2, + 0x55C3, 0x55C6, 0x55C7, 0x55C8, 0x55CA, 0x55CB, 0x55CE, 0x55CF, + 0x55D0, 0x55D5, 0x55D7, 0x55D8, 0x55D9, 0x55DA, 0x55DB, 0x55DE, + 0x55E0, 0x55E2, 0x55E7, 0x55E9, 0x55ED, 0x55EE, 0x55F0, 0x55F1, + 0x55F4, 0x55F6, 0x55F8, 0x55F9, 0x55FA, 0x55FB, 0x55FC, 0x55FF, + 0x5602, 0x5603, 0x5604, 0x5605, 0x5606, 0x5607, 0x560A, 0x560B, + 0x560D, 0x5610, 0x5611, 0x5612, 0x5613, 0x5614, 0x5615, 0x5616, + 0x5617, 0x5619, 0x561A, 0x561C, 0x561D, 0x5620, 0x5621, 0x5622, + 0x5625, 0x5626, 0x5628, 0x5629, 0x562A, 0x562B, 0x562E, 0x562F, + 0x5630, 0x5633, 0x5635, 0x5637, 0x5638, 0x563A, 0x563C, 0x563D, + 0x563E, 0x5640, 0x5641, 0x5642, 0x5643, 0x5644, 0x5645, 0x5646, + 0x5647, 0x5648, 0x5649, 0x564A, 0x564B, 0x564F, 0x5650, 0x5651, + 0x5652, 0x5653, 0x5655, 0x5656, 0x565A, 0x565B, 0x565D, 0x565E, + 0x565F, 0x5660, 0x5661, 0x5663, 0x5665, 0x5666, 0x5667, 0x566D, + 0x566E, 0x566F, 0x5670, 0x5672, 0x5673, 0x5674, 0x5675, 0x5677, + 0x5678, 0x5679, 0x567A, 0x567D, 0x567E, 0x567F, 0x5680, 0x5681, + 0x5682, 0x5683, 0x5684, 0x5687, 0x5688, 0x5689, 0x568A, 0x568B, + 0x568C, 0x568D, 0x5690, 0x5691, 0x5692, 0x5694, 0x5695, 0x5696, + 0x5697, 0x5698, 0x5699, 0x569A, 0x569B, 0x569C, 0x569D, 0x569E, + 0x569F, 0x56A0, 0x56A1, 0x56A2, 0x56A4, 0x56A5, 0x56A6, 0x56A7, + 0x56A8, 0x56A9, 0x56AA, 0x56AB, 0x56AC, 0x56AD, 0x56AE, 0x56B0, + 0x56B1, 0x56B2, 0x56B3, 0x56B4, 0x56B5, 0x56B6, 0x56B8, 0x56B9, + 0x56BA, 0x56BB, 0x56BD, 0x56BE, 0x56BF, 0x56C0, 0x56C1, 0x56C2, +plane 06 +at 0x00 + 0x56C3, 0x56C4, 0x56C5, 0x56C6, 0x56C7, 0x56C8, 0x56C9, 0x56CB, + 0x56CC, 0x56CD, 0x56CE, 0x56CF, 0x56D0, 0x56D1, 0x56D2, 0x56D3, + 0x56D5, 0x56D6, 0x56D8, 0x56D9, 0x56DC, 0x56E3, 0x56E5, 0x56E6, + 0x56E7, 0x56E8, 0x56E9, 0x56EA, 0x56EC, 0x56EE, 0x56EF, 0x56F2, + 0x56F3, 0x56F6, 0x56F7, 0x56F8, 0x56FB, 0x56FC, 0x5700, 0x5701, + 0x5702, 0x5705, 0x5707, 0x570B, 0x570C, 0x570D, 0x570E, 0x570F, + 0x5710, 0x5711, 0x5712, 0x5713, 0x5714, 0x5715, 0x5716, 0x5717, + 0x5718, 0x5719, 0x571A, 0x571B, 0x571D, 0x571E, 0x5720, 0x5721, + 0x5722, 0x5724, 0x5725, 0x5726, 0x5727, 0x572B, 0x5731, 0x5732, + 0x5734, 0x5735, 0x5736, 0x5737, 0x5738, 0x573C, 0x573D, 0x573F, + 0x5741, 0x5743, 0x5744, 0x5745, 0x5746, 0x5748, 0x5749, 0x574B, + 0x5752, 0x5753, 0x5754, 0x5755, 0x5756, 0x5758, 0x5759, 0x5762, + 0x5763, 0x5765, 0x5767, 0x576C, 0x576E, 0x5770, 0x5771, 0x5772, + 0x5774, 0x5775, 0x5778, 0x5779, 0x577A, 0x577D, 0x577E, 0x577F, + 0x5780, 0x5781, 0x5787, 0x5788, 0x5789, 0x578A, 0x578D, 0x578E, + 0x578F, 0x5790, 0x5791, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, + 0x5799, 0x579A, 0x579C, 0x579D, 0x579E, 0x579F, 0x57A5, 0x57A8, + 0x57AA, 0x57AC, 0x57AF, 0x57B0, 0x57B1, 0x57B3, 0x57B5, 0x57B6, + 0x57B7, 0x57B9, 0x57BA, 0x57BB, 0x57BC, 0x57BD, 0x57BE, 0x57BF, + 0x57C0, 0x57C1, 0x57C4, 0x57C5, 0x57C6, 0x57C7, 0x57C8, 0x57C9, + 0x57CA, 0x57CC, 0x57CD, 0x57D0, 0x57D1, 0x57D3, 0x57D6, 0x57D7, + 0x57DB, 0x57DC, 0x57DE, 0x57E1, 0x57E2, 0x57E3, 0x57E5, 0x57E6, + 0x57E7, 0x57E8, 0x57E9, 0x57EA, 0x57EB, 0x57EC, 0x57EE, 0x57F0, + 0x57F1, 0x57F2, 0x57F3, 0x57F5, 0x57F6, 0x57F7, 0x57FB, 0x57FC, + 0x57FE, 0x57FF, 0x5801, 0x5803, 0x5804, 0x5805, 0x5808, 0x5809, + 0x580A, 0x580C, 0x580E, 0x580F, 0x5810, 0x5812, 0x5813, 0x5814, + 0x5816, 0x5817, 0x5818, 0x581A, 0x581B, 0x581C, 0x581D, 0x581F, + 0x5822, 0x5823, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582B, + 0x582C, 0x582D, 0x582E, 0x582F, 0x5831, 0x5832, 0x5833, 0x5834, + 0x5836, 0x5837, 0x5838, 0x5839, 0x583A, 0x583B, 0x583C, 0x583D, + 0x583E, 0x583F, 0x5840, 0x5841, 0x5842, 0x5843, 0x5845, 0x5846, + 0x5847, 0x5848, 0x5849, 0x584A, 0x584B, 0x584E, 0x584F, 0x5850, +plane 07 +at 0x00 + 0x5852, 0x5853, 0x5855, 0x5856, 0x5857, 0x5859, 0x585A, 0x585B, + 0x585C, 0x585D, 0x585F, 0x5860, 0x5861, 0x5862, 0x5863, 0x5864, + 0x5866, 0x5867, 0x5868, 0x5869, 0x586A, 0x586D, 0x586E, 0x586F, + 0x5870, 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877, + 0x5878, 0x5879, 0x587A, 0x587B, 0x587C, 0x587D, 0x587F, 0x5882, + 0x5884, 0x5886, 0x5887, 0x5888, 0x588A, 0x588B, 0x588C, 0x588D, + 0x588E, 0x588F, 0x5890, 0x5891, 0x5894, 0x5895, 0x5896, 0x5897, + 0x5898, 0x589B, 0x589C, 0x589D, 0x58A0, 0x58A1, 0x58A2, 0x58A3, + 0x58A4, 0x58A5, 0x58A6, 0x58A7, 0x58AA, 0x58AB, 0x58AC, 0x58AD, + 0x58AE, 0x58AF, 0x58B0, 0x58B1, 0x58B2, 0x58B3, 0x58B4, 0x58B5, + 0x58B6, 0x58B7, 0x58B8, 0x58B9, 0x58BA, 0x58BB, 0x58BD, 0x58BE, + 0x58BF, 0x58C0, 0x58C2, 0x58C3, 0x58C4, 0x58C6, 0x58C7, 0x58C8, + 0x58C9, 0x58CA, 0x58CB, 0x58CC, 0x58CD, 0x58CE, 0x58CF, 0x58D0, + 0x58D2, 0x58D3, 0x58D4, 0x58D6, 0x58D7, 0x58D8, 0x58D9, 0x58DA, + 0x58DB, 0x58DC, 0x58DD, 0x58DE, 0x58DF, 0x58E0, 0x58E1, 0x58E2, + 0x58E3, 0x58E5, 0x58E6, 0x58E7, 0x58E8, 0x58E9, 0x58EA, 0x58ED, + 0x58EF, 0x58F1, 0x58F2, 0x58F4, 0x58F5, 0x58F7, 0x58F8, 0x58FA, + 0x58FB, 0x58FC, 0x58FD, 0x58FE, 0x58FF, 0x5900, 0x5901, 0x5903, + 0x5905, 0x5906, 0x5908, 0x5909, 0x590A, 0x590B, 0x590C, 0x590E, + 0x5910, 0x5911, 0x5912, 0x5913, 0x5917, 0x5918, 0x591B, 0x591D, + 0x591E, 0x5920, 0x5921, 0x5922, 0x5923, 0x5926, 0x5928, 0x592C, + 0x5930, 0x5932, 0x5933, 0x5935, 0x5936, 0x593B, 0x593D, 0x593E, + 0x593F, 0x5940, 0x5943, 0x5945, 0x5946, 0x594A, 0x594C, 0x594D, + 0x5950, 0x5952, 0x5953, 0x5959, 0x595B, 0x595C, 0x595D, 0x595E, + 0x595F, 0x5961, 0x5963, 0x5964, 0x5966, 0x5967, 0x5968, 0x5969, + 0x596A, 0x596B, 0x596C, 0x596D, 0x596E, 0x596F, 0x5970, 0x5971, + 0x5972, 0x5975, 0x5977, 0x597A, 0x597B, 0x597C, 0x597E, 0x597F, + 0x5980, 0x5985, 0x5989, 0x598B, 0x598C, 0x598E, 0x598F, 0x5990, + 0x5991, 0x5994, 0x5995, 0x5998, 0x599A, 0x599B, 0x599C, 0x599D, + 0x599F, 0x59A0, 0x59A1, 0x59A2, 0x59A6, 0x59A7, 0x59AC, 0x59AD, + 0x59B0, 0x59B1, 0x59B3, 0x59B4, 0x59B5, 0x59B6, 0x59B7, 0x59B8, + 0x59BA, 0x59BC, 0x59BD, 0x59BF, 0x59C0, 0x59C1, 0x59C2, 0x59C3, +plane 08 +at 0x00 + 0x59C4, 0x59C5, 0x59C7, 0x59C8, 0x59C9, 0x59CC, 0x59CD, 0x59CE, + 0x59CF, 0x59D5, 0x59D6, 0x59D9, 0x59DB, 0x59DE, 0x59DF, 0x59E0, + 0x59E1, 0x59E2, 0x59E4, 0x59E6, 0x59E7, 0x59E9, 0x59EA, 0x59EB, + 0x59ED, 0x59EE, 0x59EF, 0x59F0, 0x59F1, 0x59F2, 0x59F3, 0x59F4, + 0x59F5, 0x59F6, 0x59F7, 0x59F8, 0x59FA, 0x59FC, 0x59FD, 0x59FE, + 0x5A00, 0x5A02, 0x5A0A, 0x5A0B, 0x5A0D, 0x5A0E, 0x5A0F, 0x5A10, + 0x5A12, 0x5A14, 0x5A15, 0x5A16, 0x5A17, 0x5A19, 0x5A1A, 0x5A1B, + 0x5A1D, 0x5A1E, 0x5A21, 0x5A22, 0x5A24, 0x5A26, 0x5A27, 0x5A28, + 0x5A2A, 0x5A2B, 0x5A2C, 0x5A2D, 0x5A2E, 0x5A2F, 0x5A30, 0x5A33, + 0x5A35, 0x5A37, 0x5A38, 0x5A39, 0x5A3A, 0x5A3B, 0x5A3D, 0x5A3E, + 0x5A3F, 0x5A41, 0x5A42, 0x5A43, 0x5A44, 0x5A45, 0x5A47, 0x5A48, + 0x5A4B, 0x5A4C, 0x5A4D, 0x5A4E, 0x5A4F, 0x5A50, 0x5A51, 0x5A52, + 0x5A53, 0x5A54, 0x5A56, 0x5A57, 0x5A58, 0x5A59, 0x5A5B, 0x5A5C, + 0x5A5D, 0x5A5E, 0x5A5F, 0x5A60, 0x5A61, 0x5A63, 0x5A64, 0x5A65, + 0x5A66, 0x5A68, 0x5A69, 0x5A6B, 0x5A6C, 0x5A6D, 0x5A6E, 0x5A6F, + 0x5A70, 0x5A71, 0x5A72, 0x5A73, 0x5A78, 0x5A79, 0x5A7B, 0x5A7C, + 0x5A7D, 0x5A7E, 0x5A80, 0x5A81, 0x5A82, 0x5A83, 0x5A84, 0x5A85, + 0x5A86, 0x5A87, 0x5A88, 0x5A89, 0x5A8A, 0x5A8B, 0x5A8C, 0x5A8D, + 0x5A8E, 0x5A8F, 0x5A90, 0x5A91, 0x5A93, 0x5A94, 0x5A95, 0x5A96, + 0x5A97, 0x5A98, 0x5A99, 0x5A9C, 0x5A9D, 0x5A9E, 0x5A9F, 0x5AA0, + 0x5AA1, 0x5AA2, 0x5AA3, 0x5AA4, 0x5AA5, 0x5AA6, 0x5AA7, 0x5AA8, + 0x5AA9, 0x5AAB, 0x5AAC, 0x5AAD, 0x5AAE, 0x5AAF, 0x5AB0, 0x5AB1, + 0x5AB4, 0x5AB6, 0x5AB7, 0x5AB9, 0x5ABA, 0x5ABB, 0x5ABC, 0x5ABD, + 0x5ABF, 0x5AC0, 0x5AC3, 0x5AC4, 0x5AC5, 0x5AC6, 0x5AC7, 0x5AC8, + 0x5ACA, 0x5ACB, 0x5ACD, 0x5ACE, 0x5ACF, 0x5AD0, 0x5AD1, 0x5AD3, + 0x5AD5, 0x5AD7, 0x5AD9, 0x5ADA, 0x5ADB, 0x5ADD, 0x5ADE, 0x5ADF, + 0x5AE2, 0x5AE4, 0x5AE5, 0x5AE7, 0x5AE8, 0x5AEA, 0x5AEC, 0x5AED, + 0x5AEE, 0x5AEF, 0x5AF0, 0x5AF2, 0x5AF3, 0x5AF4, 0x5AF5, 0x5AF6, + 0x5AF7, 0x5AF8, 0x5AF9, 0x5AFA, 0x5AFB, 0x5AFC, 0x5AFD, 0x5AFE, + 0x5AFF, 0x5B00, 0x5B01, 0x5B02, 0x5B03, 0x5B04, 0x5B05, 0x5B06, + 0x5B07, 0x5B08, 0x5B0A, 0x5B0B, 0x5B0C, 0x5B0D, 0x5B0E, 0x5B0F, + 0x5B10, 0x5B11, 0x5B12, 0x5B13, 0x5B14, 0x5B15, 0x5B18, 0x5B19, +plane 09 +at 0x00 + 0x5B1A, 0x5B1B, 0x5B1C, 0x5B1D, 0x5B1E, 0x5B1F, 0x5B20, 0x5B21, + 0x5B22, 0x5B23, 0x5B24, 0x5B25, 0x5B26, 0x5B27, 0x5B28, 0x5B29, + 0x5B2A, 0x5B2B, 0x5B2C, 0x5B2D, 0x5B2E, 0x5B2F, 0x5B30, 0x5B31, + 0x5B33, 0x5B35, 0x5B36, 0x5B38, 0x5B39, 0x5B3A, 0x5B3B, 0x5B3C, + 0x5B3D, 0x5B3E, 0x5B3F, 0x5B41, 0x5B42, 0x5B43, 0x5B44, 0x5B45, + 0x5B46, 0x5B47, 0x5B48, 0x5B49, 0x5B4A, 0x5B4B, 0x5B4C, 0x5B4D, + 0x5B4E, 0x5B4F, 0x5B52, 0x5B56, 0x5B5E, 0x5B60, 0x5B61, 0x5B67, + 0x5B68, 0x5B6B, 0x5B6D, 0x5B6E, 0x5B6F, 0x5B72, 0x5B74, 0x5B76, + 0x5B77, 0x5B78, 0x5B79, 0x5B7B, 0x5B7C, 0x5B7E, 0x5B7F, 0x5B82, + 0x5B86, 0x5B8A, 0x5B8D, 0x5B8E, 0x5B90, 0x5B91, 0x5B92, 0x5B94, + 0x5B96, 0x5B9F, 0x5BA7, 0x5BA8, 0x5BA9, 0x5BAC, 0x5BAD, 0x5BAE, + 0x5BAF, 0x5BB1, 0x5BB2, 0x5BB7, 0x5BBA, 0x5BBB, 0x5BBC, 0x5BC0, + 0x5BC1, 0x5BC3, 0x5BC8, 0x5BC9, 0x5BCA, 0x5BCB, 0x5BCD, 0x5BCE, + 0x5BCF, 0x5BD1, 0x5BD4, 0x5BD5, 0x5BD6, 0x5BD7, 0x5BD8, 0x5BD9, + 0x5BDA, 0x5BDB, 0x5BDC, 0x5BE0, 0x5BE2, 0x5BE3, 0x5BE6, 0x5BE7, + 0x5BE9, 0x5BEA, 0x5BEB, 0x5BEC, 0x5BED, 0x5BEF, 0x5BF1, 0x5BF2, + 0x5BF3, 0x5BF4, 0x5BF5, 0x5BF6, 0x5BF7, 0x5BFD, 0x5BFE, 0x5C00, + 0x5C02, 0x5C03, 0x5C05, 0x5C07, 0x5C08, 0x5C0B, 0x5C0C, 0x5C0D, + 0x5C0E, 0x5C10, 0x5C12, 0x5C13, 0x5C17, 0x5C19, 0x5C1B, 0x5C1E, + 0x5C1F, 0x5C20, 0x5C21, 0x5C23, 0x5C26, 0x5C28, 0x5C29, 0x5C2A, + 0x5C2B, 0x5C2D, 0x5C2E, 0x5C2F, 0x5C30, 0x5C32, 0x5C33, 0x5C35, + 0x5C36, 0x5C37, 0x5C43, 0x5C44, 0x5C46, 0x5C47, 0x5C4C, 0x5C4D, + 0x5C52, 0x5C53, 0x5C54, 0x5C56, 0x5C57, 0x5C58, 0x5C5A, 0x5C5B, + 0x5C5C, 0x5C5D, 0x5C5F, 0x5C62, 0x5C64, 0x5C67, 0x5C68, 0x5C69, + 0x5C6A, 0x5C6B, 0x5C6C, 0x5C6D, 0x5C70, 0x5C72, 0x5C73, 0x5C74, + 0x5C75, 0x5C76, 0x5C77, 0x5C78, 0x5C7B, 0x5C7C, 0x5C7D, 0x5C7E, + 0x5C80, 0x5C83, 0x5C84, 0x5C85, 0x5C86, 0x5C87, 0x5C89, 0x5C8A, + 0x5C8B, 0x5C8E, 0x5C8F, 0x5C92, 0x5C93, 0x5C95, 0x5C9D, 0x5C9E, + 0x5C9F, 0x5CA0, 0x5CA1, 0x5CA4, 0x5CA5, 0x5CA6, 0x5CA7, 0x5CA8, + 0x5CAA, 0x5CAE, 0x5CAF, 0x5CB0, 0x5CB2, 0x5CB4, 0x5CB6, 0x5CB9, + 0x5CBA, 0x5CBB, 0x5CBC, 0x5CBE, 0x5CC0, 0x5CC2, 0x5CC3, 0x5CC5, + 0x5CC6, 0x5CC7, 0x5CC8, 0x5CC9, 0x5CCA, 0x5CCC, 0x5CCD, 0x5CCE, +plane 10 +at 0x00 + 0x5CCF, 0x5CD0, 0x5CD1, 0x5CD3, 0x5CD4, 0x5CD5, 0x5CD6, 0x5CD7, + 0x5CD8, 0x5CDA, 0x5CDB, 0x5CDC, 0x5CDD, 0x5CDE, 0x5CDF, 0x5CE0, + 0x5CE2, 0x5CE3, 0x5CE7, 0x5CE9, 0x5CEB, 0x5CEC, 0x5CEE, 0x5CEF, + 0x5CF1, 0x5CF2, 0x5CF3, 0x5CF4, 0x5CF5, 0x5CF6, 0x5CF7, 0x5CF8, + 0x5CF9, 0x5CFA, 0x5CFC, 0x5CFD, 0x5CFE, 0x5CFF, 0x5D00, 0x5D01, + 0x5D04, 0x5D05, 0x5D08, 0x5D09, 0x5D0A, 0x5D0B, 0x5D0C, 0x5D0D, + 0x5D0F, 0x5D10, 0x5D11, 0x5D12, 0x5D13, 0x5D15, 0x5D17, 0x5D18, + 0x5D19, 0x5D1A, 0x5D1C, 0x5D1D, 0x5D1F, 0x5D20, 0x5D21, 0x5D22, + 0x5D23, 0x5D25, 0x5D28, 0x5D2A, 0x5D2B, 0x5D2C, 0x5D2F, 0x5D30, + 0x5D31, 0x5D32, 0x5D33, 0x5D35, 0x5D36, 0x5D37, 0x5D38, 0x5D39, + 0x5D3A, 0x5D3B, 0x5D3C, 0x5D3F, 0x5D40, 0x5D41, 0x5D42, 0x5D43, + 0x5D44, 0x5D45, 0x5D46, 0x5D48, 0x5D49, 0x5D4D, 0x5D4E, 0x5D4F, + 0x5D50, 0x5D51, 0x5D52, 0x5D53, 0x5D54, 0x5D55, 0x5D56, 0x5D57, + 0x5D59, 0x5D5A, 0x5D5C, 0x5D5E, 0x5D5F, 0x5D60, 0x5D61, 0x5D62, + 0x5D63, 0x5D64, 0x5D65, 0x5D66, 0x5D67, 0x5D68, 0x5D6A, 0x5D6D, + 0x5D6E, 0x5D70, 0x5D71, 0x5D72, 0x5D73, 0x5D75, 0x5D76, 0x5D77, + 0x5D78, 0x5D79, 0x5D7A, 0x5D7B, 0x5D7C, 0x5D7D, 0x5D7E, 0x5D7F, + 0x5D80, 0x5D81, 0x5D83, 0x5D84, 0x5D85, 0x5D86, 0x5D87, 0x5D88, + 0x5D89, 0x5D8A, 0x5D8B, 0x5D8C, 0x5D8D, 0x5D8E, 0x5D8F, 0x5D90, + 0x5D91, 0x5D92, 0x5D93, 0x5D94, 0x5D95, 0x5D96, 0x5D97, 0x5D98, + 0x5D9A, 0x5D9B, 0x5D9C, 0x5D9E, 0x5D9F, 0x5DA0, 0x5DA1, 0x5DA2, + 0x5DA3, 0x5DA4, 0x5DA5, 0x5DA6, 0x5DA7, 0x5DA8, 0x5DA9, 0x5DAA, + 0x5DAB, 0x5DAC, 0x5DAD, 0x5DAE, 0x5DAF, 0x5DB0, 0x5DB1, 0x5DB2, + 0x5DB3, 0x5DB4, 0x5DB5, 0x5DB6, 0x5DB8, 0x5DB9, 0x5DBA, 0x5DBB, + 0x5DBC, 0x5DBD, 0x5DBE, 0x5DBF, 0x5DC0, 0x5DC1, 0x5DC2, 0x5DC3, + 0x5DC4, 0x5DC6, 0x5DC7, 0x5DC8, 0x5DC9, 0x5DCA, 0x5DCB, 0x5DCC, + 0x5DCE, 0x5DCF, 0x5DD0, 0x5DD1, 0x5DD2, 0x5DD3, 0x5DD4, 0x5DD5, + 0x5DD6, 0x5DD7, 0x5DD8, 0x5DD9, 0x5DDA, 0x5DDC, 0x5DDF, 0x5DE0, + 0x5DE3, 0x5DE4, 0x5DEA, 0x5DEC, 0x5DED, 0x5DF0, 0x5DF5, 0x5DF6, + 0x5DF8, 0x5DF9, 0x5DFA, 0x5DFB, 0x5DFC, 0x5DFF, 0x5E00, 0x5E04, + 0x5E07, 0x5E09, 0x5E0A, 0x5E0B, 0x5E0D, 0x5E0E, 0x5E12, 0x5E13, + 0x5E17, 0x5E1E, 0x5E1F, 0x5E20, 0x5E21, 0x5E22, 0x5E23, 0x5E24, +plane 11 +at 0x00 + 0x5E25, 0x5E28, 0x5E29, 0x5E2A, 0x5E2B, 0x5E2C, 0x5E2F, 0x5E30, + 0x5E32, 0x5E33, 0x5E34, 0x5E35, 0x5E36, 0x5E39, 0x5E3A, 0x5E3E, + 0x5E3F, 0x5E40, 0x5E41, 0x5E43, 0x5E46, 0x5E47, 0x5E48, 0x5E49, + 0x5E4A, 0x5E4B, 0x5E4D, 0x5E4E, 0x5E4F, 0x5E50, 0x5E51, 0x5E52, + 0x5E53, 0x5E56, 0x5E57, 0x5E58, 0x5E59, 0x5E5A, 0x5E5C, 0x5E5D, + 0x5E5F, 0x5E60, 0x5E63, 0x5E64, 0x5E65, 0x5E66, 0x5E67, 0x5E68, + 0x5E69, 0x5E6A, 0x5E6B, 0x5E6C, 0x5E6D, 0x5E6E, 0x5E6F, 0x5E70, + 0x5E71, 0x5E75, 0x5E77, 0x5E79, 0x5E7E, 0x5E81, 0x5E82, 0x5E83, + 0x5E85, 0x5E88, 0x5E89, 0x5E8C, 0x5E8D, 0x5E8E, 0x5E92, 0x5E98, + 0x5E9B, 0x5E9D, 0x5EA1, 0x5EA2, 0x5EA3, 0x5EA4, 0x5EA8, 0x5EA9, + 0x5EAA, 0x5EAB, 0x5EAC, 0x5EAE, 0x5EAF, 0x5EB0, 0x5EB1, 0x5EB2, + 0x5EB4, 0x5EBA, 0x5EBB, 0x5EBC, 0x5EBD, 0x5EBF, 0x5EC0, 0x5EC1, + 0x5EC2, 0x5EC3, 0x5EC4, 0x5EC5, 0x5EC6, 0x5EC7, 0x5EC8, 0x5ECB, + 0x5ECC, 0x5ECD, 0x5ECE, 0x5ECF, 0x5ED0, 0x5ED4, 0x5ED5, 0x5ED7, + 0x5ED8, 0x5ED9, 0x5EDA, 0x5EDC, 0x5EDD, 0x5EDE, 0x5EDF, 0x5EE0, + 0x5EE1, 0x5EE2, 0x5EE3, 0x5EE4, 0x5EE5, 0x5EE6, 0x5EE7, 0x5EE9, + 0x5EEB, 0x5EEC, 0x5EED, 0x5EEE, 0x5EEF, 0x5EF0, 0x5EF1, 0x5EF2, + 0x5EF3, 0x5EF5, 0x5EF8, 0x5EF9, 0x5EFB, 0x5EFC, 0x5EFD, 0x5F05, + 0x5F06, 0x5F07, 0x5F09, 0x5F0C, 0x5F0D, 0x5F0E, 0x5F10, 0x5F12, + 0x5F14, 0x5F16, 0x5F19, 0x5F1A, 0x5F1C, 0x5F1D, 0x5F1E, 0x5F21, + 0x5F22, 0x5F23, 0x5F24, 0x5F28, 0x5F2B, 0x5F2C, 0x5F2E, 0x5F30, + 0x5F32, 0x5F33, 0x5F34, 0x5F35, 0x5F36, 0x5F37, 0x5F38, 0x5F3B, + 0x5F3D, 0x5F3E, 0x5F3F, 0x5F41, 0x5F42, 0x5F43, 0x5F44, 0x5F45, + 0x5F46, 0x5F47, 0x5F48, 0x5F49, 0x5F4A, 0x5F4B, 0x5F4C, 0x5F4D, + 0x5F4E, 0x5F4F, 0x5F51, 0x5F54, 0x5F59, 0x5F5A, 0x5F5B, 0x5F5C, + 0x5F5E, 0x5F5F, 0x5F60, 0x5F63, 0x5F65, 0x5F67, 0x5F68, 0x5F6B, + 0x5F6E, 0x5F6F, 0x5F72, 0x5F74, 0x5F75, 0x5F76, 0x5F78, 0x5F7A, + 0x5F7D, 0x5F7E, 0x5F7F, 0x5F83, 0x5F86, 0x5F8D, 0x5F8E, 0x5F8F, + 0x5F91, 0x5F93, 0x5F94, 0x5F96, 0x5F9A, 0x5F9B, 0x5F9D, 0x5F9E, + 0x5F9F, 0x5FA0, 0x5FA2, 0x5FA3, 0x5FA4, 0x5FA5, 0x5FA6, 0x5FA7, + 0x5FA9, 0x5FAB, 0x5FAC, 0x5FAF, 0x5FB0, 0x5FB1, 0x5FB2, 0x5FB3, + 0x5FB4, 0x5FB6, 0x5FB8, 0x5FB9, 0x5FBA, 0x5FBB, 0x5FBE, 0x5FBF, +plane 12 +at 0x00 + 0x5FC0, 0x5FC1, 0x5FC2, 0x5FC7, 0x5FC8, 0x5FCA, 0x5FCB, 0x5FCE, + 0x5FD3, 0x5FD4, 0x5FD5, 0x5FDA, 0x5FDB, 0x5FDC, 0x5FDE, 0x5FDF, + 0x5FE2, 0x5FE3, 0x5FE5, 0x5FE6, 0x5FE8, 0x5FE9, 0x5FEC, 0x5FEF, + 0x5FF0, 0x5FF2, 0x5FF3, 0x5FF4, 0x5FF6, 0x5FF7, 0x5FF9, 0x5FFA, + 0x5FFC, 0x6007, 0x6008, 0x6009, 0x600B, 0x600C, 0x6010, 0x6011, + 0x6013, 0x6017, 0x6018, 0x601A, 0x601E, 0x601F, 0x6022, 0x6023, + 0x6024, 0x602C, 0x602D, 0x602E, 0x6030, 0x6031, 0x6032, 0x6033, + 0x6034, 0x6036, 0x6037, 0x6038, 0x6039, 0x603A, 0x603D, 0x603E, + 0x6040, 0x6044, 0x6045, 0x6046, 0x6047, 0x6048, 0x6049, 0x604A, + 0x604C, 0x604E, 0x604F, 0x6051, 0x6053, 0x6054, 0x6056, 0x6057, + 0x6058, 0x605B, 0x605C, 0x605E, 0x605F, 0x6060, 0x6061, 0x6065, + 0x6066, 0x606E, 0x6071, 0x6072, 0x6074, 0x6075, 0x6077, 0x607E, + 0x6080, 0x6081, 0x6082, 0x6085, 0x6086, 0x6087, 0x6088, 0x608A, + 0x608B, 0x608E, 0x608F, 0x6090, 0x6091, 0x6093, 0x6095, 0x6097, + 0x6098, 0x6099, 0x609C, 0x609E, 0x60A1, 0x60A2, 0x60A4, 0x60A5, + 0x60A7, 0x60A9, 0x60AA, 0x60AE, 0x60B0, 0x60B3, 0x60B5, 0x60B6, + 0x60B7, 0x60B9, 0x60BA, 0x60BD, 0x60BE, 0x60BF, 0x60C0, 0x60C1, + 0x60C2, 0x60C3, 0x60C4, 0x60C7, 0x60C8, 0x60C9, 0x60CC, 0x60CD, + 0x60CE, 0x60CF, 0x60D0, 0x60D2, 0x60D3, 0x60D4, 0x60D6, 0x60D7, + 0x60D9, 0x60DB, 0x60DE, 0x60E1, 0x60E2, 0x60E3, 0x60E4, 0x60E5, + 0x60EA, 0x60F1, 0x60F2, 0x60F5, 0x60F7, 0x60F8, 0x60FB, 0x60FC, + 0x60FD, 0x60FE, 0x60FF, 0x6102, 0x6103, 0x6104, 0x6105, 0x6107, + 0x610A, 0x610B, 0x610C, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, + 0x6116, 0x6117, 0x6118, 0x6119, 0x611B, 0x611C, 0x611D, 0x611E, + 0x6121, 0x6122, 0x6125, 0x6128, 0x6129, 0x612A, 0x612C, 0x612D, + 0x612E, 0x612F, 0x6130, 0x6131, 0x6132, 0x6133, 0x6134, 0x6135, + 0x6136, 0x6137, 0x6138, 0x6139, 0x613A, 0x613B, 0x613C, 0x613D, + 0x613E, 0x6140, 0x6141, 0x6142, 0x6143, 0x6144, 0x6145, 0x6146, + 0x6147, 0x6149, 0x614B, 0x614D, 0x614F, 0x6150, 0x6152, 0x6153, + 0x6154, 0x6156, 0x6157, 0x6158, 0x6159, 0x615A, 0x615B, 0x615C, + 0x615E, 0x615F, 0x6160, 0x6161, 0x6163, 0x6164, 0x6165, 0x6166, + 0x6169, 0x616A, 0x616B, 0x616C, 0x616D, 0x616E, 0x616F, 0x6171, +plane 13 +at 0x00 + 0x6172, 0x6173, 0x6174, 0x6176, 0x6178, 0x6179, 0x617A, 0x617B, + 0x617C, 0x617D, 0x617E, 0x617F, 0x6180, 0x6181, 0x6182, 0x6183, + 0x6184, 0x6185, 0x6186, 0x6187, 0x6188, 0x6189, 0x618A, 0x618C, + 0x618D, 0x618F, 0x6190, 0x6191, 0x6192, 0x6193, 0x6195, 0x6196, + 0x6197, 0x6198, 0x6199, 0x619A, 0x619B, 0x619C, 0x619E, 0x619F, + 0x61A0, 0x61A1, 0x61A2, 0x61A3, 0x61A4, 0x61A5, 0x61A6, 0x61AA, + 0x61AB, 0x61AD, 0x61AE, 0x61AF, 0x61B0, 0x61B1, 0x61B2, 0x61B3, + 0x61B4, 0x61B5, 0x61B6, 0x61B8, 0x61B9, 0x61BA, 0x61BB, 0x61BC, + 0x61BD, 0x61BF, 0x61C0, 0x61C1, 0x61C3, 0x61C4, 0x61C5, 0x61C6, + 0x61C7, 0x61C9, 0x61CC, 0x61CD, 0x61CE, 0x61CF, 0x61D0, 0x61D3, + 0x61D5, 0x61D6, 0x61D7, 0x61D8, 0x61D9, 0x61DA, 0x61DB, 0x61DC, + 0x61DD, 0x61DE, 0x61DF, 0x61E0, 0x61E1, 0x61E2, 0x61E3, 0x61E4, + 0x61E5, 0x61E7, 0x61E8, 0x61E9, 0x61EA, 0x61EB, 0x61EC, 0x61ED, + 0x61EE, 0x61EF, 0x61F0, 0x61F1, 0x61F2, 0x61F3, 0x61F4, 0x61F6, + 0x61F7, 0x61F8, 0x61F9, 0x61FA, 0x61FB, 0x61FC, 0x61FD, 0x61FE, + 0x6200, 0x6201, 0x6202, 0x6203, 0x6204, 0x6205, 0x6207, 0x6209, + 0x6213, 0x6214, 0x6219, 0x621C, 0x621D, 0x621E, 0x6220, 0x6223, + 0x6226, 0x6227, 0x6228, 0x6229, 0x622B, 0x622D, 0x622F, 0x6230, + 0x6231, 0x6232, 0x6235, 0x6236, 0x6238, 0x6239, 0x623A, 0x623B, + 0x623C, 0x6242, 0x6244, 0x6245, 0x6246, 0x624A, 0x624F, 0x6250, + 0x6255, 0x6256, 0x6257, 0x6259, 0x625A, 0x625C, 0x625D, 0x625E, + 0x625F, 0x6260, 0x6261, 0x6262, 0x6264, 0x6265, 0x6268, 0x6271, + 0x6272, 0x6274, 0x6275, 0x6277, 0x6278, 0x627A, 0x627B, 0x627D, + 0x6281, 0x6282, 0x6283, 0x6285, 0x6286, 0x6287, 0x6288, 0x628B, + 0x628C, 0x628D, 0x628E, 0x628F, 0x6290, 0x6294, 0x6299, 0x629C, + 0x629D, 0x629E, 0x62A3, 0x62A6, 0x62A7, 0x62A9, 0x62AA, 0x62AD, + 0x62AE, 0x62AF, 0x62B0, 0x62B2, 0x62B3, 0x62B4, 0x62B6, 0x62B7, + 0x62B8, 0x62BA, 0x62BE, 0x62C0, 0x62C1, 0x62C3, 0x62CB, 0x62CF, + 0x62D1, 0x62D5, 0x62DD, 0x62DE, 0x62E0, 0x62E1, 0x62E4, 0x62EA, + 0x62EB, 0x62F0, 0x62F2, 0x62F5, 0x62F8, 0x62F9, 0x62FA, 0x62FB, + 0x6300, 0x6303, 0x6304, 0x6305, 0x6306, 0x630A, 0x630B, 0x630C, + 0x630D, 0x630F, 0x6310, 0x6312, 0x6313, 0x6314, 0x6315, 0x6317, +plane 14 +at 0x00 + 0x6318, 0x6319, 0x631C, 0x6326, 0x6327, 0x6329, 0x632C, 0x632D, + 0x632E, 0x6330, 0x6331, 0x6333, 0x6334, 0x6335, 0x6336, 0x6337, + 0x6338, 0x633B, 0x633C, 0x633E, 0x633F, 0x6340, 0x6341, 0x6344, + 0x6347, 0x6348, 0x634A, 0x6351, 0x6352, 0x6353, 0x6354, 0x6356, + 0x6357, 0x6358, 0x6359, 0x635A, 0x635B, 0x635C, 0x635D, 0x6360, + 0x6364, 0x6365, 0x6366, 0x6368, 0x636A, 0x636B, 0x636C, 0x636F, + 0x6370, 0x6372, 0x6373, 0x6374, 0x6375, 0x6378, 0x6379, 0x637C, + 0x637D, 0x637E, 0x637F, 0x6381, 0x6383, 0x6384, 0x6385, 0x6386, + 0x638B, 0x638D, 0x6391, 0x6393, 0x6394, 0x6395, 0x6397, 0x6399, + 0x639A, 0x639B, 0x639C, 0x639D, 0x639E, 0x639F, 0x63A1, 0x63A4, + 0x63A6, 0x63AB, 0x63AF, 0x63B1, 0x63B2, 0x63B5, 0x63B6, 0x63B9, + 0x63BB, 0x63BD, 0x63BF, 0x63C0, 0x63C1, 0x63C2, 0x63C3, 0x63C5, + 0x63C7, 0x63C8, 0x63CA, 0x63CB, 0x63CC, 0x63D1, 0x63D3, 0x63D4, + 0x63D5, 0x63D7, 0x63D8, 0x63D9, 0x63DA, 0x63DB, 0x63DC, 0x63DD, + 0x63DF, 0x63E2, 0x63E4, 0x63E5, 0x63E6, 0x63E7, 0x63E8, 0x63EB, + 0x63EC, 0x63EE, 0x63EF, 0x63F0, 0x63F1, 0x63F3, 0x63F5, 0x63F7, + 0x63F9, 0x63FA, 0x63FB, 0x63FC, 0x63FE, 0x6403, 0x6404, 0x6406, + 0x6407, 0x6408, 0x6409, 0x640A, 0x640D, 0x640E, 0x6411, 0x6412, + 0x6415, 0x6416, 0x6417, 0x6418, 0x6419, 0x641A, 0x641D, 0x641F, + 0x6422, 0x6423, 0x6424, 0x6425, 0x6427, 0x6428, 0x6429, 0x642B, + 0x642E, 0x642F, 0x6430, 0x6431, 0x6432, 0x6433, 0x6435, 0x6436, + 0x6437, 0x6438, 0x6439, 0x643B, 0x643C, 0x643E, 0x6440, 0x6442, + 0x6443, 0x6449, 0x644B, 0x644C, 0x644D, 0x644E, 0x644F, 0x6450, + 0x6451, 0x6453, 0x6455, 0x6456, 0x6457, 0x6459, 0x645A, 0x645B, + 0x645C, 0x645D, 0x645F, 0x6460, 0x6461, 0x6462, 0x6463, 0x6464, + 0x6465, 0x6466, 0x6468, 0x646A, 0x646B, 0x646C, 0x646E, 0x646F, + 0x6470, 0x6471, 0x6472, 0x6473, 0x6474, 0x6475, 0x6476, 0x6477, + 0x647B, 0x647C, 0x647D, 0x647E, 0x647F, 0x6480, 0x6481, 0x6483, + 0x6486, 0x6488, 0x6489, 0x648A, 0x648B, 0x648C, 0x648D, 0x648E, + 0x648F, 0x6490, 0x6493, 0x6494, 0x6497, 0x6498, 0x649A, 0x649B, + 0x649C, 0x649D, 0x649F, 0x64A0, 0x64A1, 0x64A2, 0x64A3, 0x64A5, + 0x64A6, 0x64A7, 0x64A8, 0x64AA, 0x64AB, 0x64AF, 0x64B1, 0x64B2, +plane 15 +at 0x00 + 0x64B3, 0x64B4, 0x64B6, 0x64B9, 0x64BB, 0x64BD, 0x64BE, 0x64BF, + 0x64C1, 0x64C3, 0x64C4, 0x64C6, 0x64C7, 0x64C8, 0x64C9, 0x64CA, + 0x64CB, 0x64CC, 0x64CF, 0x64D1, 0x64D3, 0x64D4, 0x64D5, 0x64D6, + 0x64D9, 0x64DA, 0x64DB, 0x64DC, 0x64DD, 0x64DF, 0x64E0, 0x64E1, + 0x64E3, 0x64E5, 0x64E7, 0x64E8, 0x64E9, 0x64EA, 0x64EB, 0x64EC, + 0x64ED, 0x64EE, 0x64EF, 0x64F0, 0x64F1, 0x64F2, 0x64F3, 0x64F4, + 0x64F5, 0x64F6, 0x64F7, 0x64F8, 0x64F9, 0x64FA, 0x64FB, 0x64FC, + 0x64FD, 0x64FE, 0x64FF, 0x6501, 0x6502, 0x6503, 0x6504, 0x6505, + 0x6506, 0x6507, 0x6508, 0x650A, 0x650B, 0x650C, 0x650D, 0x650E, + 0x650F, 0x6510, 0x6511, 0x6513, 0x6514, 0x6515, 0x6516, 0x6517, + 0x6519, 0x651A, 0x651B, 0x651C, 0x651D, 0x651E, 0x651F, 0x6520, + 0x6521, 0x6522, 0x6523, 0x6524, 0x6526, 0x6527, 0x6528, 0x6529, + 0x652A, 0x652C, 0x652D, 0x6530, 0x6531, 0x6532, 0x6533, 0x6537, + 0x653A, 0x653C, 0x653D, 0x6540, 0x6541, 0x6542, 0x6543, 0x6544, + 0x6546, 0x6547, 0x654A, 0x654B, 0x654D, 0x654E, 0x6550, 0x6552, + 0x6553, 0x6554, 0x6557, 0x6558, 0x655A, 0x655C, 0x655F, 0x6560, + 0x6561, 0x6564, 0x6565, 0x6567, 0x6568, 0x6569, 0x656A, 0x656D, + 0x656E, 0x656F, 0x6571, 0x6573, 0x6575, 0x6576, 0x6578, 0x6579, + 0x657A, 0x657B, 0x657C, 0x657D, 0x657E, 0x657F, 0x6580, 0x6581, + 0x6582, 0x6583, 0x6584, 0x6585, 0x6586, 0x6588, 0x6589, 0x658A, + 0x658D, 0x658E, 0x658F, 0x6592, 0x6594, 0x6595, 0x6596, 0x6598, + 0x659A, 0x659D, 0x659E, 0x65A0, 0x65A2, 0x65A3, 0x65A6, 0x65A8, + 0x65AA, 0x65AC, 0x65AE, 0x65B1, 0x65B2, 0x65B3, 0x65B4, 0x65B5, + 0x65B6, 0x65B7, 0x65B8, 0x65BA, 0x65BB, 0x65BE, 0x65BF, 0x65C0, + 0x65C2, 0x65C7, 0x65C8, 0x65C9, 0x65CA, 0x65CD, 0x65D0, 0x65D1, + 0x65D3, 0x65D4, 0x65D5, 0x65D8, 0x65D9, 0x65DA, 0x65DB, 0x65DC, + 0x65DD, 0x65DE, 0x65DF, 0x65E1, 0x65E3, 0x65E4, 0x65EA, 0x65EB, + 0x65F2, 0x65F3, 0x65F4, 0x65F5, 0x65F8, 0x65F9, 0x65FB, 0x65FC, + 0x65FD, 0x65FE, 0x65FF, 0x6601, 0x6604, 0x6605, 0x6607, 0x6608, + 0x6609, 0x660B, 0x660D, 0x6610, 0x6611, 0x6612, 0x6616, 0x6617, + 0x6618, 0x661A, 0x661B, 0x661C, 0x661E, 0x6621, 0x6622, 0x6623, + 0x6624, 0x6626, 0x6629, 0x662A, 0x662B, 0x662C, 0x662E, 0x6630, +plane 16 +at 0x00 + 0x6632, 0x6633, 0x6637, 0x6638, 0x6639, 0x663A, 0x663B, 0x663D, + 0x663F, 0x6640, 0x6642, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648, + 0x6649, 0x664A, 0x664D, 0x664E, 0x6650, 0x6651, 0x6658, 0x6659, + 0x665B, 0x665C, 0x665D, 0x665E, 0x6660, 0x6662, 0x6663, 0x6665, + 0x6667, 0x6669, 0x666A, 0x666B, 0x666C, 0x666D, 0x6671, 0x6672, + 0x6673, 0x6675, 0x6678, 0x6679, 0x667B, 0x667C, 0x667D, 0x667F, + 0x6680, 0x6681, 0x6683, 0x6685, 0x6686, 0x6688, 0x6689, 0x668A, + 0x668B, 0x668D, 0x668E, 0x668F, 0x6690, 0x6692, 0x6693, 0x6694, + 0x6695, 0x6698, 0x6699, 0x669A, 0x669B, 0x669C, 0x669E, 0x669F, + 0x66A0, 0x66A1, 0x66A2, 0x66A3, 0x66A4, 0x66A5, 0x66A6, 0x66A9, + 0x66AA, 0x66AB, 0x66AC, 0x66AD, 0x66AF, 0x66B0, 0x66B1, 0x66B2, + 0x66B3, 0x66B5, 0x66B6, 0x66B7, 0x66B8, 0x66BA, 0x66BB, 0x66BC, + 0x66BD, 0x66BF, 0x66C0, 0x66C1, 0x66C2, 0x66C3, 0x66C4, 0x66C5, + 0x66C6, 0x66C7, 0x66C8, 0x66C9, 0x66CA, 0x66CB, 0x66CC, 0x66CD, + 0x66CE, 0x66CF, 0x66D0, 0x66D1, 0x66D2, 0x66D3, 0x66D4, 0x66D5, + 0x66D6, 0x66D7, 0x66D8, 0x66DA, 0x66DE, 0x66DF, 0x66E0, 0x66E1, + 0x66E2, 0x66E3, 0x66E4, 0x66E5, 0x66E7, 0x66E8, 0x66EA, 0x66EB, + 0x66EC, 0x66ED, 0x66EE, 0x66EF, 0x66F1, 0x66F5, 0x66F6, 0x66F8, + 0x66FA, 0x66FB, 0x66FD, 0x6701, 0x6702, 0x6703, 0x6704, 0x6705, + 0x6706, 0x6707, 0x670C, 0x670E, 0x670F, 0x6711, 0x6712, 0x6713, + 0x6716, 0x6718, 0x6719, 0x671A, 0x671C, 0x671E, 0x6720, 0x6721, + 0x6722, 0x6723, 0x6724, 0x6725, 0x6727, 0x6729, 0x672E, 0x6730, + 0x6732, 0x6733, 0x6736, 0x6737, 0x6738, 0x6739, 0x673B, 0x673C, + 0x673E, 0x673F, 0x6741, 0x6744, 0x6745, 0x6747, 0x674A, 0x674B, + 0x674D, 0x6752, 0x6754, 0x6755, 0x6757, 0x6758, 0x6759, 0x675A, + 0x675B, 0x675D, 0x6762, 0x6763, 0x6764, 0x6766, 0x6767, 0x676B, + 0x676C, 0x676E, 0x6771, 0x6774, 0x6776, 0x6778, 0x6779, 0x677A, + 0x677B, 0x677D, 0x6780, 0x6782, 0x6783, 0x6785, 0x6786, 0x6788, + 0x678A, 0x678C, 0x678D, 0x678E, 0x678F, 0x6791, 0x6792, 0x6793, + 0x6794, 0x6796, 0x6799, 0x679B, 0x679F, 0x67A0, 0x67A1, 0x67A4, + 0x67A6, 0x67A9, 0x67AC, 0x67AE, 0x67B1, 0x67B2, 0x67B4, 0x67B9, + 0x67BA, 0x67BB, 0x67BC, 0x67BD, 0x67BE, 0x67BF, 0x67C0, 0x67C2, +plane 17 +at 0x00 + 0x67C5, 0x67C6, 0x67C7, 0x67C8, 0x67C9, 0x67CA, 0x67CB, 0x67CC, + 0x67CD, 0x67CE, 0x67D5, 0x67D6, 0x67D7, 0x67DB, 0x67DF, 0x67E1, + 0x67E3, 0x67E4, 0x67E6, 0x67E7, 0x67E8, 0x67EA, 0x67EB, 0x67ED, + 0x67EE, 0x67F2, 0x67F5, 0x67F6, 0x67F7, 0x67F8, 0x67F9, 0x67FA, + 0x67FB, 0x67FC, 0x67FE, 0x6801, 0x6802, 0x6803, 0x6804, 0x6806, + 0x680D, 0x6810, 0x6812, 0x6814, 0x6815, 0x6818, 0x6819, 0x681A, + 0x681B, 0x681C, 0x681E, 0x681F, 0x6820, 0x6822, 0x6823, 0x6824, + 0x6825, 0x6826, 0x6827, 0x6828, 0x682B, 0x682C, 0x682D, 0x682E, + 0x682F, 0x6830, 0x6831, 0x6834, 0x6835, 0x6836, 0x683A, 0x683B, + 0x683F, 0x6847, 0x684B, 0x684D, 0x684F, 0x6852, 0x6856, 0x6857, + 0x6858, 0x6859, 0x685A, 0x685B, 0x685C, 0x685D, 0x685E, 0x685F, + 0x686A, 0x686C, 0x686D, 0x686E, 0x686F, 0x6870, 0x6871, 0x6872, + 0x6873, 0x6875, 0x6878, 0x6879, 0x687A, 0x687B, 0x687C, 0x687D, + 0x687E, 0x687F, 0x6880, 0x6882, 0x6884, 0x6887, 0x6888, 0x6889, + 0x688A, 0x688B, 0x688C, 0x688D, 0x688E, 0x6890, 0x6891, 0x6892, + 0x6894, 0x6895, 0x6896, 0x6898, 0x6899, 0x689A, 0x689B, 0x689C, + 0x689D, 0x689E, 0x689F, 0x68A0, 0x68A1, 0x68A3, 0x68A4, 0x68A5, + 0x68A9, 0x68AA, 0x68AB, 0x68AC, 0x68AE, 0x68B1, 0x68B2, 0x68B4, + 0x68B6, 0x68B7, 0x68B8, 0x68B9, 0x68BA, 0x68BB, 0x68BC, 0x68BD, + 0x68BE, 0x68BF, 0x68C1, 0x68C3, 0x68C4, 0x68C5, 0x68C6, 0x68C7, + 0x68C8, 0x68CA, 0x68CC, 0x68CE, 0x68CF, 0x68D0, 0x68D1, 0x68D3, + 0x68D4, 0x68D6, 0x68D7, 0x68D9, 0x68DB, 0x68DC, 0x68DD, 0x68DE, + 0x68DF, 0x68E1, 0x68E2, 0x68E4, 0x68E5, 0x68E6, 0x68E7, 0x68E8, + 0x68E9, 0x68EA, 0x68EB, 0x68EC, 0x68ED, 0x68EF, 0x68F2, 0x68F3, + 0x68F4, 0x68F6, 0x68F7, 0x68F8, 0x68FB, 0x68FD, 0x68FE, 0x68FF, + 0x6900, 0x6902, 0x6903, 0x6904, 0x6906, 0x6907, 0x6908, 0x6909, + 0x690A, 0x690C, 0x690F, 0x6911, 0x6913, 0x6914, 0x6915, 0x6916, + 0x6917, 0x6918, 0x6919, 0x691A, 0x691B, 0x691C, 0x691D, 0x691E, + 0x6921, 0x6922, 0x6923, 0x6925, 0x6926, 0x6927, 0x6928, 0x6929, + 0x692A, 0x692B, 0x692C, 0x692E, 0x692F, 0x6931, 0x6932, 0x6933, + 0x6935, 0x6936, 0x6937, 0x6938, 0x693A, 0x693B, 0x693C, 0x693E, + 0x6940, 0x6941, 0x6943, 0x6944, 0x6945, 0x6946, 0x6947, 0x6948, +plane 18 +at 0x00 + 0x6949, 0x694A, 0x694B, 0x694C, 0x694D, 0x694E, 0x694F, 0x6950, + 0x6951, 0x6952, 0x6953, 0x6955, 0x6956, 0x6958, 0x6959, 0x695B, + 0x695C, 0x695F, 0x6961, 0x6962, 0x6964, 0x6965, 0x6967, 0x6968, + 0x6969, 0x696A, 0x696C, 0x696D, 0x696F, 0x6970, 0x6972, 0x6973, + 0x6974, 0x6975, 0x6976, 0x697A, 0x697B, 0x697D, 0x697E, 0x697F, + 0x6981, 0x6983, 0x6985, 0x698A, 0x698B, 0x698C, 0x698E, 0x698F, + 0x6990, 0x6991, 0x6992, 0x6993, 0x6996, 0x6997, 0x6999, 0x699A, + 0x699D, 0x699E, 0x699F, 0x69A0, 0x69A1, 0x69A2, 0x69A3, 0x69A4, + 0x69A5, 0x69A6, 0x69A9, 0x69AA, 0x69AC, 0x69AE, 0x69AF, 0x69B0, + 0x69B2, 0x69B3, 0x69B5, 0x69B6, 0x69B8, 0x69B9, 0x69BA, 0x69BC, + 0x69BD, 0x69BE, 0x69BF, 0x69C0, 0x69C2, 0x69C3, 0x69C4, 0x69C5, + 0x69C6, 0x69C7, 0x69C8, 0x69C9, 0x69CB, 0x69CD, 0x69CF, 0x69D1, + 0x69D2, 0x69D3, 0x69D5, 0x69D6, 0x69D7, 0x69D8, 0x69D9, 0x69DA, + 0x69DC, 0x69DD, 0x69DE, 0x69E1, 0x69E2, 0x69E3, 0x69E4, 0x69E5, + 0x69E6, 0x69E7, 0x69E8, 0x69E9, 0x69EA, 0x69EB, 0x69EC, 0x69EE, + 0x69EF, 0x69F0, 0x69F1, 0x69F3, 0x69F4, 0x69F5, 0x69F6, 0x69F7, + 0x69F8, 0x69F9, 0x69FA, 0x69FB, 0x69FC, 0x69FE, 0x6A00, 0x6A01, + 0x6A02, 0x6A03, 0x6A04, 0x6A05, 0x6A06, 0x6A07, 0x6A08, 0x6A09, + 0x6A0B, 0x6A0C, 0x6A0D, 0x6A0E, 0x6A0F, 0x6A10, 0x6A11, 0x6A12, + 0x6A13, 0x6A14, 0x6A15, 0x6A16, 0x6A19, 0x6A1A, 0x6A1B, 0x6A1C, + 0x6A1D, 0x6A1E, 0x6A20, 0x6A22, 0x6A23, 0x6A24, 0x6A25, 0x6A26, + 0x6A27, 0x6A29, 0x6A2B, 0x6A2C, 0x6A2D, 0x6A2E, 0x6A30, 0x6A32, + 0x6A33, 0x6A34, 0x6A36, 0x6A37, 0x6A38, 0x6A39, 0x6A3A, 0x6A3B, + 0x6A3C, 0x6A3F, 0x6A40, 0x6A41, 0x6A42, 0x6A43, 0x6A45, 0x6A46, + 0x6A48, 0x6A49, 0x6A4A, 0x6A4B, 0x6A4C, 0x6A4D, 0x6A4E, 0x6A4F, + 0x6A51, 0x6A52, 0x6A53, 0x6A54, 0x6A55, 0x6A56, 0x6A57, 0x6A5A, + 0x6A5C, 0x6A5D, 0x6A5E, 0x6A5F, 0x6A60, 0x6A62, 0x6A63, 0x6A64, + 0x6A66, 0x6A67, 0x6A68, 0x6A69, 0x6A6A, 0x6A6B, 0x6A6C, 0x6A6D, + 0x6A6E, 0x6A6F, 0x6A70, 0x6A72, 0x6A73, 0x6A74, 0x6A75, 0x6A76, + 0x6A77, 0x6A78, 0x6A7A, 0x6A7B, 0x6A7D, 0x6A7E, 0x6A7F, 0x6A81, + 0x6A82, 0x6A83, 0x6A85, 0x6A86, 0x6A87, 0x6A88, 0x6A89, 0x6A8A, + 0x6A8B, 0x6A8C, 0x6A8D, 0x6A8F, 0x6A92, 0x6A93, 0x6A94, 0x6A95, +plane 19 +at 0x00 + 0x6A96, 0x6A98, 0x6A99, 0x6A9A, 0x6A9B, 0x6A9C, 0x6A9D, 0x6A9E, + 0x6A9F, 0x6AA1, 0x6AA2, 0x6AA3, 0x6AA4, 0x6AA5, 0x6AA6, 0x6AA7, + 0x6AA8, 0x6AAA, 0x6AAD, 0x6AAE, 0x6AAF, 0x6AB0, 0x6AB1, 0x6AB2, + 0x6AB3, 0x6AB4, 0x6AB5, 0x6AB6, 0x6AB7, 0x6AB8, 0x6AB9, 0x6ABA, + 0x6ABB, 0x6ABC, 0x6ABD, 0x6ABE, 0x6ABF, 0x6AC0, 0x6AC1, 0x6AC2, + 0x6AC3, 0x6AC4, 0x6AC5, 0x6AC6, 0x6AC7, 0x6AC8, 0x6AC9, 0x6ACA, + 0x6ACB, 0x6ACC, 0x6ACD, 0x6ACE, 0x6ACF, 0x6AD0, 0x6AD1, 0x6AD2, + 0x6AD3, 0x6AD4, 0x6AD5, 0x6AD6, 0x6AD7, 0x6AD8, 0x6AD9, 0x6ADA, + 0x6ADB, 0x6ADC, 0x6ADD, 0x6ADE, 0x6ADF, 0x6AE0, 0x6AE1, 0x6AE2, + 0x6AE3, 0x6AE4, 0x6AE5, 0x6AE6, 0x6AE7, 0x6AE8, 0x6AE9, 0x6AEA, + 0x6AEB, 0x6AEC, 0x6AED, 0x6AEE, 0x6AEF, 0x6AF0, 0x6AF1, 0x6AF2, + 0x6AF3, 0x6AF4, 0x6AF5, 0x6AF6, 0x6AF7, 0x6AF8, 0x6AF9, 0x6AFA, + 0x6AFB, 0x6AFC, 0x6AFD, 0x6AFE, 0x6AFF, 0x6B00, 0x6B01, 0x6B02, + 0x6B03, 0x6B04, 0x6B05, 0x6B06, 0x6B07, 0x6B08, 0x6B09, 0x6B0A, + 0x6B0B, 0x6B0C, 0x6B0D, 0x6B0E, 0x6B0F, 0x6B10, 0x6B11, 0x6B12, + 0x6B13, 0x6B14, 0x6B15, 0x6B16, 0x6B17, 0x6B18, 0x6B19, 0x6B1A, + 0x6B1B, 0x6B1C, 0x6B1D, 0x6B1E, 0x6B1F, 0x6B25, 0x6B26, 0x6B28, + 0x6B29, 0x6B2A, 0x6B2B, 0x6B2C, 0x6B2D, 0x6B2E, 0x6B2F, 0x6B30, + 0x6B31, 0x6B33, 0x6B34, 0x6B35, 0x6B36, 0x6B38, 0x6B3B, 0x6B3C, + 0x6B3D, 0x6B3F, 0x6B40, 0x6B41, 0x6B42, 0x6B44, 0x6B45, 0x6B48, + 0x6B4A, 0x6B4B, 0x6B4D, 0x6B4E, 0x6B4F, 0x6B50, 0x6B51, 0x6B52, + 0x6B53, 0x6B54, 0x6B55, 0x6B56, 0x6B57, 0x6B58, 0x6B5A, 0x6B5B, + 0x6B5C, 0x6B5D, 0x6B5E, 0x6B5F, 0x6B60, 0x6B61, 0x6B68, 0x6B69, + 0x6B6B, 0x6B6C, 0x6B6D, 0x6B6E, 0x6B6F, 0x6B70, 0x6B71, 0x6B72, + 0x6B73, 0x6B74, 0x6B75, 0x6B76, 0x6B77, 0x6B78, 0x6B7A, 0x6B7D, + 0x6B7E, 0x6B7F, 0x6B80, 0x6B85, 0x6B88, 0x6B8C, 0x6B8E, 0x6B8F, + 0x6B90, 0x6B91, 0x6B94, 0x6B95, 0x6B97, 0x6B98, 0x6B99, 0x6B9C, + 0x6B9D, 0x6B9E, 0x6B9F, 0x6BA0, 0x6BA2, 0x6BA3, 0x6BA4, 0x6BA5, + 0x6BA6, 0x6BA7, 0x6BA8, 0x6BA9, 0x6BAB, 0x6BAC, 0x6BAD, 0x6BAE, + 0x6BAF, 0x6BB0, 0x6BB1, 0x6BB2, 0x6BB6, 0x6BB8, 0x6BB9, 0x6BBA, + 0x6BBB, 0x6BBC, 0x6BBD, 0x6BBE, 0x6BC0, 0x6BC3, 0x6BC4, 0x6BC6, + 0x6BC7, 0x6BC8, 0x6BC9, 0x6BCA, 0x6BCC, 0x6BCE, 0x6BD0, 0x6BD1, +plane 20 +at 0x00 + 0x6BD8, 0x6BDA, 0x6BDC, 0x6BDD, 0x6BDE, 0x6BDF, 0x6BE0, 0x6BE2, + 0x6BE3, 0x6BE4, 0x6BE5, 0x6BE6, 0x6BE7, 0x6BE8, 0x6BE9, 0x6BEC, + 0x6BED, 0x6BEE, 0x6BF0, 0x6BF1, 0x6BF2, 0x6BF4, 0x6BF6, 0x6BF7, + 0x6BF8, 0x6BFA, 0x6BFB, 0x6BFC, 0x6BFE, 0x6BFF, 0x6C00, 0x6C01, + 0x6C02, 0x6C03, 0x6C04, 0x6C08, 0x6C09, 0x6C0A, 0x6C0B, 0x6C0C, + 0x6C0E, 0x6C12, 0x6C17, 0x6C1C, 0x6C1D, 0x6C1E, 0x6C20, 0x6C23, + 0x6C25, 0x6C2B, 0x6C2C, 0x6C2D, 0x6C31, 0x6C33, 0x6C36, 0x6C37, + 0x6C39, 0x6C3A, 0x6C3B, 0x6C3C, 0x6C3E, 0x6C3F, 0x6C43, 0x6C44, + 0x6C45, 0x6C48, 0x6C4B, 0x6C4C, 0x6C4D, 0x6C4E, 0x6C4F, 0x6C51, + 0x6C52, 0x6C53, 0x6C56, 0x6C58, 0x6C59, 0x6C5A, 0x6C62, 0x6C63, + 0x6C65, 0x6C66, 0x6C67, 0x6C6B, 0x6C6C, 0x6C6D, 0x6C6E, 0x6C6F, + 0x6C71, 0x6C73, 0x6C75, 0x6C77, 0x6C78, 0x6C7A, 0x6C7B, 0x6C7C, + 0x6C7F, 0x6C80, 0x6C84, 0x6C87, 0x6C8A, 0x6C8B, 0x6C8D, 0x6C8E, + 0x6C91, 0x6C92, 0x6C95, 0x6C96, 0x6C97, 0x6C98, 0x6C9A, 0x6C9C, + 0x6C9D, 0x6C9E, 0x6CA0, 0x6CA2, 0x6CA8, 0x6CAC, 0x6CAF, 0x6CB0, + 0x6CB4, 0x6CB5, 0x6CB6, 0x6CB7, 0x6CBA, 0x6CC0, 0x6CC1, 0x6CC2, + 0x6CC3, 0x6CC6, 0x6CC7, 0x6CC8, 0x6CCB, 0x6CCD, 0x6CCE, 0x6CCF, + 0x6CD1, 0x6CD2, 0x6CD8, 0x6CD9, 0x6CDA, 0x6CDC, 0x6CDD, 0x6CDF, + 0x6CE4, 0x6CE6, 0x6CE7, 0x6CE9, 0x6CEC, 0x6CED, 0x6CF2, 0x6CF4, + 0x6CF9, 0x6CFF, 0x6D00, 0x6D02, 0x6D03, 0x6D05, 0x6D06, 0x6D08, + 0x6D09, 0x6D0A, 0x6D0D, 0x6D0F, 0x6D10, 0x6D11, 0x6D13, 0x6D14, + 0x6D15, 0x6D16, 0x6D18, 0x6D1C, 0x6D1D, 0x6D1F, 0x6D20, 0x6D21, + 0x6D22, 0x6D23, 0x6D24, 0x6D26, 0x6D28, 0x6D29, 0x6D2C, 0x6D2D, + 0x6D2F, 0x6D30, 0x6D34, 0x6D36, 0x6D37, 0x6D38, 0x6D3A, 0x6D3F, + 0x6D40, 0x6D42, 0x6D44, 0x6D49, 0x6D4C, 0x6D50, 0x6D55, 0x6D56, + 0x6D57, 0x6D58, 0x6D5B, 0x6D5D, 0x6D5F, 0x6D61, 0x6D62, 0x6D64, + 0x6D65, 0x6D67, 0x6D68, 0x6D6B, 0x6D6C, 0x6D6D, 0x6D70, 0x6D71, + 0x6D72, 0x6D73, 0x6D75, 0x6D76, 0x6D79, 0x6D7A, 0x6D7B, 0x6D7D, + 0x6D7E, 0x6D7F, 0x6D80, 0x6D81, 0x6D83, 0x6D84, 0x6D86, 0x6D87, + 0x6D8A, 0x6D8B, 0x6D8D, 0x6D8F, 0x6D90, 0x6D92, 0x6D96, 0x6D97, + 0x6D98, 0x6D99, 0x6D9A, 0x6D9C, 0x6DA2, 0x6DA5, 0x6DAC, 0x6DAD, + 0x6DB0, 0x6DB1, 0x6DB3, 0x6DB4, 0x6DB6, 0x6DB7, 0x6DB9, 0x6DBA, +plane 21 +at 0x00 + 0x6DBB, 0x6DBC, 0x6DBD, 0x6DBE, 0x6DC1, 0x6DC2, 0x6DC3, 0x6DC8, + 0x6DC9, 0x6DCA, 0x6DCD, 0x6DCE, 0x6DCF, 0x6DD0, 0x6DD2, 0x6DD3, + 0x6DD4, 0x6DD5, 0x6DD7, 0x6DDA, 0x6DDB, 0x6DDC, 0x6DDF, 0x6DE2, + 0x6DE3, 0x6DE5, 0x6DE7, 0x6DE8, 0x6DE9, 0x6DEA, 0x6DED, 0x6DEF, + 0x6DF0, 0x6DF2, 0x6DF4, 0x6DF5, 0x6DF6, 0x6DF8, 0x6DFA, 0x6DFD, + 0x6DFE, 0x6DFF, 0x6E00, 0x6E01, 0x6E02, 0x6E03, 0x6E04, 0x6E06, + 0x6E07, 0x6E08, 0x6E09, 0x6E0B, 0x6E0F, 0x6E12, 0x6E13, 0x6E15, + 0x6E18, 0x6E19, 0x6E1B, 0x6E1C, 0x6E1E, 0x6E1F, 0x6E22, 0x6E26, + 0x6E27, 0x6E28, 0x6E2A, 0x6E2C, 0x6E2E, 0x6E30, 0x6E31, 0x6E33, + 0x6E35, 0x6E36, 0x6E37, 0x6E39, 0x6E3B, 0x6E3C, 0x6E3D, 0x6E3E, + 0x6E3F, 0x6E40, 0x6E41, 0x6E42, 0x6E45, 0x6E46, 0x6E47, 0x6E48, + 0x6E49, 0x6E4A, 0x6E4B, 0x6E4C, 0x6E4F, 0x6E50, 0x6E51, 0x6E52, + 0x6E55, 0x6E57, 0x6E59, 0x6E5A, 0x6E5C, 0x6E5D, 0x6E5E, 0x6E60, + 0x6E61, 0x6E62, 0x6E63, 0x6E64, 0x6E65, 0x6E66, 0x6E67, 0x6E68, + 0x6E69, 0x6E6A, 0x6E6C, 0x6E6D, 0x6E6F, 0x6E70, 0x6E71, 0x6E72, + 0x6E73, 0x6E74, 0x6E75, 0x6E76, 0x6E77, 0x6E78, 0x6E79, 0x6E7A, + 0x6E7B, 0x6E7C, 0x6E7D, 0x6E80, 0x6E81, 0x6E82, 0x6E84, 0x6E87, + 0x6E88, 0x6E8A, 0x6E8B, 0x6E8C, 0x6E8D, 0x6E8E, 0x6E91, 0x6E92, + 0x6E93, 0x6E94, 0x6E95, 0x6E96, 0x6E97, 0x6E99, 0x6E9A, 0x6E9B, + 0x6E9D, 0x6E9E, 0x6EA0, 0x6EA1, 0x6EA3, 0x6EA4, 0x6EA6, 0x6EA8, + 0x6EA9, 0x6EAB, 0x6EAC, 0x6EAD, 0x6EAE, 0x6EB0, 0x6EB3, 0x6EB5, + 0x6EB8, 0x6EB9, 0x6EBC, 0x6EBE, 0x6EBF, 0x6EC0, 0x6EC3, 0x6EC4, + 0x6EC5, 0x6EC6, 0x6EC8, 0x6EC9, 0x6ECA, 0x6ECC, 0x6ECD, 0x6ECE, + 0x6ED0, 0x6ED2, 0x6ED6, 0x6ED8, 0x6ED9, 0x6EDB, 0x6EDC, 0x6EDD, + 0x6EE3, 0x6EE7, 0x6EEA, 0x6EEB, 0x6EEC, 0x6EED, 0x6EEE, 0x6EEF, + 0x6EF0, 0x6EF1, 0x6EF2, 0x6EF3, 0x6EF5, 0x6EF6, 0x6EF7, 0x6EF8, + 0x6EFA, 0x6EFB, 0x6EFC, 0x6EFD, 0x6EFE, 0x6EFF, 0x6F00, 0x6F01, + 0x6F03, 0x6F04, 0x6F05, 0x6F07, 0x6F08, 0x6F0A, 0x6F0B, 0x6F0C, + 0x6F0D, 0x6F0E, 0x6F10, 0x6F11, 0x6F12, 0x6F16, 0x6F17, 0x6F18, + 0x6F19, 0x6F1A, 0x6F1B, 0x6F1C, 0x6F1D, 0x6F1E, 0x6F1F, 0x6F21, + 0x6F22, 0x6F23, 0x6F25, 0x6F26, 0x6F27, 0x6F28, 0x6F2C, 0x6F2E, + 0x6F30, 0x6F32, 0x6F34, 0x6F35, 0x6F37, 0x6F38, 0x6F39, 0x6F3A, +plane 22 +at 0x00 + 0x6F3B, 0x6F3C, 0x6F3D, 0x6F3F, 0x6F40, 0x6F41, 0x6F42, 0x6F43, + 0x6F44, 0x6F45, 0x6F48, 0x6F49, 0x6F4A, 0x6F4C, 0x6F4E, 0x6F4F, + 0x6F50, 0x6F51, 0x6F52, 0x6F53, 0x6F54, 0x6F55, 0x6F56, 0x6F57, + 0x6F59, 0x6F5A, 0x6F5B, 0x6F5D, 0x6F5F, 0x6F60, 0x6F61, 0x6F63, + 0x6F64, 0x6F65, 0x6F67, 0x6F68, 0x6F69, 0x6F6A, 0x6F6B, 0x6F6C, + 0x6F6F, 0x6F70, 0x6F71, 0x6F73, 0x6F75, 0x6F76, 0x6F77, 0x6F79, + 0x6F7B, 0x6F7D, 0x6F7E, 0x6F7F, 0x6F80, 0x6F81, 0x6F82, 0x6F83, + 0x6F85, 0x6F86, 0x6F87, 0x6F8A, 0x6F8B, 0x6F8F, 0x6F90, 0x6F91, + 0x6F92, 0x6F93, 0x6F94, 0x6F95, 0x6F96, 0x6F97, 0x6F98, 0x6F99, + 0x6F9A, 0x6F9B, 0x6F9D, 0x6F9E, 0x6F9F, 0x6FA0, 0x6FA2, 0x6FA3, + 0x6FA4, 0x6FA5, 0x6FA6, 0x6FA8, 0x6FA9, 0x6FAA, 0x6FAB, 0x6FAC, + 0x6FAD, 0x6FAE, 0x6FAF, 0x6FB0, 0x6FB1, 0x6FB2, 0x6FB4, 0x6FB5, + 0x6FB7, 0x6FB8, 0x6FBA, 0x6FBB, 0x6FBC, 0x6FBD, 0x6FBE, 0x6FBF, + 0x6FC1, 0x6FC3, 0x6FC4, 0x6FC5, 0x6FC6, 0x6FC7, 0x6FC8, 0x6FCA, + 0x6FCB, 0x6FCC, 0x6FCD, 0x6FCE, 0x6FCF, 0x6FD0, 0x6FD3, 0x6FD4, + 0x6FD5, 0x6FD6, 0x6FD7, 0x6FD8, 0x6FD9, 0x6FDA, 0x6FDB, 0x6FDC, + 0x6FDD, 0x6FDF, 0x6FE2, 0x6FE3, 0x6FE4, 0x6FE5, 0x6FE6, 0x6FE7, + 0x6FE8, 0x6FE9, 0x6FEA, 0x6FEB, 0x6FEC, 0x6FED, 0x6FF0, 0x6FF1, + 0x6FF2, 0x6FF3, 0x6FF4, 0x6FF5, 0x6FF6, 0x6FF7, 0x6FF8, 0x6FF9, + 0x6FFA, 0x6FFB, 0x6FFC, 0x6FFD, 0x6FFE, 0x6FFF, 0x7000, 0x7001, + 0x7002, 0x7003, 0x7004, 0x7005, 0x7006, 0x7007, 0x7008, 0x7009, + 0x700A, 0x700B, 0x700C, 0x700D, 0x700E, 0x700F, 0x7010, 0x7012, + 0x7013, 0x7014, 0x7015, 0x7016, 0x7017, 0x7018, 0x7019, 0x701C, + 0x701D, 0x701E, 0x701F, 0x7020, 0x7021, 0x7022, 0x7024, 0x7025, + 0x7026, 0x7027, 0x7028, 0x7029, 0x702A, 0x702B, 0x702C, 0x702D, + 0x702E, 0x702F, 0x7030, 0x7031, 0x7032, 0x7033, 0x7034, 0x7036, + 0x7037, 0x7038, 0x703A, 0x703B, 0x703C, 0x703D, 0x703E, 0x703F, + 0x7040, 0x7041, 0x7042, 0x7043, 0x7044, 0x7045, 0x7046, 0x7047, + 0x7048, 0x7049, 0x704A, 0x704B, 0x704D, 0x704E, 0x7050, 0x7051, + 0x7052, 0x7053, 0x7054, 0x7055, 0x7056, 0x7057, 0x7058, 0x7059, + 0x705A, 0x705B, 0x705C, 0x705D, 0x705F, 0x7060, 0x7061, 0x7062, + 0x7063, 0x7064, 0x7065, 0x7066, 0x7067, 0x7068, 0x7069, 0x706A, +plane 23 +at 0x00 + 0x706E, 0x7071, 0x7072, 0x7073, 0x7074, 0x7077, 0x7079, 0x707A, + 0x707B, 0x707D, 0x7081, 0x7082, 0x7083, 0x7084, 0x7086, 0x7087, + 0x7088, 0x708B, 0x708C, 0x708D, 0x708F, 0x7090, 0x7091, 0x7093, + 0x7097, 0x7098, 0x709A, 0x709B, 0x709E, 0x709F, 0x70A0, 0x70A1, + 0x70A2, 0x70A3, 0x70A4, 0x70A5, 0x70A6, 0x70A7, 0x70A8, 0x70A9, + 0x70AA, 0x70B0, 0x70B2, 0x70B4, 0x70B5, 0x70B6, 0x70BA, 0x70BE, + 0x70BF, 0x70C4, 0x70C5, 0x70C6, 0x70C7, 0x70C9, 0x70CB, 0x70CC, + 0x70CD, 0x70CE, 0x70CF, 0x70D0, 0x70D1, 0x70D2, 0x70D3, 0x70D4, + 0x70D5, 0x70D6, 0x70D7, 0x70DA, 0x70DC, 0x70DD, 0x70DE, 0x70E0, + 0x70E1, 0x70E2, 0x70E3, 0x70E5, 0x70EA, 0x70EE, 0x70F0, 0x70F1, + 0x70F2, 0x70F3, 0x70F4, 0x70F5, 0x70F6, 0x70F8, 0x70FA, 0x70FB, + 0x70FC, 0x70FE, 0x70FF, 0x7100, 0x7101, 0x7102, 0x7103, 0x7104, + 0x7105, 0x7106, 0x7107, 0x7108, 0x710B, 0x710C, 0x710D, 0x710E, + 0x710F, 0x7111, 0x7112, 0x7114, 0x7117, 0x711B, 0x711C, 0x711D, + 0x711E, 0x711F, 0x7120, 0x7121, 0x7122, 0x7123, 0x7124, 0x7125, + 0x7127, 0x7128, 0x7129, 0x712A, 0x712B, 0x712C, 0x712D, 0x712E, + 0x7132, 0x7133, 0x7134, 0x7135, 0x7137, 0x7138, 0x7139, 0x713A, + 0x713B, 0x713C, 0x713D, 0x713E, 0x713F, 0x7140, 0x7141, 0x7142, + 0x7143, 0x7144, 0x7146, 0x7147, 0x7148, 0x7149, 0x714B, 0x714D, + 0x714F, 0x7150, 0x7151, 0x7152, 0x7153, 0x7154, 0x7155, 0x7156, + 0x7157, 0x7158, 0x7159, 0x715A, 0x715B, 0x715D, 0x715F, 0x7160, + 0x7161, 0x7162, 0x7163, 0x7165, 0x7169, 0x716A, 0x716B, 0x716C, + 0x716D, 0x716F, 0x7170, 0x7171, 0x7174, 0x7175, 0x7176, 0x7177, + 0x7179, 0x717B, 0x717C, 0x717E, 0x717F, 0x7180, 0x7181, 0x7182, + 0x7183, 0x7185, 0x7186, 0x7187, 0x7188, 0x7189, 0x718B, 0x718C, + 0x718D, 0x718E, 0x7190, 0x7191, 0x7192, 0x7193, 0x7195, 0x7196, + 0x7197, 0x719A, 0x719B, 0x719C, 0x719D, 0x719E, 0x71A1, 0x71A2, + 0x71A3, 0x71A4, 0x71A5, 0x71A6, 0x71A7, 0x71A9, 0x71AA, 0x71AB, + 0x71AD, 0x71AE, 0x71AF, 0x71B0, 0x71B1, 0x71B2, 0x71B4, 0x71B6, + 0x71B7, 0x71B8, 0x71BA, 0x71BB, 0x71BC, 0x71BD, 0x71BE, 0x71BF, + 0x71C0, 0x71C1, 0x71C2, 0x71C4, 0x71C5, 0x71C6, 0x71C7, 0x71C8, + 0x71C9, 0x71CA, 0x71CB, 0x71CC, 0x71CD, 0x71CF, 0x71D0, 0x71D1, +plane 24 +at 0x00 + 0x71D2, 0x71D3, 0x71D6, 0x71D7, 0x71D8, 0x71D9, 0x71DA, 0x71DB, + 0x71DC, 0x71DD, 0x71DE, 0x71DF, 0x71E1, 0x71E2, 0x71E3, 0x71E4, + 0x71E6, 0x71E8, 0x71E9, 0x71EA, 0x71EB, 0x71EC, 0x71ED, 0x71EF, + 0x71F0, 0x71F1, 0x71F2, 0x71F3, 0x71F4, 0x71F5, 0x71F6, 0x71F7, + 0x71F8, 0x71FA, 0x71FB, 0x71FC, 0x71FD, 0x71FE, 0x71FF, 0x7200, + 0x7201, 0x7202, 0x7203, 0x7204, 0x7205, 0x7207, 0x7208, 0x7209, + 0x720A, 0x720B, 0x720C, 0x720D, 0x720E, 0x720F, 0x7210, 0x7211, + 0x7212, 0x7213, 0x7214, 0x7215, 0x7216, 0x7217, 0x7218, 0x7219, + 0x721A, 0x721B, 0x721C, 0x721E, 0x721F, 0x7220, 0x7221, 0x7222, + 0x7223, 0x7224, 0x7225, 0x7226, 0x7227, 0x7229, 0x722B, 0x722D, + 0x722E, 0x722F, 0x7232, 0x7233, 0x7234, 0x723A, 0x723C, 0x723E, + 0x7240, 0x7241, 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7249, + 0x724A, 0x724B, 0x724E, 0x724F, 0x7250, 0x7251, 0x7253, 0x7254, + 0x7255, 0x7257, 0x7258, 0x725A, 0x725C, 0x725E, 0x7260, 0x7263, + 0x7264, 0x7265, 0x7268, 0x726A, 0x726B, 0x726C, 0x726D, 0x7270, + 0x7271, 0x7273, 0x7274, 0x7276, 0x7277, 0x7278, 0x727B, 0x727C, + 0x727D, 0x7282, 0x7283, 0x7285, 0x7286, 0x7287, 0x7288, 0x7289, + 0x728C, 0x728E, 0x7290, 0x7291, 0x7293, 0x7294, 0x7295, 0x7296, + 0x7297, 0x7298, 0x7299, 0x729A, 0x729B, 0x729C, 0x729D, 0x729E, + 0x72A0, 0x72A1, 0x72A2, 0x72A3, 0x72A4, 0x72A5, 0x72A6, 0x72A7, + 0x72A8, 0x72A9, 0x72AA, 0x72AB, 0x72AE, 0x72B1, 0x72B2, 0x72B3, + 0x72B5, 0x72BA, 0x72BB, 0x72BC, 0x72BD, 0x72BE, 0x72BF, 0x72C0, + 0x72C5, 0x72C6, 0x72C7, 0x72C9, 0x72CA, 0x72CB, 0x72CC, 0x72CF, + 0x72D1, 0x72D3, 0x72D4, 0x72D5, 0x72D6, 0x72D8, 0x72DA, 0x72DB, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 25 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0x3000, 0x3001, 0x3002, 0x00B7, 0x02C9, 0x02C7, 0x00A8, 0x3003, + 0x3005, 0x2014, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x2019, 0x201C, + 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, + 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x3011, 0x00B1, + 0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F, 0x222A, + 0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220, 0x2312, + 0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D, 0x221D, + 0x2260, 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235, 0x2234, + 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04, 0x00A4, + 0xFFE0, 0xFFE1, 0x2030, 0x00A7, 0x2116, 0x2606, 0x2605, 0x25CB, + 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2, + 0x203B, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x2170, 0x2171, + 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, + 0, 0, 0, 0, 0, 0, 0x2488, 0x2489, + 0x248A, 0x248B, 0x248C, 0x248D, 0x248E, 0x248F, 0x2490, 0x2491, + 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, 0x2498, 0x2499, +plane 26 +at 0x00 + 0x249A, 0x249B, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, + 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480, 0x2481, + 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x2460, 0x2461, + 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, + 0, 0, 0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, + 0x3226, 0x3227, 0x3228, 0x3229, 0, 0, 0x2160, 0x2161, + 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, + 0x216A, 0x216B, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0xFF01, 0xFF02, 0xFF03, 0xFFE5, + 0xFF05, 0xFF06, 0xFF07, 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, + 0xFF0D, 0xFF0E, 0xFF0F, 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, + 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, + 0xFF1D, 0xFF1E, 0xFF1F, 0xFF20, 0xFF21, 0xFF22, 0xFF23, 0xFF24, + 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, + 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, + 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFF3C, + 0xFF3D, 0xFF3E, 0xFF3F, 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, + 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, + 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, + 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, + 0xFF5D, 0xFFE3, 0, 0, 0, 0, 0, 0, +plane 27 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, + 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, + 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, + 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, + 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, + 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, + 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, + 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, + 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, + 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, + 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 28 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, + 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, + 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, + 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, + 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, + 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, + 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, + 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, + 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, + 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, + 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x0391, 0x0392, + 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, + 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, + 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0, 0, + 0, 0, 0, 0, 0, 0, 0x03B1, 0x03B2, + 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, +plane 29 +at 0x00 + 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, + 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0, 0, + 0, 0, 0, 0, 0, 0xFE35, 0xFE36, 0xFE39, + 0xFE3A, 0xFE3F, 0xFE40, 0xFE3D, 0xFE3E, 0xFE41, 0xFE42, 0xFE43, + 0xFE44, 0, 0, 0xFE3B, 0xFE3C, 0xFE37, 0xFE38, 0xFE31, + 0, 0xFE33, 0xFE34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0x0410, 0x0411, 0x0412, 0x0413, + 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, + 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, + 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, + 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0x0430, 0x0431, 0x0432, 0x0433, + 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, + 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, + 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, + 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x02CA, 0x02CB, 0x02D9, 0x2013, 0x2015, 0x2025, + 0x2035, 0x2105, 0x2109, 0x2196, 0x2197, 0x2198, 0x2199, 0x2215, +plane 30 +at 0x00 + 0x221F, 0x2223, 0x2252, 0x2266, 0x2267, 0x22BF, 0x2550, 0x2551, + 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, + 0x255A, 0x255B, 0x255C, 0x255D, 0x255E, 0x255F, 0x2560, 0x2561, + 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, + 0x256A, 0x256B, 0x256C, 0x256D, 0x256E, 0x256F, 0x2570, 0x2571, + 0x2572, 0x2573, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, + 0x2587, 0x2588, 0x2589, 0x258A, 0x258B, 0x258C, 0x258D, 0x258E, + 0x258F, 0x2593, 0x2594, 0x2595, 0x25BC, 0x25BD, 0x25E2, 0x25E3, + 0x25E4, 0x25E5, 0x2609, 0x2295, 0x3012, 0x301D, 0x301E, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, + 0x011B, 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, + 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, + 0x01DA, 0x01DC, 0x00FC, 0x00EA, 0x0251, 0xE7C7, 0x0144, 0x0148, + 0xE7C8, 0x0261, 0, 0, 0, 0, 0x3105, 0x3106, + 0x3107, 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, + 0x310F, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, + 0x3117, 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, + 0x311F, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, + 0x3127, 0x3128, 0x3129, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, + 0x3029, 0x32A3, 0x338E, 0x338F, 0x339C, 0x339D, 0x339E, 0x33A1, + 0x33C4, 0x33CE, 0x33D1, 0x33D2, 0x33D5, 0xFE30, 0xFFE2, 0xFFE4, + 0, 0x2121, 0x3231, 0, 0x2010, 0, 0, 0, + 0x30FC, 0x309B, 0x309C, 0x30FD, 0x30FE, 0x3006, 0x309D, 0x309E, + 0xFE49, 0xFE4A, 0xFE4B, 0xFE4C, 0xFE4D, 0xFE4E, 0xFE4F, 0xFE50, + 0xFE51, 0xFE52, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFE59, 0xFE5A, + 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0xFE5F, 0xFE60, 0xFE61, 0xFE62, + 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0xFE68, 0xFE69, 0xFE6A, 0xFE6B, + 0xE7E7, 0xE7E8, 0xE7E9, 0xE7EA, 0xE7EB, 0xE7EC, 0xE7ED, 0xE7EE, +plane 31 +at 0x00 + 0xE7EF, 0xE7F0, 0xE7F1, 0xE7F2, 0xE7F3, 0x3007, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, + 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, 0x250C, + 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, + 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, 0x251C, + 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, + 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, + 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, + 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, + 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, + 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, 0x254B, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x72DC, 0x72DD, + 0x72DF, 0x72E2, 0x72E3, 0x72E4, 0x72E5, 0x72E6, 0x72E7, 0x72EA, + 0x72EB, 0x72F5, 0x72F6, 0x72F9, 0x72FD, 0x72FE, 0x72FF, 0x7300, + 0x7302, 0x7304, 0x7305, 0x7306, 0x7307, 0x7308, 0x7309, 0x730B, + 0x730C, 0x730D, 0x730F, 0x7310, 0x7311, 0x7312, 0x7314, 0x7318, + 0x7319, 0x731A, 0x731F, 0x7320, 0x7323, 0x7324, 0x7326, 0x7327, + 0x7328, 0x732D, 0x732F, 0x7330, 0x7332, 0x7333, 0x7335, 0x7336, + 0x733A, 0x733B, 0x733C, 0x733D, 0x7340, 0x7341, 0x7342, 0x7343, + 0x7344, 0x7345, 0x7346, 0x7347, 0x7348, 0x7349, 0x734A, 0x734B, + 0x734C, 0x734E, 0x734F, 0x7351, 0x7353, 0x7354, 0x7355, 0x7356, + 0x7358, 0x7359, 0x735A, 0x735B, 0x735C, 0x735D, 0x735E, 0x735F, + 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, 0x7366, 0x7367, 0x7368, + 0x7369, 0x736A, 0x736B, 0x736E, 0x7370, 0x7371, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 32 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0x7372, 0x7373, 0x7374, 0x7375, + 0x7376, 0x7377, 0x7378, 0x7379, 0x737A, 0x737B, 0x737C, 0x737D, + 0x737F, 0x7380, 0x7381, 0x7382, 0x7383, 0x7385, 0x7386, 0x7388, + 0x738A, 0x738C, 0x738D, 0x738F, 0x7390, 0x7392, 0x7393, 0x7394, + 0x7395, 0x7397, 0x7398, 0x7399, 0x739A, 0x739C, 0x739D, 0x739E, + 0x73A0, 0x73A1, 0x73A3, 0x73A4, 0x73A5, 0x73A6, 0x73A7, 0x73A8, + 0x73AA, 0x73AC, 0x73AD, 0x73B1, 0x73B4, 0x73B5, 0x73B6, 0x73B8, + 0x73B9, 0x73BC, 0x73BD, 0x73BE, 0x73BF, 0x73C1, 0x73C3, 0x73C4, + 0x73C5, 0x73C6, 0x73C7, 0x73CB, 0x73CC, 0x73CE, 0x73D2, 0x73D3, + 0x73D4, 0x73D5, 0x73D6, 0x73D7, 0x73D8, 0x73DA, 0x73DB, 0x73DC, + 0x73DD, 0x73DF, 0x73E1, 0x73E2, 0x73E3, 0x73E4, 0x73E6, 0x73E8, + 0x73EA, 0x73EB, 0x73EC, 0x73EE, 0x73EF, 0x73F0, 0x73F1, 0x73F3, + 0x73F4, 0x73F5, 0x73F6, 0x73F7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x73F8, 0x73F9, 0x73FA, 0x73FB, 0x73FC, 0x73FD, + 0x73FE, 0x73FF, 0x7400, 0x7401, 0x7402, 0x7404, 0x7407, 0x7408, + 0x740B, 0x740C, 0x740D, 0x740E, 0x7411, 0x7412, 0x7413, 0x7414, +plane 33 +at 0x00 + 0x7415, 0x7416, 0x7417, 0x7418, 0x7419, 0x741C, 0x741D, 0x741E, + 0x741F, 0x7420, 0x7421, 0x7423, 0x7424, 0x7427, 0x7429, 0x742B, + 0x742D, 0x742F, 0x7431, 0x7432, 0x7437, 0x7438, 0x7439, 0x743A, + 0x743B, 0x743D, 0x743E, 0x743F, 0x7440, 0x7442, 0x7443, 0x7444, + 0x7445, 0x7446, 0x7447, 0x7448, 0x7449, 0x744A, 0x744B, 0x744C, + 0x744D, 0x744E, 0x744F, 0x7450, 0x7451, 0x7452, 0x7453, 0x7454, + 0x7456, 0x7458, 0x745D, 0x7460, 0x7461, 0x7462, 0x7463, 0x7464, + 0x7465, 0x7466, 0x7467, 0x7468, 0x7469, 0x746A, 0x746B, 0x746C, + 0x746E, 0x746F, 0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7478, + 0x7479, 0x747A, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0x747B, 0x747C, 0x747D, 0x747F, 0x7482, 0x7484, 0x7485, 0x7486, + 0x7488, 0x7489, 0x748A, 0x748C, 0x748D, 0x748F, 0x7491, 0x7492, + 0x7493, 0x7494, 0x7495, 0x7496, 0x7497, 0x7498, 0x7499, 0x749A, + 0x749B, 0x749D, 0x749F, 0x74A0, 0x74A1, 0x74A2, 0x74A3, 0x74A4, + 0x74A5, 0x74A6, 0x74AA, 0x74AB, 0x74AC, 0x74AD, 0x74AE, 0x74AF, + 0x74B0, 0x74B1, 0x74B2, 0x74B3, 0x74B4, 0x74B5, 0x74B6, 0x74B7, + 0x74B8, 0x74B9, 0x74BB, 0x74BC, 0x74BD, 0x74BE, 0x74BF, 0x74C0, + 0x74C1, 0x74C2, 0x74C3, 0x74C4, 0x74C5, 0x74C6, 0x74C7, 0x74C8, + 0x74C9, 0x74CA, 0x74CB, 0x74CC, 0x74CD, 0x74CE, 0x74CF, 0x74D0, + 0x74D1, 0x74D3, 0x74D4, 0x74D5, 0x74D6, 0x74D7, 0x74D8, 0x74D9, + 0x74DA, 0x74DB, 0x74DD, 0x74DF, 0x74E1, 0x74E5, 0x74E7, 0x74E8, +plane 34 +at 0x00 + 0x74E9, 0x74EA, 0x74EB, 0x74EC, 0x74ED, 0x74F0, 0x74F1, 0x74F2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x74F3, 0x74F5, + 0x74F8, 0x74F9, 0x74FA, 0x74FB, 0x74FC, 0x74FD, 0x74FE, 0x7500, + 0x7501, 0x7502, 0x7503, 0x7505, 0x7506, 0x7507, 0x7508, 0x7509, + 0x750A, 0x750B, 0x750C, 0x750E, 0x7510, 0x7512, 0x7514, 0x7515, + 0x7516, 0x7517, 0x751B, 0x751D, 0x751E, 0x7520, 0x7521, 0x7522, + 0x7523, 0x7524, 0x7526, 0x7527, 0x752A, 0x752E, 0x7534, 0x7536, + 0x7539, 0x753C, 0x753D, 0x753F, 0x7541, 0x7542, 0x7543, 0x7544, + 0x7546, 0x7547, 0x7549, 0x754A, 0x754D, 0x7550, 0x7551, 0x7552, + 0x7553, 0x7555, 0x7556, 0x7557, 0x7558, 0x755D, 0x755E, 0x755F, + 0x7560, 0x7561, 0x7562, 0x7563, 0x7564, 0x7567, 0x7568, 0x7569, + 0x756B, 0x756C, 0x756D, 0x756E, 0x756F, 0x7570, 0x7571, 0x7573, + 0x7575, 0x7576, 0x7577, 0x757A, 0x757B, 0x757C, 0x757D, 0x757E, + 0x7580, 0x7581, 0x7582, 0x7584, 0x7585, 0x7587, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 35 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0x7588, 0x7589, 0x758A, 0x758C, + 0x758D, 0x758E, 0x7590, 0x7593, 0x7595, 0x7598, 0x759B, 0x759C, + 0x759E, 0x75A2, 0x75A6, 0x75A7, 0x75A8, 0x75A9, 0x75AA, 0x75AD, + 0x75B6, 0x75B7, 0x75BA, 0x75BB, 0x75BF, 0x75C0, 0x75C1, 0x75C6, + 0x75CB, 0x75CC, 0x75CE, 0x75CF, 0x75D0, 0x75D1, 0x75D3, 0x75D7, + 0x75D9, 0x75DA, 0x75DC, 0x75DD, 0x75DF, 0x75E0, 0x75E1, 0x75E5, + 0x75E9, 0x75EC, 0x75ED, 0x75EE, 0x75EF, 0x75F2, 0x75F3, 0x75F5, + 0x75F6, 0x75F7, 0x75F8, 0x75FA, 0x75FB, 0x75FD, 0x75FE, 0x7602, + 0x7604, 0x7606, 0x7607, 0x7608, 0x7609, 0x760B, 0x760D, 0x760E, + 0x760F, 0x7611, 0x7612, 0x7613, 0x7614, 0x7616, 0x761A, 0x761C, + 0x761D, 0x761E, 0x7621, 0x7623, 0x7627, 0x7628, 0x762C, 0x762E, + 0x762F, 0x7631, 0x7632, 0x7636, 0x7637, 0x7639, 0x763A, 0x763B, + 0x763D, 0x7641, 0x7642, 0x7644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x7645, 0x7646, 0x7647, 0x7648, 0x7649, 0x764A, + 0x764B, 0x764E, 0x764F, 0x7650, 0x7651, 0x7652, 0x7653, 0x7655, + 0x7657, 0x7658, 0x7659, 0x765A, 0x765B, 0x765D, 0x765F, 0x7660, + 0x7661, 0x7662, 0x7664, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, +plane 36 +at 0x00 + 0x766A, 0x766C, 0x766D, 0x766E, 0x7670, 0x7671, 0x7672, 0x7673, + 0x7674, 0x7675, 0x7676, 0x7677, 0x7679, 0x767A, 0x767C, 0x767F, + 0x7680, 0x7681, 0x7683, 0x7685, 0x7689, 0x768A, 0x768C, 0x768D, + 0x768F, 0x7690, 0x7692, 0x7694, 0x7695, 0x7697, 0x7698, 0x769A, + 0x769B, 0x769C, 0x769D, 0x769E, 0x769F, 0x76A0, 0x76A1, 0x76A2, + 0x76A3, 0x76A5, 0x76A6, 0x76A7, 0x76A8, 0x76A9, 0x76AA, 0x76AB, + 0x76AC, 0x76AD, 0x76AF, 0x76B0, 0x76B3, 0x76B5, 0x76B6, 0x76B7, + 0x76B8, 0x76B9, 0x76BA, 0x76BB, 0x76BC, 0x76BD, 0x76BE, 0x76C0, + 0x76C1, 0x76C3, 0x554A, 0x963F, 0x57C3, 0x6328, 0x54CE, 0x5509, + 0x54C0, 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E, 0x788D, 0x7231, + 0x9698, 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309, 0x6697, 0x5CB8, + 0x80FA, 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9, 0x6556, 0x71AC, + 0x7FF1, 0x8884, 0x50B2, 0x5965, 0x61CA, 0x6FB3, 0x82AD, 0x634C, + 0x6252, 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4, 0x5DF4, 0x62D4, + 0x8DCB, 0x9776, 0x628A, 0x8019, 0x575D, 0x9738, 0x7F62, 0x7238, + 0x767D, 0x67CF, 0x767E, 0x6446, 0x4F70, 0x8D25, 0x62DC, 0x7A17, + 0x6591, 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881, 0x677F, 0x7248, + 0x626E, 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E, 0x7ECA, 0x90A6, + 0x5E2E, 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2, 0x78C5, 0x868C, + 0x9551, 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305, 0x8912, 0x5265, + 0x76C4, 0x76C7, 0x76C9, 0x76CB, 0x76CC, 0x76D3, 0x76D5, 0x76D9, + 0x76DA, 0x76DC, 0x76DD, 0x76DE, 0x76E0, 0x76E1, 0x76E2, 0x76E3, + 0x76E4, 0x76E6, 0x76E7, 0x76E8, 0x76E9, 0x76EA, 0x76EB, 0x76EC, + 0x76ED, 0x76F0, 0x76F3, 0x76F5, 0x76F6, 0x76F7, 0x76FA, 0x76FB, + 0x76FD, 0x76FF, 0x7700, 0x7702, 0x7703, 0x7705, 0x7706, 0x770A, + 0x770C, 0x770E, 0x770F, 0x7710, 0x7711, 0x7712, 0x7713, 0x7714, + 0x7715, 0x7716, 0x7717, 0x7718, 0x771B, 0x771C, 0x771D, 0x771E, + 0x7721, 0x7723, 0x7724, 0x7725, 0x7727, 0x772A, 0x772B, 0x772C, + 0x772E, 0x7730, 0x7731, 0x7732, 0x7733, 0x7734, 0x7739, 0x773B, + 0x773D, 0x773E, 0x773F, 0x7742, 0x7744, 0x7745, 0x7746, 0x7748, + 0x7749, 0x774A, 0x774B, 0x774C, 0x774D, 0x774E, 0x774F, 0x7752, + 0x7753, 0x7754, 0x7755, 0x7756, 0x7757, 0x7758, 0x7759, 0x775C, +plane 37 +at 0x00 + 0x8584, 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D, 0x62B1, 0x62A5, + 0x66B4, 0x8C79, 0x9C8D, 0x7206, 0x676F, 0x7891, 0x60B2, 0x5351, + 0x5317, 0x8F88, 0x80CC, 0x8D1D, 0x94A1, 0x500D, 0x72C8, 0x5907, + 0x60EB, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C, 0x7B28, 0x5D29, + 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C, 0x9F3B, 0x6BD4, + 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D, 0x6BD5, 0x6BD9, + 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D, 0x5F0A, 0x5FC5, + 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD, 0x8FB9, 0x7F16, + 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8, 0x8FA9, 0x8FAB, + 0x904D, 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6, 0x618B, 0x522B, + 0x762A, 0x5F6C, 0x658C, 0x6FD2, 0x6EE8, 0x5BBE, 0x6448, 0x5175, + 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x997C, 0x70B3, 0x775D, 0x775E, + 0x775F, 0x7760, 0x7764, 0x7767, 0x7769, 0x776A, 0x776D, 0x776E, + 0x776F, 0x7770, 0x7771, 0x7772, 0x7773, 0x7774, 0x7775, 0x7776, + 0x7777, 0x7778, 0x777A, 0x777B, 0x777C, 0x7781, 0x7782, 0x7783, + 0x7786, 0x7787, 0x7788, 0x7789, 0x778A, 0x778B, 0x778F, 0x7790, + 0x7793, 0x7794, 0x7795, 0x7796, 0x7797, 0x7798, 0x7799, 0x779A, + 0x779B, 0x779C, 0x779D, 0x779E, 0x77A1, 0x77A3, 0x77A4, 0x77A6, + 0x77A8, 0x77AB, 0x77AD, 0x77AE, 0x77AF, 0x77B1, 0x77B2, 0x77B4, + 0x77B6, 0x77B7, 0x77B8, 0x77B9, 0x77BA, 0x77BC, 0x77BE, 0x77C0, + 0x77C1, 0x77C2, 0x77C3, 0x77C4, 0x77C5, 0x77C6, 0x77C7, 0x77C8, + 0x77C9, 0x77CA, 0x77CB, 0x77CC, 0x77CE, 0x77CF, 0x77D0, 0x77D1, + 0x77D2, 0x77D3, 0x77D4, 0x77D5, 0x77D6, 0x77D8, 0x77D9, 0x77DA, + 0x77DD, 0x77DE, 0x77DF, 0x77E0, 0x77E1, 0x77E4, 0x75C5, 0x5E76, + 0x73BB, 0x83E0, 0x64AD, 0x62E8, 0x94B5, 0x6CE2, 0x535A, 0x52C3, + 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B, 0x8236, 0x8116, 0x818A, + 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C, 0x54FA, 0x8865, 0x57E0, + 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, 0x6016, 0x64E6, 0x731C, + 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C, 0x8E29, 0x91C7, 0x5F69, + 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695, 0x6B8B, 0x60ED, 0x60E8, + 0x707F, 0x82CD, 0x8231, 0x4ED3, 0x6CA7, 0x85CF, 0x64CD, 0x7CD9, + 0x69FD, 0x66F9, 0x8349, 0x5395, 0x7B56, 0x4FA7, 0x518C, 0x6D4B, +plane 38 +at 0x00 + 0x5C42, 0x8E6D, 0x63D2, 0x53C9, 0x832C, 0x8336, 0x67E5, 0x78B4, + 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8BE7, 0x62C6, 0x67F4, 0x8C7A, + 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17, 0x7F20, 0x94F2, 0x4EA7, + 0x9610, 0x98A4, 0x660C, 0x7316, 0x77E6, 0x77E8, 0x77EA, 0x77EF, + 0x77F0, 0x77F1, 0x77F2, 0x77F4, 0x77F5, 0x77F7, 0x77F9, 0x77FA, + 0x77FB, 0x77FC, 0x7803, 0x7804, 0x7805, 0x7806, 0x7807, 0x7808, + 0x780A, 0x780B, 0x780E, 0x780F, 0x7810, 0x7813, 0x7815, 0x7819, + 0x781B, 0x781E, 0x7820, 0x7821, 0x7822, 0x7824, 0x7828, 0x782A, + 0x782B, 0x782E, 0x782F, 0x7831, 0x7832, 0x7833, 0x7835, 0x7836, + 0x783D, 0x783F, 0x7841, 0x7842, 0x7843, 0x7844, 0x7846, 0x7848, + 0x7849, 0x784A, 0x784B, 0x784D, 0x784F, 0x7851, 0x7853, 0x7854, + 0x7858, 0x7859, 0x785A, 0x785B, 0x785C, 0x785E, 0x785F, 0x7860, + 0x7861, 0x7862, 0x7863, 0x7864, 0x7865, 0x7866, 0x7867, 0x7868, + 0x7869, 0x786F, 0x7870, 0x7871, 0x7872, 0x7873, 0x7874, 0x7875, + 0x7876, 0x7878, 0x7879, 0x787A, 0x787B, 0x787D, 0x787E, 0x787F, + 0x7880, 0x7881, 0x7882, 0x7883, 0x573A, 0x5C1D, 0x5E38, 0x957F, + 0x507F, 0x80A0, 0x5382, 0x655E, 0x7545, 0x5531, 0x5021, 0x8D85, + 0x6284, 0x949E, 0x671D, 0x5632, 0x6F6E, 0x5DE2, 0x5435, 0x7092, + 0x8F66, 0x626F, 0x64A4, 0x63A3, 0x5F7B, 0x6F88, 0x90F4, 0x81E3, + 0x8FB0, 0x5C18, 0x6668, 0x5FF1, 0x6C89, 0x9648, 0x8D81, 0x886C, + 0x6491, 0x79F0, 0x57CE, 0x6A59, 0x6210, 0x5448, 0x4E58, 0x7A0B, + 0x60E9, 0x6F84, 0x8BDA, 0x627F, 0x901E, 0x9A8B, 0x79E4, 0x5403, + 0x75F4, 0x6301, 0x5319, 0x6C60, 0x8FDF, 0x5F1B, 0x9A70, 0x803B, + 0x9F7F, 0x4F88, 0x5C3A, 0x8D64, 0x7FC5, 0x65A5, 0x70BD, 0x5145, + 0x51B2, 0x866B, 0x5D07, 0x5BA0, 0x62BD, 0x916C, 0x7574, 0x8E0C, + 0x7A20, 0x6101, 0x7B79, 0x4EC7, 0x7EF8, 0x7785, 0x4E11, 0x81ED, + 0x521D, 0x51FA, 0x6A71, 0x53A8, 0x8E87, 0x9504, 0x96CF, 0x6EC1, + 0x9664, 0x695A, 0x7884, 0x7885, 0x7886, 0x7888, 0x788A, 0x788B, + 0x788F, 0x7890, 0x7892, 0x7894, 0x7895, 0x7896, 0x7899, 0x789D, + 0x789E, 0x78A0, 0x78A2, 0x78A4, 0x78A6, 0x78A8, 0x78A9, 0x78AA, + 0x78AB, 0x78AC, 0x78AD, 0x78AE, 0x78AF, 0x78B5, 0x78B6, 0x78B7, + 0x78B8, 0x78BA, 0x78BB, 0x78BC, 0x78BD, 0x78BF, 0x78C0, 0x78C2, +plane 39 +at 0x00 + 0x78C3, 0x78C4, 0x78C6, 0x78C7, 0x78C8, 0x78CC, 0x78CD, 0x78CE, + 0x78CF, 0x78D1, 0x78D2, 0x78D3, 0x78D6, 0x78D7, 0x78D8, 0x78DA, + 0x78DB, 0x78DC, 0x78DD, 0x78DE, 0x78DF, 0x78E0, 0x78E1, 0x78E2, + 0x78E3, 0x78E4, 0x78E5, 0x78E6, 0x78E7, 0x78E9, 0x78EA, 0x78EB, + 0x78ED, 0x78EE, 0x78EF, 0x78F0, 0x78F1, 0x78F3, 0x78F5, 0x78F6, + 0x78F8, 0x78F9, 0x78FB, 0x78FC, 0x78FD, 0x78FE, 0x78FF, 0x7900, + 0x7902, 0x7903, 0x7904, 0x7906, 0x7907, 0x7908, 0x7909, 0x790A, + 0x790B, 0x790C, 0x7840, 0x50A8, 0x77D7, 0x6410, 0x89E6, 0x5904, + 0x63E3, 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239, 0x5598, 0x4E32, + 0x75AE, 0x7A97, 0x5E62, 0x5E8A, 0x95EF, 0x521B, 0x5439, 0x708A, + 0x6376, 0x9524, 0x5782, 0x6625, 0x693F, 0x9187, 0x5507, 0x6DF3, + 0x7EAF, 0x8822, 0x6233, 0x7EF0, 0x75B5, 0x8328, 0x78C1, 0x96CC, + 0x8F9E, 0x6148, 0x74F7, 0x8BCD, 0x6B64, 0x523A, 0x8D50, 0x6B21, + 0x806A, 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B, 0x51D1, 0x7C97, + 0x918B, 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C, 0x6467, 0x5D14, + 0x50AC, 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0, 0x6751, 0x5B58, + 0x5BF8, 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B, 0x9519, 0x642D, + 0x8FBE, 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6B79, 0x50A3, + 0x6234, 0x5E26, 0x6B86, 0x4EE3, 0x8D37, 0x888B, 0x5F85, 0x902E, + 0x790D, 0x790E, 0x790F, 0x7910, 0x7911, 0x7912, 0x7914, 0x7915, + 0x7916, 0x7917, 0x7918, 0x7919, 0x791A, 0x791B, 0x791C, 0x791D, + 0x791F, 0x7920, 0x7921, 0x7922, 0x7923, 0x7925, 0x7926, 0x7927, + 0x7928, 0x7929, 0x792A, 0x792B, 0x792C, 0x792D, 0x792E, 0x792F, + 0x7930, 0x7931, 0x7932, 0x7933, 0x7935, 0x7936, 0x7937, 0x7938, + 0x7939, 0x793D, 0x793F, 0x7942, 0x7943, 0x7944, 0x7945, 0x7947, + 0x794A, 0x794B, 0x794C, 0x794D, 0x794E, 0x794F, 0x7950, 0x7951, + 0x7952, 0x7954, 0x7955, 0x7958, 0x7959, 0x7961, 0x7963, 0x7964, + 0x7966, 0x7969, 0x796A, 0x796B, 0x796C, 0x796E, 0x7970, 0x7971, + 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7979, 0x797B, 0x797C, + 0x797D, 0x797E, 0x797F, 0x7982, 0x7983, 0x7986, 0x7987, 0x7988, + 0x7989, 0x798B, 0x798C, 0x798D, 0x798E, 0x7990, 0x7991, 0x7992, + 0x6020, 0x803D, 0x62C5, 0x4E39, 0x5355, 0x90F8, 0x63B8, 0x80C6, +plane 40 +at 0x00 + 0x65E6, 0x6C2E, 0x4F46, 0x60EE, 0x6DE1, 0x8BDE, 0x5F39, 0x86CB, + 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, 0x5200, 0x6363, 0x8E48, + 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B, 0x60BC, 0x9053, + 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F, 0x767B, 0x7B49, + 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4, 0x8FEA, 0x654C, + 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5, 0x5E95, 0x5730, + 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14, 0x98A0, 0x6382, + 0x6EC7, 0x7898, 0x70B9, 0x5178, 0x975B, 0x57AB, 0x7535, 0x4F43, + 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6DC0, 0x6BBF, 0x7889, 0x53FC, + 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x9493, 0x8C03, 0x8DCC, + 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, 0x53E0, 0x7993, 0x7994, + 0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x799B, 0x799C, 0x799D, + 0x799E, 0x799F, 0x79A0, 0x79A1, 0x79A2, 0x79A3, 0x79A4, 0x79A5, + 0x79A6, 0x79A8, 0x79A9, 0x79AA, 0x79AB, 0x79AC, 0x79AD, 0x79AE, + 0x79AF, 0x79B0, 0x79B1, 0x79B2, 0x79B4, 0x79B5, 0x79B6, 0x79B7, + 0x79B8, 0x79BC, 0x79BF, 0x79C2, 0x79C4, 0x79C5, 0x79C7, 0x79C8, + 0x79CA, 0x79CC, 0x79CE, 0x79CF, 0x79D0, 0x79D3, 0x79D4, 0x79D6, + 0x79D7, 0x79D9, 0x79DA, 0x79DB, 0x79DC, 0x79DD, 0x79DE, 0x79E0, + 0x79E1, 0x79E2, 0x79E5, 0x79E8, 0x79EA, 0x79EC, 0x79EE, 0x79F1, + 0x79F2, 0x79F3, 0x79F4, 0x79F5, 0x79F6, 0x79F7, 0x79F9, 0x79FA, + 0x79FC, 0x79FE, 0x79FF, 0x7A01, 0x7A04, 0x7A05, 0x7A07, 0x7A08, + 0x7A09, 0x7A0A, 0x7A0C, 0x7A0F, 0x7A10, 0x7A11, 0x7A12, 0x7A13, + 0x7A15, 0x7A16, 0x7A18, 0x7A19, 0x7A1B, 0x7A1C, 0x4E01, 0x76EF, + 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D, 0x5B9A, 0x8BA2, 0x4E22, + 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8, 0x680B, 0x4F97, 0x606B, + 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597, 0x9661, 0x8C46, 0x9017, + 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A, 0x72EC, 0x8BFB, 0x5835, + 0x7779, 0x8D4C, 0x675C, 0x9540, 0x809A, 0x5EA6, 0x6E21, 0x5992, + 0x7AEF, 0x77ED, 0x953B, 0x6BB5, 0x65AD, 0x7F0E, 0x5806, 0x5151, + 0x961F, 0x5BF9, 0x58A9, 0x5428, 0x8E72, 0x6566, 0x987F, 0x56E4, + 0x949D, 0x76FE, 0x9041, 0x6387, 0x54C6, 0x591A, 0x593A, 0x579B, + 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241, 0x60F0, 0x5815, 0x86FE, +plane 41 +at 0x00 + 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9, 0x5A25, 0x6076, 0x5384, + 0x627C, 0x904F, 0x9102, 0x997F, 0x6069, 0x800C, 0x513F, 0x8033, + 0x5C14, 0x9975, 0x6D31, 0x4E8C, 0x7A1D, 0x7A1F, 0x7A21, 0x7A22, + 0x7A24, 0x7A25, 0x7A26, 0x7A27, 0x7A28, 0x7A29, 0x7A2A, 0x7A2B, + 0x7A2C, 0x7A2D, 0x7A2E, 0x7A2F, 0x7A30, 0x7A31, 0x7A32, 0x7A34, + 0x7A35, 0x7A36, 0x7A38, 0x7A3A, 0x7A3E, 0x7A40, 0x7A41, 0x7A42, + 0x7A43, 0x7A44, 0x7A45, 0x7A47, 0x7A48, 0x7A49, 0x7A4A, 0x7A4B, + 0x7A4C, 0x7A4D, 0x7A4E, 0x7A4F, 0x7A50, 0x7A52, 0x7A53, 0x7A54, + 0x7A55, 0x7A56, 0x7A58, 0x7A59, 0x7A5A, 0x7A5B, 0x7A5C, 0x7A5D, + 0x7A5E, 0x7A5F, 0x7A60, 0x7A61, 0x7A62, 0x7A63, 0x7A64, 0x7A65, + 0x7A66, 0x7A67, 0x7A68, 0x7A69, 0x7A6A, 0x7A6B, 0x7A6C, 0x7A6D, + 0x7A6E, 0x7A6F, 0x7A71, 0x7A72, 0x7A73, 0x7A75, 0x7A7B, 0x7A7C, + 0x7A7D, 0x7A7E, 0x7A82, 0x7A85, 0x7A87, 0x7A89, 0x7A8A, 0x7A8B, + 0x7A8C, 0x7A8E, 0x7A8F, 0x7A90, 0x7A93, 0x7A94, 0x7A99, 0x7A9A, + 0x7A9B, 0x7A9E, 0x7AA1, 0x7AA2, 0x8D30, 0x53D1, 0x7F5A, 0x7B4F, + 0x4F10, 0x4E4F, 0x9600, 0x6CD5, 0x73D0, 0x85E9, 0x5E06, 0x756A, + 0x7FFB, 0x6A0A, 0x77FE, 0x9492, 0x7E41, 0x51E1, 0x70E6, 0x53CD, + 0x8FD4, 0x8303, 0x8D29, 0x72AF, 0x996D, 0x6CDB, 0x574A, 0x82B3, + 0x65B9, 0x80AA, 0x623F, 0x9632, 0x59A8, 0x4EFF, 0x8BBF, 0x7EBA, + 0x653E, 0x83F2, 0x975E, 0x5561, 0x98DE, 0x80A5, 0x532A, 0x8BFD, + 0x5420, 0x80BA, 0x5E9F, 0x6CB8, 0x8D39, 0x82AC, 0x915A, 0x5429, + 0x6C1B, 0x5206, 0x7EB7, 0x575F, 0x711A, 0x6C7E, 0x7C89, 0x594B, + 0x4EFD, 0x5FFF, 0x6124, 0x7CAA, 0x4E30, 0x5C01, 0x67AB, 0x8702, + 0x5CF0, 0x950B, 0x98CE, 0x75AF, 0x70FD, 0x9022, 0x51AF, 0x7F1D, + 0x8BBD, 0x5949, 0x51E4, 0x4F5B, 0x5426, 0x592B, 0x6577, 0x80A4, + 0x5B75, 0x6276, 0x62C2, 0x8F90, 0x5E45, 0x6C1F, 0x7B26, 0x4F0F, + 0x4FD8, 0x670D, 0x7AA3, 0x7AA4, 0x7AA7, 0x7AA9, 0x7AAA, 0x7AAB, + 0x7AAE, 0x7AAF, 0x7AB0, 0x7AB1, 0x7AB2, 0x7AB4, 0x7AB5, 0x7AB6, + 0x7AB7, 0x7AB8, 0x7AB9, 0x7ABA, 0x7ABB, 0x7ABC, 0x7ABD, 0x7ABE, + 0x7AC0, 0x7AC1, 0x7AC2, 0x7AC3, 0x7AC4, 0x7AC5, 0x7AC6, 0x7AC7, + 0x7AC8, 0x7AC9, 0x7ACA, 0x7ACC, 0x7ACD, 0x7ACE, 0x7ACF, 0x7AD0, + 0x7AD1, 0x7AD2, 0x7AD3, 0x7AD4, 0x7AD5, 0x7AD7, 0x7AD8, 0x7ADA, +plane 42 +at 0x00 + 0x7ADB, 0x7ADC, 0x7ADD, 0x7AE1, 0x7AE2, 0x7AE4, 0x7AE7, 0x7AE8, + 0x7AE9, 0x7AEA, 0x7AEB, 0x7AEC, 0x7AEE, 0x7AF0, 0x7AF1, 0x7AF2, + 0x7AF3, 0x7AF4, 0x7AF5, 0x7AF6, 0x7AF7, 0x7AF8, 0x7AFB, 0x7AFC, + 0x7AFE, 0x7B00, 0x7B01, 0x7B02, 0x7B05, 0x7B07, 0x7B09, 0x7B0C, + 0x7B0D, 0x7B0E, 0x7B10, 0x7B12, 0x7B13, 0x7B16, 0x7B17, 0x7B18, + 0x7B1A, 0x7B1C, 0x7B1D, 0x7B1F, 0x7B21, 0x7B22, 0x7B23, 0x7B27, + 0x7B29, 0x7B2D, 0x6D6E, 0x6DAA, 0x798F, 0x88B1, 0x5F17, 0x752B, + 0x629A, 0x8F85, 0x4FEF, 0x91DC, 0x65A7, 0x812F, 0x8151, 0x5E9C, + 0x8150, 0x8D74, 0x526F, 0x8986, 0x8D4B, 0x590D, 0x5085, 0x4ED8, + 0x961C, 0x7236, 0x8179, 0x8D1F, 0x5BCC, 0x8BA3, 0x9644, 0x5987, + 0x7F1A, 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539, 0x6982, 0x9499, + 0x76D6, 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1, 0x7AFF, 0x809D, + 0x8D76, 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188, 0x521A, 0x94A2, + 0x7F38, 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760, 0x7BD9, 0x768B, + 0x9AD8, 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550, 0x7A3F, 0x544A, + 0x54E5, 0x6B4C, 0x6401, 0x6208, 0x9E3D, 0x80F3, 0x7599, 0x5272, + 0x9769, 0x845B, 0x683C, 0x86E4, 0x9601, 0x9694, 0x94EC, 0x4E2A, + 0x5404, 0x7ED9, 0x6839, 0x8DDF, 0x8015, 0x66F4, 0x5E9A, 0x7FB9, + 0x7B2F, 0x7B30, 0x7B32, 0x7B34, 0x7B35, 0x7B36, 0x7B37, 0x7B39, + 0x7B3B, 0x7B3D, 0x7B3F, 0x7B40, 0x7B41, 0x7B42, 0x7B43, 0x7B44, + 0x7B46, 0x7B48, 0x7B4A, 0x7B4D, 0x7B4E, 0x7B53, 0x7B55, 0x7B57, + 0x7B59, 0x7B5C, 0x7B5E, 0x7B5F, 0x7B61, 0x7B63, 0x7B64, 0x7B65, + 0x7B66, 0x7B67, 0x7B68, 0x7B69, 0x7B6A, 0x7B6B, 0x7B6C, 0x7B6D, + 0x7B6F, 0x7B70, 0x7B73, 0x7B74, 0x7B76, 0x7B78, 0x7B7A, 0x7B7C, + 0x7B7D, 0x7B7F, 0x7B81, 0x7B82, 0x7B83, 0x7B84, 0x7B86, 0x7B87, + 0x7B88, 0x7B89, 0x7B8A, 0x7B8B, 0x7B8C, 0x7B8E, 0x7B8F, 0x7B91, + 0x7B92, 0x7B93, 0x7B96, 0x7B98, 0x7B99, 0x7B9A, 0x7B9B, 0x7B9E, + 0x7B9F, 0x7BA0, 0x7BA3, 0x7BA4, 0x7BA5, 0x7BAE, 0x7BAF, 0x7BB0, + 0x7BB2, 0x7BB3, 0x7BB5, 0x7BB6, 0x7BB7, 0x7BB9, 0x7BBA, 0x7BBB, + 0x7BBC, 0x7BBD, 0x7BBE, 0x7BBF, 0x7BC0, 0x7BC2, 0x7BC3, 0x7BC4, + 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F, 0x606D, 0x9F9A, + 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9, 0x6C5E, 0x62F1, +plane 43 +at 0x00 + 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF, 0x72D7, 0x57A2, + 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495, 0x7B8D, 0x4F30, + 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA, 0x9AA8, 0x8C37, + 0x80A1, 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E, 0x74DC, 0x5250, + 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A, 0x68FA, 0x5173, + 0x5B98, 0x51A0, 0x89C2, 0x7BA1, 0x9986, 0x7F50, 0x60EF, 0x704C, + 0x8D2F, 0x5149, 0x5E7F, 0x901B, 0x7470, 0x89C4, 0x572D, 0x7845, + 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, 0x8BE1, 0x7678, 0x6842, + 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA, 0x68CD, 0x9505, + 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8, 0x7BC5, 0x7BC8, + 0x7BC9, 0x7BCA, 0x7BCB, 0x7BCD, 0x7BCE, 0x7BCF, 0x7BD0, 0x7BD2, + 0x7BD4, 0x7BD5, 0x7BD6, 0x7BD7, 0x7BD8, 0x7BDB, 0x7BDC, 0x7BDE, + 0x7BDF, 0x7BE0, 0x7BE2, 0x7BE3, 0x7BE4, 0x7BE7, 0x7BE8, 0x7BE9, + 0x7BEB, 0x7BEC, 0x7BED, 0x7BEF, 0x7BF0, 0x7BF2, 0x7BF3, 0x7BF4, + 0x7BF5, 0x7BF6, 0x7BF8, 0x7BF9, 0x7BFA, 0x7BFB, 0x7BFD, 0x7BFF, + 0x7C00, 0x7C01, 0x7C02, 0x7C03, 0x7C04, 0x7C05, 0x7C06, 0x7C08, + 0x7C09, 0x7C0A, 0x7C0D, 0x7C0E, 0x7C10, 0x7C11, 0x7C12, 0x7C13, + 0x7C14, 0x7C15, 0x7C17, 0x7C18, 0x7C19, 0x7C1A, 0x7C1B, 0x7C1C, + 0x7C1D, 0x7C1E, 0x7C20, 0x7C21, 0x7C22, 0x7C23, 0x7C24, 0x7C25, + 0x7C28, 0x7C29, 0x7C2B, 0x7C2C, 0x7C2D, 0x7C2E, 0x7C2F, 0x7C30, + 0x7C31, 0x7C32, 0x7C33, 0x7C34, 0x7C35, 0x7C36, 0x7C37, 0x7C39, + 0x7C3A, 0x7C3B, 0x7C3C, 0x7C3D, 0x7C3E, 0x7C42, 0x9AB8, 0x5B69, + 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87, 0x9163, 0x61A8, 0x90AF, + 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD, 0x558A, 0x7F55, 0x7FF0, + 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D, 0x710A, 0x6C57, 0x6C49, + 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E, 0x8C6A, 0x6BEB, 0x90DD, + 0x597D, 0x8017, 0x53F7, 0x6D69, 0x5475, 0x559D, 0x8377, 0x83CF, + 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408, 0x76D2, 0x8C89, 0x9602, + 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64, 0x8D3A, 0x563F, 0x9ED1, + 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC, 0x4EA8, 0x6A2A, 0x8861, + 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679, 0x9E3F, 0x6D2A, 0x5B8F, + 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334, 0x543C, 0x539A, 0x5019, +plane 44 +at 0x00 + 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A, 0x58F6, 0x846B, 0x80E1, + 0x8774, 0x72D0, 0x7CCA, 0x6E56, 0x7C43, 0x7C44, 0x7C45, 0x7C46, + 0x7C47, 0x7C48, 0x7C49, 0x7C4A, 0x7C4B, 0x7C4C, 0x7C4E, 0x7C4F, + 0x7C50, 0x7C51, 0x7C52, 0x7C53, 0x7C54, 0x7C55, 0x7C56, 0x7C57, + 0x7C58, 0x7C59, 0x7C5A, 0x7C5B, 0x7C5C, 0x7C5D, 0x7C5E, 0x7C5F, + 0x7C60, 0x7C61, 0x7C62, 0x7C63, 0x7C64, 0x7C65, 0x7C66, 0x7C67, + 0x7C68, 0x7C69, 0x7C6A, 0x7C6B, 0x7C6C, 0x7C6D, 0x7C6E, 0x7C6F, + 0x7C70, 0x7C71, 0x7C72, 0x7C75, 0x7C76, 0x7C77, 0x7C78, 0x7C79, + 0x7C7A, 0x7C7E, 0x7C7F, 0x7C80, 0x7C81, 0x7C82, 0x7C83, 0x7C84, + 0x7C85, 0x7C86, 0x7C87, 0x7C88, 0x7C8A, 0x7C8B, 0x7C8C, 0x7C8D, + 0x7C8E, 0x7C8F, 0x7C90, 0x7C93, 0x7C94, 0x7C96, 0x7C99, 0x7C9A, + 0x7C9B, 0x7CA0, 0x7CA1, 0x7CA3, 0x7CA6, 0x7CA7, 0x7CA8, 0x7CA9, + 0x7CAB, 0x7CAC, 0x7CAD, 0x7CAF, 0x7CB0, 0x7CB4, 0x7CB5, 0x7CB6, + 0x7CB7, 0x7CB8, 0x7CBA, 0x7CBB, 0x5F27, 0x864E, 0x552C, 0x62A4, + 0x4E92, 0x6CAA, 0x6237, 0x82B1, 0x54D7, 0x534E, 0x733E, 0x6ED1, + 0x753B, 0x5212, 0x5316, 0x8BDD, 0x69D0, 0x5F8A, 0x6000, 0x6DEE, + 0x574F, 0x6B22, 0x73AF, 0x6853, 0x8FD8, 0x7F13, 0x6362, 0x60A3, + 0x5524, 0x75EA, 0x8C62, 0x7115, 0x6DA3, 0x5BA6, 0x5E7B, 0x8352, + 0x614C, 0x9EC4, 0x78FA, 0x8757, 0x7C27, 0x7687, 0x51F0, 0x60F6, + 0x714C, 0x6643, 0x5E4C, 0x604D, 0x8C0E, 0x7070, 0x6325, 0x8F89, + 0x5FBD, 0x6062, 0x86D4, 0x56DE, 0x6BC1, 0x6094, 0x6167, 0x5349, + 0x60E0, 0x6666, 0x8D3F, 0x79FD, 0x4F1A, 0x70E9, 0x6C47, 0x8BB3, + 0x8BF2, 0x7ED8, 0x8364, 0x660F, 0x5A5A, 0x9B42, 0x6D51, 0x6DF7, + 0x8C41, 0x6D3B, 0x4F19, 0x706B, 0x83B7, 0x6216, 0x60D1, 0x970D, + 0x8D27, 0x7978, 0x51FB, 0x573E, 0x57FA, 0x673A, 0x7578, 0x7A3D, + 0x79EF, 0x7B95, 0x7CBF, 0x7CC0, 0x7CC2, 0x7CC3, 0x7CC4, 0x7CC6, + 0x7CC9, 0x7CCB, 0x7CCE, 0x7CCF, 0x7CD0, 0x7CD1, 0x7CD2, 0x7CD3, + 0x7CD4, 0x7CD8, 0x7CDA, 0x7CDB, 0x7CDD, 0x7CDE, 0x7CE1, 0x7CE2, + 0x7CE3, 0x7CE4, 0x7CE5, 0x7CE6, 0x7CE7, 0x7CE9, 0x7CEA, 0x7CEB, + 0x7CEC, 0x7CED, 0x7CEE, 0x7CF0, 0x7CF1, 0x7CF2, 0x7CF3, 0x7CF4, + 0x7CF5, 0x7CF6, 0x7CF7, 0x7CF9, 0x7CFA, 0x7CFC, 0x7CFD, 0x7CFE, + 0x7CFF, 0x7D00, 0x7D01, 0x7D02, 0x7D03, 0x7D04, 0x7D05, 0x7D06, +plane 45 +at 0x00 + 0x7D07, 0x7D08, 0x7D09, 0x7D0B, 0x7D0C, 0x7D0D, 0x7D0E, 0x7D0F, + 0x7D10, 0x7D11, 0x7D12, 0x7D13, 0x7D14, 0x7D15, 0x7D16, 0x7D17, + 0x7D18, 0x7D19, 0x7D1A, 0x7D1B, 0x7D1C, 0x7D1D, 0x7D1E, 0x7D1F, + 0x7D21, 0x7D23, 0x7D24, 0x7D25, 0x7D26, 0x7D28, 0x7D29, 0x7D2A, + 0x7D2C, 0x7D2D, 0x7D2E, 0x7D30, 0x7D31, 0x7D32, 0x7D33, 0x7D34, + 0x7D35, 0x7D36, 0x808C, 0x9965, 0x8FF9, 0x6FC0, 0x8BA5, 0x9E21, + 0x59EC, 0x7EE9, 0x7F09, 0x5409, 0x6781, 0x68D8, 0x8F91, 0x7C4D, + 0x96C6, 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373, 0x5AC9, 0x7EA7, + 0x6324, 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280, 0x5180, 0x5B63, + 0x4F0E, 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4, 0x5BC2, 0x8BA1, + 0x8BB0, 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7, 0x7EAA, 0x5609, + 0x67B7, 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A, 0x988A, 0x8D3E, + 0x7532, 0x94BE, 0x5047, 0x7A3C, 0x4EF7, 0x67B6, 0x9A7E, 0x5AC1, + 0x6B7C, 0x76D1, 0x575A, 0x5C16, 0x7B3A, 0x95F4, 0x714E, 0x517C, + 0x80A9, 0x8270, 0x5978, 0x7F04, 0x8327, 0x68C0, 0x67EC, 0x78B1, + 0x7877, 0x62E3, 0x6361, 0x7B80, 0x4FED, 0x526A, 0x51CF, 0x8350, + 0x69DB, 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E, 0x7BAD, 0x4EF6, + 0x7D37, 0x7D38, 0x7D39, 0x7D3A, 0x7D3B, 0x7D3C, 0x7D3D, 0x7D3E, + 0x7D3F, 0x7D40, 0x7D41, 0x7D42, 0x7D43, 0x7D44, 0x7D45, 0x7D46, + 0x7D47, 0x7D48, 0x7D49, 0x7D4A, 0x7D4B, 0x7D4C, 0x7D4D, 0x7D4E, + 0x7D4F, 0x7D50, 0x7D51, 0x7D52, 0x7D53, 0x7D54, 0x7D55, 0x7D56, + 0x7D57, 0x7D58, 0x7D59, 0x7D5A, 0x7D5B, 0x7D5C, 0x7D5D, 0x7D5E, + 0x7D5F, 0x7D60, 0x7D61, 0x7D62, 0x7D63, 0x7D64, 0x7D65, 0x7D66, + 0x7D67, 0x7D68, 0x7D69, 0x7D6A, 0x7D6B, 0x7D6C, 0x7D6D, 0x7D6F, + 0x7D70, 0x7D71, 0x7D72, 0x7D73, 0x7D74, 0x7D75, 0x7D76, 0x7D78, + 0x7D79, 0x7D7A, 0x7D7B, 0x7D7C, 0x7D7D, 0x7D7E, 0x7D7F, 0x7D80, + 0x7D81, 0x7D82, 0x7D83, 0x7D84, 0x7D85, 0x7D86, 0x7D87, 0x7D88, + 0x7D89, 0x7D8A, 0x7D8B, 0x7D8C, 0x7D8D, 0x7D8E, 0x7D8F, 0x7D90, + 0x7D91, 0x7D92, 0x7D93, 0x7D94, 0x7D95, 0x7D96, 0x7D97, 0x7D98, + 0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85, 0x6DA7, 0x5EFA, + 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586, 0x848B, 0x6868, + 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549, 0x6912, 0x7901, +plane 46 +at 0x00 + 0x7126, 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84, 0x5A07, 0x56BC, + 0x6405, 0x94F0, 0x77EB, 0x4FA5, 0x811A, 0x72E1, 0x89D2, 0x997A, + 0x7F34, 0x7EDE, 0x527F, 0x6559, 0x9175, 0x8F7F, 0x8F83, 0x53EB, + 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857, 0x9636, 0x622A, + 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, 0x776B, 0x7AED, 0x6D01, + 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5, 0x754C, 0x501F, + 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B, 0x65A4, 0x91D1, + 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5, 0x8C28, 0x8FDB, + 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78, 0x7D99, 0x7D9A, + 0x7D9B, 0x7D9C, 0x7D9D, 0x7D9E, 0x7D9F, 0x7DA0, 0x7DA1, 0x7DA2, + 0x7DA3, 0x7DA4, 0x7DA5, 0x7DA7, 0x7DA8, 0x7DA9, 0x7DAA, 0x7DAB, + 0x7DAC, 0x7DAD, 0x7DAF, 0x7DB0, 0x7DB1, 0x7DB2, 0x7DB3, 0x7DB4, + 0x7DB5, 0x7DB6, 0x7DB7, 0x7DB8, 0x7DB9, 0x7DBA, 0x7DBB, 0x7DBC, + 0x7DBD, 0x7DBE, 0x7DBF, 0x7DC0, 0x7DC1, 0x7DC2, 0x7DC3, 0x7DC4, + 0x7DC5, 0x7DC6, 0x7DC7, 0x7DC8, 0x7DC9, 0x7DCA, 0x7DCB, 0x7DCC, + 0x7DCD, 0x7DCE, 0x7DCF, 0x7DD0, 0x7DD1, 0x7DD2, 0x7DD3, 0x7DD4, + 0x7DD5, 0x7DD6, 0x7DD7, 0x7DD8, 0x7DD9, 0x7DDA, 0x7DDB, 0x7DDC, + 0x7DDD, 0x7DDE, 0x7DDF, 0x7DE0, 0x7DE1, 0x7DE2, 0x7DE3, 0x7DE4, + 0x7DE5, 0x7DE6, 0x7DE7, 0x7DE8, 0x7DE9, 0x7DEA, 0x7DEB, 0x7DEC, + 0x7DED, 0x7DEE, 0x7DEF, 0x7DF0, 0x7DF1, 0x7DF2, 0x7DF3, 0x7DF4, + 0x7DF5, 0x7DF6, 0x7DF7, 0x7DF8, 0x7DF9, 0x7DFA, 0x5C3D, 0x52B2, + 0x8346, 0x5162, 0x830E, 0x775B, 0x6676, 0x9CB8, 0x4EAC, 0x60CA, + 0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, 0x8B66, 0x666F, 0x9888, 0x9759, + 0x5883, 0x656C, 0x955C, 0x5F84, 0x75C9, 0x9756, 0x7ADF, 0x7ADE, + 0x51C0, 0x70AF, 0x7A98, 0x63EA, 0x7A76, 0x7EA0, 0x7396, 0x97ED, + 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9, 0x6551, 0x65E7, 0x81FC, + 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0, 0x62D8, 0x72D9, 0x75BD, + 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480, 0x77E9, 0x4E3E, 0x6CAE, + 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177, 0x8DDD, 0x8E1E, 0x952F, + 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267, 0x6350, 0x9E43, 0x5A1F, + 0x5026, 0x7737, 0x5377, 0x7EE2, 0x6485, 0x652B, 0x6289, 0x6398, + 0x5014, 0x7235, 0x89C9, 0x51B3, 0x8BC0, 0x7EDD, 0x5747, 0x83CC, +plane 47 +at 0x00 + 0x94A7, 0x519B, 0x541B, 0x5CFB, 0x7DFB, 0x7DFC, 0x7DFD, 0x7DFE, + 0x7DFF, 0x7E00, 0x7E01, 0x7E02, 0x7E03, 0x7E04, 0x7E05, 0x7E06, + 0x7E07, 0x7E08, 0x7E09, 0x7E0A, 0x7E0B, 0x7E0C, 0x7E0D, 0x7E0E, + 0x7E0F, 0x7E10, 0x7E11, 0x7E12, 0x7E13, 0x7E14, 0x7E15, 0x7E16, + 0x7E17, 0x7E18, 0x7E19, 0x7E1A, 0x7E1B, 0x7E1C, 0x7E1D, 0x7E1E, + 0x7E1F, 0x7E20, 0x7E21, 0x7E22, 0x7E23, 0x7E24, 0x7E25, 0x7E26, + 0x7E27, 0x7E28, 0x7E29, 0x7E2A, 0x7E2B, 0x7E2C, 0x7E2D, 0x7E2E, + 0x7E2F, 0x7E30, 0x7E31, 0x7E32, 0x7E33, 0x7E34, 0x7E35, 0x7E36, + 0x7E37, 0x7E38, 0x7E39, 0x7E3A, 0x7E3C, 0x7E3D, 0x7E3E, 0x7E3F, + 0x7E40, 0x7E42, 0x7E43, 0x7E44, 0x7E45, 0x7E46, 0x7E48, 0x7E49, + 0x7E4A, 0x7E4B, 0x7E4C, 0x7E4D, 0x7E4E, 0x7E4F, 0x7E50, 0x7E51, + 0x7E52, 0x7E53, 0x7E54, 0x7E55, 0x7E56, 0x7E57, 0x7E58, 0x7E59, + 0x7E5A, 0x7E5B, 0x7E5C, 0x7E5D, 0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, + 0x9A8F, 0x5580, 0x5496, 0x5361, 0x54AF, 0x5F00, 0x63E9, 0x6977, + 0x51EF, 0x6168, 0x520A, 0x582A, 0x52D8, 0x574E, 0x780D, 0x770B, + 0x5EB7, 0x6177, 0x7CE0, 0x625B, 0x6297, 0x4EA2, 0x7095, 0x8003, + 0x62F7, 0x70E4, 0x9760, 0x5777, 0x82DB, 0x67EF, 0x68F5, 0x78D5, + 0x9897, 0x79D1, 0x58F3, 0x54B3, 0x53EF, 0x6E34, 0x514B, 0x523B, + 0x5BA2, 0x8BFE, 0x80AF, 0x5543, 0x57A6, 0x6073, 0x5751, 0x542D, + 0x7A7A, 0x6050, 0x5B54, 0x63A7, 0x62A0, 0x53E3, 0x6263, 0x5BC7, + 0x67AF, 0x54ED, 0x7A9F, 0x82E6, 0x9177, 0x5E93, 0x88E4, 0x5938, + 0x57AE, 0x630E, 0x8DE8, 0x80EF, 0x5757, 0x7B77, 0x4FA9, 0x5FEB, + 0x5BBD, 0x6B3E, 0x5321, 0x7B50, 0x72C2, 0x6846, 0x77FF, 0x7736, + 0x65F7, 0x51B5, 0x4E8F, 0x76D4, 0x5CBF, 0x7AA5, 0x8475, 0x594E, + 0x9B41, 0x5080, 0x7E5E, 0x7E5F, 0x7E60, 0x7E61, 0x7E62, 0x7E63, + 0x7E64, 0x7E65, 0x7E66, 0x7E67, 0x7E68, 0x7E69, 0x7E6A, 0x7E6B, + 0x7E6C, 0x7E6D, 0x7E6E, 0x7E6F, 0x7E70, 0x7E71, 0x7E72, 0x7E73, + 0x7E74, 0x7E75, 0x7E76, 0x7E77, 0x7E78, 0x7E79, 0x7E7A, 0x7E7B, + 0x7E7C, 0x7E7D, 0x7E7E, 0x7E7F, 0x7E80, 0x7E81, 0x7E83, 0x7E84, + 0x7E85, 0x7E86, 0x7E87, 0x7E88, 0x7E89, 0x7E8A, 0x7E8B, 0x7E8C, + 0x7E8D, 0x7E8E, 0x7E8F, 0x7E90, 0x7E91, 0x7E92, 0x7E93, 0x7E94, + 0x7E95, 0x7E96, 0x7E97, 0x7E98, 0x7E99, 0x7E9A, 0x7E9C, 0x7E9D, +plane 48 +at 0x00 + 0x7E9E, 0x7EAE, 0x7EB4, 0x7EBB, 0x7EBC, 0x7ED6, 0x7EE4, 0x7EEC, + 0x7EF9, 0x7F0A, 0x7F10, 0x7F1E, 0x7F37, 0x7F39, 0x7F3B, 0x7F3C, + 0x7F3D, 0x7F3E, 0x7F3F, 0x7F40, 0x7F41, 0x7F43, 0x7F46, 0x7F47, + 0x7F48, 0x7F49, 0x7F4A, 0x7F4B, 0x7F4C, 0x7F4D, 0x7F4E, 0x7F4F, + 0x7F52, 0x7F53, 0x9988, 0x6127, 0x6E83, 0x5764, 0x6606, 0x6346, + 0x56F0, 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783, 0x62C9, 0x5587, + 0x8721, 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765, 0x8D56, 0x84DD, + 0x5A6A, 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170, 0x6F9C, 0x8C30, + 0x63FD, 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5, 0x7405, 0x6994, + 0x72FC, 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x635E, 0x52B3, 0x7262, + 0x8001, 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6D9D, 0x52D2, 0x4E50, + 0x96F7, 0x956D, 0x857E, 0x78CA, 0x7D2F, 0x5121, 0x5792, 0x64C2, + 0x808B, 0x7C7B, 0x6CEA, 0x68F1, 0x695E, 0x51B7, 0x5398, 0x68A8, + 0x7281, 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13, 0x7406, 0x674E, + 0x91CC, 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F, 0x6817, 0x4E3D, + 0x5389, 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088, 0x4F8B, 0x4FD0, + 0x7F56, 0x7F59, 0x7F5B, 0x7F5C, 0x7F5D, 0x7F5E, 0x7F60, 0x7F63, + 0x7F64, 0x7F65, 0x7F66, 0x7F67, 0x7F6B, 0x7F6C, 0x7F6D, 0x7F6F, + 0x7F70, 0x7F73, 0x7F75, 0x7F76, 0x7F77, 0x7F78, 0x7F7A, 0x7F7B, + 0x7F7C, 0x7F7D, 0x7F7F, 0x7F80, 0x7F82, 0x7F83, 0x7F84, 0x7F85, + 0x7F86, 0x7F87, 0x7F88, 0x7F89, 0x7F8B, 0x7F8D, 0x7F8F, 0x7F90, + 0x7F91, 0x7F92, 0x7F93, 0x7F95, 0x7F96, 0x7F97, 0x7F98, 0x7F99, + 0x7F9B, 0x7F9C, 0x7FA0, 0x7FA2, 0x7FA3, 0x7FA5, 0x7FA6, 0x7FA8, + 0x7FA9, 0x7FAA, 0x7FAB, 0x7FAC, 0x7FAD, 0x7FAE, 0x7FB1, 0x7FB3, + 0x7FB4, 0x7FB5, 0x7FB6, 0x7FB7, 0x7FBA, 0x7FBB, 0x7FBE, 0x7FC0, + 0x7FC2, 0x7FC3, 0x7FC4, 0x7FC6, 0x7FC7, 0x7FC8, 0x7FC9, 0x7FCB, + 0x7FCD, 0x7FCF, 0x7FD0, 0x7FD1, 0x7FD2, 0x7FD3, 0x7FD6, 0x7FD7, + 0x7FD9, 0x7FDA, 0x7FDB, 0x7FDC, 0x7FDD, 0x7FDE, 0x7FE2, 0x7FE3, + 0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B, 0x7483, 0x54E9, + 0x4FE9, 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9, 0x601C, 0x6D9F, + 0x5E18, 0x655B, 0x8138, 0x94FE, 0x604B, 0x70BC, 0x7EC3, 0x7CAE, + 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x4E24, 0x8F86, 0x91CF, 0x667E, +plane 49 +at 0x00 + 0x4EAE, 0x8C05, 0x64A9, 0x804A, 0x50DA, 0x7597, 0x71CE, 0x5BE5, + 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, 0x5ED6, 0x6599, 0x5217, + 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797, 0x78F7, 0x9716, + 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41, 0x541D, 0x62CE, + 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36, 0x7F9A, 0x51CC, + 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4, 0x6E9C, 0x7409, + 0x69B4, 0x786B, 0x998F, 0x7559, 0x5218, 0x7624, 0x6D41, 0x67F3, + 0x516D, 0x9F99, 0x804B, 0x5499, 0x7B3C, 0x7ABF, 0x7FE4, 0x7FE7, + 0x7FE8, 0x7FEA, 0x7FEB, 0x7FEC, 0x7FED, 0x7FEF, 0x7FF2, 0x7FF4, + 0x7FF5, 0x7FF6, 0x7FF7, 0x7FF8, 0x7FF9, 0x7FFA, 0x7FFD, 0x7FFE, + 0x7FFF, 0x8002, 0x8007, 0x8008, 0x8009, 0x800A, 0x800E, 0x800F, + 0x8011, 0x8013, 0x801A, 0x801B, 0x801D, 0x801E, 0x801F, 0x8021, + 0x8023, 0x8024, 0x802B, 0x802C, 0x802D, 0x802E, 0x802F, 0x8030, + 0x8032, 0x8034, 0x8039, 0x803A, 0x803C, 0x803E, 0x8040, 0x8041, + 0x8044, 0x8045, 0x8047, 0x8048, 0x8049, 0x804E, 0x804F, 0x8050, + 0x8051, 0x8053, 0x8055, 0x8056, 0x8057, 0x8059, 0x805B, 0x805C, + 0x805D, 0x805E, 0x805F, 0x8060, 0x8061, 0x8062, 0x8063, 0x8064, + 0x8065, 0x8066, 0x8067, 0x8068, 0x806B, 0x806C, 0x806D, 0x806E, + 0x806F, 0x8070, 0x8072, 0x8073, 0x8074, 0x8075, 0x8076, 0x8077, + 0x8078, 0x8079, 0x807A, 0x807B, 0x807C, 0x807D, 0x9686, 0x5784, + 0x62E2, 0x9647, 0x697C, 0x5A04, 0x6402, 0x7BD3, 0x6F0F, 0x964B, + 0x82A6, 0x5362, 0x9885, 0x5E90, 0x7089, 0x63B3, 0x5364, 0x864F, + 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF, 0x8D42, 0x9E7F, 0x6F5E, + 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74, 0x5415, 0x94DD, 0x4FA3, + 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651, 0x6C2F, 0x5F8B, 0x7387, + 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A, 0x6EE6, 0x5375, 0x4E71, + 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26, 0x4ED1, 0x6CA6, 0x7EB6, + 0x8BBA, 0x841D, 0x87BA, 0x7F57, 0x903B, 0x9523, 0x7BA9, 0x9AA1, + 0x88F8, 0x843D, 0x6D1B, 0x9A86, 0x7EDC, 0x5988, 0x9EBB, 0x739B, + 0x7801, 0x8682, 0x9A6C, 0x9A82, 0x561B, 0x5417, 0x57CB, 0x4E70, + 0x9EA6, 0x5356, 0x8FC8, 0x8109, 0x7792, 0x9992, 0x86EE, 0x6EE1, + 0x8513, 0x66FC, 0x6162, 0x6F2B, 0x807E, 0x8081, 0x8082, 0x8085, +plane 50 +at 0x00 + 0x8088, 0x808A, 0x808D, 0x808E, 0x808F, 0x8090, 0x8091, 0x8092, + 0x8094, 0x8095, 0x8097, 0x8099, 0x809E, 0x80A3, 0x80A6, 0x80A7, + 0x80A8, 0x80AC, 0x80B0, 0x80B3, 0x80B5, 0x80B6, 0x80B8, 0x80B9, + 0x80BB, 0x80C5, 0x80C7, 0x80C8, 0x80C9, 0x80CA, 0x80CB, 0x80CF, + 0x80D0, 0x80D1, 0x80D2, 0x80D3, 0x80D4, 0x80D5, 0x80D8, 0x80DF, + 0x80E0, 0x80E2, 0x80E3, 0x80E6, 0x80EE, 0x80F5, 0x80F7, 0x80F9, + 0x80FB, 0x80FE, 0x80FF, 0x8100, 0x8101, 0x8103, 0x8104, 0x8105, + 0x8107, 0x8108, 0x810B, 0x810C, 0x8115, 0x8117, 0x8119, 0x811B, + 0x811C, 0x811D, 0x811F, 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, + 0x8125, 0x8126, 0x8127, 0x8128, 0x8129, 0x812A, 0x812B, 0x812D, + 0x812E, 0x8130, 0x8133, 0x8134, 0x8135, 0x8137, 0x8139, 0x813A, + 0x813B, 0x813C, 0x813D, 0x813F, 0x8C29, 0x8292, 0x832B, 0x76F2, + 0x6C13, 0x5FD9, 0x83BD, 0x732B, 0x8305, 0x951A, 0x6BDB, 0x77DB, + 0x94C6, 0x536F, 0x8302, 0x5192, 0x5E3D, 0x8C8C, 0x8D38, 0x4E48, + 0x73AB, 0x679A, 0x6885, 0x9176, 0x9709, 0x7164, 0x6CA1, 0x7709, + 0x5A92, 0x9541, 0x6BCF, 0x7F8E, 0x6627, 0x5BD0, 0x59B9, 0x5A9A, + 0x95E8, 0x95F7, 0x4EEC, 0x840C, 0x8499, 0x6AAC, 0x76DF, 0x9530, + 0x731B, 0x68A6, 0x5B5F, 0x772F, 0x919A, 0x9761, 0x7CDC, 0x8FF7, + 0x8C1C, 0x5F25, 0x7C73, 0x79D8, 0x89C5, 0x6CCC, 0x871C, 0x5BC6, + 0x5E42, 0x68C9, 0x7720, 0x7EF5, 0x5195, 0x514D, 0x52C9, 0x5A29, + 0x7F05, 0x9762, 0x82D7, 0x63CF, 0x7784, 0x85D0, 0x79D2, 0x6E3A, + 0x5E99, 0x5999, 0x8511, 0x706D, 0x6C11, 0x62BF, 0x76BF, 0x654F, + 0x60AF, 0x95FD, 0x660E, 0x879F, 0x9E23, 0x94ED, 0x540D, 0x547D, + 0x8C2C, 0x6478, 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, + 0x8147, 0x8149, 0x814D, 0x814E, 0x814F, 0x8152, 0x8156, 0x8157, + 0x8158, 0x815B, 0x815C, 0x815D, 0x815E, 0x815F, 0x8161, 0x8162, + 0x8163, 0x8164, 0x8166, 0x8168, 0x816A, 0x816B, 0x816C, 0x816F, + 0x8172, 0x8173, 0x8175, 0x8176, 0x8177, 0x8178, 0x8181, 0x8183, + 0x8184, 0x8185, 0x8186, 0x8187, 0x8189, 0x818B, 0x818C, 0x818D, + 0x818E, 0x8190, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, + 0x8199, 0x819A, 0x819E, 0x819F, 0x81A0, 0x81A1, 0x81A2, 0x81A4, + 0x81A5, 0x81A7, 0x81A9, 0x81AB, 0x81AC, 0x81AD, 0x81AE, 0x81AF, +plane 51 +at 0x00 + 0x81B0, 0x81B1, 0x81B2, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, + 0x81B9, 0x81BC, 0x81BD, 0x81BE, 0x81BF, 0x81C4, 0x81C5, 0x81C7, + 0x81C8, 0x81C9, 0x81CB, 0x81CD, 0x81CE, 0x81CF, 0x81D0, 0x81D1, + 0x81D2, 0x81D3, 0x6479, 0x8611, 0x6A21, 0x819C, 0x78E8, 0x6469, + 0x9B54, 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8, 0x6CAB, 0x6F20, + 0x5BDE, 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7, 0x7261, 0x4EA9, + 0x59C6, 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF, 0x6155, 0x6728, + 0x76EE, 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA, 0x5450, 0x94A0, + 0x90A3, 0x5A1C, 0x7EB3, 0x6C16, 0x4E43, 0x5976, 0x8010, 0x5948, + 0x5357, 0x7537, 0x96BE, 0x56CA, 0x6320, 0x8111, 0x607C, 0x95F9, + 0x6DD6, 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD, 0x59AE, 0x9713, + 0x502A, 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F, 0x817B, 0x9006, + 0x6EBA, 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5, 0x637B, 0x5FF5, + 0x5A18, 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042, 0x5B7D, 0x556E, + 0x954A, 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE, 0x51DD, 0x5B81, + 0x81D4, 0x81D5, 0x81D6, 0x81D7, 0x81D8, 0x81D9, 0x81DA, 0x81DB, + 0x81DC, 0x81DD, 0x81DE, 0x81DF, 0x81E0, 0x81E1, 0x81E2, 0x81E4, + 0x81E5, 0x81E6, 0x81E8, 0x81E9, 0x81EB, 0x81EE, 0x81EF, 0x81F0, + 0x81F1, 0x81F2, 0x81F5, 0x81F6, 0x81F7, 0x81F8, 0x81F9, 0x81FA, + 0x81FD, 0x81FF, 0x8203, 0x8207, 0x8208, 0x8209, 0x820A, 0x820B, + 0x820E, 0x820F, 0x8211, 0x8213, 0x8215, 0x8216, 0x8217, 0x8218, + 0x8219, 0x821A, 0x821D, 0x8220, 0x8224, 0x8225, 0x8226, 0x8227, + 0x8229, 0x822E, 0x8232, 0x823A, 0x823C, 0x823D, 0x823F, 0x8240, + 0x8241, 0x8242, 0x8243, 0x8245, 0x8246, 0x8248, 0x824A, 0x824C, + 0x824D, 0x824E, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, + 0x8256, 0x8257, 0x8259, 0x825B, 0x825C, 0x825D, 0x825E, 0x8260, + 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, 0x8269, + 0x62E7, 0x6CDE, 0x725B, 0x626D, 0x94AE, 0x7EBD, 0x8113, 0x6D53, + 0x519C, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973, 0x6696, 0x8650, + 0x759F, 0x632A, 0x61E6, 0x7CEF, 0x8BFA, 0x54E6, 0x6B27, 0x9E25, + 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, 0x556A, 0x8DB4, 0x722C, + 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C, 0x5F98, 0x6E43, +plane 52 +at 0x00 + 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC, 0x7554, 0x5224, + 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6, 0x629B, 0x5486, + 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478, 0x80DA, 0x57F9, + 0x88F4, 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B, 0x55B7, 0x76C6, + 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC, 0x68DA, 0x787C, + 0x7BF7, 0x81A8, 0x670B, 0x9E4F, 0x6367, 0x78B0, 0x576F, 0x7812, + 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7, 0x826A, 0x826B, + 0x826C, 0x826D, 0x8271, 0x8275, 0x8276, 0x8277, 0x8278, 0x827B, + 0x827C, 0x8280, 0x8281, 0x8283, 0x8285, 0x8286, 0x8287, 0x8289, + 0x828C, 0x8290, 0x8293, 0x8294, 0x8295, 0x8296, 0x829A, 0x829B, + 0x829E, 0x82A0, 0x82A2, 0x82A3, 0x82A7, 0x82B2, 0x82B5, 0x82B6, + 0x82BA, 0x82BB, 0x82BC, 0x82BF, 0x82C0, 0x82C2, 0x82C3, 0x82C5, + 0x82C6, 0x82C9, 0x82D0, 0x82D6, 0x82D9, 0x82DA, 0x82DD, 0x82E2, + 0x82E7, 0x82E8, 0x82E9, 0x82EA, 0x82EC, 0x82ED, 0x82EE, 0x82F0, + 0x82F2, 0x82F3, 0x82F5, 0x82F6, 0x82F8, 0x82FA, 0x82FC, 0x82FD, + 0x82FE, 0x82FF, 0x8300, 0x830A, 0x830B, 0x830D, 0x8310, 0x8312, + 0x8313, 0x8316, 0x8318, 0x8319, 0x831D, 0x831E, 0x831F, 0x8320, + 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326, 0x8329, 0x832A, + 0x832E, 0x8330, 0x8332, 0x8337, 0x833B, 0x833D, 0x5564, 0x813E, + 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB, 0x5C41, 0x8B6C, 0x7BC7, + 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02, 0x74E2, 0x7968, 0x6487, + 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1, 0x8058, 0x4E52, 0x576A, + 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6, 0x8BC4, 0x5C4F, 0x5761, + 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44, 0x8FEB, 0x7C95, 0x5256, + 0x6251, 0x94FA, 0x4EC6, 0x8386, 0x8461, 0x83E9, 0x84B2, 0x57D4, + 0x6734, 0x5703, 0x666E, 0x6D66, 0x8C31, 0x66DD, 0x7011, 0x671F, + 0x6B3A, 0x6816, 0x621A, 0x59BB, 0x4E03, 0x51C4, 0x6F06, 0x67D2, + 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67, 0x7566, 0x5D0E, 0x8110, + 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91, 0x8D77, 0x5C82, 0x4E5E, + 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668, 0x6C14, 0x8FC4, 0x5F03, + 0x6C7D, 0x6CE3, 0x8BAB, 0x6390, 0x833E, 0x833F, 0x8341, 0x8342, + 0x8344, 0x8345, 0x8348, 0x834A, 0x834B, 0x834C, 0x834D, 0x834E, +plane 53 +at 0x00 + 0x8353, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835D, 0x8362, + 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8379, + 0x837A, 0x837E, 0x837F, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, + 0x8387, 0x8388, 0x838A, 0x838B, 0x838C, 0x838D, 0x838F, 0x8390, + 0x8391, 0x8394, 0x8395, 0x8396, 0x8397, 0x8399, 0x839A, 0x839D, + 0x839F, 0x83A1, 0x83A2, 0x83A3, 0x83A4, 0x83A5, 0x83A6, 0x83A7, + 0x83AC, 0x83AD, 0x83AE, 0x83AF, 0x83B5, 0x83BB, 0x83BE, 0x83BF, + 0x83C2, 0x83C3, 0x83C4, 0x83C6, 0x83C8, 0x83C9, 0x83CB, 0x83CD, + 0x83CE, 0x83D0, 0x83D1, 0x83D2, 0x83D3, 0x83D5, 0x83D7, 0x83D9, + 0x83DA, 0x83DB, 0x83DE, 0x83E2, 0x83E3, 0x83E4, 0x83E6, 0x83E7, + 0x83E8, 0x83EB, 0x83EC, 0x83ED, 0x6070, 0x6D3D, 0x7275, 0x6266, + 0x948E, 0x94C5, 0x5343, 0x8FC1, 0x7B7E, 0x4EDF, 0x8C26, 0x4E7E, + 0x9ED4, 0x94B1, 0x94B3, 0x524D, 0x6F5C, 0x9063, 0x6D45, 0x8C34, + 0x5811, 0x5D4C, 0x6B20, 0x6B49, 0x67AA, 0x545B, 0x8154, 0x7F8C, + 0x5899, 0x8537, 0x5F3A, 0x62A2, 0x6A47, 0x9539, 0x6572, 0x6084, + 0x6865, 0x77A7, 0x4E54, 0x4FA8, 0x5DE7, 0x9798, 0x64AC, 0x7FD8, + 0x5CED, 0x4FCF, 0x7A8D, 0x5207, 0x8304, 0x4E14, 0x602F, 0x7A83, + 0x94A6, 0x4FB5, 0x4EB2, 0x79E6, 0x7434, 0x52E4, 0x82B9, 0x64D2, + 0x79BD, 0x5BDD, 0x6C81, 0x9752, 0x8F7B, 0x6C22, 0x503E, 0x537F, + 0x6E05, 0x64CE, 0x6674, 0x6C30, 0x60C5, 0x9877, 0x8BF7, 0x5E86, + 0x743C, 0x7A77, 0x79CB, 0x4E18, 0x90B1, 0x7403, 0x6C42, 0x56DA, + 0x914B, 0x6CC5, 0x8D8B, 0x533A, 0x86C6, 0x66F2, 0x8EAF, 0x5C48, + 0x9A71, 0x6E20, 0x83EE, 0x83EF, 0x83F3, 0x83F4, 0x83F5, 0x83F6, + 0x83F7, 0x83FA, 0x83FB, 0x83FC, 0x83FE, 0x83FF, 0x8400, 0x8402, + 0x8405, 0x8407, 0x8408, 0x8409, 0x840A, 0x8410, 0x8412, 0x8413, + 0x8414, 0x8415, 0x8416, 0x8417, 0x8419, 0x841A, 0x841B, 0x841E, + 0x841F, 0x8420, 0x8421, 0x8422, 0x8423, 0x8429, 0x842A, 0x842B, + 0x842C, 0x842D, 0x842E, 0x842F, 0x8430, 0x8432, 0x8433, 0x8434, + 0x8435, 0x8436, 0x8437, 0x8439, 0x843A, 0x843B, 0x843E, 0x843F, + 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8447, 0x8448, + 0x8449, 0x844A, 0x844B, 0x844C, 0x844D, 0x844E, 0x844F, 0x8450, + 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8458, 0x845D, 0x845E, +plane 54 +at 0x00 + 0x845F, 0x8460, 0x8462, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, + 0x846A, 0x846E, 0x846F, 0x8470, 0x8472, 0x8474, 0x8477, 0x8479, + 0x847B, 0x847C, 0x53D6, 0x5A36, 0x9F8B, 0x8DA3, 0x53BB, 0x5708, + 0x98A7, 0x6743, 0x919B, 0x6CC9, 0x5168, 0x75CA, 0x62F3, 0x72AC, + 0x5238, 0x529D, 0x7F3A, 0x7094, 0x7638, 0x5374, 0x9E4A, 0x69B7, + 0x786E, 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3, 0x5189, 0x67D3, + 0x74E4, 0x58E4, 0x6518, 0x56B7, 0x8BA9, 0x9976, 0x6270, 0x7ED5, + 0x60F9, 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD, 0x97E7, 0x4EFB, + 0x8BA4, 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD, 0x65E5, 0x620E, + 0x8338, 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6, 0x5BB9, 0x7ED2, + 0x5197, 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5B7A, + 0x5982, 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925, 0x8F6F, 0x962E, + 0x854A, 0x745E, 0x9510, 0x95F0, 0x6DA6, 0x82E5, 0x5F31, 0x6492, + 0x6D12, 0x8428, 0x816E, 0x9CC3, 0x585E, 0x8D5B, 0x4E09, 0x53C1, + 0x847D, 0x847E, 0x847F, 0x8480, 0x8481, 0x8483, 0x8484, 0x8485, + 0x8486, 0x848A, 0x848D, 0x848F, 0x8490, 0x8491, 0x8492, 0x8493, + 0x8494, 0x8495, 0x8496, 0x8498, 0x849A, 0x849B, 0x849D, 0x849E, + 0x849F, 0x84A0, 0x84A2, 0x84A3, 0x84A4, 0x84A5, 0x84A6, 0x84A7, + 0x84A8, 0x84A9, 0x84AA, 0x84AB, 0x84AC, 0x84AD, 0x84AE, 0x84B0, + 0x84B1, 0x84B3, 0x84B5, 0x84B6, 0x84B7, 0x84BB, 0x84BC, 0x84BE, + 0x84C0, 0x84C2, 0x84C3, 0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x84CB, + 0x84CC, 0x84CE, 0x84CF, 0x84D2, 0x84D4, 0x84D5, 0x84D7, 0x84D8, + 0x84D9, 0x84DA, 0x84DB, 0x84DC, 0x84DE, 0x84E1, 0x84E2, 0x84E4, + 0x84E7, 0x84E8, 0x84E9, 0x84EA, 0x84EB, 0x84ED, 0x84EE, 0x84EF, + 0x84F1, 0x84F2, 0x84F3, 0x84F4, 0x84F5, 0x84F6, 0x84F7, 0x84F8, + 0x84F9, 0x84FA, 0x84FB, 0x84FD, 0x84FE, 0x8500, 0x8501, 0x8502, + 0x4F1E, 0x6563, 0x6851, 0x55D3, 0x4E27, 0x6414, 0x9A9A, 0x626B, + 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, 0x50E7, 0x838E, 0x7802, + 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565, 0x715E, 0x7B5B, + 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220, 0x717D, 0x886B, + 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584, 0x6C55, 0x6247, + 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C, 0x4E0A, 0x5C1A, +plane 55 +at 0x00 + 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D, 0x52FA, 0x97F6, + 0x5C11, 0x54E8, 0x90B5, 0x7ECD, 0x5962, 0x8D4A, 0x86C7, 0x820C, + 0x820D, 0x8D66, 0x6444, 0x5C04, 0x6151, 0x6D89, 0x793E, 0x8BBE, + 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1, 0x5A20, 0x7EC5, + 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, 0x80BE, 0x614E, 0x6E17, + 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3, 0x8503, 0x8504, + 0x8505, 0x8506, 0x8507, 0x8508, 0x8509, 0x850A, 0x850B, 0x850D, + 0x850E, 0x850F, 0x8510, 0x8512, 0x8514, 0x8515, 0x8516, 0x8518, + 0x8519, 0x851B, 0x851C, 0x851D, 0x851E, 0x8520, 0x8522, 0x8523, + 0x8524, 0x8525, 0x8526, 0x8527, 0x8528, 0x8529, 0x852A, 0x852D, + 0x852E, 0x852F, 0x8530, 0x8531, 0x8532, 0x8533, 0x8534, 0x8535, + 0x8536, 0x853E, 0x853F, 0x8540, 0x8541, 0x8542, 0x8544, 0x8545, + 0x8546, 0x8547, 0x854B, 0x854C, 0x854D, 0x854E, 0x854F, 0x8550, + 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8557, 0x8558, 0x855A, + 0x855B, 0x855C, 0x855D, 0x855F, 0x8560, 0x8561, 0x8562, 0x8563, + 0x8565, 0x8566, 0x8567, 0x8569, 0x856A, 0x856B, 0x856C, 0x856D, + 0x856E, 0x856F, 0x8570, 0x8571, 0x8573, 0x8575, 0x8576, 0x8577, + 0x8578, 0x857C, 0x857D, 0x857F, 0x8580, 0x8581, 0x7701, 0x76DB, + 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931, 0x72EE, 0x65BD, 0x6E7F, + 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3, 0x62FE, 0x65F6, 0x4EC0, + 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2, 0x77E2, 0x4F7F, 0x5C4E, + 0x9A76, 0x59CB, 0x5F0F, 0x793A, 0x58EB, 0x4E16, 0x67FF, 0x4E8B, + 0x62ED, 0x8A93, 0x901D, 0x52BF, 0x662F, 0x55DC, 0x566C, 0x9002, + 0x4ED5, 0x4F8D, 0x91CA, 0x9970, 0x6C0F, 0x5E02, 0x6043, 0x5BA4, + 0x89C6, 0x8BD5, 0x6536, 0x624B, 0x9996, 0x5B88, 0x5BFF, 0x6388, + 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C, 0x67A2, 0x68B3, 0x6B8A, + 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1, 0x758F, 0x4E66, 0x8D4E, + 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9, 0x7F72, 0x8700, 0x9ECD, + 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811, 0x675F, 0x620D, 0x7AD6, + 0x5885, 0x5EB6, 0x6570, 0x6F31, 0x8582, 0x8583, 0x8586, 0x8588, + 0x8589, 0x858A, 0x858B, 0x858C, 0x858D, 0x858E, 0x8590, 0x8591, + 0x8592, 0x8593, 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, +plane 56 +at 0x00 + 0x859A, 0x859D, 0x859E, 0x859F, 0x85A0, 0x85A1, 0x85A2, 0x85A3, + 0x85A5, 0x85A6, 0x85A7, 0x85A9, 0x85AB, 0x85AC, 0x85AD, 0x85B1, + 0x85B2, 0x85B3, 0x85B4, 0x85B5, 0x85B6, 0x85B8, 0x85BA, 0x85BB, + 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C0, 0x85C2, 0x85C3, 0x85C4, + 0x85C5, 0x85C6, 0x85C7, 0x85C8, 0x85CA, 0x85CB, 0x85CC, 0x85CD, + 0x85CE, 0x85D1, 0x85D2, 0x85D4, 0x85D6, 0x85D7, 0x85D8, 0x85D9, + 0x85DA, 0x85DB, 0x85DD, 0x85DE, 0x85DF, 0x85E0, 0x85E1, 0x85E2, + 0x85E3, 0x85E5, 0x85E6, 0x85E7, 0x85E8, 0x85EA, 0x85EB, 0x85EC, + 0x85ED, 0x85EE, 0x85EF, 0x85F0, 0x85F1, 0x85F2, 0x85F3, 0x85F4, + 0x85F5, 0x85F6, 0x85F7, 0x85F8, 0x6055, 0x5237, 0x800D, 0x6454, + 0x8870, 0x7529, 0x5E05, 0x6813, 0x62F4, 0x971C, 0x53CC, 0x723D, + 0x8C01, 0x6C34, 0x7761, 0x7A0E, 0x542E, 0x77AC, 0x987A, 0x821C, + 0x8BF4, 0x7855, 0x6714, 0x70C1, 0x65AF, 0x6495, 0x5636, 0x601D, + 0x79C1, 0x53F8, 0x4E1D, 0x6B7B, 0x8086, 0x5BFA, 0x55E3, 0x56DB, + 0x4F3A, 0x4F3C, 0x9972, 0x5DF3, 0x677E, 0x8038, 0x6002, 0x9882, + 0x9001, 0x5B8B, 0x8BBC, 0x8BF5, 0x641C, 0x8258, 0x64DE, 0x55FD, + 0x82CF, 0x9165, 0x4FD7, 0x7D20, 0x901F, 0x7C9F, 0x50F3, 0x5851, + 0x6EAF, 0x5BBF, 0x8BC9, 0x8083, 0x9178, 0x849C, 0x7B97, 0x867D, + 0x968B, 0x968F, 0x7EE5, 0x9AD3, 0x788E, 0x5C81, 0x7A57, 0x9042, + 0x96A7, 0x795F, 0x5B59, 0x635F, 0x7B0B, 0x84D1, 0x68AD, 0x5506, + 0x7F29, 0x7410, 0x7D22, 0x9501, 0x6240, 0x584C, 0x4ED6, 0x5B83, + 0x5979, 0x5854, 0x85F9, 0x85FA, 0x85FC, 0x85FD, 0x85FE, 0x8600, + 0x8601, 0x8602, 0x8603, 0x8604, 0x8606, 0x8607, 0x8608, 0x8609, + 0x860A, 0x860B, 0x860C, 0x860D, 0x860E, 0x860F, 0x8610, 0x8612, + 0x8613, 0x8614, 0x8615, 0x8617, 0x8618, 0x8619, 0x861A, 0x861B, + 0x861C, 0x861D, 0x861E, 0x861F, 0x8620, 0x8621, 0x8622, 0x8623, + 0x8624, 0x8625, 0x8626, 0x8628, 0x862A, 0x862B, 0x862C, 0x862D, + 0x862E, 0x862F, 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, + 0x8636, 0x8637, 0x8639, 0x863A, 0x863B, 0x863D, 0x863E, 0x863F, + 0x8640, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, + 0x8648, 0x8649, 0x864A, 0x864B, 0x864C, 0x8652, 0x8653, 0x8655, + 0x8656, 0x8657, 0x8658, 0x8659, 0x865B, 0x865C, 0x865D, 0x865F, +plane 57 +at 0x00 + 0x8660, 0x8661, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, + 0x8669, 0x866A, 0x736D, 0x631E, 0x8E4B, 0x8E0F, 0x80CE, 0x82D4, + 0x62AC, 0x53F0, 0x6CF0, 0x915E, 0x592A, 0x6001, 0x6C70, 0x574D, + 0x644A, 0x8D2A, 0x762B, 0x6EE9, 0x575B, 0x6A80, 0x75F0, 0x6F6D, + 0x8C2D, 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3, 0x63A2, 0x53F9, + 0x70AD, 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0, 0x819B, 0x5510, + 0x7CD6, 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB, 0x638F, 0x6D9B, + 0x6ED4, 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8, 0x9676, 0x8BA8, + 0x5957, 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A, 0x68AF, 0x5254, + 0x8E22, 0x9511, 0x63D0, 0x9898, 0x8E44, 0x557C, 0x4F53, 0x66FF, + 0x568F, 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929, 0x6DFB, 0x586B, + 0x7530, 0x751C, 0x606C, 0x8214, 0x8146, 0x6311, 0x6761, 0x8FE2, + 0x773A, 0x8DF3, 0x8D34, 0x94C1, 0x5E16, 0x5385, 0x542C, 0x70C3, + 0x866D, 0x866F, 0x8670, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, + 0x8677, 0x8678, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, + 0x8689, 0x868E, 0x868F, 0x8690, 0x8691, 0x8692, 0x8694, 0x8696, + 0x8697, 0x8698, 0x8699, 0x869A, 0x869B, 0x869E, 0x869F, 0x86A0, + 0x86A1, 0x86A2, 0x86A5, 0x86A6, 0x86AB, 0x86AD, 0x86AE, 0x86B2, + 0x86B3, 0x86B7, 0x86B8, 0x86B9, 0x86BB, 0x86BC, 0x86BD, 0x86BE, + 0x86BF, 0x86C1, 0x86C2, 0x86C3, 0x86C5, 0x86C8, 0x86CC, 0x86CD, + 0x86D2, 0x86D3, 0x86D5, 0x86D6, 0x86D7, 0x86DA, 0x86DC, 0x86DD, + 0x86E0, 0x86E1, 0x86E2, 0x86E3, 0x86E5, 0x86E6, 0x86E7, 0x86E8, + 0x86EA, 0x86EB, 0x86EC, 0x86EF, 0x86F5, 0x86F6, 0x86F7, 0x86FA, + 0x86FB, 0x86FC, 0x86FD, 0x86FF, 0x8701, 0x8704, 0x8705, 0x8706, + 0x870B, 0x870C, 0x870E, 0x870F, 0x8710, 0x8711, 0x8714, 0x8716, + 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A, 0x8247, 0x901A, + 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64, 0x7AE5, 0x6876, + 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295, 0x5934, 0x900F, + 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014, 0x6D82, 0x5C60, + 0x571F, 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8, 0x9893, 0x817F, + 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0, 0x62D6, 0x6258, + 0x8131, 0x9E35, 0x9640, 0x9A6E, 0x9A7C, 0x692D, 0x59A5, 0x62D3, +plane 58 +at 0x00 + 0x553E, 0x6316, 0x54C7, 0x86D9, 0x6D3C, 0x5A03, 0x74E6, 0x889C, + 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, 0x73A9, 0x987D, 0x4E38, + 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696, 0x60CB, 0x5B9B, + 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1, 0x6789, 0x7F51, + 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01, 0x8719, 0x871B, + 0x871D, 0x871F, 0x8720, 0x8724, 0x8726, 0x8727, 0x8728, 0x872A, + 0x872B, 0x872C, 0x872D, 0x872F, 0x8730, 0x8732, 0x8733, 0x8735, + 0x8736, 0x8738, 0x8739, 0x873A, 0x873C, 0x873D, 0x8740, 0x8741, + 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x874A, 0x874B, 0x874D, + 0x874F, 0x8750, 0x8751, 0x8752, 0x8754, 0x8755, 0x8756, 0x8758, + 0x875A, 0x875B, 0x875C, 0x875D, 0x875E, 0x875F, 0x8761, 0x8762, + 0x8766, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B, 0x876C, 0x876D, + 0x876F, 0x8771, 0x8772, 0x8773, 0x8775, 0x8777, 0x8778, 0x8779, + 0x877A, 0x877F, 0x8780, 0x8781, 0x8784, 0x8786, 0x8787, 0x8789, + 0x878A, 0x878C, 0x878E, 0x878F, 0x8790, 0x8791, 0x8792, 0x8794, + 0x8795, 0x8796, 0x8798, 0x8799, 0x879A, 0x879B, 0x879C, 0x879D, + 0x879E, 0x87A0, 0x87A1, 0x87A2, 0x87A3, 0x87A4, 0x5DCD, 0x5FAE, + 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4, 0x552F, 0x60DF, 0x4E3A, + 0x6F4D, 0x7EF4, 0x82C7, 0x840E, 0x59D4, 0x4F1F, 0x4F2A, 0x5C3E, + 0x7EAC, 0x672A, 0x851A, 0x5473, 0x754F, 0x80C3, 0x5582, 0x9B4F, + 0x4F4D, 0x6E2D, 0x8C13, 0x5C09, 0x6170, 0x536B, 0x761F, 0x6E29, + 0x868A, 0x6587, 0x95FB, 0x7EB9, 0x543B, 0x7A33, 0x7D0A, 0x95EE, + 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717, 0x6DA1, 0x7A9D, 0x6211, + 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB, 0x545C, 0x94A8, 0x4E4C, + 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C, 0x68A7, 0x543E, 0x5434, + 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348, 0x821E, 0x4F0D, 0x4FAE, + 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269, 0x52FF, 0x52A1, 0x609F, + 0x8BEF, 0x6614, 0x7199, 0x6790, 0x897F, 0x7852, 0x77FD, 0x6670, + 0x563B, 0x5438, 0x9521, 0x727A, 0x87A5, 0x87A6, 0x87A7, 0x87A9, + 0x87AA, 0x87AE, 0x87B0, 0x87B1, 0x87B2, 0x87B4, 0x87B6, 0x87B7, + 0x87B8, 0x87B9, 0x87BB, 0x87BC, 0x87BE, 0x87BF, 0x87C1, 0x87C2, + 0x87C3, 0x87C4, 0x87C5, 0x87C7, 0x87C8, 0x87C9, 0x87CC, 0x87CD, +plane 59 +at 0x00 + 0x87CE, 0x87CF, 0x87D0, 0x87D4, 0x87D5, 0x87D6, 0x87D7, 0x87D8, + 0x87D9, 0x87DA, 0x87DC, 0x87DD, 0x87DE, 0x87DF, 0x87E1, 0x87E2, + 0x87E3, 0x87E4, 0x87E6, 0x87E7, 0x87E8, 0x87E9, 0x87EB, 0x87EC, + 0x87ED, 0x87EF, 0x87F0, 0x87F1, 0x87F2, 0x87F3, 0x87F4, 0x87F5, + 0x87F6, 0x87F7, 0x87F8, 0x87FA, 0x87FB, 0x87FC, 0x87FD, 0x87FF, + 0x8800, 0x8801, 0x8802, 0x8804, 0x8805, 0x8806, 0x8807, 0x8808, + 0x8809, 0x880B, 0x880C, 0x880D, 0x880E, 0x880F, 0x8810, 0x8811, + 0x8812, 0x8814, 0x8817, 0x8818, 0x8819, 0x881A, 0x881C, 0x881D, + 0x881E, 0x881F, 0x8820, 0x8823, 0x7A00, 0x606F, 0x5E0C, 0x6089, + 0x819D, 0x5915, 0x60DC, 0x7184, 0x70EF, 0x6EAA, 0x6C50, 0x7280, + 0x6A84, 0x88AD, 0x5E2D, 0x4E60, 0x5AB3, 0x559C, 0x94E3, 0x6D17, + 0x7CFB, 0x9699, 0x620F, 0x7EC6, 0x778E, 0x867E, 0x5323, 0x971E, + 0x8F96, 0x6687, 0x5CE1, 0x4FA0, 0x72ED, 0x4E0B, 0x53A6, 0x590F, + 0x5413, 0x6380, 0x9528, 0x5148, 0x4ED9, 0x9C9C, 0x7EA4, 0x54B8, + 0x8D24, 0x8854, 0x8237, 0x95F2, 0x6D8E, 0x5F26, 0x5ACC, 0x663E, + 0x9669, 0x73B0, 0x732E, 0x53BF, 0x817A, 0x9985, 0x7FA1, 0x5BAA, + 0x9677, 0x9650, 0x7EBF, 0x76F8, 0x53A2, 0x9576, 0x9999, 0x7BB1, + 0x8944, 0x6E58, 0x4E61, 0x7FD4, 0x7965, 0x8BE6, 0x60F3, 0x54CD, + 0x4EAB, 0x9879, 0x5DF7, 0x6A61, 0x50CF, 0x5411, 0x8C61, 0x8427, + 0x785D, 0x9704, 0x524A, 0x54EE, 0x56A3, 0x9500, 0x6D88, 0x5BB5, + 0x6DC6, 0x6653, 0x8824, 0x8825, 0x8826, 0x8827, 0x8828, 0x8829, + 0x882A, 0x882B, 0x882C, 0x882D, 0x882E, 0x882F, 0x8830, 0x8831, + 0x8833, 0x8834, 0x8835, 0x8836, 0x8837, 0x8838, 0x883A, 0x883B, + 0x883D, 0x883E, 0x883F, 0x8841, 0x8842, 0x8843, 0x8846, 0x8847, + 0x8848, 0x8849, 0x884A, 0x884B, 0x884E, 0x884F, 0x8850, 0x8851, + 0x8852, 0x8853, 0x8855, 0x8856, 0x8858, 0x885A, 0x885B, 0x885C, + 0x885D, 0x885E, 0x885F, 0x8860, 0x8866, 0x8867, 0x886A, 0x886D, + 0x886F, 0x8871, 0x8873, 0x8874, 0x8875, 0x8876, 0x8878, 0x8879, + 0x887A, 0x887B, 0x887C, 0x8880, 0x8883, 0x8886, 0x8887, 0x8889, + 0x888A, 0x888C, 0x888E, 0x888F, 0x8890, 0x8891, 0x8893, 0x8894, + 0x8895, 0x8897, 0x8898, 0x8899, 0x889A, 0x889B, 0x889D, 0x889E, + 0x889F, 0x88A0, 0x88A1, 0x88A3, 0x88A5, 0x88A6, 0x88A7, 0x88A8, +plane 60 +at 0x00 + 0x88A9, 0x88AA, 0x5C0F, 0x5B5D, 0x6821, 0x8096, 0x5578, 0x7B11, + 0x6548, 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B, 0x534F, 0x631F, + 0x643A, 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199, 0x68B0, 0x5378, + 0x87F9, 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51, 0x85AA, 0x82AF, + 0x950C, 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3, 0x4FE1, 0x8845, + 0x661F, 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211, 0x578B, 0x5F62, + 0x90A2, 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027, 0x59D3, 0x5144, + 0x51F6, 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A, 0x4F11, 0x4FEE, + 0x7F9E, 0x673D, 0x55C5, 0x9508, 0x79C0, 0x8896, 0x7EE3, 0x589F, + 0x620C, 0x9700, 0x865A, 0x5618, 0x987B, 0x5F90, 0x8BB8, 0x84C4, + 0x9157, 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064, 0x7D6E, 0x5A7F, + 0x7EEA, 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC, 0x65CB, 0x7384, + 0x88AC, 0x88AE, 0x88AF, 0x88B0, 0x88B2, 0x88B3, 0x88B4, 0x88B5, + 0x88B6, 0x88B8, 0x88B9, 0x88BA, 0x88BB, 0x88BD, 0x88BE, 0x88BF, + 0x88C0, 0x88C3, 0x88C4, 0x88C7, 0x88C8, 0x88CA, 0x88CB, 0x88CC, + 0x88CD, 0x88CF, 0x88D0, 0x88D1, 0x88D3, 0x88D6, 0x88D7, 0x88DA, + 0x88DB, 0x88DC, 0x88DD, 0x88DE, 0x88E0, 0x88E1, 0x88E6, 0x88E7, + 0x88E9, 0x88EA, 0x88EB, 0x88EC, 0x88ED, 0x88EE, 0x88EF, 0x88F2, + 0x88F5, 0x88F6, 0x88F7, 0x88FA, 0x88FB, 0x88FD, 0x88FF, 0x8900, + 0x8901, 0x8903, 0x8904, 0x8905, 0x8906, 0x8907, 0x8908, 0x8909, + 0x890B, 0x890C, 0x890D, 0x890E, 0x890F, 0x8911, 0x8914, 0x8915, + 0x8916, 0x8917, 0x8918, 0x891C, 0x891D, 0x891E, 0x891F, 0x8920, + 0x8922, 0x8923, 0x8924, 0x8926, 0x8927, 0x8928, 0x8929, 0x892C, + 0x892D, 0x892E, 0x892F, 0x8931, 0x8932, 0x8933, 0x8935, 0x8937, + 0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B, 0x5B66, 0x7A74, + 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC, 0x8BE2, 0x5BFB, + 0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF, 0x900A, 0x8FC5, + 0x538B, 0x62BC, 0x9E26, 0x9E2D, 0x5440, 0x4E2B, 0x82BD, 0x7259, + 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x54D1, 0x4E9A, 0x8BB6, + 0x7109, 0x54BD, 0x9609, 0x70DF, 0x6DF9, 0x76D0, 0x4E25, 0x7814, + 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, 0x960E, 0x708E, 0x6CBF, + 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273, 0x5830, 0x71D5, +plane 61 +at 0x00 + 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130, 0x5BB4, 0x8C1A, + 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768, 0x626C, 0x4F6F, + 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0, 0x75D2, 0x517B, + 0x6837, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476, 0x8938, 0x8939, + 0x893A, 0x893B, 0x893C, 0x893D, 0x893E, 0x893F, 0x8940, 0x8942, + 0x8943, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949, 0x894A, 0x894B, + 0x894C, 0x894D, 0x894E, 0x894F, 0x8950, 0x8951, 0x8952, 0x8953, + 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, 0x895A, 0x895B, + 0x895C, 0x895D, 0x8960, 0x8961, 0x8962, 0x8963, 0x8964, 0x8965, + 0x8967, 0x8968, 0x8969, 0x896A, 0x896B, 0x896C, 0x896D, 0x896E, + 0x896F, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0x8976, + 0x8977, 0x8978, 0x8979, 0x897A, 0x897C, 0x897D, 0x897E, 0x8980, + 0x8982, 0x8984, 0x8985, 0x8987, 0x8988, 0x8989, 0x898A, 0x898B, + 0x898C, 0x898D, 0x898E, 0x898F, 0x8990, 0x8991, 0x8992, 0x8993, + 0x8994, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899A, 0x899B, + 0x899C, 0x899D, 0x899E, 0x899F, 0x89A0, 0x89A1, 0x6447, 0x5C27, + 0x9065, 0x7A91, 0x8C23, 0x59DA, 0x54AC, 0x8200, 0x836F, 0x8981, + 0x8000, 0x6930, 0x564E, 0x8036, 0x7237, 0x91CE, 0x51B6, 0x4E5F, + 0x9875, 0x6396, 0x4E1A, 0x53F6, 0x66F3, 0x814B, 0x591C, 0x6DB2, + 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1, 0x4F9D, 0x4F0A, 0x8863, + 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA, 0x80F0, 0x7591, 0x6C82, + 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681, 0x501A, 0x5DF2, 0x4E59, + 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613, 0x9091, 0x5C79, 0x4EBF, + 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB, 0x4EA6, 0x88D4, 0x610F, + 0x6BC5, 0x5FC6, 0x4E49, 0x76CA, 0x6EA2, 0x8BE3, 0x8BAE, 0x8C0A, + 0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, 0x7ECE, 0x8335, 0x836B, 0x56E0, + 0x6BB7, 0x97F3, 0x9634, 0x59FB, 0x541F, 0x94F6, 0x6DEB, 0x5BC5, + 0x996E, 0x5C39, 0x5F15, 0x9690, 0x89A2, 0x89A3, 0x89A4, 0x89A5, + 0x89A6, 0x89A7, 0x89A8, 0x89A9, 0x89AA, 0x89AB, 0x89AC, 0x89AD, + 0x89AE, 0x89AF, 0x89B0, 0x89B1, 0x89B2, 0x89B3, 0x89B4, 0x89B5, + 0x89B6, 0x89B7, 0x89B8, 0x89B9, 0x89BA, 0x89BB, 0x89BC, 0x89BD, + 0x89BE, 0x89BF, 0x89C0, 0x89C3, 0x89CD, 0x89D3, 0x89D4, 0x89D5, +plane 62 +at 0x00 + 0x89D7, 0x89D8, 0x89D9, 0x89DB, 0x89DD, 0x89DF, 0x89E0, 0x89E1, + 0x89E2, 0x89E4, 0x89E7, 0x89E8, 0x89E9, 0x89EA, 0x89EC, 0x89ED, + 0x89EE, 0x89F0, 0x89F1, 0x89F2, 0x89F4, 0x89F5, 0x89F6, 0x89F7, + 0x89F8, 0x89F9, 0x89FA, 0x89FB, 0x89FC, 0x89FD, 0x89FE, 0x89FF, + 0x8A01, 0x8A02, 0x8A03, 0x8A04, 0x8A05, 0x8A06, 0x8A08, 0x8A09, + 0x8A0A, 0x8A0B, 0x8A0C, 0x8A0D, 0x8A0E, 0x8A0F, 0x8A10, 0x8A11, + 0x8A12, 0x8A13, 0x8A14, 0x8A15, 0x8A16, 0x8A17, 0x8A18, 0x8A19, + 0x8A1A, 0x8A1B, 0x8A1C, 0x8A1D, 0x5370, 0x82F1, 0x6A31, 0x5A74, + 0x9E70, 0x5E94, 0x7F28, 0x83B9, 0x8424, 0x8425, 0x8367, 0x8747, + 0x8FCE, 0x8D62, 0x76C8, 0x5F71, 0x9896, 0x786C, 0x6620, 0x54DF, + 0x62E5, 0x4F63, 0x81C3, 0x75C8, 0x5EB8, 0x96CD, 0x8E0A, 0x86F9, + 0x548F, 0x6CF3, 0x6D8C, 0x6C38, 0x607F, 0x52C7, 0x7528, 0x5E7D, + 0x4F18, 0x60A0, 0x5FE7, 0x5C24, 0x7531, 0x90AE, 0x94C0, 0x72B9, + 0x6CB9, 0x6E38, 0x9149, 0x6709, 0x53CB, 0x53F3, 0x4F51, 0x91C9, + 0x8BF1, 0x53C8, 0x5E7C, 0x8FC2, 0x6DE4, 0x4E8E, 0x76C2, 0x6986, + 0x865E, 0x611A, 0x8206, 0x4F59, 0x4FDE, 0x903E, 0x9C7C, 0x6109, + 0x6E1D, 0x6E14, 0x9685, 0x4E88, 0x5A31, 0x96E8, 0x4E0E, 0x5C7F, + 0x79B9, 0x5B87, 0x8BED, 0x7FBD, 0x7389, 0x57DF, 0x828B, 0x90C1, + 0x5401, 0x9047, 0x55BB, 0x5CEA, 0x5FA1, 0x6108, 0x6B32, 0x72F1, + 0x80B2, 0x8A89, 0x8A1E, 0x8A1F, 0x8A20, 0x8A21, 0x8A22, 0x8A23, + 0x8A24, 0x8A25, 0x8A26, 0x8A27, 0x8A28, 0x8A29, 0x8A2A, 0x8A2B, + 0x8A2C, 0x8A2D, 0x8A2E, 0x8A2F, 0x8A30, 0x8A31, 0x8A32, 0x8A33, + 0x8A34, 0x8A35, 0x8A36, 0x8A37, 0x8A38, 0x8A39, 0x8A3A, 0x8A3B, + 0x8A3C, 0x8A3D, 0x8A3F, 0x8A40, 0x8A41, 0x8A42, 0x8A43, 0x8A44, + 0x8A45, 0x8A46, 0x8A47, 0x8A49, 0x8A4A, 0x8A4B, 0x8A4C, 0x8A4D, + 0x8A4E, 0x8A4F, 0x8A50, 0x8A51, 0x8A52, 0x8A53, 0x8A54, 0x8A55, + 0x8A56, 0x8A57, 0x8A58, 0x8A59, 0x8A5A, 0x8A5B, 0x8A5C, 0x8A5D, + 0x8A5E, 0x8A5F, 0x8A60, 0x8A61, 0x8A62, 0x8A63, 0x8A64, 0x8A65, + 0x8A66, 0x8A67, 0x8A68, 0x8A69, 0x8A6A, 0x8A6B, 0x8A6C, 0x8A6D, + 0x8A6E, 0x8A6F, 0x8A70, 0x8A71, 0x8A72, 0x8A73, 0x8A74, 0x8A75, + 0x8A76, 0x8A77, 0x8A78, 0x8A7A, 0x8A7B, 0x8A7C, 0x8A7D, 0x8A7E, + 0x8A7F, 0x8A80, 0x6D74, 0x5BD3, 0x88D5, 0x9884, 0x8C6B, 0x9A6D, +plane 63 +at 0x00 + 0x9E33, 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881, 0x539F, 0x63F4, + 0x8F95, 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90, 0x7F18, 0x8FDC, + 0x82D1, 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6, 0x8D8A, 0x8DC3, + 0x94A5, 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x9605, 0x8018, 0x4E91, + 0x90E7, 0x5300, 0x9668, 0x5141, 0x8FD0, 0x8574, 0x915D, 0x6655, + 0x97F5, 0x5B55, 0x531D, 0x7838, 0x6742, 0x683D, 0x54C9, 0x707E, + 0x5BB0, 0x8F7D, 0x518D, 0x5728, 0x54B1, 0x6512, 0x6682, 0x8D5E, + 0x8D43, 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF, 0x85FB, 0x67A3, + 0x65E9, 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020, 0x7682, 0x7076, + 0x71E5, 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C, 0x600E, 0x589E, + 0x618E, 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23, 0x672D, 0x8F67, + 0x8A81, 0x8A82, 0x8A83, 0x8A84, 0x8A85, 0x8A86, 0x8A87, 0x8A88, + 0x8A8B, 0x8A8C, 0x8A8D, 0x8A8E, 0x8A8F, 0x8A90, 0x8A91, 0x8A92, + 0x8A94, 0x8A95, 0x8A96, 0x8A97, 0x8A98, 0x8A99, 0x8A9A, 0x8A9B, + 0x8A9C, 0x8A9D, 0x8A9E, 0x8A9F, 0x8AA0, 0x8AA1, 0x8AA2, 0x8AA3, + 0x8AA4, 0x8AA5, 0x8AA6, 0x8AA7, 0x8AA8, 0x8AA9, 0x8AAA, 0x8AAB, + 0x8AAC, 0x8AAD, 0x8AAE, 0x8AAF, 0x8AB0, 0x8AB1, 0x8AB2, 0x8AB3, + 0x8AB4, 0x8AB5, 0x8AB6, 0x8AB7, 0x8AB8, 0x8AB9, 0x8ABA, 0x8ABB, + 0x8ABC, 0x8ABD, 0x8ABE, 0x8ABF, 0x8AC0, 0x8AC1, 0x8AC2, 0x8AC3, + 0x8AC4, 0x8AC5, 0x8AC6, 0x8AC7, 0x8AC8, 0x8AC9, 0x8ACA, 0x8ACB, + 0x8ACC, 0x8ACD, 0x8ACE, 0x8ACF, 0x8AD0, 0x8AD1, 0x8AD2, 0x8AD3, + 0x8AD4, 0x8AD5, 0x8AD6, 0x8AD7, 0x8AD8, 0x8AD9, 0x8ADA, 0x8ADB, + 0x8ADC, 0x8ADD, 0x8ADE, 0x8ADF, 0x8AE0, 0x8AE1, 0x8AE2, 0x8AE3, + 0x94E1, 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B, 0x4E4D, 0x70B8, + 0x8BC8, 0x6458, 0x658B, 0x5B85, 0x7A84, 0x503A, 0x5BE8, 0x77BB, + 0x6BE1, 0x8A79, 0x7C98, 0x6CBE, 0x76CF, 0x65A9, 0x8F97, 0x5D2D, + 0x5C55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7AD9, 0x6E5B, 0x7EFD, + 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, 0x638C, 0x6DA8, 0x6756, + 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634, 0x969C, 0x62DB, + 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69, 0x5146, 0x8087, + 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99, 0x8005, 0x9517, + 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F, 0x7504, 0x7827, +plane 64 +at 0x00 + 0x81FB, 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9, 0x8BCA, 0x9707, + 0x632F, 0x9547, 0x9635, 0x84B8, 0x6323, 0x7741, 0x5F81, 0x72F0, + 0x4E89, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F, 0x8AE4, 0x8AE5, + 0x8AE6, 0x8AE7, 0x8AE8, 0x8AE9, 0x8AEA, 0x8AEB, 0x8AEC, 0x8AED, + 0x8AEE, 0x8AEF, 0x8AF0, 0x8AF1, 0x8AF2, 0x8AF3, 0x8AF4, 0x8AF5, + 0x8AF6, 0x8AF7, 0x8AF8, 0x8AF9, 0x8AFA, 0x8AFB, 0x8AFC, 0x8AFD, + 0x8AFE, 0x8AFF, 0x8B00, 0x8B01, 0x8B02, 0x8B03, 0x8B04, 0x8B05, + 0x8B06, 0x8B08, 0x8B09, 0x8B0A, 0x8B0B, 0x8B0C, 0x8B0D, 0x8B0E, + 0x8B0F, 0x8B10, 0x8B11, 0x8B12, 0x8B13, 0x8B14, 0x8B15, 0x8B16, + 0x8B17, 0x8B18, 0x8B19, 0x8B1A, 0x8B1B, 0x8B1C, 0x8B1D, 0x8B1E, + 0x8B1F, 0x8B20, 0x8B21, 0x8B22, 0x8B23, 0x8B24, 0x8B25, 0x8B27, + 0x8B28, 0x8B29, 0x8B2A, 0x8B2B, 0x8B2C, 0x8B2D, 0x8B2E, 0x8B2F, + 0x8B30, 0x8B31, 0x8B32, 0x8B33, 0x8B34, 0x8B35, 0x8B36, 0x8B37, + 0x8B38, 0x8B39, 0x8B3A, 0x8B3B, 0x8B3C, 0x8B3D, 0x8B3E, 0x8B3F, + 0x8B40, 0x8B41, 0x8B42, 0x8B43, 0x8B44, 0x8B45, 0x5E27, 0x75C7, + 0x90D1, 0x8BC1, 0x829D, 0x679D, 0x652F, 0x5431, 0x8718, 0x77E5, + 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7, 0x804C, 0x76F4, 0x690D, + 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740, 0x6307, 0x6B62, 0x8DBE, + 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A, 0x63B7, 0x81F3, 0x81F4, + 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A, 0x79E9, 0x7A1A, 0x8D28, + 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92, 0x4E2D, 0x76C5, 0x5FE0, + 0x949F, 0x8877, 0x7EC8, 0x79CD, 0x80BF, 0x91CD, 0x4EF2, 0x4F17, + 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8BCC, 0x7CA5, 0x8F74, 0x8098, + 0x5E1A, 0x5492, 0x76B1, 0x5B99, 0x663C, 0x9AA4, 0x73E0, 0x682A, + 0x86DB, 0x6731, 0x732A, 0x8BF8, 0x8BDB, 0x9010, 0x7AF9, 0x70DB, + 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B, 0x8457, 0x67F1, 0x52A9, + 0x86C0, 0x8D2E, 0x94F8, 0x7B51, 0x8B46, 0x8B47, 0x8B48, 0x8B49, + 0x8B4A, 0x8B4B, 0x8B4C, 0x8B4D, 0x8B4E, 0x8B4F, 0x8B50, 0x8B51, + 0x8B52, 0x8B53, 0x8B54, 0x8B55, 0x8B56, 0x8B57, 0x8B58, 0x8B59, + 0x8B5A, 0x8B5B, 0x8B5C, 0x8B5D, 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, + 0x8B62, 0x8B63, 0x8B64, 0x8B65, 0x8B67, 0x8B68, 0x8B69, 0x8B6A, + 0x8B6B, 0x8B6D, 0x8B6E, 0x8B6F, 0x8B70, 0x8B71, 0x8B72, 0x8B73, +plane 65 +at 0x00 + 0x8B74, 0x8B75, 0x8B76, 0x8B77, 0x8B78, 0x8B79, 0x8B7A, 0x8B7B, + 0x8B7C, 0x8B7D, 0x8B7E, 0x8B7F, 0x8B80, 0x8B81, 0x8B82, 0x8B83, + 0x8B84, 0x8B85, 0x8B86, 0x8B87, 0x8B88, 0x8B89, 0x8B8A, 0x8B8B, + 0x8B8C, 0x8B8D, 0x8B8E, 0x8B8F, 0x8B90, 0x8B91, 0x8B92, 0x8B93, + 0x8B94, 0x8B95, 0x8B96, 0x8B97, 0x8B98, 0x8B99, 0x8B9A, 0x8B9B, + 0x8B9C, 0x8B9D, 0x8B9E, 0x8B9F, 0x8BAC, 0x8BB1, 0x8BBB, 0x8BC7, + 0x8BD0, 0x8BEA, 0x8C09, 0x8C1E, 0x4F4F, 0x6CE8, 0x795D, 0x9A7B, + 0x6293, 0x722A, 0x62FD, 0x4E13, 0x7816, 0x8F6C, 0x64B0, 0x8D5A, + 0x7BC6, 0x6869, 0x5E84, 0x88C5, 0x5986, 0x649E, 0x58EE, 0x72B6, + 0x690E, 0x9525, 0x8FFD, 0x8D58, 0x5760, 0x7F00, 0x8C06, 0x51C6, + 0x6349, 0x62D9, 0x5353, 0x684C, 0x7422, 0x8301, 0x914C, 0x5544, + 0x7740, 0x707C, 0x6D4A, 0x5179, 0x54A8, 0x8D44, 0x59FF, 0x6ECB, + 0x6DC4, 0x5B5C, 0x7D2B, 0x4ED4, 0x7C7D, 0x6ED3, 0x5B50, 0x81EA, + 0x6E0D, 0x5B57, 0x9B03, 0x68D5, 0x8E2A, 0x5B97, 0x7EFC, 0x603B, + 0x7EB5, 0x90B9, 0x8D70, 0x594F, 0x63CD, 0x79DF, 0x8DB3, 0x5352, + 0x65CF, 0x7956, 0x8BC5, 0x963B, 0x7EC4, 0x94BB, 0x7E82, 0x5634, + 0x9189, 0x6700, 0x7F6A, 0x5C0A, 0x9075, 0x6628, 0x5DE6, 0x4F50, + 0x67DE, 0x505A, 0x4F5C, 0x5750, 0x5EA7, 0, 0, 0, + 0, 0, 0x8C38, 0x8C39, 0x8C3A, 0x8C3B, 0x8C3C, 0x8C3D, + 0x8C3E, 0x8C3F, 0x8C40, 0x8C42, 0x8C43, 0x8C44, 0x8C45, 0x8C48, + 0x8C4A, 0x8C4B, 0x8C4D, 0x8C4E, 0x8C4F, 0x8C50, 0x8C51, 0x8C52, + 0x8C53, 0x8C54, 0x8C56, 0x8C57, 0x8C58, 0x8C59, 0x8C5B, 0x8C5C, + 0x8C5D, 0x8C5E, 0x8C5F, 0x8C60, 0x8C63, 0x8C64, 0x8C65, 0x8C66, + 0x8C67, 0x8C68, 0x8C69, 0x8C6C, 0x8C6D, 0x8C6E, 0x8C6F, 0x8C70, + 0x8C71, 0x8C72, 0x8C74, 0x8C75, 0x8C76, 0x8C77, 0x8C7B, 0x8C7C, + 0x8C7D, 0x8C7E, 0x8C7F, 0x8C80, 0x8C81, 0x8C83, 0x8C84, 0x8C86, + 0x8C87, 0x8C88, 0x8C8B, 0x8C8D, 0x8C8E, 0x8C8F, 0x8C90, 0x8C91, + 0x8C92, 0x8C93, 0x8C95, 0x8C96, 0x8C97, 0x8C99, 0x8C9A, 0x8C9B, + 0x8C9C, 0x8C9D, 0x8C9E, 0x8C9F, 0x8CA0, 0x8CA1, 0x8CA2, 0x8CA3, + 0x8CA4, 0x8CA5, 0x8CA6, 0x8CA7, 0x8CA8, 0x8CA9, 0x8CAA, 0x8CAB, + 0x8CAC, 0x8CAD, 0x4E8D, 0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, + 0x4E15, 0x4E98, 0x4E1E, 0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, +plane 66 +at 0x00 + 0x4E3F, 0x5315, 0x4E47, 0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, + 0x80E4, 0x9997, 0x6BD3, 0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, + 0x4E5C, 0x4E69, 0x4E93, 0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, + 0x538D, 0x539D, 0x53A3, 0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, + 0x53F5, 0x5326, 0x532E, 0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, + 0x5208, 0x520E, 0x522D, 0x5233, 0x523F, 0x5240, 0x524C, 0x525E, + 0x5261, 0x525C, 0x84AF, 0x527D, 0x5282, 0x5281, 0x5290, 0x5293, + 0x5182, 0x7F54, 0x4EBB, 0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, + 0x4EEB, 0x4EDE, 0x4F1B, 0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x4F25, + 0x4F27, 0x4F09, 0x4F2B, 0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D, + 0x8CAE, 0x8CAF, 0x8CB0, 0x8CB1, 0x8CB2, 0x8CB3, 0x8CB4, 0x8CB5, + 0x8CB6, 0x8CB7, 0x8CB8, 0x8CB9, 0x8CBA, 0x8CBB, 0x8CBC, 0x8CBD, + 0x8CBE, 0x8CBF, 0x8CC0, 0x8CC1, 0x8CC2, 0x8CC3, 0x8CC4, 0x8CC5, + 0x8CC6, 0x8CC7, 0x8CC8, 0x8CC9, 0x8CCA, 0x8CCB, 0x8CCC, 0x8CCD, + 0x8CCE, 0x8CCF, 0x8CD0, 0x8CD1, 0x8CD2, 0x8CD3, 0x8CD4, 0x8CD5, + 0x8CD6, 0x8CD7, 0x8CD8, 0x8CD9, 0x8CDA, 0x8CDB, 0x8CDC, 0x8CDD, + 0x8CDE, 0x8CDF, 0x8CE0, 0x8CE1, 0x8CE2, 0x8CE3, 0x8CE4, 0x8CE5, + 0x8CE6, 0x8CE7, 0x8CE8, 0x8CE9, 0x8CEA, 0x8CEB, 0x8CEC, 0x8CED, + 0x8CEE, 0x8CEF, 0x8CF0, 0x8CF1, 0x8CF2, 0x8CF3, 0x8CF4, 0x8CF5, + 0x8CF6, 0x8CF7, 0x8CF8, 0x8CF9, 0x8CFA, 0x8CFB, 0x8CFC, 0x8CFD, + 0x8CFE, 0x8CFF, 0x8D00, 0x8D01, 0x8D02, 0x8D03, 0x8D04, 0x8D05, + 0x8D06, 0x8D07, 0x8D08, 0x8D09, 0x8D0A, 0x8D0B, 0x8D0C, 0x8D0D, + 0x4F5F, 0x4F57, 0x4F32, 0x4F3D, 0x4F76, 0x4F74, 0x4F91, 0x4F89, + 0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC, 0x4F94, + 0x4FE6, 0x4FE8, 0x4FEA, 0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC, 0x4FD1, + 0x4FDF, 0x4FF8, 0x5029, 0x504C, 0x4FF3, 0x502C, 0x500F, 0x502E, + 0x502D, 0x4FFE, 0x501C, 0x500C, 0x5025, 0x5028, 0x507E, 0x5043, + 0x5055, 0x5048, 0x504E, 0x506C, 0x507B, 0x50A5, 0x50A7, 0x50A9, + 0x50BA, 0x50D6, 0x5106, 0x50ED, 0x50EC, 0x50E6, 0x50EE, 0x5107, + 0x510B, 0x4EDD, 0x6C3D, 0x4F58, 0x4F65, 0x4FCE, 0x9FA0, 0x6C46, + 0x7C74, 0x516E, 0x5DFD, 0x9EC9, 0x9998, 0x5181, 0x5914, 0x52F9, + 0x530D, 0x8A07, 0x5310, 0x51EB, 0x5919, 0x5155, 0x4EA0, 0x5156, +plane 67 +at 0x00 + 0x4EB3, 0x886E, 0x88A4, 0x4EB5, 0x8114, 0x88D2, 0x7980, 0x5B34, + 0x8803, 0x7FB8, 0x51AB, 0x51B1, 0x51BD, 0x51BC, 0x8D0E, 0x8D0F, + 0x8D10, 0x8D11, 0x8D12, 0x8D13, 0x8D14, 0x8D15, 0x8D16, 0x8D17, + 0x8D18, 0x8D19, 0x8D1A, 0x8D1B, 0x8D1C, 0x8D20, 0x8D51, 0x8D52, + 0x8D57, 0x8D5F, 0x8D65, 0x8D68, 0x8D69, 0x8D6A, 0x8D6C, 0x8D6E, + 0x8D6F, 0x8D71, 0x8D72, 0x8D78, 0x8D79, 0x8D7A, 0x8D7B, 0x8D7C, + 0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, 0x8D82, 0x8D83, 0x8D86, 0x8D87, + 0x8D88, 0x8D89, 0x8D8C, 0x8D8D, 0x8D8E, 0x8D8F, 0x8D90, 0x8D92, + 0x8D93, 0x8D95, 0x8D96, 0x8D97, 0x8D98, 0x8D99, 0x8D9A, 0x8D9B, + 0x8D9C, 0x8D9D, 0x8D9E, 0x8DA0, 0x8DA1, 0x8DA2, 0x8DA4, 0x8DA5, + 0x8DA6, 0x8DA7, 0x8DA8, 0x8DA9, 0x8DAA, 0x8DAB, 0x8DAC, 0x8DAD, + 0x8DAE, 0x8DAF, 0x8DB0, 0x8DB2, 0x8DB6, 0x8DB7, 0x8DB9, 0x8DBB, + 0x8DBD, 0x8DC0, 0x8DC1, 0x8DC2, 0x8DC5, 0x8DC7, 0x8DC8, 0x8DC9, + 0x8DCA, 0x8DCD, 0x8DD0, 0x8DD2, 0x8DD3, 0x8DD4, 0x51C7, 0x5196, + 0x51A2, 0x51A5, 0x8BA0, 0x8BA6, 0x8BA7, 0x8BAA, 0x8BB4, 0x8BB5, + 0x8BB7, 0x8BC2, 0x8BC3, 0x8BCB, 0x8BCF, 0x8BCE, 0x8BD2, 0x8BD3, + 0x8BD4, 0x8BD6, 0x8BD8, 0x8BD9, 0x8BDC, 0x8BDF, 0x8BE0, 0x8BE4, + 0x8BE8, 0x8BE9, 0x8BEE, 0x8BF0, 0x8BF3, 0x8BF6, 0x8BF9, 0x8BFC, + 0x8BFF, 0x8C00, 0x8C02, 0x8C04, 0x8C07, 0x8C0C, 0x8C0F, 0x8C11, + 0x8C12, 0x8C14, 0x8C15, 0x8C16, 0x8C19, 0x8C1B, 0x8C18, 0x8C1D, + 0x8C1F, 0x8C20, 0x8C21, 0x8C25, 0x8C27, 0x8C2A, 0x8C2B, 0x8C2E, + 0x8C2F, 0x8C32, 0x8C33, 0x8C35, 0x8C36, 0x5369, 0x537A, 0x961D, + 0x9622, 0x9621, 0x9631, 0x962A, 0x963D, 0x963C, 0x9642, 0x9649, + 0x9654, 0x965F, 0x9667, 0x966C, 0x9672, 0x9674, 0x9688, 0x968D, + 0x9697, 0x96B0, 0x9097, 0x909B, 0x909D, 0x9099, 0x90AC, 0x90A1, + 0x90B4, 0x90B3, 0x90B6, 0x90BA, 0x8DD5, 0x8DD8, 0x8DD9, 0x8DDC, + 0x8DE0, 0x8DE1, 0x8DE2, 0x8DE5, 0x8DE6, 0x8DE7, 0x8DE9, 0x8DED, + 0x8DEE, 0x8DF0, 0x8DF1, 0x8DF2, 0x8DF4, 0x8DF6, 0x8DFC, 0x8DFE, + 0x8DFF, 0x8E00, 0x8E01, 0x8E02, 0x8E03, 0x8E04, 0x8E06, 0x8E07, + 0x8E08, 0x8E0B, 0x8E0D, 0x8E0E, 0x8E10, 0x8E11, 0x8E12, 0x8E13, + 0x8E15, 0x8E16, 0x8E17, 0x8E18, 0x8E19, 0x8E1A, 0x8E1B, 0x8E1C, + 0x8E20, 0x8E21, 0x8E24, 0x8E25, 0x8E26, 0x8E27, 0x8E28, 0x8E2B, +plane 68 +at 0x00 + 0x8E2D, 0x8E30, 0x8E32, 0x8E33, 0x8E34, 0x8E36, 0x8E37, 0x8E38, + 0x8E3B, 0x8E3C, 0x8E3E, 0x8E3F, 0x8E43, 0x8E45, 0x8E46, 0x8E4C, + 0x8E4D, 0x8E4E, 0x8E4F, 0x8E50, 0x8E53, 0x8E54, 0x8E55, 0x8E56, + 0x8E57, 0x8E58, 0x8E5A, 0x8E5B, 0x8E5C, 0x8E5D, 0x8E5E, 0x8E5F, + 0x8E60, 0x8E61, 0x8E62, 0x8E63, 0x8E64, 0x8E65, 0x8E67, 0x8E68, + 0x8E6A, 0x8E6B, 0x8E6E, 0x8E71, 0x90B8, 0x90B0, 0x90CF, 0x90C5, + 0x90BE, 0x90D0, 0x90C4, 0x90C7, 0x90D3, 0x90E6, 0x90E2, 0x90DC, + 0x90D7, 0x90DB, 0x90EB, 0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, + 0x9123, 0x9131, 0x912F, 0x9139, 0x9143, 0x9146, 0x520D, 0x5942, + 0x52A2, 0x52AC, 0x52AD, 0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, + 0x53DF, 0x71EE, 0x77CD, 0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, + 0x5F01, 0x755A, 0x5DEF, 0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, + 0x58C5, 0x58D1, 0x5729, 0x572C, 0x572A, 0x5733, 0x5739, 0x572E, + 0x572F, 0x575C, 0x573B, 0x5742, 0x5769, 0x5785, 0x576B, 0x5786, + 0x577C, 0x577B, 0x5768, 0x576D, 0x5776, 0x5773, 0x57AD, 0x57A4, + 0x578C, 0x57B2, 0x57CF, 0x57A7, 0x57B4, 0x5793, 0x57A0, 0x57D5, + 0x57D8, 0x57DA, 0x57D9, 0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, + 0x57E4, 0x57DD, 0x8E73, 0x8E75, 0x8E77, 0x8E78, 0x8E79, 0x8E7A, + 0x8E7B, 0x8E7D, 0x8E7E, 0x8E80, 0x8E82, 0x8E83, 0x8E84, 0x8E86, + 0x8E88, 0x8E89, 0x8E8A, 0x8E8B, 0x8E8C, 0x8E8D, 0x8E8E, 0x8E91, + 0x8E92, 0x8E93, 0x8E95, 0x8E96, 0x8E97, 0x8E98, 0x8E99, 0x8E9A, + 0x8E9B, 0x8E9D, 0x8E9F, 0x8EA0, 0x8EA1, 0x8EA2, 0x8EA3, 0x8EA4, + 0x8EA5, 0x8EA6, 0x8EA7, 0x8EA8, 0x8EA9, 0x8EAA, 0x8EAD, 0x8EAE, + 0x8EB0, 0x8EB1, 0x8EB3, 0x8EB4, 0x8EB5, 0x8EB6, 0x8EB7, 0x8EB8, + 0x8EB9, 0x8EBB, 0x8EBC, 0x8EBD, 0x8EBE, 0x8EBF, 0x8EC0, 0x8EC1, + 0x8EC2, 0x8EC3, 0x8EC4, 0x8EC5, 0x8EC6, 0x8EC7, 0x8EC8, 0x8EC9, + 0x8ECA, 0x8ECB, 0x8ECC, 0x8ECD, 0x8ECF, 0x8ED0, 0x8ED1, 0x8ED2, + 0x8ED3, 0x8ED4, 0x8ED5, 0x8ED6, 0x8ED7, 0x8ED8, 0x8ED9, 0x8EDA, + 0x8EDB, 0x8EDC, 0x8EDD, 0x8EDE, 0x8EDF, 0x8EE0, 0x8EE1, 0x8EE2, + 0x8EE3, 0x8EE4, 0x580B, 0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, + 0x5819, 0x5844, 0x5820, 0x5865, 0x586C, 0x5881, 0x5889, 0x589A, + 0x5880, 0x99A8, 0x9F19, 0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, +plane 69 +at 0x00 + 0x828A, 0x82A8, 0x8284, 0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, + 0x82B8, 0x82BE, 0x82B0, 0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, + 0x82AE, 0x82CB, 0x82CC, 0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, + 0x829F, 0x82C4, 0x82CE, 0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, + 0x830F, 0x8307, 0x82DC, 0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, + 0x82D3, 0x8311, 0x831A, 0x8306, 0x8314, 0x8315, 0x82E0, 0x82D5, + 0x831C, 0x8351, 0x835B, 0x835C, 0x8308, 0x8392, 0x833C, 0x8334, + 0x8331, 0x839B, 0x835E, 0x832F, 0x834F, 0x8347, 0x8343, 0x835F, + 0x8340, 0x8317, 0x8360, 0x832D, 0x833A, 0x8333, 0x8366, 0x8365, + 0x8EE5, 0x8EE6, 0x8EE7, 0x8EE8, 0x8EE9, 0x8EEA, 0x8EEB, 0x8EEC, + 0x8EED, 0x8EEE, 0x8EEF, 0x8EF0, 0x8EF1, 0x8EF2, 0x8EF3, 0x8EF4, + 0x8EF5, 0x8EF6, 0x8EF7, 0x8EF8, 0x8EF9, 0x8EFA, 0x8EFB, 0x8EFC, + 0x8EFD, 0x8EFE, 0x8EFF, 0x8F00, 0x8F01, 0x8F02, 0x8F03, 0x8F04, + 0x8F05, 0x8F06, 0x8F07, 0x8F08, 0x8F09, 0x8F0A, 0x8F0B, 0x8F0C, + 0x8F0D, 0x8F0E, 0x8F0F, 0x8F10, 0x8F11, 0x8F12, 0x8F13, 0x8F14, + 0x8F15, 0x8F16, 0x8F17, 0x8F18, 0x8F19, 0x8F1A, 0x8F1B, 0x8F1C, + 0x8F1D, 0x8F1E, 0x8F1F, 0x8F20, 0x8F21, 0x8F22, 0x8F23, 0x8F24, + 0x8F25, 0x8F26, 0x8F27, 0x8F28, 0x8F29, 0x8F2A, 0x8F2B, 0x8F2C, + 0x8F2D, 0x8F2E, 0x8F2F, 0x8F30, 0x8F31, 0x8F32, 0x8F33, 0x8F34, + 0x8F35, 0x8F36, 0x8F37, 0x8F38, 0x8F39, 0x8F3A, 0x8F3B, 0x8F3C, + 0x8F3D, 0x8F3E, 0x8F3F, 0x8F40, 0x8F41, 0x8F42, 0x8F43, 0x8F44, + 0x8368, 0x831B, 0x8369, 0x836C, 0x836A, 0x836D, 0x836E, 0x83B0, + 0x8378, 0x83B3, 0x83B4, 0x83A0, 0x83AA, 0x8393, 0x839C, 0x8385, + 0x837C, 0x83B6, 0x83A9, 0x837D, 0x83B8, 0x837B, 0x8398, 0x839E, + 0x83A8, 0x83BA, 0x83BC, 0x83C1, 0x8401, 0x83E5, 0x83D8, 0x5807, + 0x8418, 0x840B, 0x83DD, 0x83FD, 0x83D6, 0x841C, 0x8438, 0x8411, + 0x8406, 0x83D4, 0x83DF, 0x840F, 0x8403, 0x83F8, 0x83F9, 0x83EA, + 0x83C5, 0x83C0, 0x8426, 0x83F0, 0x83E1, 0x845C, 0x8451, 0x845A, + 0x8459, 0x8473, 0x8487, 0x8488, 0x847A, 0x8489, 0x8478, 0x843C, + 0x8446, 0x8469, 0x8476, 0x848C, 0x848E, 0x8431, 0x846D, 0x84C1, + 0x84CD, 0x84D0, 0x84E6, 0x84BD, 0x84D3, 0x84CA, 0x84BF, 0x84BA, + 0x84E0, 0x84A1, 0x84B9, 0x84B4, 0x8497, 0x84E5, 0x84E3, 0x850C, +plane 70 +at 0x00 + 0x750D, 0x8538, 0x84F0, 0x8539, 0x851F, 0x853A, 0x8F45, 0x8F46, + 0x8F47, 0x8F48, 0x8F49, 0x8F4A, 0x8F4B, 0x8F4C, 0x8F4D, 0x8F4E, + 0x8F4F, 0x8F50, 0x8F51, 0x8F52, 0x8F53, 0x8F54, 0x8F55, 0x8F56, + 0x8F57, 0x8F58, 0x8F59, 0x8F5A, 0x8F5B, 0x8F5C, 0x8F5D, 0x8F5E, + 0x8F5F, 0x8F60, 0x8F61, 0x8F62, 0x8F63, 0x8F64, 0x8F65, 0x8F6A, + 0x8F80, 0x8F8C, 0x8F92, 0x8F9D, 0x8FA0, 0x8FA1, 0x8FA2, 0x8FA4, + 0x8FA5, 0x8FA6, 0x8FA7, 0x8FAA, 0x8FAC, 0x8FAD, 0x8FAE, 0x8FAF, + 0x8FB2, 0x8FB3, 0x8FB4, 0x8FB5, 0x8FB7, 0x8FB8, 0x8FBA, 0x8FBB, + 0x8FBC, 0x8FBF, 0x8FC0, 0x8FC3, 0x8FC6, 0x8FC9, 0x8FCA, 0x8FCB, + 0x8FCC, 0x8FCD, 0x8FCF, 0x8FD2, 0x8FD6, 0x8FD7, 0x8FDA, 0x8FE0, + 0x8FE1, 0x8FE3, 0x8FE7, 0x8FEC, 0x8FEF, 0x8FF1, 0x8FF2, 0x8FF4, + 0x8FF5, 0x8FF6, 0x8FFA, 0x8FFB, 0x8FFC, 0x8FFE, 0x8FFF, 0x9007, + 0x9008, 0x900C, 0x900E, 0x9013, 0x9015, 0x9018, 0x8556, 0x853B, + 0x84FF, 0x84FC, 0x8559, 0x8548, 0x8568, 0x8564, 0x855E, 0x857A, + 0x77A2, 0x8543, 0x8572, 0x857B, 0x85A4, 0x85A8, 0x8587, 0x858F, + 0x8579, 0x85AE, 0x859C, 0x8585, 0x85B9, 0x85B7, 0x85B0, 0x85D3, + 0x85C1, 0x85DC, 0x85FF, 0x8627, 0x8605, 0x8629, 0x8616, 0x863C, + 0x5EFE, 0x5F08, 0x593C, 0x5941, 0x8037, 0x5955, 0x595A, 0x5958, + 0x530F, 0x5C22, 0x5C25, 0x5C2C, 0x5C34, 0x624C, 0x626A, 0x629F, + 0x62BB, 0x62CA, 0x62DA, 0x62D7, 0x62EE, 0x6322, 0x62F6, 0x6339, + 0x634B, 0x6343, 0x63AD, 0x63F6, 0x6371, 0x637A, 0x638E, 0x63B4, + 0x636D, 0x63AC, 0x638A, 0x6369, 0x63AE, 0x63BC, 0x63F2, 0x63F8, + 0x63E0, 0x63FF, 0x63C4, 0x63DE, 0x63CE, 0x6452, 0x63C6, 0x63BE, + 0x6445, 0x6441, 0x640B, 0x641B, 0x6420, 0x640C, 0x6426, 0x6421, + 0x645E, 0x6484, 0x646D, 0x6496, 0x9019, 0x901C, 0x9023, 0x9024, + 0x9025, 0x9027, 0x9028, 0x9029, 0x902A, 0x902B, 0x902C, 0x9030, + 0x9031, 0x9032, 0x9033, 0x9034, 0x9037, 0x9039, 0x903A, 0x903D, + 0x903F, 0x9040, 0x9043, 0x9045, 0x9046, 0x9048, 0x9049, 0x904A, + 0x904B, 0x904C, 0x904E, 0x9054, 0x9055, 0x9056, 0x9059, 0x905A, + 0x905C, 0x905D, 0x905E, 0x905F, 0x9060, 0x9061, 0x9064, 0x9066, + 0x9067, 0x9069, 0x906A, 0x906B, 0x906C, 0x906F, 0x9070, 0x9071, + 0x9072, 0x9073, 0x9076, 0x9077, 0x9078, 0x9079, 0x907A, 0x907B, +plane 71 +at 0x00 + 0x907C, 0x907E, 0x9081, 0x9084, 0x9085, 0x9086, 0x9087, 0x9089, + 0x908A, 0x908C, 0x908D, 0x908E, 0x908F, 0x9090, 0x9092, 0x9094, + 0x9096, 0x9098, 0x909A, 0x909C, 0x909E, 0x909F, 0x90A0, 0x90A4, + 0x90A5, 0x90A7, 0x90A8, 0x90A9, 0x90AB, 0x90AD, 0x90B2, 0x90B7, + 0x90BC, 0x90BD, 0x90BF, 0x90C0, 0x647A, 0x64B7, 0x64B8, 0x6499, + 0x64BA, 0x64C0, 0x64D0, 0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, + 0x652E, 0x5F0B, 0x5FD2, 0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, + 0x53E9, 0x53E8, 0x53FB, 0x5412, 0x5416, 0x5406, 0x544B, 0x5452, + 0x5453, 0x5454, 0x5456, 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, + 0x5432, 0x5482, 0x5494, 0x5477, 0x5471, 0x5464, 0x549A, 0x549B, + 0x5484, 0x5476, 0x5466, 0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, + 0x54D2, 0x54A7, 0x54A6, 0x54D3, 0x54D4, 0x5472, 0x54A3, 0x54D5, + 0x54BB, 0x54BF, 0x54CC, 0x54D9, 0x54DA, 0x54DC, 0x54A9, 0x54AA, + 0x54A4, 0x54DD, 0x54CF, 0x54DE, 0x551B, 0x54E7, 0x5520, 0x54FD, + 0x5514, 0x54F3, 0x5522, 0x5523, 0x550F, 0x5511, 0x5527, 0x552A, + 0x5567, 0x558F, 0x55B5, 0x5549, 0x556D, 0x5541, 0x5555, 0x553F, + 0x5550, 0x553C, 0x90C2, 0x90C3, 0x90C6, 0x90C8, 0x90C9, 0x90CB, + 0x90CC, 0x90CD, 0x90D2, 0x90D4, 0x90D5, 0x90D6, 0x90D8, 0x90D9, + 0x90DA, 0x90DE, 0x90DF, 0x90E0, 0x90E3, 0x90E4, 0x90E5, 0x90E9, + 0x90EA, 0x90EC, 0x90EE, 0x90F0, 0x90F1, 0x90F2, 0x90F3, 0x90F5, + 0x90F6, 0x90F7, 0x90F9, 0x90FA, 0x90FB, 0x90FC, 0x90FF, 0x9100, + 0x9101, 0x9103, 0x9105, 0x9106, 0x9107, 0x9108, 0x9109, 0x910A, + 0x910B, 0x910C, 0x910D, 0x910E, 0x910F, 0x9110, 0x9111, 0x9112, + 0x9113, 0x9114, 0x9115, 0x9116, 0x9117, 0x9118, 0x911A, 0x911B, + 0x911C, 0x911D, 0x911F, 0x9120, 0x9121, 0x9124, 0x9125, 0x9126, + 0x9127, 0x9128, 0x9129, 0x912A, 0x912B, 0x912C, 0x912D, 0x912E, + 0x9130, 0x9132, 0x9133, 0x9134, 0x9135, 0x9136, 0x9137, 0x9138, + 0x913A, 0x913B, 0x913C, 0x913D, 0x913E, 0x913F, 0x9140, 0x9141, + 0x9142, 0x9144, 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, + 0x5530, 0x555C, 0x558B, 0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, + 0x5581, 0x559F, 0x557E, 0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, + 0x55BE, 0x5594, 0x5599, 0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, +plane 72 +at 0x00 + 0x55EB, 0x55EC, 0x55D4, 0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, + 0x55F2, 0x55F3, 0x55CC, 0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F94, + 0x561E, 0x5608, 0x560C, 0x5601, 0x5624, 0x5623, 0x55FE, 0x5600, + 0x5627, 0x562D, 0x5658, 0x5639, 0x5657, 0x562C, 0x564D, 0x5662, + 0x5659, 0x565C, 0x564C, 0x5654, 0x5686, 0x5664, 0x5671, 0x566B, + 0x567B, 0x567C, 0x5685, 0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, + 0x56E1, 0x56F5, 0x56EB, 0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, + 0x571C, 0x5E0F, 0x5E19, 0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C, + 0x9145, 0x9147, 0x9148, 0x9151, 0x9153, 0x9154, 0x9155, 0x9156, + 0x9158, 0x9159, 0x915B, 0x915C, 0x915F, 0x9160, 0x9166, 0x9167, + 0x9168, 0x916B, 0x916D, 0x9173, 0x917A, 0x917B, 0x917C, 0x9180, + 0x9181, 0x9182, 0x9183, 0x9184, 0x9186, 0x9188, 0x918A, 0x918E, + 0x918F, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, + 0x919C, 0x919D, 0x919E, 0x919F, 0x91A0, 0x91A1, 0x91A4, 0x91A5, + 0x91A6, 0x91A7, 0x91A8, 0x91A9, 0x91AB, 0x91AC, 0x91B0, 0x91B1, + 0x91B2, 0x91B3, 0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BB, 0x91BC, + 0x91BD, 0x91BE, 0x91BF, 0x91C0, 0x91C1, 0x91C2, 0x91C3, 0x91C4, + 0x91C5, 0x91C6, 0x91C8, 0x91CB, 0x91D0, 0x91D2, 0x91D3, 0x91D4, + 0x91D5, 0x91D6, 0x91D7, 0x91D8, 0x91D9, 0x91DA, 0x91DB, 0x91DD, + 0x91DE, 0x91DF, 0x91E0, 0x91E1, 0x91E2, 0x91E3, 0x91E4, 0x91E5, + 0x5E37, 0x5E44, 0x5E54, 0x5E5B, 0x5E5E, 0x5E61, 0x5C8C, 0x5C7A, + 0x5C8D, 0x5C90, 0x5C96, 0x5C88, 0x5C98, 0x5C99, 0x5C91, 0x5C9A, + 0x5C9C, 0x5CB5, 0x5CA2, 0x5CBD, 0x5CAC, 0x5CAB, 0x5CB1, 0x5CA3, + 0x5CC1, 0x5CB7, 0x5CC4, 0x5CD2, 0x5CE4, 0x5CCB, 0x5CE5, 0x5D02, + 0x5D03, 0x5D27, 0x5D26, 0x5D2E, 0x5D24, 0x5D1E, 0x5D06, 0x5D1B, + 0x5D58, 0x5D3E, 0x5D34, 0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F, 0x5D5D, + 0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, 0x5D74, 0x5D82, 0x5D99, 0x5D9D, + 0x8C73, 0x5DB7, 0x5DC5, 0x5F73, 0x5F77, 0x5F82, 0x5F87, 0x5F89, + 0x5F8C, 0x5F95, 0x5F99, 0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5, 0x5FBC, + 0x8862, 0x5F61, 0x72AD, 0x72B0, 0x72B4, 0x72B7, 0x72B8, 0x72C3, + 0x72C1, 0x72CE, 0x72CD, 0x72D2, 0x72E8, 0x72EF, 0x72E9, 0x72F2, + 0x72F4, 0x72F7, 0x7301, 0x72F3, 0x7303, 0x72FA, 0x91E6, 0x91E7, +plane 73 +at 0x00 + 0x91E8, 0x91E9, 0x91EA, 0x91EB, 0x91EC, 0x91ED, 0x91EE, 0x91EF, + 0x91F0, 0x91F1, 0x91F2, 0x91F3, 0x91F4, 0x91F5, 0x91F6, 0x91F7, + 0x91F8, 0x91F9, 0x91FA, 0x91FB, 0x91FC, 0x91FD, 0x91FE, 0x91FF, + 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205, 0x9206, 0x9207, + 0x9208, 0x9209, 0x920A, 0x920B, 0x920C, 0x920D, 0x920E, 0x920F, + 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215, 0x9216, 0x9217, + 0x9218, 0x9219, 0x921A, 0x921B, 0x921C, 0x921D, 0x921E, 0x921F, + 0x9220, 0x9221, 0x9222, 0x9223, 0x9224, 0x9225, 0x9226, 0x9227, + 0x9228, 0x9229, 0x922A, 0x922B, 0x922C, 0x922D, 0x922E, 0x922F, + 0x9230, 0x9231, 0x9232, 0x9233, 0x9234, 0x9235, 0x9236, 0x9237, + 0x9238, 0x9239, 0x923A, 0x923B, 0x923C, 0x923D, 0x923E, 0x923F, + 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, 0x72FB, 0x7317, + 0x7313, 0x7321, 0x730A, 0x731E, 0x731D, 0x7315, 0x7322, 0x7339, + 0x7325, 0x732C, 0x7338, 0x7331, 0x7350, 0x734D, 0x7357, 0x7360, + 0x736C, 0x736F, 0x737E, 0x821B, 0x5925, 0x98E7, 0x5924, 0x5902, + 0x9963, 0x9967, 0x9968, 0x9969, 0x996A, 0x996B, 0x996C, 0x9974, + 0x9977, 0x997D, 0x9980, 0x9984, 0x9987, 0x998A, 0x998D, 0x9990, + 0x9991, 0x9993, 0x9994, 0x9995, 0x5E80, 0x5E91, 0x5E8B, 0x5E96, + 0x5EA5, 0x5EA0, 0x5EB9, 0x5EB5, 0x5EBE, 0x5EB3, 0x8D53, 0x5ED2, + 0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, 0x81BA, 0x5FC4, 0x5FC9, 0x5FD6, + 0x5FCF, 0x6003, 0x5FEE, 0x6004, 0x5FE1, 0x5FE4, 0x5FFE, 0x6005, + 0x6006, 0x5FEA, 0x5FED, 0x5FF8, 0x6019, 0x6035, 0x6026, 0x601B, + 0x600F, 0x600D, 0x6029, 0x602B, 0x600A, 0x603F, 0x6021, 0x6078, + 0x6079, 0x607B, 0x607A, 0x6042, 0x9246, 0x9247, 0x9248, 0x9249, + 0x924A, 0x924B, 0x924C, 0x924D, 0x924E, 0x924F, 0x9250, 0x9251, + 0x9252, 0x9253, 0x9254, 0x9255, 0x9256, 0x9257, 0x9258, 0x9259, + 0x925A, 0x925B, 0x925C, 0x925D, 0x925E, 0x925F, 0x9260, 0x9261, + 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267, 0x9268, 0x9269, + 0x926A, 0x926B, 0x926C, 0x926D, 0x926E, 0x926F, 0x9270, 0x9271, + 0x9272, 0x9273, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927A, + 0x927B, 0x927C, 0x927D, 0x927E, 0x927F, 0x9280, 0x9281, 0x9282, + 0x9283, 0x9284, 0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928A, +plane 74 +at 0x00 + 0x928B, 0x928C, 0x928D, 0x928F, 0x9290, 0x9291, 0x9292, 0x9293, + 0x9294, 0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929A, 0x929B, + 0x929C, 0x929D, 0x929E, 0x929F, 0x92A0, 0x92A1, 0x92A2, 0x92A3, + 0x92A4, 0x92A5, 0x92A6, 0x92A7, 0x606A, 0x607D, 0x6096, 0x609A, + 0x60AD, 0x609D, 0x6083, 0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, + 0x60B1, 0x60DD, 0x60D8, 0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, + 0x6115, 0x6123, 0x60F4, 0x6100, 0x610E, 0x612B, 0x614A, 0x6175, + 0x61AC, 0x6194, 0x61A7, 0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, + 0x95E9, 0x95EB, 0x95F1, 0x95F3, 0x95F5, 0x95F6, 0x95FC, 0x95FE, + 0x9603, 0x9604, 0x9606, 0x9608, 0x960A, 0x960B, 0x960C, 0x960D, + 0x960F, 0x9612, 0x9615, 0x9616, 0x9617, 0x9619, 0x961A, 0x4E2C, + 0x723F, 0x6215, 0x6C35, 0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, + 0x6C90, 0x6C94, 0x6C8C, 0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, + 0x6CA9, 0x6CD0, 0x6CD4, 0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, + 0x6CB2, 0x6CE0, 0x6CD6, 0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, + 0x6CEF, 0x6CFE, 0x92A8, 0x92A9, 0x92AA, 0x92AB, 0x92AC, 0x92AD, + 0x92AF, 0x92B0, 0x92B1, 0x92B2, 0x92B3, 0x92B4, 0x92B5, 0x92B6, + 0x92B7, 0x92B8, 0x92B9, 0x92BA, 0x92BB, 0x92BC, 0x92BD, 0x92BE, + 0x92BF, 0x92C0, 0x92C1, 0x92C2, 0x92C3, 0x92C4, 0x92C5, 0x92C6, + 0x92C7, 0x92C9, 0x92CA, 0x92CB, 0x92CC, 0x92CD, 0x92CE, 0x92CF, + 0x92D0, 0x92D1, 0x92D2, 0x92D3, 0x92D4, 0x92D5, 0x92D6, 0x92D7, + 0x92D8, 0x92D9, 0x92DA, 0x92DB, 0x92DC, 0x92DD, 0x92DE, 0x92DF, + 0x92E0, 0x92E1, 0x92E2, 0x92E3, 0x92E4, 0x92E5, 0x92E6, 0x92E7, + 0x92E8, 0x92E9, 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, + 0x92F0, 0x92F1, 0x92F2, 0x92F3, 0x92F4, 0x92F5, 0x92F6, 0x92F7, + 0x92F8, 0x92F9, 0x92FA, 0x92FB, 0x92FC, 0x92FD, 0x92FE, 0x92FF, + 0x9300, 0x9301, 0x9302, 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, + 0x9308, 0x9309, 0x6D39, 0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, + 0x6D04, 0x6D19, 0x6D0E, 0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, + 0x6D4F, 0x6D52, 0x6D54, 0x6D33, 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, + 0x6D5E, 0x6D93, 0x6D94, 0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, + 0x6DC7, 0x6DC5, 0x6DDE, 0x6E0E, 0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, +plane 75 +at 0x00 + 0x6DDD, 0x6DD9, 0x6E16, 0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, + 0x6E4E, 0x6E6B, 0x6EB2, 0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, + 0x6E25, 0x6E44, 0x6EDF, 0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, + 0x6EA5, 0x6EA7, 0x6EBD, 0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, + 0x6E8F, 0x6EC2, 0x6E9F, 0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, + 0x6EF9, 0x6F2F, 0x6F36, 0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, + 0x6F89, 0x6F8D, 0x6F8C, 0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1, + 0x930A, 0x930B, 0x930C, 0x930D, 0x930E, 0x930F, 0x9310, 0x9311, + 0x9312, 0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319, + 0x931A, 0x931B, 0x931C, 0x931D, 0x931E, 0x931F, 0x9320, 0x9321, + 0x9322, 0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329, + 0x932A, 0x932B, 0x932C, 0x932D, 0x932E, 0x932F, 0x9330, 0x9331, + 0x9332, 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339, + 0x933A, 0x933B, 0x933C, 0x933D, 0x933F, 0x9340, 0x9341, 0x9342, + 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x934A, + 0x934B, 0x934C, 0x934D, 0x934E, 0x934F, 0x9350, 0x9351, 0x9352, + 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, 0x935A, + 0x935B, 0x935C, 0x935D, 0x935E, 0x935F, 0x9360, 0x9361, 0x9362, + 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x936B, + 0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE, 0x6FDE, + 0x6FE0, 0x6FEF, 0x701A, 0x7023, 0x701B, 0x7039, 0x7035, 0x704F, + 0x705E, 0x5B80, 0x5B84, 0x5B95, 0x5B93, 0x5BA5, 0x5BB8, 0x752F, + 0x9A9E, 0x6434, 0x5BE4, 0x5BEE, 0x8930, 0x5BF0, 0x8E47, 0x8B07, + 0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9, 0x8FE6, + 0x8FF3, 0x8FE8, 0x9005, 0x9004, 0x900B, 0x9026, 0x9011, 0x900D, + 0x9016, 0x9021, 0x9035, 0x9036, 0x902D, 0x902F, 0x9044, 0x9051, + 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905B, 0x66B9, 0x9074, + 0x907D, 0x9082, 0x9088, 0x9083, 0x908B, 0x5F50, 0x5F57, 0x5F56, + 0x5F58, 0x5C3B, 0x54AB, 0x5C50, 0x5C59, 0x5B71, 0x5C63, 0x5C66, + 0x7FBC, 0x5F2A, 0x5F29, 0x5F2D, 0x8274, 0x5F3C, 0x9B3B, 0x5C6E, + 0x5981, 0x5983, 0x598D, 0x59A9, 0x59AA, 0x59A3, 0x936C, 0x936D, + 0x936E, 0x936F, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, +plane 76 +at 0x00 + 0x9376, 0x9377, 0x9378, 0x9379, 0x937A, 0x937B, 0x937C, 0x937D, + 0x937E, 0x937F, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, + 0x9386, 0x9387, 0x9388, 0x9389, 0x938A, 0x938B, 0x938C, 0x938D, + 0x938E, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396, + 0x9397, 0x9398, 0x9399, 0x939A, 0x939B, 0x939C, 0x939D, 0x939E, + 0x939F, 0x93A0, 0x93A1, 0x93A2, 0x93A3, 0x93A4, 0x93A5, 0x93A6, + 0x93A7, 0x93A8, 0x93A9, 0x93AA, 0x93AB, 0x93AC, 0x93AD, 0x93AE, + 0x93AF, 0x93B0, 0x93B1, 0x93B2, 0x93B3, 0x93B4, 0x93B5, 0x93B6, + 0x93B7, 0x93B8, 0x93B9, 0x93BA, 0x93BB, 0x93BC, 0x93BD, 0x93BE, + 0x93BF, 0x93C0, 0x93C1, 0x93C2, 0x93C3, 0x93C4, 0x93C5, 0x93C6, + 0x93C7, 0x93C8, 0x93C9, 0x93CB, 0x93CC, 0x93CD, 0x5997, 0x59CA, + 0x59AB, 0x599E, 0x59A4, 0x59D2, 0x59B2, 0x59AF, 0x59D7, 0x59BE, + 0x5A05, 0x5A06, 0x59DD, 0x5A08, 0x59E3, 0x59D8, 0x59F9, 0x5A0C, + 0x5A09, 0x5A32, 0x5A34, 0x5A11, 0x5A23, 0x5A13, 0x5A40, 0x5A67, + 0x5A4A, 0x5A55, 0x5A3C, 0x5A62, 0x5A75, 0x80EC, 0x5AAA, 0x5A9B, + 0x5A77, 0x5A7A, 0x5ABE, 0x5AEB, 0x5AB2, 0x5AD2, 0x5AD4, 0x5AB8, + 0x5AE0, 0x5AE3, 0x5AF1, 0x5AD6, 0x5AE6, 0x5AD8, 0x5ADC, 0x5B09, + 0x5B17, 0x5B16, 0x5B32, 0x5B37, 0x5B40, 0x5C15, 0x5C1C, 0x5B5A, + 0x5B65, 0x5B73, 0x5B51, 0x5B53, 0x5B62, 0x9A75, 0x9A77, 0x9A78, + 0x9A7A, 0x9A7F, 0x9A7D, 0x9A80, 0x9A81, 0x9A85, 0x9A88, 0x9A8A, + 0x9A90, 0x9A92, 0x9A93, 0x9A96, 0x9A98, 0x9A9B, 0x9A9C, 0x9A9D, + 0x9A9F, 0x9AA0, 0x9AA2, 0x9AA3, 0x9AA5, 0x9AA7, 0x7E9F, 0x7EA1, + 0x7EA3, 0x7EA5, 0x7EA8, 0x7EA9, 0x93CE, 0x93CF, 0x93D0, 0x93D1, + 0x93D2, 0x93D3, 0x93D4, 0x93D5, 0x93D7, 0x93D8, 0x93D9, 0x93DA, + 0x93DB, 0x93DC, 0x93DD, 0x93DE, 0x93DF, 0x93E0, 0x93E1, 0x93E2, + 0x93E3, 0x93E4, 0x93E5, 0x93E6, 0x93E7, 0x93E8, 0x93E9, 0x93EA, + 0x93EB, 0x93EC, 0x93ED, 0x93EE, 0x93EF, 0x93F0, 0x93F1, 0x93F2, + 0x93F3, 0x93F4, 0x93F5, 0x93F6, 0x93F7, 0x93F8, 0x93F9, 0x93FA, + 0x93FB, 0x93FC, 0x93FD, 0x93FE, 0x93FF, 0x9400, 0x9401, 0x9402, + 0x9403, 0x9404, 0x9405, 0x9406, 0x9407, 0x9408, 0x9409, 0x940A, + 0x940B, 0x940C, 0x940D, 0x940E, 0x940F, 0x9410, 0x9411, 0x9412, + 0x9413, 0x9414, 0x9415, 0x9416, 0x9417, 0x9418, 0x9419, 0x941A, +plane 77 +at 0x00 + 0x941B, 0x941C, 0x941D, 0x941E, 0x941F, 0x9420, 0x9421, 0x9422, + 0x9423, 0x9424, 0x9425, 0x9426, 0x9427, 0x9428, 0x9429, 0x942A, + 0x942B, 0x942C, 0x942D, 0x942E, 0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, + 0x7EC1, 0x7EC2, 0x7EC9, 0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, + 0x7EDB, 0x7EE0, 0x7EE1, 0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, + 0x7EF2, 0x7F0D, 0x7EF6, 0x7EFA, 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, + 0x7F03, 0x7F07, 0x7F08, 0x7F0B, 0x7F0C, 0x7F0F, 0x7F11, 0x7F12, + 0x7F17, 0x7F19, 0x7F1C, 0x7F1B, 0x7F1F, 0x7F21, 0x7F22, 0x7F23, + 0x7F24, 0x7F25, 0x7F26, 0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, + 0x7F2F, 0x7F30, 0x7F31, 0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, + 0x5DDB, 0x753E, 0x9095, 0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, + 0x73CF, 0x73C2, 0x73D1, 0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, + 0x73E5, 0x73D9, 0x987C, 0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, + 0x73F2, 0x740F, 0x742A, 0x745B, 0x7426, 0x7425, 0x7428, 0x7430, + 0x742E, 0x742C, 0x942F, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, + 0x9435, 0x9436, 0x9437, 0x9438, 0x9439, 0x943A, 0x943B, 0x943C, + 0x943D, 0x943F, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, + 0x9446, 0x9447, 0x9448, 0x9449, 0x944A, 0x944B, 0x944C, 0x944D, + 0x944E, 0x944F, 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, + 0x9456, 0x9457, 0x9458, 0x9459, 0x945A, 0x945B, 0x945C, 0x945D, + 0x945E, 0x945F, 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, + 0x9466, 0x9467, 0x9468, 0x9469, 0x946A, 0x946C, 0x946D, 0x946E, + 0x946F, 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, + 0x9477, 0x9478, 0x9479, 0x947A, 0x947B, 0x947C, 0x947D, 0x947E, + 0x947F, 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9491, 0x9496, + 0x9498, 0x94C7, 0x94CF, 0x94D3, 0x94D4, 0x94DA, 0x94E6, 0x94FB, + 0x951C, 0x9520, 0x741B, 0x741A, 0x7441, 0x745C, 0x7457, 0x7455, + 0x7459, 0x7477, 0x746D, 0x747E, 0x749C, 0x748E, 0x7480, 0x7481, + 0x7487, 0x748B, 0x749E, 0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74D2, + 0x74BA, 0x97EA, 0x97EB, 0x97EC, 0x674C, 0x6753, 0x675E, 0x6748, + 0x6769, 0x67A5, 0x6787, 0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, + 0x67A8, 0x679E, 0x67AD, 0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, +plane 78 +at 0x00 + 0x67D8, 0x680A, 0x67E9, 0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, + 0x67B3, 0x67DD, 0x6800, 0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, + 0x67FD, 0x6832, 0x6833, 0x6860, 0x6861, 0x684E, 0x6862, 0x6844, + 0x6864, 0x6883, 0x681D, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, + 0x683E, 0x684A, 0x6849, 0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, + 0x6893, 0x686B, 0x68C2, 0x696E, 0x68FC, 0x691F, 0x6920, 0x68F9, + 0x9527, 0x9533, 0x953D, 0x9543, 0x9548, 0x954B, 0x9555, 0x955A, + 0x9560, 0x956E, 0x9574, 0x9575, 0x9577, 0x9578, 0x9579, 0x957A, + 0x957B, 0x957C, 0x957D, 0x957E, 0x9580, 0x9581, 0x9582, 0x9583, + 0x9584, 0x9585, 0x9586, 0x9587, 0x9588, 0x9589, 0x958A, 0x958B, + 0x958C, 0x958D, 0x958E, 0x958F, 0x9590, 0x9591, 0x9592, 0x9593, + 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959A, 0x959B, + 0x959C, 0x959D, 0x959E, 0x959F, 0x95A0, 0x95A1, 0x95A2, 0x95A3, + 0x95A4, 0x95A5, 0x95A6, 0x95A7, 0x95A8, 0x95A9, 0x95AA, 0x95AB, + 0x95AC, 0x95AD, 0x95AE, 0x95AF, 0x95B0, 0x95B1, 0x95B2, 0x95B3, + 0x95B4, 0x95B5, 0x95B6, 0x95B7, 0x95B8, 0x95B9, 0x95BA, 0x95BB, + 0x95BC, 0x95BD, 0x95BE, 0x95BF, 0x95C0, 0x95C1, 0x95C2, 0x95C3, + 0x95C4, 0x95C5, 0x95C6, 0x95C7, 0x95C8, 0x95C9, 0x95CA, 0x95CB, + 0x6924, 0x68F0, 0x690B, 0x6901, 0x6957, 0x68E3, 0x6910, 0x6971, + 0x6939, 0x6960, 0x6942, 0x695D, 0x6984, 0x696B, 0x6980, 0x6998, + 0x6978, 0x6934, 0x69CC, 0x6987, 0x6988, 0x69CE, 0x6989, 0x6966, + 0x6963, 0x6979, 0x699B, 0x69A7, 0x69BB, 0x69AB, 0x69AD, 0x69D4, + 0x69B1, 0x69C1, 0x69CA, 0x69DF, 0x6995, 0x69E0, 0x698D, 0x69FF, + 0x6A2F, 0x69ED, 0x6A17, 0x6A18, 0x6A65, 0x69F2, 0x6A44, 0x6A3E, + 0x6AA0, 0x6A50, 0x6A5B, 0x6A35, 0x6A8E, 0x6A79, 0x6A3D, 0x6A28, + 0x6A58, 0x6A7C, 0x6A91, 0x6A90, 0x6AA9, 0x6A97, 0x6AAB, 0x7337, + 0x7352, 0x6B81, 0x6B82, 0x6B87, 0x6B84, 0x6B92, 0x6B93, 0x6B8D, + 0x6B9A, 0x6B9B, 0x6BA1, 0x6BAA, 0x8F6B, 0x8F6D, 0x8F71, 0x8F72, + 0x8F73, 0x8F75, 0x8F76, 0x8F78, 0x8F77, 0x8F79, 0x8F7A, 0x8F7C, + 0x8F7E, 0x8F81, 0x8F82, 0x8F84, 0x8F87, 0x8F8B, 0x95CC, 0x95CD, + 0x95CE, 0x95CF, 0x95D0, 0x95D1, 0x95D2, 0x95D3, 0x95D4, 0x95D5, + 0x95D6, 0x95D7, 0x95D8, 0x95D9, 0x95DA, 0x95DB, 0x95DC, 0x95DD, +plane 79 +at 0x00 + 0x95DE, 0x95DF, 0x95E0, 0x95E1, 0x95E2, 0x95E3, 0x95E4, 0x95E5, + 0x95E6, 0x95E7, 0x95EC, 0x95FF, 0x9607, 0x9613, 0x9618, 0x961B, + 0x961E, 0x9620, 0x9623, 0x9624, 0x9625, 0x9626, 0x9627, 0x9628, + 0x9629, 0x962B, 0x962C, 0x962D, 0x962F, 0x9630, 0x9637, 0x9638, + 0x9639, 0x963A, 0x963E, 0x9641, 0x9643, 0x964A, 0x964E, 0x964F, + 0x9651, 0x9652, 0x9653, 0x9656, 0x9657, 0x9658, 0x9659, 0x965A, + 0x965C, 0x965D, 0x965E, 0x9660, 0x9663, 0x9665, 0x9666, 0x966B, + 0x966D, 0x966E, 0x966F, 0x9670, 0x9671, 0x9673, 0x9678, 0x9679, + 0x967A, 0x967B, 0x967C, 0x967D, 0x967E, 0x967F, 0x9680, 0x9681, + 0x9682, 0x9683, 0x9684, 0x9687, 0x9689, 0x968A, 0x8F8D, 0x8F8E, + 0x8F8F, 0x8F98, 0x8F9A, 0x8ECE, 0x620B, 0x6217, 0x621B, 0x621F, + 0x6222, 0x6221, 0x6225, 0x6224, 0x622C, 0x81E7, 0x74EF, 0x74F4, + 0x74FF, 0x750F, 0x7511, 0x7513, 0x6534, 0x65EE, 0x65EF, 0x65F0, + 0x660A, 0x6619, 0x6772, 0x6603, 0x6615, 0x6600, 0x7085, 0x66F7, + 0x661D, 0x6634, 0x6631, 0x6636, 0x6635, 0x8006, 0x665F, 0x6654, + 0x6641, 0x664F, 0x6656, 0x6661, 0x6657, 0x6677, 0x6684, 0x668C, + 0x66A7, 0x669D, 0x66BE, 0x66DB, 0x66DC, 0x66E6, 0x66E9, 0x8D32, + 0x8D33, 0x8D36, 0x8D3B, 0x8D3D, 0x8D40, 0x8D45, 0x8D46, 0x8D48, + 0x8D49, 0x8D47, 0x8D4D, 0x8D55, 0x8D59, 0x89C7, 0x89CA, 0x89CB, + 0x89CC, 0x89CE, 0x89CF, 0x89D0, 0x89D1, 0x726E, 0x729F, 0x725D, + 0x7266, 0x726F, 0x727E, 0x727F, 0x7284, 0x728B, 0x728D, 0x728F, + 0x7292, 0x6308, 0x6332, 0x63B0, 0x968C, 0x968E, 0x9691, 0x9692, + 0x9693, 0x9695, 0x9696, 0x969A, 0x969B, 0x969D, 0x969E, 0x969F, + 0x96A0, 0x96A1, 0x96A2, 0x96A3, 0x96A4, 0x96A5, 0x96A6, 0x96A8, + 0x96A9, 0x96AA, 0x96AB, 0x96AC, 0x96AD, 0x96AE, 0x96AF, 0x96B1, + 0x96B2, 0x96B4, 0x96B5, 0x96B7, 0x96B8, 0x96BA, 0x96BB, 0x96BF, + 0x96C2, 0x96C3, 0x96C8, 0x96CA, 0x96CB, 0x96D0, 0x96D1, 0x96D3, + 0x96D4, 0x96D6, 0x96D7, 0x96D8, 0x96D9, 0x96DA, 0x96DB, 0x96DC, + 0x96DD, 0x96DE, 0x96DF, 0x96E1, 0x96E2, 0x96E3, 0x96E4, 0x96E5, + 0x96E6, 0x96E7, 0x96EB, 0x96EC, 0x96ED, 0x96EE, 0x96F0, 0x96F1, + 0x96F2, 0x96F4, 0x96F5, 0x96F8, 0x96FA, 0x96FB, 0x96FC, 0x96FD, + 0x96FF, 0x9702, 0x9703, 0x9705, 0x970A, 0x970B, 0x970C, 0x9710, +plane 80 +at 0x00 + 0x9711, 0x9712, 0x9714, 0x9715, 0x9717, 0x9718, 0x9719, 0x971A, + 0x971B, 0x971D, 0x971F, 0x9720, 0x643F, 0x64D8, 0x8004, 0x6BEA, + 0x6BF3, 0x6BFD, 0x6BF5, 0x6BF9, 0x6C05, 0x6C07, 0x6C06, 0x6C0D, + 0x6C15, 0x6C18, 0x6C19, 0x6C1A, 0x6C21, 0x6C29, 0x6C24, 0x6C2A, + 0x6C32, 0x6535, 0x6555, 0x656B, 0x724D, 0x7252, 0x7256, 0x7230, + 0x8662, 0x5216, 0x809F, 0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, + 0x80B1, 0x80AB, 0x80AD, 0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, + 0x80EA, 0x80DB, 0x80C2, 0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, + 0x80DD, 0x80EB, 0x80F1, 0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, + 0x80FC, 0x6715, 0x8112, 0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, + 0x8132, 0x8148, 0x814C, 0x8153, 0x8174, 0x8159, 0x815A, 0x8171, + 0x8160, 0x8169, 0x817C, 0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, + 0x8188, 0x8182, 0x8191, 0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, + 0x81CA, 0x81BB, 0x9721, 0x9722, 0x9723, 0x9724, 0x9725, 0x9726, + 0x9727, 0x9728, 0x9729, 0x972B, 0x972C, 0x972E, 0x972F, 0x9731, + 0x9733, 0x9734, 0x9735, 0x9736, 0x9737, 0x973A, 0x973B, 0x973C, + 0x973D, 0x973F, 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, + 0x9746, 0x9747, 0x9748, 0x9749, 0x974A, 0x974B, 0x974C, 0x974D, + 0x974E, 0x974F, 0x9750, 0x9751, 0x9754, 0x9755, 0x9757, 0x9758, + 0x975A, 0x975C, 0x975D, 0x975F, 0x9763, 0x9764, 0x9766, 0x9767, + 0x9768, 0x976A, 0x976B, 0x976C, 0x976D, 0x976E, 0x976F, 0x9770, + 0x9771, 0x9772, 0x9775, 0x9777, 0x9778, 0x9779, 0x977A, 0x977B, + 0x977D, 0x977E, 0x977F, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, + 0x9786, 0x9787, 0x9788, 0x9789, 0x978A, 0x978C, 0x978E, 0x978F, + 0x9790, 0x9793, 0x9795, 0x9796, 0x9797, 0x9799, 0x979A, 0x979B, + 0x979C, 0x979D, 0x81C1, 0x81A6, 0x6B24, 0x6B37, 0x6B39, 0x6B43, + 0x6B46, 0x6B59, 0x98D1, 0x98D2, 0x98D3, 0x98D5, 0x98D9, 0x98DA, + 0x6BB3, 0x5F40, 0x6BC2, 0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, + 0x65C6, 0x65C4, 0x65C3, 0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, + 0x709C, 0x7096, 0x709D, 0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, + 0x70E8, 0x70CA, 0x7110, 0x7113, 0x7116, 0x712F, 0x7131, 0x7173, + 0x715C, 0x7168, 0x7145, 0x7172, 0x714A, 0x7178, 0x717A, 0x7198, +plane 81 +at 0x00 + 0x71B3, 0x71B5, 0x71A8, 0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, + 0x721D, 0x7228, 0x706C, 0x7118, 0x7166, 0x71B9, 0x623E, 0x623D, + 0x6243, 0x6248, 0x6249, 0x793B, 0x7940, 0x7946, 0x7949, 0x795B, + 0x795C, 0x7953, 0x795A, 0x7962, 0x7957, 0x7960, 0x796F, 0x7967, + 0x797A, 0x7985, 0x798A, 0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0, + 0x979E, 0x979F, 0x97A1, 0x97A2, 0x97A4, 0x97A5, 0x97A6, 0x97A7, + 0x97A8, 0x97A9, 0x97AA, 0x97AC, 0x97AE, 0x97B0, 0x97B1, 0x97B3, + 0x97B5, 0x97B6, 0x97B7, 0x97B8, 0x97B9, 0x97BA, 0x97BB, 0x97BC, + 0x97BD, 0x97BE, 0x97BF, 0x97C0, 0x97C1, 0x97C2, 0x97C3, 0x97C4, + 0x97C5, 0x97C6, 0x97C7, 0x97C8, 0x97C9, 0x97CA, 0x97CB, 0x97CC, + 0x97CD, 0x97CE, 0x97CF, 0x97D0, 0x97D1, 0x97D2, 0x97D3, 0x97D4, + 0x97D5, 0x97D6, 0x97D7, 0x97D8, 0x97D9, 0x97DA, 0x97DB, 0x97DC, + 0x97DD, 0x97DE, 0x97DF, 0x97E0, 0x97E1, 0x97E2, 0x97E3, 0x97E4, + 0x97E5, 0x97E8, 0x97EE, 0x97EF, 0x97F0, 0x97F1, 0x97F2, 0x97F4, + 0x97F7, 0x97F8, 0x97F9, 0x97FA, 0x97FB, 0x97FC, 0x97FD, 0x97FE, + 0x97FF, 0x9800, 0x9801, 0x9802, 0x9803, 0x9804, 0x9805, 0x9806, + 0x9807, 0x9808, 0x9809, 0x980A, 0x980B, 0x980C, 0x980D, 0x980E, + 0x603C, 0x605D, 0x605A, 0x6067, 0x6041, 0x6059, 0x6063, 0x60AB, + 0x6106, 0x610D, 0x615D, 0x61A9, 0x619D, 0x61CB, 0x61D1, 0x6206, + 0x8080, 0x807F, 0x6C93, 0x6CF6, 0x6DFC, 0x77F6, 0x77F8, 0x7800, + 0x7809, 0x7817, 0x7818, 0x7811, 0x65AB, 0x782D, 0x781C, 0x781D, + 0x7839, 0x783A, 0x783B, 0x781F, 0x783C, 0x7825, 0x782C, 0x7823, + 0x7829, 0x784E, 0x786D, 0x7856, 0x7857, 0x7826, 0x7850, 0x7847, + 0x784C, 0x786A, 0x789B, 0x7893, 0x789A, 0x7887, 0x789C, 0x78A1, + 0x78A3, 0x78B2, 0x78B9, 0x78A5, 0x78D4, 0x78D9, 0x78C9, 0x78EC, + 0x78F2, 0x7905, 0x78F4, 0x7913, 0x7924, 0x791E, 0x7934, 0x9F9B, + 0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, 0x7704, 0x770D, 0x76F9, 0x7707, + 0x7708, 0x771A, 0x7722, 0x7719, 0x772D, 0x7726, 0x7735, 0x7738, + 0x7750, 0x7751, 0x7747, 0x7743, 0x775A, 0x7768, 0x980F, 0x9810, + 0x9811, 0x9812, 0x9813, 0x9814, 0x9815, 0x9816, 0x9817, 0x9818, + 0x9819, 0x981A, 0x981B, 0x981C, 0x981D, 0x981E, 0x981F, 0x9820, + 0x9821, 0x9822, 0x9823, 0x9824, 0x9825, 0x9826, 0x9827, 0x9828, +plane 82 +at 0x00 + 0x9829, 0x982A, 0x982B, 0x982C, 0x982D, 0x982E, 0x982F, 0x9830, + 0x9831, 0x9832, 0x9833, 0x9834, 0x9835, 0x9836, 0x9837, 0x9838, + 0x9839, 0x983A, 0x983B, 0x983C, 0x983D, 0x983E, 0x983F, 0x9840, + 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9847, 0x9848, + 0x9849, 0x984A, 0x984B, 0x984C, 0x984D, 0x984E, 0x984F, 0x9850, + 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856, 0x9857, 0x9858, + 0x9859, 0x985A, 0x985B, 0x985C, 0x985D, 0x985E, 0x985F, 0x9860, + 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866, 0x9867, 0x9868, + 0x9869, 0x986A, 0x986B, 0x986C, 0x986D, 0x986E, 0x7762, 0x7765, + 0x777F, 0x778D, 0x777D, 0x7780, 0x778C, 0x7791, 0x779F, 0x77A0, + 0x77B0, 0x77B5, 0x77BD, 0x753A, 0x7540, 0x754E, 0x754B, 0x7548, + 0x755B, 0x7572, 0x7579, 0x7583, 0x7F58, 0x7F61, 0x7F5F, 0x8A48, + 0x7F68, 0x7F74, 0x7F71, 0x7F79, 0x7F81, 0x7F7E, 0x76CD, 0x76E5, + 0x8832, 0x9485, 0x9486, 0x9487, 0x948B, 0x948A, 0x948C, 0x948D, + 0x948F, 0x9490, 0x9494, 0x9497, 0x9495, 0x949A, 0x949B, 0x949C, + 0x94A3, 0x94A4, 0x94AB, 0x94AA, 0x94AD, 0x94AC, 0x94AF, 0x94B0, + 0x94B2, 0x94B4, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BC, + 0x94BD, 0x94BF, 0x94C4, 0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, + 0x94CD, 0x94CE, 0x94D0, 0x94D1, 0x94D2, 0x94D5, 0x94D6, 0x94D7, + 0x94D9, 0x94D8, 0x94DB, 0x94DE, 0x94DF, 0x94E0, 0x94E2, 0x94E4, + 0x94E5, 0x94E7, 0x94E8, 0x94EA, 0x986F, 0x9870, 0x9871, 0x9872, + 0x9873, 0x9874, 0x988B, 0x988E, 0x9892, 0x9895, 0x9899, 0x98A3, + 0x98A8, 0x98A9, 0x98AA, 0x98AB, 0x98AC, 0x98AD, 0x98AE, 0x98AF, + 0x98B0, 0x98B1, 0x98B2, 0x98B3, 0x98B4, 0x98B5, 0x98B6, 0x98B7, + 0x98B8, 0x98B9, 0x98BA, 0x98BB, 0x98BC, 0x98BD, 0x98BE, 0x98BF, + 0x98C0, 0x98C1, 0x98C2, 0x98C3, 0x98C4, 0x98C5, 0x98C6, 0x98C7, + 0x98C8, 0x98C9, 0x98CA, 0x98CB, 0x98CC, 0x98CD, 0x98CF, 0x98D0, + 0x98D4, 0x98D6, 0x98D7, 0x98DB, 0x98DC, 0x98DD, 0x98E0, 0x98E1, + 0x98E2, 0x98E3, 0x98E4, 0x98E5, 0x98E6, 0x98E9, 0x98EA, 0x98EB, + 0x98EC, 0x98ED, 0x98EE, 0x98EF, 0x98F0, 0x98F1, 0x98F2, 0x98F3, + 0x98F4, 0x98F5, 0x98F6, 0x98F7, 0x98F8, 0x98F9, 0x98FA, 0x98FB, + 0x98FC, 0x98FD, 0x98FE, 0x98FF, 0x9900, 0x9901, 0x9902, 0x9903, +plane 83 +at 0x00 + 0x9904, 0x9905, 0x9906, 0x9907, 0x94E9, 0x94EB, 0x94EE, 0x94EF, + 0x94F3, 0x94F4, 0x94F5, 0x94F7, 0x94F9, 0x94FC, 0x94FD, 0x94FF, + 0x9503, 0x9502, 0x9506, 0x9507, 0x9509, 0x950A, 0x950D, 0x950E, + 0x950F, 0x9512, 0x9513, 0x9514, 0x9515, 0x9516, 0x9518, 0x951B, + 0x951D, 0x951E, 0x951F, 0x9522, 0x952A, 0x952B, 0x9529, 0x952C, + 0x9531, 0x9532, 0x9534, 0x9536, 0x9537, 0x9538, 0x953C, 0x953E, + 0x953F, 0x9542, 0x9535, 0x9544, 0x9545, 0x9546, 0x9549, 0x954C, + 0x954E, 0x954F, 0x9552, 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, + 0x9559, 0x955B, 0x955E, 0x955F, 0x955D, 0x9561, 0x9562, 0x9564, + 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956A, 0x956B, 0x956C, + 0x956F, 0x9571, 0x9572, 0x9573, 0x953A, 0x77E7, 0x77EC, 0x96C9, + 0x79D5, 0x79ED, 0x79E3, 0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, + 0x7A1E, 0x7A14, 0x9908, 0x9909, 0x990A, 0x990B, 0x990C, 0x990E, + 0x990F, 0x9911, 0x9912, 0x9913, 0x9914, 0x9915, 0x9916, 0x9917, + 0x9918, 0x9919, 0x991A, 0x991B, 0x991C, 0x991D, 0x991E, 0x991F, + 0x9920, 0x9921, 0x9922, 0x9923, 0x9924, 0x9925, 0x9926, 0x9927, + 0x9928, 0x9929, 0x992A, 0x992B, 0x992C, 0x992D, 0x992F, 0x9930, + 0x9931, 0x9932, 0x9933, 0x9934, 0x9935, 0x9936, 0x9937, 0x9938, + 0x9939, 0x993A, 0x993B, 0x993C, 0x993D, 0x993E, 0x993F, 0x9940, + 0x9941, 0x9942, 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, + 0x9949, 0x994A, 0x994B, 0x994C, 0x994D, 0x994E, 0x994F, 0x9950, + 0x9951, 0x9952, 0x9953, 0x9956, 0x9957, 0x9958, 0x9959, 0x995A, + 0x995B, 0x995C, 0x995D, 0x995E, 0x995F, 0x9960, 0x9961, 0x9962, + 0x9964, 0x9966, 0x9973, 0x9978, 0x9979, 0x997B, 0x997E, 0x9982, + 0x9983, 0x9989, 0x7A39, 0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, + 0x7688, 0x768E, 0x7693, 0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, + 0x9E20, 0x9E22, 0x9E28, 0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, + 0x9E31, 0x9E36, 0x9E38, 0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, + 0x9E42, 0x9E44, 0x9E46, 0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, + 0x9E4E, 0x9E51, 0x9E55, 0x9E57, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, + 0x9E63, 0x9E66, 0x9E67, 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, + 0x9E71, 0x9E6D, 0x9E73, 0x7592, 0x7594, 0x7596, 0x75A0, 0x759D, +plane 84 +at 0x00 + 0x75AC, 0x75A3, 0x75B3, 0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, + 0x75C3, 0x75C2, 0x75D6, 0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, + 0x75EB, 0x75E7, 0x7603, 0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, + 0x7605, 0x760C, 0x7617, 0x760A, 0x7625, 0x7618, 0x7615, 0x7619, + 0x998C, 0x998E, 0x999A, 0x999B, 0x999C, 0x999D, 0x999E, 0x999F, + 0x99A0, 0x99A1, 0x99A2, 0x99A3, 0x99A4, 0x99A6, 0x99A7, 0x99A9, + 0x99AA, 0x99AB, 0x99AC, 0x99AD, 0x99AE, 0x99AF, 0x99B0, 0x99B1, + 0x99B2, 0x99B3, 0x99B4, 0x99B5, 0x99B6, 0x99B7, 0x99B8, 0x99B9, + 0x99BA, 0x99BB, 0x99BC, 0x99BD, 0x99BE, 0x99BF, 0x99C0, 0x99C1, + 0x99C2, 0x99C3, 0x99C4, 0x99C5, 0x99C6, 0x99C7, 0x99C8, 0x99C9, + 0x99CA, 0x99CB, 0x99CC, 0x99CD, 0x99CE, 0x99CF, 0x99D0, 0x99D1, + 0x99D2, 0x99D3, 0x99D4, 0x99D5, 0x99D6, 0x99D7, 0x99D8, 0x99D9, + 0x99DA, 0x99DB, 0x99DC, 0x99DD, 0x99DE, 0x99DF, 0x99E0, 0x99E1, + 0x99E2, 0x99E3, 0x99E4, 0x99E5, 0x99E6, 0x99E7, 0x99E8, 0x99E9, + 0x99EA, 0x99EB, 0x99EC, 0x99ED, 0x99EE, 0x99EF, 0x99F0, 0x99F1, + 0x99F2, 0x99F3, 0x99F4, 0x99F5, 0x99F6, 0x99F7, 0x99F8, 0x99F9, + 0x761B, 0x763C, 0x7622, 0x7620, 0x7640, 0x762D, 0x7630, 0x763F, + 0x7635, 0x7643, 0x763E, 0x7633, 0x764D, 0x765E, 0x7654, 0x765C, + 0x7656, 0x766B, 0x766F, 0x7FCA, 0x7AE6, 0x7A78, 0x7A79, 0x7A80, + 0x7A86, 0x7A88, 0x7A95, 0x7AA6, 0x7AA0, 0x7AAC, 0x7AA8, 0x7AAD, + 0x7AB3, 0x8864, 0x8869, 0x8872, 0x887D, 0x887F, 0x8882, 0x88A2, + 0x88C6, 0x88B7, 0x88BC, 0x88C9, 0x88E2, 0x88CE, 0x88E3, 0x88E5, + 0x88F1, 0x891A, 0x88FC, 0x88E8, 0x88FE, 0x88F0, 0x8921, 0x8919, + 0x8913, 0x891B, 0x890A, 0x8934, 0x892B, 0x8936, 0x8941, 0x8966, + 0x897B, 0x758B, 0x80E5, 0x76B2, 0x76B4, 0x77DC, 0x8012, 0x8014, + 0x8016, 0x801C, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, 0x8029, + 0x8028, 0x8031, 0x800B, 0x8035, 0x8043, 0x8046, 0x804D, 0x8052, + 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883, 0x99FA, 0x99FB, + 0x99FC, 0x99FD, 0x99FE, 0x99FF, 0x9A00, 0x9A01, 0x9A02, 0x9A03, + 0x9A04, 0x9A05, 0x9A06, 0x9A07, 0x9A08, 0x9A09, 0x9A0A, 0x9A0B, + 0x9A0C, 0x9A0D, 0x9A0E, 0x9A0F, 0x9A10, 0x9A11, 0x9A12, 0x9A13, + 0x9A14, 0x9A15, 0x9A16, 0x9A17, 0x9A18, 0x9A19, 0x9A1A, 0x9A1B, +plane 85 +at 0x00 + 0x9A1C, 0x9A1D, 0x9A1E, 0x9A1F, 0x9A20, 0x9A21, 0x9A22, 0x9A23, + 0x9A24, 0x9A25, 0x9A26, 0x9A27, 0x9A28, 0x9A29, 0x9A2A, 0x9A2B, + 0x9A2C, 0x9A2D, 0x9A2E, 0x9A2F, 0x9A30, 0x9A31, 0x9A32, 0x9A33, + 0x9A34, 0x9A35, 0x9A36, 0x9A37, 0x9A38, 0x9A39, 0x9A3A, 0x9A3B, + 0x9A3C, 0x9A3D, 0x9A3E, 0x9A3F, 0x9A40, 0x9A41, 0x9A42, 0x9A43, + 0x9A44, 0x9A45, 0x9A46, 0x9A47, 0x9A48, 0x9A49, 0x9A4A, 0x9A4B, + 0x9A4C, 0x9A4D, 0x9A4E, 0x9A4F, 0x9A50, 0x9A51, 0x9A52, 0x9A53, + 0x9A54, 0x9A55, 0x9A56, 0x9A57, 0x9A58, 0x9A59, 0x9889, 0x988C, + 0x988D, 0x988F, 0x9894, 0x989A, 0x989B, 0x989E, 0x989F, 0x98A1, + 0x98A2, 0x98A5, 0x98A6, 0x864D, 0x8654, 0x866C, 0x866E, 0x867F, + 0x867A, 0x867C, 0x867B, 0x86A8, 0x868D, 0x868B, 0x86AC, 0x869D, + 0x86A7, 0x86A3, 0x86AA, 0x8693, 0x86A9, 0x86B6, 0x86C4, 0x86B5, + 0x86CE, 0x86B0, 0x86BA, 0x86B1, 0x86AF, 0x86C9, 0x86CF, 0x86B4, + 0x86E9, 0x86F1, 0x86F2, 0x86ED, 0x86F3, 0x86D0, 0x8713, 0x86DE, + 0x86F4, 0x86DF, 0x86D8, 0x86D1, 0x8703, 0x8707, 0x86F8, 0x8708, + 0x870A, 0x870D, 0x8709, 0x8723, 0x873B, 0x871E, 0x8725, 0x872E, + 0x871A, 0x873E, 0x8748, 0x8734, 0x8731, 0x8729, 0x8737, 0x873F, + 0x8782, 0x8722, 0x877D, 0x877E, 0x877B, 0x8760, 0x8770, 0x874C, + 0x876E, 0x878B, 0x8753, 0x8763, 0x877C, 0x8764, 0x8759, 0x8765, + 0x8793, 0x87AF, 0x87A8, 0x87D2, 0x9A5A, 0x9A5B, 0x9A5C, 0x9A5D, + 0x9A5E, 0x9A5F, 0x9A60, 0x9A61, 0x9A62, 0x9A63, 0x9A64, 0x9A65, + 0x9A66, 0x9A67, 0x9A68, 0x9A69, 0x9A6A, 0x9A6B, 0x9A72, 0x9A83, + 0x9A89, 0x9A8D, 0x9A8E, 0x9A94, 0x9A95, 0x9A99, 0x9AA6, 0x9AA9, + 0x9AAA, 0x9AAB, 0x9AAC, 0x9AAD, 0x9AAE, 0x9AAF, 0x9AB2, 0x9AB3, + 0x9AB4, 0x9AB5, 0x9AB9, 0x9ABB, 0x9ABD, 0x9ABE, 0x9ABF, 0x9AC3, + 0x9AC4, 0x9AC6, 0x9AC7, 0x9AC8, 0x9AC9, 0x9ACA, 0x9ACD, 0x9ACE, + 0x9ACF, 0x9AD0, 0x9AD2, 0x9AD4, 0x9AD5, 0x9AD6, 0x9AD7, 0x9AD9, + 0x9ADA, 0x9ADB, 0x9ADC, 0x9ADD, 0x9ADE, 0x9AE0, 0x9AE2, 0x9AE3, + 0x9AE4, 0x9AE5, 0x9AE7, 0x9AE8, 0x9AE9, 0x9AEA, 0x9AEC, 0x9AEE, + 0x9AF0, 0x9AF1, 0x9AF2, 0x9AF3, 0x9AF4, 0x9AF5, 0x9AF6, 0x9AF7, + 0x9AF8, 0x9AFA, 0x9AFC, 0x9AFD, 0x9AFE, 0x9AFF, 0x9B00, 0x9B01, + 0x9B02, 0x9B04, 0x9B05, 0x9B06, 0x87C6, 0x8788, 0x8785, 0x87AD, +plane 86 +at 0x00 + 0x8797, 0x8783, 0x87AB, 0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, + 0x87D3, 0x87BD, 0x87D1, 0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, + 0x87EE, 0x8816, 0x8813, 0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, + 0x883C, 0x7F36, 0x7F42, 0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, + 0x7B08, 0x7B03, 0x7B04, 0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, + 0x7B38, 0x7B2A, 0x7B19, 0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, + 0x7B33, 0x7B3E, 0x7B1E, 0x7B58, 0x7B5A, 0x7B45, 0x7B75, 0x7B4C, + 0x7B5D, 0x7B60, 0x7B6E, 0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, + 0x7BA6, 0x7BA7, 0x7BB8, 0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, + 0x7B9C, 0x7BA2, 0x7BAB, 0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, + 0x7BDA, 0x7BE5, 0x7BE6, 0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, + 0x7C16, 0x7C0B, 0x9B07, 0x9B09, 0x9B0A, 0x9B0B, 0x9B0C, 0x9B0D, + 0x9B0E, 0x9B10, 0x9B11, 0x9B12, 0x9B14, 0x9B15, 0x9B16, 0x9B17, + 0x9B18, 0x9B19, 0x9B1A, 0x9B1B, 0x9B1C, 0x9B1D, 0x9B1E, 0x9B20, + 0x9B21, 0x9B22, 0x9B24, 0x9B25, 0x9B26, 0x9B27, 0x9B28, 0x9B29, + 0x9B2A, 0x9B2B, 0x9B2C, 0x9B2D, 0x9B2E, 0x9B30, 0x9B31, 0x9B33, + 0x9B34, 0x9B35, 0x9B36, 0x9B37, 0x9B38, 0x9B39, 0x9B3A, 0x9B3D, + 0x9B3E, 0x9B3F, 0x9B40, 0x9B46, 0x9B4A, 0x9B4B, 0x9B4C, 0x9B4E, + 0x9B50, 0x9B52, 0x9B53, 0x9B55, 0x9B56, 0x9B57, 0x9B58, 0x9B59, + 0x9B5A, 0x9B5B, 0x9B5C, 0x9B5D, 0x9B5E, 0x9B5F, 0x9B60, 0x9B61, + 0x9B62, 0x9B63, 0x9B64, 0x9B65, 0x9B66, 0x9B67, 0x9B68, 0x9B69, + 0x9B6A, 0x9B6B, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B6F, 0x9B70, 0x9B71, + 0x9B72, 0x9B73, 0x9B74, 0x9B75, 0x9B76, 0x9B77, 0x9B78, 0x9B79, + 0x9B7A, 0x9B7B, 0x7C1F, 0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, + 0x81FE, 0x8201, 0x8202, 0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, + 0x8223, 0x822D, 0x822F, 0x8228, 0x822B, 0x8238, 0x823B, 0x8233, + 0x8234, 0x823E, 0x8244, 0x8249, 0x824B, 0x824F, 0x825A, 0x825F, + 0x8268, 0x887E, 0x8885, 0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, + 0x7F9F, 0x7FA7, 0x7FAF, 0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, + 0x7C9D, 0x7C9C, 0x7C9E, 0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, + 0x7CC7, 0x7CCC, 0x7CCD, 0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, + 0x66A8, 0x7FBF, 0x7FCE, 0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, +plane 87 +at 0x00 + 0x7FEE, 0x7FF3, 0x7CF8, 0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, + 0x9EB8, 0x9EB4, 0x8D73, 0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, + 0x8D6D, 0x8C47, 0x8C49, 0x914A, 0x9150, 0x914E, 0x914F, 0x9164, + 0x9B7C, 0x9B7D, 0x9B7E, 0x9B7F, 0x9B80, 0x9B81, 0x9B82, 0x9B83, + 0x9B84, 0x9B85, 0x9B86, 0x9B87, 0x9B88, 0x9B89, 0x9B8A, 0x9B8B, + 0x9B8C, 0x9B8D, 0x9B8E, 0x9B8F, 0x9B90, 0x9B91, 0x9B92, 0x9B93, + 0x9B94, 0x9B95, 0x9B96, 0x9B97, 0x9B98, 0x9B99, 0x9B9A, 0x9B9B, + 0x9B9C, 0x9B9D, 0x9B9E, 0x9B9F, 0x9BA0, 0x9BA1, 0x9BA2, 0x9BA3, + 0x9BA4, 0x9BA5, 0x9BA6, 0x9BA7, 0x9BA8, 0x9BA9, 0x9BAA, 0x9BAB, + 0x9BAC, 0x9BAD, 0x9BAE, 0x9BAF, 0x9BB0, 0x9BB1, 0x9BB2, 0x9BB3, + 0x9BB4, 0x9BB5, 0x9BB6, 0x9BB7, 0x9BB8, 0x9BB9, 0x9BBA, 0x9BBB, + 0x9BBC, 0x9BBD, 0x9BBE, 0x9BBF, 0x9BC0, 0x9BC1, 0x9BC2, 0x9BC3, + 0x9BC4, 0x9BC5, 0x9BC6, 0x9BC7, 0x9BC8, 0x9BC9, 0x9BCA, 0x9BCB, + 0x9BCC, 0x9BCD, 0x9BCE, 0x9BCF, 0x9BD0, 0x9BD1, 0x9BD2, 0x9BD3, + 0x9BD4, 0x9BD5, 0x9BD6, 0x9BD7, 0x9BD8, 0x9BD9, 0x9BDA, 0x9BDB, + 0x9162, 0x9161, 0x9170, 0x9169, 0x916F, 0x917D, 0x917E, 0x9172, + 0x9174, 0x9179, 0x918C, 0x9185, 0x9190, 0x918D, 0x9191, 0x91A2, + 0x91A3, 0x91AA, 0x91AD, 0x91AE, 0x91AF, 0x91B5, 0x91B4, 0x91BA, + 0x8C55, 0x9E7E, 0x8DB8, 0x8DEB, 0x8E05, 0x8E59, 0x8E69, 0x8DB5, + 0x8DBF, 0x8DBC, 0x8DBA, 0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA, 0x8DDE, + 0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8, 0x8DE3, + 0x8DF9, 0x8DFB, 0x8DE4, 0x8E09, 0x8DFD, 0x8E14, 0x8E1D, 0x8E1F, + 0x8E2C, 0x8E2E, 0x8E23, 0x8E2F, 0x8E3A, 0x8E40, 0x8E39, 0x8E35, + 0x8E3D, 0x8E31, 0x8E49, 0x8E41, 0x8E42, 0x8E51, 0x8E52, 0x8E4A, + 0x8E70, 0x8E76, 0x8E7C, 0x8E6F, 0x8E74, 0x8E85, 0x8E8F, 0x8E94, + 0x8E90, 0x8E9C, 0x8E9E, 0x8C78, 0x8C82, 0x8C8A, 0x8C85, 0x8C98, + 0x8C94, 0x659B, 0x89D6, 0x89DE, 0x89DA, 0x89DC, 0x9BDC, 0x9BDD, + 0x9BDE, 0x9BDF, 0x9BE0, 0x9BE1, 0x9BE2, 0x9BE3, 0x9BE4, 0x9BE5, + 0x9BE6, 0x9BE7, 0x9BE8, 0x9BE9, 0x9BEA, 0x9BEB, 0x9BEC, 0x9BED, + 0x9BEE, 0x9BEF, 0x9BF0, 0x9BF1, 0x9BF2, 0x9BF3, 0x9BF4, 0x9BF5, + 0x9BF6, 0x9BF7, 0x9BF8, 0x9BF9, 0x9BFA, 0x9BFB, 0x9BFC, 0x9BFD, + 0x9BFE, 0x9BFF, 0x9C00, 0x9C01, 0x9C02, 0x9C03, 0x9C04, 0x9C05, +plane 88 +at 0x00 + 0x9C06, 0x9C07, 0x9C08, 0x9C09, 0x9C0A, 0x9C0B, 0x9C0C, 0x9C0D, + 0x9C0E, 0x9C0F, 0x9C10, 0x9C11, 0x9C12, 0x9C13, 0x9C14, 0x9C15, + 0x9C16, 0x9C17, 0x9C18, 0x9C19, 0x9C1A, 0x9C1B, 0x9C1C, 0x9C1D, + 0x9C1E, 0x9C1F, 0x9C20, 0x9C21, 0x9C22, 0x9C23, 0x9C24, 0x9C25, + 0x9C26, 0x9C27, 0x9C28, 0x9C29, 0x9C2A, 0x9C2B, 0x9C2C, 0x9C2D, + 0x9C2E, 0x9C2F, 0x9C30, 0x9C31, 0x9C32, 0x9C33, 0x9C34, 0x9C35, + 0x9C36, 0x9C37, 0x9C38, 0x9C39, 0x9C3A, 0x9C3B, 0x89E5, 0x89EB, + 0x89EF, 0x8A3E, 0x8B26, 0x9753, 0x96E9, 0x96F3, 0x96EF, 0x9706, + 0x9701, 0x9708, 0x970F, 0x970E, 0x972A, 0x972D, 0x9730, 0x973E, + 0x9F80, 0x9F83, 0x9F85, 0x9F86, 0x9F87, 0x9F88, 0x9F89, 0x9F8A, + 0x9F8C, 0x9EFE, 0x9F0B, 0x9F0D, 0x96B9, 0x96BC, 0x96BD, 0x96CE, + 0x96D2, 0x77BF, 0x96E0, 0x928E, 0x92AE, 0x92C8, 0x933E, 0x936A, + 0x93CA, 0x938F, 0x943E, 0x946B, 0x9C7F, 0x9C82, 0x9C85, 0x9C86, + 0x9C87, 0x9C88, 0x7A23, 0x9C8B, 0x9C8E, 0x9C90, 0x9C91, 0x9C92, + 0x9C94, 0x9C95, 0x9C9A, 0x9C9B, 0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1, + 0x9CA2, 0x9CA3, 0x9CA5, 0x9CA6, 0x9CA7, 0x9CA8, 0x9CA9, 0x9CAB, + 0x9CAD, 0x9CAE, 0x9CB0, 0x9CB1, 0x9CB2, 0x9CB3, 0x9CB4, 0x9CB5, + 0x9CB6, 0x9CB7, 0x9CBA, 0x9CBB, 0x9CBC, 0x9CBD, 0x9CC4, 0x9CC5, + 0x9CC6, 0x9CC7, 0x9CCA, 0x9CCB, 0x9C3C, 0x9C3D, 0x9C3E, 0x9C3F, + 0x9C40, 0x9C41, 0x9C42, 0x9C43, 0x9C44, 0x9C45, 0x9C46, 0x9C47, + 0x9C48, 0x9C49, 0x9C4A, 0x9C4B, 0x9C4C, 0x9C4D, 0x9C4E, 0x9C4F, + 0x9C50, 0x9C51, 0x9C52, 0x9C53, 0x9C54, 0x9C55, 0x9C56, 0x9C57, + 0x9C58, 0x9C59, 0x9C5A, 0x9C5B, 0x9C5C, 0x9C5D, 0x9C5E, 0x9C5F, + 0x9C60, 0x9C61, 0x9C62, 0x9C63, 0x9C64, 0x9C65, 0x9C66, 0x9C67, + 0x9C68, 0x9C69, 0x9C6A, 0x9C6B, 0x9C6C, 0x9C6D, 0x9C6E, 0x9C6F, + 0x9C70, 0x9C71, 0x9C72, 0x9C73, 0x9C74, 0x9C75, 0x9C76, 0x9C77, + 0x9C78, 0x9C79, 0x9C7A, 0x9C7B, 0x9C7D, 0x9C7E, 0x9C80, 0x9C83, + 0x9C84, 0x9C89, 0x9C8A, 0x9C8C, 0x9C8F, 0x9C93, 0x9C96, 0x9C97, + 0x9C98, 0x9C99, 0x9C9D, 0x9CAA, 0x9CAC, 0x9CAF, 0x9CB9, 0x9CBE, + 0x9CBF, 0x9CC0, 0x9CC1, 0x9CC2, 0x9CC8, 0x9CC9, 0x9CD1, 0x9CD2, + 0x9CDA, 0x9CDB, 0x9CE0, 0x9CE1, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, + 0x9CD0, 0x9CD3, 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, +plane 89 +at 0x00 + 0x9CDD, 0x9CDF, 0x9CE2, 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, + 0x97AF, 0x97AB, 0x97A3, 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, + 0x9E58, 0x9AB6, 0x9ABA, 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, + 0x9ACB, 0x9ACC, 0x9AD1, 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, + 0x9B4D, 0x9B51, 0x98E8, 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, + 0x9AE1, 0x9AE6, 0x9AEF, 0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, + 0x9B0F, 0x9B13, 0x9B1F, 0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, + 0x9E87, 0x9E88, 0x9E8B, 0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, + 0x9EDC, 0x9EDD, 0x9EE0, 0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, + 0x9EEA, 0x9EEF, 0x9F22, 0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, + 0x9F3E, 0x9F44, 0x9CE3, 0x9CE4, 0x9CE5, 0x9CE6, 0x9CE7, 0x9CE8, + 0x9CE9, 0x9CEA, 0x9CEB, 0x9CEC, 0x9CED, 0x9CEE, 0x9CEF, 0x9CF0, + 0x9CF1, 0x9CF2, 0x9CF3, 0x9CF4, 0x9CF5, 0x9CF6, 0x9CF7, 0x9CF8, + 0x9CF9, 0x9CFA, 0x9CFB, 0x9CFC, 0x9CFD, 0x9CFE, 0x9CFF, 0x9D00, + 0x9D01, 0x9D02, 0x9D03, 0x9D04, 0x9D05, 0x9D06, 0x9D07, 0x9D08, + 0x9D09, 0x9D0A, 0x9D0B, 0x9D0C, 0x9D0D, 0x9D0E, 0x9D0F, 0x9D10, + 0x9D11, 0x9D12, 0x9D13, 0x9D14, 0x9D15, 0x9D16, 0x9D17, 0x9D18, + 0x9D19, 0x9D1A, 0x9D1B, 0x9D1C, 0x9D1D, 0x9D1E, 0x9D1F, 0x9D20, + 0x9D21, 0x9D22, 0x9D23, 0x9D24, 0x9D25, 0x9D26, 0x9D27, 0x9D28, + 0x9D29, 0x9D2A, 0x9D2B, 0x9D2C, 0x9D2D, 0x9D2E, 0x9D2F, 0x9D30, + 0x9D31, 0x9D32, 0x9D33, 0x9D34, 0x9D35, 0x9D36, 0x9D37, 0x9D38, + 0x9D39, 0x9D3A, 0x9D3B, 0x9D3C, 0x9D3D, 0x9D3E, 0x9D3F, 0x9D40, + 0x9D41, 0x9D42, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 90 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0x9D43, 0x9D44, 0x9D45, 0x9D46, 0x9D47, 0x9D48, 0x9D49, 0x9D4A, + 0x9D4B, 0x9D4C, 0x9D4D, 0x9D4E, 0x9D4F, 0x9D50, 0x9D51, 0x9D52, + 0x9D53, 0x9D54, 0x9D55, 0x9D56, 0x9D57, 0x9D58, 0x9D59, 0x9D5A, + 0x9D5B, 0x9D5C, 0x9D5D, 0x9D5E, 0x9D5F, 0x9D60, 0x9D61, 0x9D62, + 0x9D63, 0x9D64, 0x9D65, 0x9D66, 0x9D67, 0x9D68, 0x9D69, 0x9D6A, + 0x9D6B, 0x9D6C, 0x9D6D, 0x9D6E, 0x9D6F, 0x9D70, 0x9D71, 0x9D72, + 0x9D73, 0x9D74, 0x9D75, 0x9D76, 0x9D77, 0x9D78, 0x9D79, 0x9D7A, + 0x9D7B, 0x9D7C, 0x9D7D, 0x9D7E, 0x9D7F, 0x9D80, 0x9D81, 0x9D82, + 0x9D83, 0x9D84, 0x9D85, 0x9D86, 0x9D87, 0x9D88, 0x9D89, 0x9D8A, + 0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, 0x9D8F, 0x9D90, 0x9D91, 0x9D92, + 0x9D93, 0x9D94, 0x9D95, 0x9D96, 0x9D97, 0x9D98, 0x9D99, 0x9D9A, + 0x9D9B, 0x9D9C, 0x9D9D, 0x9D9E, 0x9D9F, 0x9DA0, 0x9DA1, 0x9DA2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x9DA3, 0x9DA4, + 0x9DA5, 0x9DA6, 0x9DA7, 0x9DA8, 0x9DA9, 0x9DAA, 0x9DAB, 0x9DAC, + 0x9DAD, 0x9DAE, 0x9DAF, 0x9DB0, 0x9DB1, 0x9DB2, 0x9DB3, 0x9DB4, + 0x9DB5, 0x9DB6, 0x9DB7, 0x9DB8, 0x9DB9, 0x9DBA, 0x9DBB, 0x9DBC, + 0x9DBD, 0x9DBE, 0x9DBF, 0x9DC0, 0x9DC1, 0x9DC2, 0x9DC3, 0x9DC4, + 0x9DC5, 0x9DC6, 0x9DC7, 0x9DC8, 0x9DC9, 0x9DCA, 0x9DCB, 0x9DCC, + 0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, 0x9DD1, 0x9DD2, 0x9DD3, 0x9DD4, +plane 91 +at 0x00 + 0x9DD5, 0x9DD6, 0x9DD7, 0x9DD8, 0x9DD9, 0x9DDA, 0x9DDB, 0x9DDC, + 0x9DDD, 0x9DDE, 0x9DDF, 0x9DE0, 0x9DE1, 0x9DE2, 0x9DE3, 0x9DE4, + 0x9DE5, 0x9DE6, 0x9DE7, 0x9DE8, 0x9DE9, 0x9DEA, 0x9DEB, 0x9DEC, + 0x9DED, 0x9DEE, 0x9DEF, 0x9DF0, 0x9DF1, 0x9DF2, 0x9DF3, 0x9DF4, + 0x9DF5, 0x9DF6, 0x9DF7, 0x9DF8, 0x9DF9, 0x9DFA, 0x9DFB, 0x9DFC, + 0x9DFD, 0x9DFE, 0x9DFF, 0x9E00, 0x9E01, 0x9E02, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0x9E03, 0x9E04, 0x9E05, 0x9E06, + 0x9E07, 0x9E08, 0x9E09, 0x9E0A, 0x9E0B, 0x9E0C, 0x9E0D, 0x9E0E, + 0x9E0F, 0x9E10, 0x9E11, 0x9E12, 0x9E13, 0x9E14, 0x9E15, 0x9E16, + 0x9E17, 0x9E18, 0x9E19, 0x9E1A, 0x9E1B, 0x9E1C, 0x9E1D, 0x9E1E, + 0x9E24, 0x9E27, 0x9E2E, 0x9E30, 0x9E34, 0x9E3B, 0x9E3C, 0x9E40, + 0x9E4D, 0x9E50, 0x9E52, 0x9E53, 0x9E54, 0x9E56, 0x9E59, 0x9E5D, + 0x9E5F, 0x9E60, 0x9E61, 0x9E62, 0x9E65, 0x9E6E, 0x9E6F, 0x9E72, + 0x9E74, 0x9E75, 0x9E76, 0x9E77, 0x9E78, 0x9E79, 0x9E7A, 0x9E7B, + 0x9E7C, 0x9E7D, 0x9E80, 0x9E81, 0x9E83, 0x9E84, 0x9E85, 0x9E86, + 0x9E89, 0x9E8A, 0x9E8C, 0x9E8D, 0x9E8E, 0x9E8F, 0x9E90, 0x9E91, + 0x9E94, 0x9E95, 0x9E96, 0x9E97, 0x9E98, 0x9E99, 0x9E9A, 0x9E9B, + 0x9E9C, 0x9E9E, 0x9EA0, 0x9EA1, 0x9EA2, 0x9EA3, 0x9EA4, 0x9EA5, + 0x9EA7, 0x9EA8, 0x9EA9, 0x9EAA, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 92 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x9EAB, 0x9EAC, 0x9EAD, 0x9EAE, 0x9EAF, 0x9EB0, + 0x9EB1, 0x9EB2, 0x9EB3, 0x9EB5, 0x9EB6, 0x9EB7, 0x9EB9, 0x9EBA, + 0x9EBC, 0x9EBF, 0x9EC0, 0x9EC1, 0x9EC2, 0x9EC3, 0x9EC5, 0x9EC6, + 0x9EC7, 0x9EC8, 0x9ECA, 0x9ECB, 0x9ECC, 0x9ED0, 0x9ED2, 0x9ED3, + 0x9ED5, 0x9ED6, 0x9ED7, 0x9ED9, 0x9EDA, 0x9EDE, 0x9EE1, 0x9EE3, + 0x9EE4, 0x9EE6, 0x9EE8, 0x9EEB, 0x9EEC, 0x9EED, 0x9EEE, 0x9EF0, + 0x9EF1, 0x9EF2, 0x9EF3, 0x9EF4, 0x9EF5, 0x9EF6, 0x9EF7, 0x9EF8, + 0x9EFA, 0x9EFD, 0x9EFF, 0x9F00, 0x9F01, 0x9F02, 0x9F03, 0x9F04, + 0x9F05, 0x9F06, 0x9F07, 0x9F08, 0x9F09, 0x9F0A, 0x9F0C, 0x9F0F, + 0x9F11, 0x9F12, 0x9F14, 0x9F15, 0x9F16, 0x9F18, 0x9F1A, 0x9F1B, + 0x9F1C, 0x9F1D, 0x9F1E, 0x9F1F, 0x9F21, 0x9F23, 0x9F24, 0x9F25, + 0x9F26, 0x9F27, 0x9F28, 0x9F29, 0x9F2A, 0x9F2B, 0x9F2D, 0x9F2E, + 0x9F30, 0x9F31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane 93 +at 0x00 + 0, 0, 0, 0, 0, 0, 0, 0, + 0x9F32, 0x9F33, 0x9F34, 0x9F35, 0x9F36, 0x9F38, 0x9F3A, 0x9F3C, + 0x9F3F, 0x9F40, 0x9F41, 0x9F42, 0x9F43, 0x9F45, 0x9F46, 0x9F47, + 0x9F48, 0x9F49, 0x9F4A, 0x9F4B, 0x9F4C, 0x9F4D, 0x9F4E, 0x9F4F, + 0x9F52, 0x9F53, 0x9F54, 0x9F55, 0x9F56, 0x9F57, 0x9F58, 0x9F59, + 0x9F5A, 0x9F5B, 0x9F5C, 0x9F5D, 0x9F5E, 0x9F5F, 0x9F60, 0x9F61, + 0x9F62, 0x9F63, 0x9F64, 0x9F65, 0x9F66, 0x9F67, 0x9F68, 0x9F69, + 0x9F6A, 0x9F6B, 0x9F6C, 0x9F6D, 0x9F6E, 0x9F6F, 0x9F70, 0x9F71, + 0x9F72, 0x9F73, 0x9F74, 0x9F75, 0x9F76, 0x9F77, 0x9F78, 0x9F79, + 0x9F7A, 0x9F7B, 0x9F7C, 0x9F7D, 0x9F7E, 0x9F81, 0x9F82, 0x9F8D, + 0x9F8E, 0x9F8F, 0x9F90, 0x9F91, 0x9F92, 0x9F93, 0x9F94, 0x9F95, + 0x9F96, 0x9F97, 0x9F98, 0x9F9C, 0x9F9D, 0x9F9E, 0x9FA1, 0x9FA2, + 0x9FA3, 0x9FA4, 0x9FA5, 0xF92C, 0xF979, 0xF995, 0xF9E7, 0xF9F1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0xFA0C, 0xFA0D, + 0xFA0E, 0xFA0F, 0xFA11, 0xFA13, 0xFA14, 0xFA18, 0xFA1F, 0xFA20, + 0xFA21, 0xFA23, 0xFA24, 0xFA27, 0xFA28, 0xFA29, 0xE815, 0xE816, + 0xE817, 0xE818, 0xE819, 0xE81A, 0xE81B, 0xE81C, 0xE81D, 0xE81E, + 0xE81F, 0xE820, 0xE821, 0xE822, 0xE823, 0xE824, 0xE825, 0xE826, + 0xE827, 0xE828, 0xE829, 0xE82A, 0xE82B, 0xE82C, 0xE82D, 0xE82E, + 0xE82F, 0xE830, 0xE831, 0xE832, 0xE833, 0xE834, 0xE835, 0xE836, + 0xE837, 0xE838, 0xE839, 0xE83A, 0xE83B, 0xE83C, 0xE83D, 0xE83E, +plane 94 +at 0x00 + 0xE83F, 0xE840, 0xE841, 0xE842, 0xE843, 0xE844, 0xE845, 0xE846, + 0xE847, 0xE848, 0xE849, 0xE84A, 0xE84B, 0xE84C, 0xE84D, 0xE84E, + 0xE84F, 0xE850, 0xE851, 0xE852, 0xE853, 0xE854, 0xE855, 0xE856, + 0xE857, 0xE858, 0xE859, 0xE85A, 0xE85B, 0xE85C, 0xE85D, 0xE85E, + 0xE85F, 0xE860, 0xE861, 0xE862, 0xE863, 0xE864, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/ubig5.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/ubig5.map new file mode 100755 index 00000000..bd656821 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/ubig5.map @@ -0,0 +1,2184 @@ +# BIG5 --> Unicode conversion table: +# generated by Chen Xiangyang (chenxy@sun.ihep.ac.cn) +# +# it contains 13703 characters of BIG5 character set, it also contains +# some unused codes in order to make the array easy to use. +# Code range: first byte: 0xa1 -- 0xFE 94 +# second byte: 0x40 -- 0x7F 64 +# 0xA1 -- 0xFF 96 +# code points: 94 x 160 = 15040 +# +# Usage: +# +# unsigned short BIG5_code, unicode; +# int pos; +# if ((BIG5_code&0x00FF)<=0x7F) +# pos = ((BIG5_code>>8)-0xa1)*160 + ((BIG5_code&0x00FF)-0x40); +# else +# pos = ((BIG5_code>>8)-0xa1)*160 + ((BIG5_code&0x00FF)-0x60); +# unicode = big52uni[pos]; +# +# Converted to ttf2pt1 map format by Sergey Babkin +# +plane a1 +at 0x40 + 0x3000, 0xFF0C, 0x3001, 0x3002, 0xFF0E, 0x2022, 0xFF1B, 0xFF1A, + 0xFF1F, 0xFF01, 0xFE30, 0x2026, 0x2025, 0xFE50, 0xFF64, 0xFE52, + 0x00B7, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFF5C, 0x2013, 0xFE31, + 0x2014, 0xFE33, 0, 0xFE34, 0xFE4F, 0xFF08, 0xFF09, 0xFE35, + 0xFE36, 0xFF5B, 0xFF5D, 0xFE37, 0xFE38, 0x3014, 0x3015, 0xFE39, + 0xFE3A, 0x3010, 0x3011, 0xFE3B, 0xFE3C, 0x300A, 0x300B, 0xFE3D, + 0xFE3E, 0x3008, 0x3009, 0xFE3F, 0xFE40, 0x300C, 0x300D, 0xFE41, + 0xFE42, 0x300E, 0x300F, 0xFE43, 0xFE44, 0xFE59, 0xFE5A, 0, +at 0xA0 + 0, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0x2018, 0x2019, 0x201C, + 0x201D, 0x301D, 0x301E, 0x2035, 0x2032, 0xFF03, 0xFF06, 0xFF0A, + 0x203B, 0x00A7, 0x3003, 0x25CB, 0x25CF, 0x25B3, 0x25B2, 0x25CE, + 0x2606, 0x2605, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25BD, 0x25BC, + 0x32A3, 0x2105, 0x203E, 0, 0xFF3F, 0, 0xFE49, 0xFE4A, + 0xFE4D, 0xFE4E, 0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, 0xFE61, 0xFF0B, + 0xFF0D, 0x00D7, 0x00F7, 0x00B1, 0x221A, 0xFF1C, 0xFF1E, 0xFF1D, + 0x2266, 0x2267, 0x2260, 0x221E, 0x2252, 0x2261, 0xFE62, 0xFE63, + 0xFE64, 0xFE65, 0xFE66, 0x223C, 0x2229, 0x222A, 0x22A5, 0x2220, + 0x221F, 0x22BF, 0x33D2, 0x33D1, 0x222B, 0x222E, 0x2235, 0x2234, + 0x2640, 0x2642, 0x2641, 0x2609, 0x2191, 0x2193, 0x2190, 0x2192, + 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0, 0, +plane a2 +at 0x40 + 0, 0xFF0F, 0xFF3C, 0xFF04, 0x00A5, 0x3012, 0x00A2, 0x00A3, + 0xFF05, 0xFF20, 0x2103, 0x2109, 0xFE69, 0xFE6A, 0xFE6B, 0x33D5, + 0x339C, 0x339D, 0x339E, 0x33CE, 0x33A1, 0x338E, 0x338F, 0x33C4, + 0x00B0, 0x5159, 0x515B, 0x515E, 0x515D, 0x5161, 0x5163, 0x55E7, + 0x74E9, 0x7CCE, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, + 0x2587, 0x2588, 0x258F, 0x258E, 0x258D, 0x258C, 0x258B, 0x258A, + 0x2589, 0x253C, 0x2534, 0x252C, 0x2524, 0x251C, 0x2594, 0x2500, + 0x2502, 0x2595, 0x250C, 0x2510, 0x2514, 0x2518, 0x256D, 0, +at 0xA0 + 0, 0x256E, 0x2570, 0x256F, 0x2550, 0x255E, 0x256A, 0x2561, + 0x25E2, 0x25E3, 0x25E5, 0x25E4, 0x2571, 0x2572, 0x2573, 0xFF10, + 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, + 0xFF19, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, + 0x2167, 0x2168, 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, + 0x3026, 0x3027, 0x3028, 0x3029, 0, 0x5344, 0, 0xFF21, + 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, + 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, + 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, + 0xFF3A, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, + 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, + 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0, +plane a3 +at 0x40 + 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0x0391, 0x0392, 0x0393, 0x0394, + 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, + 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, + 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, + 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, + 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, + 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x3105, 0x3106, 0x3107, 0x3108, + 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, 0, +at 0xA0 + 0, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, + 0x3117, 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, + 0x311F, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, + 0x3127, 0x3128, 0x3129, 0x02D9, 0x02C9, 0x02CA, 0x02C7, 0x02CB, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a4 +at 0x40 + 0x4E00, 0x4E59, 0x4E01, 0x4E03, 0x4E43, 0x4E5D, 0x4E86, 0x4E8C, + 0x4EBA, 0x513F, 0x5165, 0x516B, 0x51E0, 0x5200, 0x5201, 0x529B, + 0x5315, 0x5341, 0x535C, 0x53C8, 0x4E09, 0x4E0B, 0x4E08, 0x4E0A, + 0x4E2B, 0x4E38, 0x51E1, 0x4E45, 0x4E48, 0x4E5F, 0x4E5E, 0x4E8E, + 0x4EA1, 0x5140, 0x5203, 0x52FA, 0x5343, 0x53C9, 0x53E3, 0x571F, + 0x58EB, 0x5915, 0x5927, 0x5973, 0x5B50, 0x5B51, 0x5B53, 0x5BF8, + 0x5C0F, 0x5C22, 0x5C38, 0x5C71, 0x5DDD, 0x5DE5, 0x5DF1, 0x5DF2, + 0x5DF3, 0x5DFE, 0x5E72, 0x5EFE, 0x5F0B, 0x5F13, 0x624D, 0, +at 0xA0 + 0, 0x4E11, 0x4E10, 0x4E0D, 0x4E2D, 0x4E30, 0x4E39, 0x4E4B, + 0x5C39, 0x4E88, 0x4E91, 0x4E95, 0x4E92, 0x4E94, 0x4EA2, 0x4EC1, + 0x4EC0, 0x4EC3, 0x4EC6, 0x4EC7, 0x4ECD, 0x4ECA, 0x4ECB, 0x4EC4, + 0x5143, 0x5141, 0x5167, 0x516D, 0x516E, 0x516C, 0x5197, 0x51F6, + 0x5206, 0x5207, 0x5208, 0x52FB, 0x52FE, 0x52FF, 0x5316, 0x5339, + 0x5348, 0x5347, 0x5345, 0x535E, 0x5384, 0x53CB, 0x53CA, 0x53CD, + 0x58EC, 0x5929, 0x592B, 0x592A, 0x592D, 0x5B54, 0x5C11, 0x5C24, + 0x5C3A, 0x5C6F, 0x5DF4, 0x5E7B, 0x5EFF, 0x5F14, 0x5F15, 0x5FC3, + 0x6208, 0x6236, 0x624B, 0x624E, 0x652F, 0x6587, 0x6597, 0x65A4, + 0x65B9, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62, 0x6B79, + 0x6BCB, 0x6BD4, 0x6BDB, 0x6C0F, 0x6C34, 0x706B, 0x722A, 0x7236, + 0x723B, 0x7247, 0x7259, 0x725B, 0x72AC, 0x738B, 0x4E19, 0, +plane a5 +at 0x40 + 0x4E16, 0x4E15, 0x4E14, 0x4E18, 0x4E3B, 0x4E4D, 0x4E4F, 0x4E4E, + 0x4EE5, 0x4ED8, 0x4ED4, 0x4ED5, 0x4ED6, 0x4ED7, 0x4EE3, 0x4EE4, + 0x4ED9, 0x4EDE, 0x5145, 0x5144, 0x5189, 0x518A, 0x51AC, 0x51F9, + 0x51FA, 0x51F8, 0x520A, 0x52A0, 0x529F, 0x5305, 0x5306, 0x5317, + 0x531D, 0x4EDF, 0x534A, 0x5349, 0x5361, 0x5360, 0x536F, 0x536E, + 0x53BB, 0x53EF, 0x53E4, 0x53F3, 0x53EC, 0x53EE, 0x53E9, 0x53E8, + 0x53FC, 0x53F8, 0x53F5, 0x53EB, 0x53E6, 0x53EA, 0x53F2, 0x53F1, + 0x53F0, 0x53E5, 0x53ED, 0x53FB, 0x56DB, 0x56DA, 0x5916, 0, +at 0xA0 + 0, 0x592E, 0x5931, 0x5974, 0x5976, 0x5B55, 0x5B83, 0x5C3C, + 0x5DE8, 0x5DE7, 0x5DE6, 0x5E02, 0x5E03, 0x5E73, 0x5E7C, 0x5F01, + 0x5F18, 0x5F17, 0x5FC5, 0x620A, 0x6253, 0x6254, 0x6252, 0x6251, + 0x65A5, 0x65E6, 0x672E, 0x672C, 0x672A, 0x672B, 0x672D, 0x6B63, + 0x6BCD, 0x6C11, 0x6C10, 0x6C38, 0x6C41, 0x6C40, 0x6C3E, 0x72AF, + 0x7384, 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7529, + 0x7530, 0x7531, 0x7532, 0x7533, 0x758B, 0x767D, 0x76AE, 0x76BF, + 0x76EE, 0x77DB, 0x77E2, 0x77F3, 0x793A, 0x79BE, 0x7A74, 0x7ACB, + 0x4E1E, 0x4E1F, 0x4E52, 0x4E53, 0x4E69, 0x4E99, 0x4EA4, 0x4EA6, + 0x4EA5, 0x4EFF, 0x4F09, 0x4F19, 0x4F0A, 0x4F15, 0x4F0D, 0x4F10, + 0x4F11, 0x4F0F, 0x4EF2, 0x4EF6, 0x4EFB, 0x4EF0, 0x4EF3, 0x4EFD, + 0x4F01, 0x4F0B, 0x5149, 0x5147, 0x5146, 0x5148, 0x5168, 0, +plane a6 +at 0x40 + 0x5171, 0x518D, 0x51B0, 0x5217, 0x5211, 0x5212, 0x520E, 0x5216, + 0x52A3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540F, + 0x540C, 0x540A, 0x5410, 0x5401, 0x540B, 0x5404, 0x5411, 0x540D, + 0x5408, 0x5403, 0x540E, 0x5406, 0x5412, 0x56E0, 0x56DE, 0x56DD, + 0x5733, 0x5730, 0x5728, 0x572D, 0x572C, 0x572F, 0x5729, 0x5919, + 0x591A, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597D, 0x5979, + 0x5982, 0x5981, 0x5B57, 0x5B58, 0x5B87, 0x5B88, 0x5B85, 0x5B89, + 0x5BFA, 0x5C16, 0x5C79, 0x5DDE, 0x5E06, 0x5E76, 0x5E74, 0, +at 0xA0 + 0, 0x5F0F, 0x5F1B, 0x5FD9, 0x5FD6, 0x620E, 0x620C, 0x620D, + 0x6210, 0x6263, 0x625B, 0x6258, 0x6536, 0x65E9, 0x65E8, 0x65EC, + 0x65ED, 0x66F2, 0x66F3, 0x6709, 0x673D, 0x6734, 0x6731, 0x6735, + 0x6B21, 0x6B64, 0x6B7B, 0x6C16, 0x6C5D, 0x6C57, 0x6C59, 0x6C5F, + 0x6C60, 0x6C50, 0x6C55, 0x6C61, 0x6C5B, 0x6C4D, 0x6C4E, 0x7070, + 0x725F, 0x725D, 0x767E, 0x7AF9, 0x7C73, 0x7CF8, 0x7F36, 0x7F8A, + 0x7FBD, 0x8001, 0x8003, 0x800C, 0x8012, 0x8033, 0x807F, 0x8089, + 0x808B, 0x808C, 0x81E3, 0x81EA, 0x81F3, 0x81FC, 0x820C, 0x821B, + 0x821F, 0x826E, 0x8272, 0x827E, 0x866B, 0x8840, 0x884C, 0x8863, + 0x897F, 0x9621, 0x4E32, 0x4EA8, 0x4F4D, 0x4F4F, 0x4F47, 0x4F57, + 0x4F5E, 0x4F34, 0x4F5B, 0x4F55, 0x4F30, 0x4F50, 0x4F51, 0x4F3D, + 0x4F3A, 0x4F38, 0x4F43, 0x4F54, 0x4F3C, 0x4F46, 0x4F63, 0, +plane a7 +at 0x40 + 0x4F5C, 0x4F60, 0x4F2F, 0x4F4E, 0x4F36, 0x4F59, 0x4F5D, 0x4F48, + 0x4F5A, 0x514C, 0x514B, 0x514D, 0x5175, 0x51B6, 0x51B7, 0x5225, + 0x5224, 0x5229, 0x522A, 0x5228, 0x52AB, 0x52A9, 0x52AA, 0x52AC, + 0x5323, 0x5373, 0x5375, 0x541D, 0x542D, 0x541E, 0x543E, 0x5426, + 0x544E, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541B, + 0x5429, 0x544A, 0x5439, 0x543B, 0x5438, 0x542E, 0x5435, 0x5436, + 0x5420, 0x543C, 0x5440, 0x5431, 0x542B, 0x541F, 0x542C, 0x56EA, + 0x56F0, 0x56E4, 0x56EB, 0x574A, 0x5751, 0x5740, 0x574D, 0, +at 0xA0 + 0, 0x5747, 0x574E, 0x573E, 0x5750, 0x574F, 0x573B, 0x58EF, + 0x593E, 0x599D, 0x5992, 0x59A8, 0x599E, 0x59A3, 0x5999, 0x5996, + 0x598D, 0x59A4, 0x5993, 0x598A, 0x59A5, 0x5B5D, 0x5B5C, 0x5B5A, + 0x5B5B, 0x5B8C, 0x5B8B, 0x5B8F, 0x5C2C, 0x5C40, 0x5C41, 0x5C3F, + 0x5C3E, 0x5C90, 0x5C91, 0x5C94, 0x5C8C, 0x5DEB, 0x5E0C, 0x5E8F, + 0x5E87, 0x5E8A, 0x5EF7, 0x5F04, 0x5F1F, 0x5F64, 0x5F62, 0x5F77, + 0x5F79, 0x5FD8, 0x5FCC, 0x5FD7, 0x5FCD, 0x5FF1, 0x5FEB, 0x5FF8, + 0x5FEA, 0x6212, 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276, + 0x6289, 0x626D, 0x628A, 0x627C, 0x627E, 0x6279, 0x6273, 0x6292, + 0x626F, 0x6298, 0x626E, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539, + 0x653B, 0x6538, 0x65F1, 0x66F4, 0x675F, 0x674E, 0x674F, 0x6750, + 0x6751, 0x675C, 0x6756, 0x675E, 0x6749, 0x6746, 0x6760, 0, +plane a8 +at 0x40 + 0x6753, 0x6757, 0x6B65, 0x6BCF, 0x6C42, 0x6C5E, 0x6C99, 0x6C81, + 0x6C88, 0x6C89, 0x6C85, 0x6C9B, 0x6C6A, 0x6C7A, 0x6C90, 0x6C70, + 0x6C8C, 0x6C68, 0x6C96, 0x6C92, 0x6C7D, 0x6C83, 0x6C72, 0x6C7E, + 0x6C74, 0x6C86, 0x6C76, 0x6C8D, 0x6C94, 0x6C98, 0x6C82, 0x7076, + 0x707C, 0x707D, 0x7078, 0x7262, 0x7261, 0x7260, 0x72C4, 0x72C2, + 0x7396, 0x752C, 0x752B, 0x7537, 0x7538, 0x7682, 0x76EF, 0x77E3, + 0x79C1, 0x79C0, 0x79BF, 0x7A76, 0x7CFB, 0x7F55, 0x8096, 0x8093, + 0x809D, 0x8098, 0x809B, 0x809A, 0x80B2, 0x826F, 0x8292, 0, +at 0xA0 + 0, 0x828B, 0x828D, 0x898B, 0x89D2, 0x8A00, 0x8C37, 0x8C46, + 0x8C55, 0x8C9D, 0x8D64, 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, 0x8F9B, + 0x8FB0, 0x8FC2, 0x8FC6, 0x8FC5, 0x8FC4, 0x5DE1, 0x9091, 0x90A2, + 0x90AA, 0x90A6, 0x90A3, 0x9149, 0x91C6, 0x91CC, 0x9632, 0x962E, + 0x9631, 0x962A, 0x962C, 0x4E26, 0x4E56, 0x4E73, 0x4E8B, 0x4E9B, + 0x4E9E, 0x4EAB, 0x4EAC, 0x4F6F, 0x4F9D, 0x4F8D, 0x4F73, 0x4F7F, + 0x4F6C, 0x4F9B, 0x4F8B, 0x4F86, 0x4F83, 0x4F70, 0x4F75, 0x4F88, + 0x4F69, 0x4F7B, 0x4F96, 0x4F7E, 0x4F8F, 0x4F91, 0x4F7A, 0x5154, + 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51BD, 0x51FD, + 0x523B, 0x5238, 0x5237, 0x523A, 0x5230, 0x522E, 0x5236, 0x5241, + 0x52BE, 0x52BB, 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, 0x5377, + 0x5378, 0x5379, 0x53D6, 0x53D4, 0x53D7, 0x5473, 0x5475, 0, +plane a9 +at 0x40 + 0x5496, 0x5478, 0x5495, 0x5480, 0x547B, 0x5477, 0x5484, 0x5492, + 0x5486, 0x547C, 0x5490, 0x5471, 0x5476, 0x548C, 0x549A, 0x5462, + 0x5468, 0x548B, 0x547D, 0x548E, 0x56FA, 0x5783, 0x5777, 0x576A, + 0x5769, 0x5761, 0x5766, 0x5764, 0x577C, 0x591C, 0x5949, 0x5947, + 0x5948, 0x5944, 0x5954, 0x59BE, 0x59BB, 0x59D4, 0x59B9, 0x59AE, + 0x59D1, 0x59C6, 0x59D0, 0x59CD, 0x59CB, 0x59D3, 0x59CA, 0x59AF, + 0x59B3, 0x59D2, 0x59C5, 0x5B5F, 0x5B64, 0x5B63, 0x5B97, 0x5B9A, + 0x5B98, 0x5B9C, 0x5B99, 0x5B9B, 0x5C1A, 0x5C48, 0x5C45, 0, +at 0xA0 + 0, 0x5C46, 0x5CB7, 0x5CA1, 0x5CB8, 0x5CA9, 0x5CAB, 0x5CB1, + 0x5CB3, 0x5E18, 0x5E1A, 0x5E16, 0x5E15, 0x5E1B, 0x5E11, 0x5E78, + 0x5E9A, 0x5E97, 0x5E9C, 0x5E95, 0x5E96, 0x5EF6, 0x5F26, 0x5F27, + 0x5F29, 0x5F80, 0x5F81, 0x5F7F, 0x5F7C, 0x5FDD, 0x5FE0, 0x5FFD, + 0x5FF5, 0x5FFF, 0x600F, 0x6014, 0x602F, 0x6035, 0x6016, 0x602A, + 0x6015, 0x6021, 0x6027, 0x6029, 0x602B, 0x601B, 0x6216, 0x6215, + 0x623F, 0x623E, 0x6240, 0x627F, 0x62C9, 0x62CC, 0x62C4, 0x62BF, + 0x62C2, 0x62B9, 0x62D2, 0x62DB, 0x62AB, 0x62D3, 0x62D4, 0x62CB, + 0x62C8, 0x62A8, 0x62BD, 0x62BC, 0x62D0, 0x62D9, 0x62C7, 0x62CD, + 0x62B5, 0x62DA, 0x62B1, 0x62D8, 0x62D6, 0x62D7, 0x62C6, 0x62AC, + 0x62CE, 0x653E, 0x65A7, 0x65BC, 0x65FA, 0x6614, 0x6613, 0x660C, + 0x6606, 0x6602, 0x660E, 0x6600, 0x660F, 0x6615, 0x660A, 0, +plane aa +at 0x40 + 0x6607, 0x670D, 0x670B, 0x676D, 0x678B, 0x6795, 0x6771, 0x679C, + 0x6773, 0x6777, 0x6787, 0x679D, 0x6797, 0x676F, 0x6770, 0x677F, + 0x6789, 0x677E, 0x6790, 0x6775, 0x679A, 0x6793, 0x677C, 0x676A, + 0x6772, 0x6B23, 0x6B66, 0x6B67, 0x6B7F, 0x6C13, 0x6C1B, 0x6CE3, + 0x6CE8, 0x6CF3, 0x6CB1, 0x6CCC, 0x6CE5, 0x6CB3, 0x6CBD, 0x6CBE, + 0x6CBC, 0x6CE2, 0x6CAB, 0x6CD5, 0x6CD3, 0x6CB8, 0x6CC4, 0x6CB9, + 0x6CC1, 0x6CAE, 0x6CD7, 0x6CC5, 0x6CF1, 0x6CBF, 0x6CBB, 0x6CE1, + 0x6CDB, 0x6CCA, 0x6CAC, 0x6CEF, 0x6CDC, 0x6CD6, 0x6CE0, 0, +at 0xA0 + 0, 0x7095, 0x708E, 0x7092, 0x708A, 0x7099, 0x722C, 0x722D, + 0x7238, 0x7248, 0x7267, 0x7269, 0x72C0, 0x72CE, 0x72D9, 0x72D7, + 0x72D0, 0x73A9, 0x73A8, 0x739F, 0x73AB, 0x73A5, 0x753D, 0x759D, + 0x7599, 0x759A, 0x7684, 0x76C2, 0x76F2, 0x76F4, 0x77E5, 0x77FD, + 0x793E, 0x7940, 0x7941, 0x79C9, 0x79C8, 0x7A7A, 0x7A79, 0x7AFA, + 0x7CFE, 0x7F54, 0x7F8C, 0x7F8B, 0x8005, 0x80BA, 0x80A5, 0x80A2, + 0x80B1, 0x80A1, 0x80AB, 0x80A9, 0x80B4, 0x80AA, 0x80AF, 0x81E5, + 0x81FE, 0x820D, 0x82B3, 0x829D, 0x8299, 0x82AD, 0x82BD, 0x829F, + 0x82B9, 0x82B1, 0x82AC, 0x82A5, 0x82AF, 0x82B8, 0x82A3, 0x82B0, + 0x82BE, 0x82B7, 0x864E, 0x8671, 0x521D, 0x8868, 0x8ECB, 0x8FCE, + 0x8FD4, 0x8FD1, 0x90B5, 0x90B8, 0x90B1, 0x90B6, 0x91C7, 0x91D1, + 0x9577, 0x9580, 0x961C, 0x9640, 0x963F, 0x963B, 0x9644, 0, +plane ab +at 0x40 + 0x9642, 0x96B9, 0x96E8, 0x9752, 0x975E, 0x4E9F, 0x4EAD, 0x4EAE, + 0x4FE1, 0x4FB5, 0x4FAF, 0x4FBF, 0x4FE0, 0x4FD1, 0x4FCF, 0x4FDD, + 0x4FC3, 0x4FB6, 0x4FD8, 0x4FDF, 0x4FCA, 0x4FD7, 0x4FAE, 0x4FD0, + 0x4FC4, 0x4FC2, 0x4FDA, 0x4FCE, 0x4FDE, 0x4FB7, 0x5157, 0x5192, + 0x5191, 0x51A0, 0x524E, 0x5243, 0x524A, 0x524D, 0x524C, 0x524B, + 0x5247, 0x52C7, 0x52C9, 0x52C3, 0x52C1, 0x530D, 0x5357, 0x537B, + 0x539A, 0x53DB, 0x54AC, 0x54C0, 0x54A8, 0x54CE, 0x54C9, 0x54B8, + 0x54A6, 0x54B3, 0x54C7, 0x54C2, 0x54BD, 0x54AA, 0x54C1, 0, +at 0xA0 + 0, 0x54C4, 0x54C8, 0x54AF, 0x54AB, 0x54B1, 0x54BB, 0x54A9, + 0x54A7, 0x54BF, 0x56FF, 0x5782, 0x578B, 0x57A0, 0x57A3, 0x57A2, + 0x57CE, 0x57AE, 0x5793, 0x5955, 0x5951, 0x594F, 0x594E, 0x5950, + 0x59DC, 0x59D8, 0x59FF, 0x59E3, 0x59E8, 0x5A03, 0x59E5, 0x59EA, + 0x59DA, 0x59E6, 0x5A01, 0x59FB, 0x5B69, 0x5BA3, 0x5BA6, 0x5BA4, + 0x5BA2, 0x5BA5, 0x5C01, 0x5C4E, 0x5C4F, 0x5C4D, 0x5C4B, 0x5CD9, + 0x5CD2, 0x5DF7, 0x5E1D, 0x5E25, 0x5E1F, 0x5E7D, 0x5EA0, 0x5EA6, + 0x5EFA, 0x5F08, 0x5F2D, 0x5F65, 0x5F88, 0x5F85, 0x5F8A, 0x5F8B, + 0x5F87, 0x5F8C, 0x5F89, 0x6012, 0x601D, 0x6020, 0x6025, 0x600E, + 0x6028, 0x604D, 0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606C, + 0x606B, 0x606A, 0x6064, 0x6241, 0x62DC, 0x6316, 0x6309, 0x62FC, + 0x62ED, 0x6301, 0x62EE, 0x62FD, 0x6307, 0x62F1, 0x62F7, 0, +plane ac +at 0x40 + 0x62EF, 0x62EC, 0x62FE, 0x62F4, 0x6311, 0x6302, 0x653F, 0x6545, + 0x65AB, 0x65BD, 0x65E2, 0x6625, 0x662D, 0x6620, 0x6627, 0x662F, + 0x661F, 0x6628, 0x6631, 0x6624, 0x66F7, 0x67FF, 0x67D3, 0x67F1, + 0x67D4, 0x67D0, 0x67EC, 0x67B6, 0x67AF, 0x67F5, 0x67E9, 0x67EF, + 0x67C4, 0x67D1, 0x67B4, 0x67DA, 0x67E5, 0x67B8, 0x67CF, 0x67DE, + 0x67F3, 0x67B0, 0x67D9, 0x67E2, 0x67DD, 0x67D2, 0x6B6A, 0x6B83, + 0x6B86, 0x6BB5, 0x6BD2, 0x6BD7, 0x6C1F, 0x6CC9, 0x6D0B, 0x6D32, + 0x6D2A, 0x6D41, 0x6D25, 0x6D0C, 0x6D31, 0x6D1E, 0x6D17, 0, +at 0xA0 + 0, 0x6D3B, 0x6D3D, 0x6D3E, 0x6D36, 0x6D1B, 0x6CF5, 0x6D39, + 0x6D27, 0x6D38, 0x6D29, 0x6D2E, 0x6D35, 0x6D0E, 0x6D2B, 0x70AB, + 0x70BA, 0x70B3, 0x70AC, 0x70AF, 0x70AD, 0x70B8, 0x70AE, 0x70A4, + 0x7230, 0x7272, 0x726F, 0x7274, 0x72E9, 0x72E0, 0x72E1, 0x73B7, + 0x73CA, 0x73BB, 0x73B2, 0x73CD, 0x73C0, 0x73B3, 0x751A, 0x752D, + 0x754F, 0x754C, 0x754E, 0x754B, 0x75AB, 0x75A4, 0x75A5, 0x75A2, + 0x75A3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76C8, 0x76C6, 0x76C3, + 0x76C5, 0x7701, 0x76F9, 0x76F8, 0x7709, 0x770B, 0x76FE, 0x76FC, + 0x7707, 0x77DC, 0x7802, 0x7814, 0x780C, 0x780D, 0x7946, 0x7949, + 0x7948, 0x7947, 0x79B9, 0x79BA, 0x79D1, 0x79D2, 0x79CB, 0x7A7F, + 0x7A81, 0x7AFF, 0x7AFD, 0x7C7D, 0x7D02, 0x7D05, 0x7D00, 0x7D09, + 0x7D07, 0x7D04, 0x7D06, 0x7F38, 0x7F8E, 0x7FBF, 0x8004, 0, +plane ad +at 0x40 + 0x8010, 0x800D, 0x8011, 0x8036, 0x80D6, 0x80E5, 0x80DA, 0x80C3, + 0x80C4, 0x80CC, 0x80E1, 0x80DB, 0x80CE, 0x80DE, 0x80E4, 0x80DD, + 0x81F4, 0x8222, 0x82E7, 0x8303, 0x8305, 0x82E3, 0x82DB, 0x82E6, + 0x8304, 0x82E5, 0x8302, 0x8309, 0x82D2, 0x82D7, 0x82F1, 0x8301, + 0x82DC, 0x82D4, 0x82D1, 0x82DE, 0x82D3, 0x82DF, 0x82EF, 0x8306, + 0x8650, 0x8679, 0x867B, 0x867A, 0x884D, 0x886B, 0x8981, 0x89D4, + 0x8A08, 0x8A02, 0x8A03, 0x8C9E, 0x8CA0, 0x8D74, 0x8D73, 0x8DB4, + 0x8ECD, 0x8ECC, 0x8FF0, 0x8FE6, 0x8FE2, 0x8FEA, 0x8FE5, 0, +at 0xA0 + 0, 0x8FED, 0x8FEB, 0x8FE4, 0x8FE8, 0x90CA, 0x90CE, 0x90C1, + 0x90C3, 0x914B, 0x914A, 0x91CD, 0x9582, 0x9650, 0x964B, 0x964C, + 0x964D, 0x9762, 0x9769, 0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8, + 0x98DB, 0x98DF, 0x9996, 0x9999, 0x4E58, 0x4EB3, 0x500C, 0x500D, + 0x5023, 0x4FEF, 0x5026, 0x5025, 0x4FF8, 0x5029, 0x5016, 0x5006, + 0x503C, 0x501F, 0x501A, 0x5012, 0x5011, 0x4FFA, 0x5000, 0x5014, + 0x5028, 0x4FF1, 0x5021, 0x500B, 0x5019, 0x5018, 0x4FF3, 0x4FEE, + 0x502D, 0x502A, 0x4FFE, 0x502B, 0x5009, 0x517C, 0x51A4, 0x51A5, + 0x51A2, 0x51CD, 0x51CC, 0x51C6, 0x51CB, 0x5256, 0x525C, 0x5254, + 0x525B, 0x525D, 0x532A, 0x537F, 0x539F, 0x539D, 0x53DF, 0x54E8, + 0x5510, 0x5501, 0x5537, 0x54FC, 0x54E5, 0x54F2, 0x5506, 0x54FA, + 0x5514, 0x54E9, 0x54ED, 0x54E1, 0x5509, 0x54EE, 0x54EA, 0, +plane ae +at 0x40 + 0x54E6, 0x5527, 0x5507, 0x54FD, 0x550F, 0x5703, 0x5704, 0x57C2, + 0x57D4, 0x57CB, 0x57C3, 0x5809, 0x590F, 0x5957, 0x5958, 0x595A, + 0x5A11, 0x5A18, 0x5A1C, 0x5A1F, 0x5A1B, 0x5A13, 0x59EC, 0x5A20, + 0x5A23, 0x5A29, 0x5A25, 0x5A0C, 0x5A09, 0x5B6B, 0x5C58, 0x5BB0, + 0x5BB3, 0x5BB6, 0x5BB4, 0x5BAE, 0x5BB5, 0x5BB9, 0x5BB8, 0x5C04, + 0x5C51, 0x5C55, 0x5C50, 0x5CED, 0x5CFD, 0x5CFB, 0x5CEA, 0x5CE8, + 0x5CF0, 0x5CF6, 0x5D01, 0x5CF4, 0x5DEE, 0x5E2D, 0x5E2B, 0x5EAB, + 0x5EAD, 0x5EA7, 0x5F31, 0x5F92, 0x5F91, 0x5F90, 0x6059, 0, +at 0xA0 + 0, 0x6063, 0x6065, 0x6050, 0x6055, 0x606D, 0x6069, 0x606F, + 0x6084, 0x609F, 0x609A, 0x608D, 0x6094, 0x608C, 0x6085, 0x6096, + 0x6247, 0x62F3, 0x6308, 0x62FF, 0x634E, 0x633E, 0x632F, 0x6355, + 0x6342, 0x6346, 0x634F, 0x6349, 0x633A, 0x6350, 0x633D, 0x632A, + 0x632B, 0x6328, 0x634D, 0x634C, 0x6548, 0x6549, 0x6599, 0x65C1, + 0x65C5, 0x6642, 0x6649, 0x664F, 0x6643, 0x6652, 0x664C, 0x6645, + 0x6641, 0x66F8, 0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, + 0x6846, 0x6853, 0x6839, 0x6842, 0x6854, 0x6829, 0x68B3, 0x6817, + 0x684C, 0x6851, 0x683D, 0x67F4, 0x6850, 0x6840, 0x683C, 0x6843, + 0x682A, 0x6845, 0x6813, 0x6818, 0x6841, 0x6B8A, 0x6B89, 0x6BB7, + 0x6C23, 0x6C27, 0x6C28, 0x6C26, 0x6C24, 0x6CF0, 0x6D6A, 0x6D95, + 0x6D88, 0x6D87, 0x6D66, 0x6D78, 0x6D77, 0x6D59, 0x6D93, 0, +plane af +at 0x40 + 0x6D6C, 0x6D89, 0x6D6E, 0x6D5A, 0x6D74, 0x6D69, 0x6D8C, 0x6D8A, + 0x6D79, 0x6D85, 0x6D65, 0x6D94, 0x70CA, 0x70D8, 0x70E4, 0x70D9, + 0x70C8, 0x70CF, 0x7239, 0x7279, 0x72FC, 0x72F9, 0x72FD, 0x72F8, + 0x72F7, 0x7386, 0x73ED, 0x7409, 0x73EE, 0x73E0, 0x73EA, 0x73DE, + 0x7554, 0x755D, 0x755C, 0x755A, 0x7559, 0x75BE, 0x75C5, 0x75C7, + 0x75B2, 0x75B3, 0x75BD, 0x75BC, 0x75B9, 0x75C2, 0x75B8, 0x768B, + 0x76B0, 0x76CA, 0x76CD, 0x76CE, 0x7729, 0x771F, 0x7720, 0x7728, + 0x77E9, 0x7830, 0x7827, 0x7838, 0x781D, 0x7834, 0x7837, 0, +at 0xA0 + 0, 0x7825, 0x782D, 0x7820, 0x781F, 0x7832, 0x7955, 0x7950, + 0x7960, 0x795F, 0x7956, 0x795E, 0x795D, 0x7957, 0x795A, 0x79E4, + 0x79E3, 0x79E7, 0x79DF, 0x79E6, 0x79E9, 0x79D8, 0x7A84, 0x7A88, + 0x7AD9, 0x7B06, 0x7B11, 0x7C89, 0x7D21, 0x7D17, 0x7D0B, 0x7D0A, + 0x7D20, 0x7D22, 0x7D14, 0x7D10, 0x7D15, 0x7D1A, 0x7D1C, 0x7D0D, + 0x7D19, 0x7D1B, 0x7F3A, 0x7F5F, 0x7F94, 0x7FC5, 0x7FC1, 0x8006, + 0x8018, 0x8015, 0x8019, 0x8017, 0x803D, 0x803F, 0x80F1, 0x8102, + 0x80F0, 0x8105, 0x80ED, 0x80F4, 0x8106, 0x80F8, 0x80F3, 0x8108, + 0x80FD, 0x810A, 0x80FC, 0x80EF, 0x81ED, 0x81EC, 0x8200, 0x8210, + 0x822A, 0x822B, 0x8228, 0x822C, 0x82BB, 0x832B, 0x8352, 0x8354, + 0x834A, 0x8338, 0x8350, 0x8349, 0x8335, 0x8334, 0x834F, 0x8332, + 0x8339, 0x8336, 0x8317, 0x8340, 0x8331, 0x8328, 0x8343, 0, +plane b0 +at 0x40 + 0x8654, 0x868A, 0x86AA, 0x8693, 0x86A4, 0x86A9, 0x868C, 0x86A3, + 0x869C, 0x8870, 0x8877, 0x8881, 0x8882, 0x887D, 0x8879, 0x8A18, + 0x8A10, 0x8A0E, 0x8A0C, 0x8A15, 0x8A0A, 0x8A17, 0x8A13, 0x8A16, + 0x8A0F, 0x8A11, 0x8C48, 0x8C7A, 0x8C79, 0x8CA1, 0x8CA2, 0x8D77, + 0x8EAC, 0x8ED2, 0x8ED4, 0x8ECF, 0x8FB1, 0x9001, 0x9006, 0x8FF7, + 0x9000, 0x8FFA, 0x8FF4, 0x9003, 0x8FFD, 0x9005, 0x8FF8, 0x9095, + 0x90E1, 0x90DD, 0x90E2, 0x9152, 0x914D, 0x914C, 0x91D8, 0x91DD, + 0x91D7, 0x91DC, 0x91D9, 0x9583, 0x9662, 0x9663, 0x9661, 0, +at 0xA0 + 0, 0x965B, 0x965D, 0x9664, 0x9658, 0x965E, 0x96BB, 0x98E2, + 0x99AC, 0x9AA8, 0x9AD8, 0x9B25, 0x9B32, 0x9B3C, 0x4E7E, 0x507A, + 0x507D, 0x505C, 0x5047, 0x5043, 0x504C, 0x505A, 0x5049, 0x5065, + 0x5076, 0x504E, 0x5055, 0x5075, 0x5074, 0x5077, 0x504F, 0x500F, + 0x506F, 0x506D, 0x515C, 0x5195, 0x51F0, 0x526A, 0x526F, 0x52D2, + 0x52D9, 0x52D8, 0x52D5, 0x5310, 0x530F, 0x5319, 0x533F, 0x5340, + 0x533E, 0x53C3, 0x66FC, 0x5546, 0x556A, 0x5566, 0x5544, 0x555E, + 0x5561, 0x5543, 0x554A, 0x5531, 0x5556, 0x554F, 0x5555, 0x552F, + 0x5564, 0x5538, 0x552E, 0x555C, 0x552C, 0x5563, 0x5533, 0x5541, + 0x5557, 0x5708, 0x570B, 0x5709, 0x57DF, 0x5805, 0x580A, 0x5806, + 0x57E0, 0x57E4, 0x57FA, 0x5802, 0x5835, 0x57F7, 0x57F9, 0x5920, + 0x5962, 0x5A36, 0x5A41, 0x5A49, 0x5A66, 0x5A6A, 0x5A40, 0, +plane b1 +at 0x40 + 0x5A3C, 0x5A62, 0x5A5A, 0x5A46, 0x5A4A, 0x5B70, 0x5BC7, 0x5BC5, + 0x5BC4, 0x5BC2, 0x5BBF, 0x5BC6, 0x5C09, 0x5C08, 0x5C07, 0x5C60, + 0x5C5C, 0x5C5D, 0x5D07, 0x5D06, 0x5D0E, 0x5D1B, 0x5D16, 0x5D22, + 0x5D11, 0x5D29, 0x5D14, 0x5D19, 0x5D24, 0x5D27, 0x5D17, 0x5DE2, + 0x5E38, 0x5E36, 0x5E33, 0x5E37, 0x5EB7, 0x5EB8, 0x5EB6, 0x5EB5, + 0x5EBE, 0x5F35, 0x5F37, 0x5F57, 0x5F6C, 0x5F69, 0x5F6B, 0x5F97, + 0x5F99, 0x5F9E, 0x5F98, 0x5FA1, 0x5FA0, 0x5F9C, 0x607F, 0x60A3, + 0x6089, 0x60A0, 0x60A8, 0x60CB, 0x60B4, 0x60E6, 0x60BD, 0, +at 0xA0 + 0, 0x60C5, 0x60BB, 0x60B5, 0x60DC, 0x60BC, 0x60D8, 0x60D5, + 0x60C6, 0x60DF, 0x60B8, 0x60DA, 0x60C7, 0x621A, 0x621B, 0x6248, + 0x63A0, 0x63A7, 0x6372, 0x6396, 0x63A2, 0x63A5, 0x6377, 0x6367, + 0x6398, 0x63AA, 0x6371, 0x63A9, 0x6389, 0x6383, 0x639B, 0x636B, + 0x63A8, 0x6384, 0x6388, 0x6399, 0x63A1, 0x63AC, 0x6392, 0x638F, + 0x6380, 0x637B, 0x6369, 0x6368, 0x637A, 0x655D, 0x6556, 0x6551, + 0x6559, 0x6557, 0x555F, 0x654F, 0x6558, 0x6555, 0x6554, 0x659C, + 0x659B, 0x65AC, 0x65CF, 0x65CB, 0x65CC, 0x65CE, 0x665D, 0x665A, + 0x6664, 0x6668, 0x6666, 0x665E, 0x66F9, 0x52D7, 0x671B, 0x6881, + 0x68AF, 0x68A2, 0x6893, 0x68B5, 0x687F, 0x6876, 0x68B1, 0x68A7, + 0x6897, 0x68B0, 0x6883, 0x68C4, 0x68AD, 0x6886, 0x6885, 0x6894, + 0x689D, 0x68A8, 0x689F, 0x68A1, 0x6882, 0x6B32, 0x6BBA, 0, +plane b2 +at 0x40 + 0x6BEB, 0x6BEC, 0x6C2B, 0x6D8E, 0x6DBC, 0x6DF3, 0x6DD9, 0x6DB2, + 0x6DE1, 0x6DCC, 0x6DE4, 0x6DFB, 0x6DFA, 0x6E05, 0x6DC7, 0x6DCB, + 0x6DAF, 0x6DD1, 0x6DAE, 0x6DDE, 0x6DF9, 0x6DB8, 0x6DF7, 0x6DF5, + 0x6DC5, 0x6DD2, 0x6E1A, 0x6DB5, 0x6DDA, 0x6DEB, 0x6DD8, 0x6DEA, + 0x6DF1, 0x6DEE, 0x6DE8, 0x6DC6, 0x6DC4, 0x6DAA, 0x6DEC, 0x6DBF, + 0x6DE6, 0x70F9, 0x7109, 0x710A, 0x70FD, 0x70EF, 0x723D, 0x727D, + 0x7281, 0x731C, 0x731B, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405, + 0x740A, 0x7403, 0x7406, 0x73FE, 0x740D, 0x74E0, 0x74F6, 0, +at 0xA0 + 0, 0x74F7, 0x751C, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, + 0x758F, 0x75D4, 0x75D5, 0x75B5, 0x75CA, 0x75CD, 0x768E, 0x76D4, + 0x76D2, 0x76DB, 0x7737, 0x773E, 0x773C, 0x7736, 0x7738, 0x773A, + 0x786B, 0x7843, 0x784E, 0x7965, 0x7968, 0x796D, 0x79FB, 0x7A92, + 0x7A95, 0x7B20, 0x7B28, 0x7B1B, 0x7B2C, 0x7B26, 0x7B19, 0x7B1E, + 0x7B2E, 0x7C92, 0x7C97, 0x7C95, 0x7D46, 0x7D43, 0x7D71, 0x7D2E, + 0x7D39, 0x7D3C, 0x7D40, 0x7D30, 0x7D33, 0x7D44, 0x7D2F, 0x7D42, + 0x7D32, 0x7D31, 0x7F3D, 0x7F9E, 0x7F9A, 0x7FCC, 0x7FCE, 0x7FD2, + 0x801C, 0x804A, 0x8046, 0x812F, 0x8116, 0x8123, 0x812B, 0x8129, + 0x8130, 0x8124, 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838E, + 0x839E, 0x8398, 0x8378, 0x83A2, 0x8396, 0x83BD, 0x83AB, 0x8392, + 0x838A, 0x8393, 0x8389, 0x83A0, 0x8377, 0x837B, 0x837C, 0, +plane b3 +at 0x40 + 0x8386, 0x83A7, 0x8655, 0x5F6A, 0x86C7, 0x86C0, 0x86B6, 0x86C4, + 0x86B5, 0x86C6, 0x86CB, 0x86B1, 0x86AF, 0x86C9, 0x8853, 0x889E, + 0x8888, 0x88AB, 0x8892, 0x8896, 0x888D, 0x888B, 0x8993, 0x898F, + 0x8A2A, 0x8A1D, 0x8A23, 0x8A25, 0x8A31, 0x8A2D, 0x8A1F, 0x8A1B, + 0x8A22, 0x8C49, 0x8C5A, 0x8CA9, 0x8CAC, 0x8CAB, 0x8CA8, 0x8CAA, + 0x8CA7, 0x8D67, 0x8D66, 0x8DBE, 0x8DBA, 0x8EDB, 0x8EDF, 0x9019, + 0x900D, 0x901A, 0x9017, 0x9023, 0x901F, 0x901D, 0x9010, 0x9015, + 0x901E, 0x9020, 0x900F, 0x9022, 0x9016, 0x901B, 0x9014, 0, +at 0xA0 + 0, 0x90E8, 0x90ED, 0x90FD, 0x9157, 0x91CE, 0x91F5, 0x91E6, + 0x91E3, 0x91E7, 0x91ED, 0x91E9, 0x9589, 0x966A, 0x9675, 0x9673, + 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, 0x966C, 0x96C0, 0x96EA, + 0x96E9, 0x7AE0, 0x7ADF, 0x9802, 0x9803, 0x9B5A, 0x9CE5, 0x9E75, + 0x9E7F, 0x9EA5, 0x9EBB, 0x50A2, 0x508D, 0x5085, 0x5099, 0x5091, + 0x5080, 0x5096, 0x5098, 0x509A, 0x6700, 0x51F1, 0x5272, 0x5274, + 0x5275, 0x5269, 0x52DE, 0x52DD, 0x52DB, 0x535A, 0x53A5, 0x557B, + 0x5580, 0x55A7, 0x557C, 0x558A, 0x559D, 0x5598, 0x5582, 0x559C, + 0x55AA, 0x5594, 0x5587, 0x558B, 0x5583, 0x55B3, 0x55AE, 0x559F, + 0x553E, 0x55B2, 0x559A, 0x55BB, 0x55AC, 0x55B1, 0x557E, 0x5589, + 0x55AB, 0x5599, 0x570D, 0x582F, 0x582A, 0x5834, 0x5824, 0x5830, + 0x5831, 0x5821, 0x581D, 0x5820, 0x58F9, 0x58FA, 0x5960, 0, +plane b4 +at 0x40 + 0x5A77, 0x5A9A, 0x5A7F, 0x5A92, 0x5A9B, 0x5AA7, 0x5B73, 0x5B71, + 0x5BD2, 0x5BCC, 0x5BD3, 0x5BD0, 0x5C0A, 0x5C0B, 0x5C31, 0x5D4C, + 0x5D50, 0x5D34, 0x5D47, 0x5DFD, 0x5E45, 0x5E3D, 0x5E40, 0x5E43, + 0x5E7E, 0x5ECA, 0x5EC1, 0x5EC2, 0x5EC4, 0x5F3C, 0x5F6D, 0x5FA9, + 0x5FAA, 0x5FA8, 0x60D1, 0x60E1, 0x60B2, 0x60B6, 0x60E0, 0x611C, + 0x6123, 0x60FA, 0x6115, 0x60F0, 0x60FB, 0x60F4, 0x6168, 0x60F1, + 0x610E, 0x60F6, 0x6109, 0x6100, 0x6112, 0x621F, 0x6249, 0x63A3, + 0x638C, 0x63CF, 0x63C0, 0x63E9, 0x63C9, 0x63C6, 0x63CD, 0, +at 0xA0 + 0, 0x63D2, 0x63E3, 0x63D0, 0x63E1, 0x63D6, 0x63ED, 0x63EE, + 0x6376, 0x63F4, 0x63EA, 0x63DB, 0x6452, 0x63DA, 0x63F9, 0x655E, + 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65AF, 0x666E, 0x6670, + 0x6674, 0x6676, 0x666F, 0x6691, 0x667A, 0x667E, 0x6677, 0x66FE, + 0x66FF, 0x671F, 0x671D, 0x68FA, 0x68D5, 0x68E0, 0x68D8, 0x68D7, + 0x6905, 0x68DF, 0x68F5, 0x68EE, 0x68E7, 0x68F9, 0x68D2, 0x68F2, + 0x68E3, 0x68CB, 0x68CD, 0x690D, 0x6912, 0x690E, 0x68C9, 0x68DA, + 0x696E, 0x68FB, 0x6B3E, 0x6B3A, 0x6B3D, 0x6B98, 0x6B96, 0x6BBC, + 0x6BEF, 0x6C2E, 0x6C2F, 0x6C2C, 0x6E2F, 0x6E38, 0x6E54, 0x6E21, + 0x6E32, 0x6E67, 0x6E4A, 0x6E20, 0x6E25, 0x6E23, 0x6E1B, 0x6E5B, + 0x6E58, 0x6E24, 0x6E56, 0x6E6E, 0x6E2D, 0x6E26, 0x6E6F, 0x6E34, + 0x6E4D, 0x6E3A, 0x6E2C, 0x6E43, 0x6E1D, 0x6E3E, 0x6ECB, 0, +plane b5 +at 0x40 + 0x6E89, 0x6E19, 0x6E4E, 0x6E63, 0x6E44, 0x6E72, 0x6E69, 0x6E5F, + 0x7119, 0x711A, 0x7126, 0x7130, 0x7121, 0x7136, 0x716E, 0x711C, + 0x724C, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743A, + 0x742A, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742F, + 0x741B, 0x7426, 0x7428, 0x7525, 0x7526, 0x756B, 0x756A, 0x75E2, + 0x75DB, 0x75E3, 0x75D9, 0x75D8, 0x75DE, 0x75E0, 0x767B, 0x767C, + 0x7696, 0x7693, 0x76B4, 0x76DC, 0x774F, 0x77ED, 0x785D, 0x786C, + 0x786F, 0x7A0D, 0x7A08, 0x7A0B, 0x7A05, 0x7A00, 0x7A98, 0, +at 0xA0 + 0, 0x7A97, 0x7A96, 0x7AE5, 0x7AE3, 0x7B49, 0x7B56, 0x7B46, + 0x7B50, 0x7B52, 0x7B54, 0x7B4D, 0x7B4B, 0x7B4F, 0x7B51, 0x7C9F, + 0x7CA5, 0x7D5E, 0x7D50, 0x7D68, 0x7D55, 0x7D2B, 0x7D6E, 0x7D72, + 0x7D61, 0x7D66, 0x7D62, 0x7D70, 0x7D73, 0x5584, 0x7FD4, 0x7FD5, + 0x800B, 0x8052, 0x8085, 0x8155, 0x8154, 0x814B, 0x8151, 0x814E, + 0x8139, 0x8146, 0x813E, 0x814C, 0x8153, 0x8174, 0x8212, 0x821C, + 0x83E9, 0x8403, 0x83F8, 0x840D, 0x83E0, 0x83C5, 0x840B, 0x83C1, + 0x83EF, 0x83F1, 0x83F4, 0x8457, 0x840A, 0x83F0, 0x840C, 0x83CC, + 0x83FD, 0x83F2, 0x83CA, 0x8438, 0x840E, 0x8404, 0x83DC, 0x8407, + 0x83D4, 0x83DF, 0x865B, 0x86DF, 0x86D9, 0x86ED, 0x86D4, 0x86DB, + 0x86E4, 0x86D0, 0x86DE, 0x8857, 0x88C1, 0x88C2, 0x88B1, 0x8983, + 0x8996, 0x8A3B, 0x8A60, 0x8A55, 0x8A5E, 0x8A3C, 0x8A41, 0, +plane b6 +at 0x40 + 0x8A54, 0x8A5B, 0x8A50, 0x8A46, 0x8A34, 0x8A3A, 0x8A36, 0x8A56, + 0x8C61, 0x8C82, 0x8CAF, 0x8CBC, 0x8CB3, 0x8CBD, 0x8CC1, 0x8CBB, + 0x8CC0, 0x8CB4, 0x8CB7, 0x8CB6, 0x8CBF, 0x8CB8, 0x8D8A, 0x8D85, + 0x8D81, 0x8DCE, 0x8DDD, 0x8DCB, 0x8DDA, 0x8DD1, 0x8DCC, 0x8DDB, + 0x8DC6, 0x8EFB, 0x8EF8, 0x8EFC, 0x8F9C, 0x902E, 0x9035, 0x9031, + 0x9038, 0x9032, 0x9036, 0x9102, 0x90F5, 0x9109, 0x90FE, 0x9163, + 0x9165, 0x91CF, 0x9214, 0x9215, 0x9223, 0x9209, 0x921E, 0x920D, + 0x9210, 0x9207, 0x9211, 0x9594, 0x958F, 0x958B, 0x9591, 0, +at 0xA0 + 0, 0x9593, 0x9592, 0x958E, 0x968A, 0x968E, 0x968B, 0x967D, + 0x9685, 0x9686, 0x968D, 0x9672, 0x9684, 0x96C1, 0x96C5, 0x96C4, + 0x96C6, 0x96C7, 0x96EF, 0x96F2, 0x97CC, 0x9805, 0x9806, 0x9808, + 0x98E7, 0x98EA, 0x98EF, 0x98E9, 0x98F2, 0x98ED, 0x99AE, 0x99AD, + 0x9EC3, 0x9ECD, 0x9ED1, 0x4E82, 0x50AD, 0x50B5, 0x50B2, 0x50B3, + 0x50C5, 0x50BE, 0x50AC, 0x50B7, 0x50BB, 0x50AF, 0x50C7, 0x527F, + 0x5277, 0x527D, 0x52DF, 0x52E6, 0x52E4, 0x52E2, 0x52E3, 0x532F, + 0x55DF, 0x55E8, 0x55D3, 0x55E6, 0x55CE, 0x55DC, 0x55C7, 0x55D1, + 0x55E3, 0x55E4, 0x55EF, 0x55DA, 0x55E1, 0x55C5, 0x55C6, 0x55E5, + 0x55C9, 0x5712, 0x5713, 0x585E, 0x5851, 0x5858, 0x5857, 0x585A, + 0x5854, 0x586B, 0x584C, 0x586D, 0x584A, 0x5862, 0x5852, 0x584B, + 0x5967, 0x5AC1, 0x5AC9, 0x5ACC, 0x5ABE, 0x5ABD, 0x5ABC, 0, +plane b7 +at 0x40 + 0x5AB3, 0x5AC2, 0x5AB2, 0x5D69, 0x5D6F, 0x5E4C, 0x5E79, 0x5EC9, + 0x5EC8, 0x5F12, 0x5F59, 0x5FAC, 0x5FAE, 0x611A, 0x610F, 0x6148, + 0x611F, 0x60F3, 0x611B, 0x60F9, 0x6101, 0x6108, 0x614E, 0x614C, + 0x6144, 0x614D, 0x613E, 0x6134, 0x6127, 0x610D, 0x6106, 0x6137, + 0x6221, 0x6222, 0x6413, 0x643E, 0x641E, 0x642A, 0x642D, 0x643D, + 0x642C, 0x640F, 0x641C, 0x6414, 0x640D, 0x6436, 0x6416, 0x6417, + 0x6406, 0x656C, 0x659F, 0x65B0, 0x6697, 0x6689, 0x6687, 0x6688, + 0x6696, 0x6684, 0x6698, 0x668D, 0x6703, 0x6994, 0x696D, 0, +at 0xA0 + 0, 0x695A, 0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982, + 0x694A, 0x6968, 0x696B, 0x695E, 0x6953, 0x6979, 0x6986, 0x695D, + 0x6963, 0x695B, 0x6B47, 0x6B72, 0x6BC0, 0x6BBF, 0x6BD3, 0x6BFD, + 0x6EA2, 0x6EAF, 0x6ED3, 0x6EB6, 0x6EC2, 0x6E90, 0x6E9D, 0x6EC7, + 0x6EC5, 0x6EA5, 0x6E98, 0x6EBC, 0x6EBA, 0x6EAB, 0x6ED1, 0x6E96, + 0x6E9C, 0x6EC4, 0x6ED4, 0x6EAA, 0x6EA7, 0x6EB4, 0x714E, 0x7159, + 0x7169, 0x7164, 0x7149, 0x7167, 0x715C, 0x716C, 0x7166, 0x714C, + 0x7165, 0x715E, 0x7146, 0x7168, 0x7156, 0x723A, 0x7252, 0x7337, + 0x7345, 0x733F, 0x733E, 0x746F, 0x745A, 0x7455, 0x745F, 0x745E, + 0x7441, 0x743F, 0x7459, 0x745B, 0x745C, 0x7576, 0x7578, 0x7600, + 0x75F0, 0x7601, 0x75F2, 0x75F1, 0x75FA, 0x75FF, 0x75F4, 0x75F3, + 0x76DE, 0x76DF, 0x775B, 0x776B, 0x7766, 0x775E, 0x7763, 0, +plane b8 +at 0x40 + 0x7779, 0x776A, 0x776C, 0x775C, 0x7765, 0x7768, 0x7762, 0x77EE, + 0x788E, 0x78B0, 0x7897, 0x7898, 0x788C, 0x7889, 0x787C, 0x7891, + 0x7893, 0x787F, 0x797A, 0x797F, 0x7981, 0x842C, 0x79BD, 0x7A1C, + 0x7A1A, 0x7A20, 0x7A14, 0x7A1F, 0x7A1E, 0x7A9F, 0x7AA0, 0x7B77, + 0x7BC0, 0x7B60, 0x7B6E, 0x7B67, 0x7CB1, 0x7CB3, 0x7CB5, 0x7D93, + 0x7D79, 0x7D91, 0x7D81, 0x7D8F, 0x7D5B, 0x7F6E, 0x7F69, 0x7F6A, + 0x7F72, 0x7FA9, 0x7FA8, 0x7FA4, 0x8056, 0x8058, 0x8086, 0x8084, + 0x8171, 0x8170, 0x8178, 0x8165, 0x816E, 0x8173, 0x816B, 0, +at 0xA0 + 0, 0x8179, 0x817A, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477, + 0x843D, 0x8431, 0x8475, 0x8466, 0x846B, 0x8449, 0x846C, 0x845B, + 0x843C, 0x8435, 0x8461, 0x8463, 0x8469, 0x846D, 0x8446, 0x865E, + 0x865C, 0x865F, 0x86F9, 0x8713, 0x8708, 0x8707, 0x8700, 0x86FE, + 0x86FB, 0x8702, 0x8703, 0x8706, 0x870A, 0x8859, 0x88DF, 0x88D4, + 0x88D9, 0x88DC, 0x88D8, 0x88DD, 0x88E1, 0x88CA, 0x88D5, 0x88D2, + 0x899C, 0x89E3, 0x8A6B, 0x8A72, 0x8A73, 0x8A66, 0x8A69, 0x8A70, + 0x8A87, 0x8A7C, 0x8A63, 0x8AA0, 0x8A71, 0x8A85, 0x8A6D, 0x8A62, + 0x8A6E, 0x8A6C, 0x8A79, 0x8A7B, 0x8A3E, 0x8A68, 0x8C62, 0x8C8A, + 0x8C89, 0x8CCA, 0x8CC7, 0x8CC8, 0x8CC4, 0x8CB2, 0x8CC3, 0x8CC2, + 0x8CC5, 0x8DE1, 0x8DDF, 0x8DE8, 0x8DEF, 0x8DF3, 0x8DFA, 0x8DEA, + 0x8DE4, 0x8DE6, 0x8EB2, 0x8F03, 0x8F09, 0x8EFE, 0x8F0A, 0, +plane b9 +at 0x40 + 0x8F9F, 0x8FB2, 0x904B, 0x904A, 0x9053, 0x9042, 0x9054, 0x903C, + 0x9055, 0x9050, 0x9047, 0x904F, 0x904E, 0x904D, 0x9051, 0x903E, + 0x9041, 0x9112, 0x9117, 0x916C, 0x916A, 0x9169, 0x91C9, 0x9237, + 0x9257, 0x9238, 0x923D, 0x9240, 0x923E, 0x925B, 0x924B, 0x9264, + 0x9251, 0x9234, 0x9249, 0x924D, 0x9245, 0x9239, 0x923F, 0x925A, + 0x9598, 0x9698, 0x9694, 0x9695, 0x96CD, 0x96CB, 0x96C9, 0x96CA, + 0x96F7, 0x96FB, 0x96F9, 0x96F6, 0x9756, 0x9774, 0x9776, 0x9810, + 0x9811, 0x9813, 0x980A, 0x9812, 0x980C, 0x98FC, 0x98F4, 0, +at 0xA0 + 0, 0x98FD, 0x98FE, 0x99B3, 0x99B1, 0x99B4, 0x9AE1, 0x9CE9, + 0x9E82, 0x9F0E, 0x9F13, 0x9F20, 0x50E7, 0x50EE, 0x50E5, 0x50D6, + 0x50ED, 0x50DA, 0x50D5, 0x50CF, 0x50D1, 0x50F1, 0x50CE, 0x50E9, + 0x5162, 0x51F3, 0x5283, 0x5282, 0x5331, 0x53AD, 0x55FE, 0x5600, + 0x561B, 0x5617, 0x55FD, 0x5614, 0x5606, 0x5609, 0x560D, 0x560E, + 0x55F7, 0x5616, 0x561F, 0x5608, 0x5610, 0x55F6, 0x5718, 0x5716, + 0x5875, 0x587E, 0x5883, 0x5893, 0x588A, 0x5879, 0x5885, 0x587D, + 0x58FD, 0x5925, 0x5922, 0x5924, 0x596A, 0x5969, 0x5AE1, 0x5AE6, + 0x5AE9, 0x5AD7, 0x5AD6, 0x5AD8, 0x5AE3, 0x5B75, 0x5BDE, 0x5BE7, + 0x5BE1, 0x5BE5, 0x5BE6, 0x5BE8, 0x5BE2, 0x5BE4, 0x5BDF, 0x5C0D, + 0x5C62, 0x5D84, 0x5D87, 0x5E5B, 0x5E63, 0x5E55, 0x5E57, 0x5E54, + 0x5ED3, 0x5ED6, 0x5F0A, 0x5F46, 0x5F70, 0x5FB9, 0x6147, 0, +plane ba +at 0x40 + 0x613F, 0x614B, 0x6177, 0x6162, 0x6163, 0x615F, 0x615A, 0x6158, + 0x6175, 0x622A, 0x6487, 0x6458, 0x6454, 0x64A4, 0x6478, 0x645F, + 0x647A, 0x6451, 0x6467, 0x6434, 0x646D, 0x647B, 0x6572, 0x65A1, + 0x65D7, 0x65D6, 0x66A2, 0x66A8, 0x669D, 0x699C, 0x69A8, 0x6995, + 0x69C1, 0x69AE, 0x69D3, 0x69CB, 0x699B, 0x69B7, 0x69BB, 0x69AB, + 0x69B4, 0x69D0, 0x69CD, 0x69AD, 0x69CC, 0x69A6, 0x69C3, 0x69A3, + 0x6B49, 0x6B4C, 0x6C33, 0x6F33, 0x6F14, 0x6EFE, 0x6F13, 0x6EF4, + 0x6F29, 0x6F3E, 0x6F20, 0x6F2C, 0x6F0F, 0x6F02, 0x6F22, 0, +at 0xA0 + 0, 0x6EFF, 0x6EEF, 0x6F06, 0x6F31, 0x6F38, 0x6F32, 0x6F23, + 0x6F15, 0x6F2B, 0x6F2F, 0x6F88, 0x6F2A, 0x6EEC, 0x6F01, 0x6EF2, + 0x6ECC, 0x6EF7, 0x7194, 0x7199, 0x717D, 0x718A, 0x7184, 0x7192, + 0x723E, 0x7292, 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746A, + 0x7470, 0x746D, 0x7504, 0x7591, 0x7627, 0x760D, 0x760B, 0x7609, + 0x7613, 0x76E1, 0x76E3, 0x7784, 0x777D, 0x777F, 0x7761, 0x78C1, + 0x789F, 0x78A7, 0x78B3, 0x78A9, 0x78A3, 0x798E, 0x798F, 0x798D, + 0x7A2E, 0x7A31, 0x7AAA, 0x7AA9, 0x7AED, 0x7AEF, 0x7BA1, 0x7B95, + 0x7B8B, 0x7B75, 0x7B97, 0x7B9D, 0x7B94, 0x7B8F, 0x7BB8, 0x7B87, + 0x7B84, 0x7CB9, 0x7CBD, 0x7CBE, 0x7DBB, 0x7DB0, 0x7D9C, 0x7DBD, + 0x7DBE, 0x7DA0, 0x7DCA, 0x7DB4, 0x7DB2, 0x7DB1, 0x7DBA, 0x7DA2, + 0x7DBF, 0x7DB5, 0x7DB8, 0x7DAD, 0x7DD2, 0x7DC7, 0x7DAC, 0, +plane bb +at 0x40 + 0x7F70, 0x7FE0, 0x7FE1, 0x7FDF, 0x805E, 0x805A, 0x8087, 0x8150, + 0x8180, 0x818F, 0x8188, 0x818A, 0x817F, 0x8182, 0x81E7, 0x81FA, + 0x8207, 0x8214, 0x821E, 0x824B, 0x84C9, 0x84BF, 0x84C6, 0x84C4, + 0x8499, 0x849E, 0x84B2, 0x849C, 0x84CB, 0x84B8, 0x84C0, 0x84D3, + 0x8490, 0x84BC, 0x84D1, 0x84CA, 0x873F, 0x871C, 0x873B, 0x8722, + 0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, 0x88F3, 0x8902, + 0x88F4, 0x88F9, 0x88F8, 0x88FD, 0x88E8, 0x891A, 0x88EF, 0x8AA6, + 0x8A8C, 0x8A9E, 0x8AA3, 0x8A8D, 0x8AA1, 0x8A93, 0x8AA4, 0, +at 0xA0 + 0, 0x8AAA, 0x8AA5, 0x8AA8, 0x8A98, 0x8A91, 0x8A9A, 0x8AA7, + 0x8C6A, 0x8C8D, 0x8C8C, 0x8CD3, 0x8CD1, 0x8CD2, 0x8D6B, 0x8D99, + 0x8D95, 0x8DFC, 0x8F14, 0x8F12, 0x8F15, 0x8F13, 0x8FA3, 0x9060, + 0x9058, 0x905C, 0x9063, 0x9059, 0x905E, 0x9062, 0x905D, 0x905B, + 0x9119, 0x9118, 0x911E, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, + 0x9280, 0x9285, 0x9298, 0x9296, 0x927B, 0x9293, 0x929C, 0x92A8, + 0x927C, 0x9291, 0x95A1, 0x95A8, 0x95A9, 0x95A3, 0x95A5, 0x95A4, + 0x9699, 0x969C, 0x969B, 0x96CC, 0x96D2, 0x9700, 0x977C, 0x9785, + 0x97F6, 0x9817, 0x9818, 0x98AF, 0x98B1, 0x9903, 0x9905, 0x990C, + 0x9909, 0x99C1, 0x9AAF, 0x9AB0, 0x9AE6, 0x9B41, 0x9B42, 0x9CF4, + 0x9CF6, 0x9CF3, 0x9EBC, 0x9F3B, 0x9F4A, 0x5104, 0x5100, 0x50FB, + 0x50F5, 0x50F9, 0x5102, 0x5108, 0x5109, 0x5105, 0x51DC, 0, +plane bc +at 0x40 + 0x5287, 0x5288, 0x5289, 0x528D, 0x528A, 0x52F0, 0x53B2, 0x562E, + 0x563B, 0x5639, 0x5632, 0x563F, 0x5634, 0x5629, 0x5653, 0x564E, + 0x5657, 0x5674, 0x5636, 0x562F, 0x5630, 0x5880, 0x589F, 0x589E, + 0x58B3, 0x589C, 0x58AE, 0x58A9, 0x58A6, 0x596D, 0x5B09, 0x5AFB, + 0x5B0B, 0x5AF5, 0x5B0C, 0x5B08, 0x5BEE, 0x5BEC, 0x5BE9, 0x5BEB, + 0x5C64, 0x5C65, 0x5D9D, 0x5D94, 0x5E62, 0x5E5F, 0x5E61, 0x5EE2, + 0x5EDA, 0x5EDF, 0x5EDD, 0x5EE3, 0x5EE0, 0x5F48, 0x5F71, 0x5FB7, + 0x5FB5, 0x6176, 0x6167, 0x616E, 0x615D, 0x6155, 0x6182, 0, +at 0xA0 + 0, 0x617C, 0x6170, 0x616B, 0x617E, 0x61A7, 0x6190, 0x61AB, + 0x618E, 0x61AC, 0x619A, 0x61A4, 0x6194, 0x61AE, 0x622E, 0x6469, + 0x646F, 0x6479, 0x649E, 0x64B2, 0x6488, 0x6490, 0x64B0, 0x64A5, + 0x6493, 0x6495, 0x64A9, 0x6492, 0x64AE, 0x64AD, 0x64AB, 0x649A, + 0x64AC, 0x6499, 0x64A2, 0x64B3, 0x6575, 0x6577, 0x6578, 0x66AE, + 0x66AB, 0x66B4, 0x66B1, 0x6A23, 0x6A1F, 0x69E8, 0x6A01, 0x6A1E, + 0x6A19, 0x69FD, 0x6A21, 0x6A13, 0x6A0A, 0x69F3, 0x6A02, 0x6A05, + 0x69ED, 0x6A11, 0x6B50, 0x6B4E, 0x6BA4, 0x6BC5, 0x6BC6, 0x6F3F, + 0x6F7C, 0x6F84, 0x6F51, 0x6F66, 0x6F54, 0x6F86, 0x6F6D, 0x6F5B, + 0x6F78, 0x6F6E, 0x6F8E, 0x6F7A, 0x6F70, 0x6F64, 0x6F97, 0x6F58, + 0x6ED5, 0x6F6F, 0x6F60, 0x6F5F, 0x719F, 0x71AC, 0x71B1, 0x71A8, + 0x7256, 0x729B, 0x734E, 0x7357, 0x7469, 0x748B, 0x7483, 0, +plane bd +at 0x40 + 0x747E, 0x7480, 0x757F, 0x7620, 0x7629, 0x761F, 0x7624, 0x7626, + 0x7621, 0x7622, 0x769A, 0x76BA, 0x76E4, 0x778E, 0x7787, 0x778C, + 0x7791, 0x778B, 0x78CB, 0x78C5, 0x78BA, 0x78CA, 0x78BE, 0x78D5, + 0x78BC, 0x78D0, 0x7A3F, 0x7A3C, 0x7A40, 0x7A3D, 0x7A37, 0x7A3B, + 0x7AAF, 0x7AAE, 0x7BAD, 0x7BB1, 0x7BC4, 0x7BB4, 0x7BC6, 0x7BC7, + 0x7BC1, 0x7BA0, 0x7BCC, 0x7CCA, 0x7DE0, 0x7DF4, 0x7DEF, 0x7DFB, + 0x7DD8, 0x7DEC, 0x7DDD, 0x7DE8, 0x7DE3, 0x7DDA, 0x7DDE, 0x7DE9, + 0x7D9E, 0x7DD9, 0x7DF2, 0x7DF9, 0x7F75, 0x7F77, 0x7FAF, 0, +at 0xA0 + 0, 0x7FE9, 0x8026, 0x819B, 0x819C, 0x819D, 0x81A0, 0x819A, + 0x8198, 0x8517, 0x853D, 0x851A, 0x84EE, 0x852C, 0x852D, 0x8513, + 0x8511, 0x8523, 0x8521, 0x8514, 0x84EC, 0x8525, 0x84FF, 0x8506, + 0x8782, 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, + 0x8757, 0x874C, 0x8753, 0x885B, 0x885D, 0x8910, 0x8907, 0x8912, + 0x8913, 0x8915, 0x890A, 0x8ABC, 0x8AD2, 0x8AC7, 0x8AC4, 0x8A95, + 0x8ACB, 0x8AF8, 0x8AB2, 0x8AC9, 0x8AC2, 0x8ABF, 0x8AB0, 0x8AD6, + 0x8ACD, 0x8AB6, 0x8AB9, 0x8ADB, 0x8C4C, 0x8C4E, 0x8C6C, 0x8CE0, + 0x8CDE, 0x8CE6, 0x8CE4, 0x8CEC, 0x8CED, 0x8CE2, 0x8CE3, 0x8CDC, + 0x8CEA, 0x8CE1, 0x8D6D, 0x8D9F, 0x8DA3, 0x8E2B, 0x8E10, 0x8E1D, + 0x8E22, 0x8E0F, 0x8E29, 0x8E1F, 0x8E21, 0x8E1E, 0x8EBA, 0x8F1D, + 0x8F1B, 0x8F1F, 0x8F29, 0x8F26, 0x8F2A, 0x8F1C, 0x8F1E, 0, +plane be +at 0x40 + 0x8F25, 0x9069, 0x906E, 0x9068, 0x906D, 0x9077, 0x9130, 0x912D, + 0x9127, 0x9131, 0x9187, 0x9189, 0x918B, 0x9183, 0x92C5, 0x92BB, + 0x92B7, 0x92EA, 0x92AC, 0x92E4, 0x92C1, 0x92B3, 0x92BC, 0x92D2, + 0x92C7, 0x92F0, 0x92B2, 0x95AD, 0x95B1, 0x9704, 0x9706, 0x9707, + 0x9709, 0x9760, 0x978D, 0x978B, 0x978F, 0x9821, 0x982B, 0x981C, + 0x98B3, 0x990A, 0x9913, 0x9912, 0x9918, 0x99DD, 0x99D0, 0x99DF, + 0x99DB, 0x99D1, 0x99D5, 0x99D2, 0x99D9, 0x9AB7, 0x9AEE, 0x9AEF, + 0x9B27, 0x9B45, 0x9B44, 0x9B77, 0x9B6F, 0x9D06, 0x9D09, 0, +at 0xA0 + 0, 0x9D03, 0x9EA9, 0x9EBE, 0x9ECE, 0x58A8, 0x9F52, 0x5112, + 0x5118, 0x5114, 0x5110, 0x5115, 0x5180, 0x51AA, 0x51DD, 0x5291, + 0x5293, 0x52F3, 0x5659, 0x566B, 0x5679, 0x5669, 0x5664, 0x5678, + 0x566A, 0x5668, 0x5665, 0x5671, 0x566F, 0x566C, 0x5662, 0x5676, + 0x58C1, 0x58BE, 0x58C7, 0x58C5, 0x596E, 0x5B1D, 0x5B34, 0x5B78, + 0x5BF0, 0x5C0E, 0x5F4A, 0x61B2, 0x6191, 0x61A9, 0x618A, 0x61CD, + 0x61B6, 0x61BE, 0x61CA, 0x61C8, 0x6230, 0x64C5, 0x64C1, 0x64CB, + 0x64BB, 0x64BC, 0x64DA, 0x64C4, 0x64C7, 0x64C2, 0x64CD, 0x64BF, + 0x64D2, 0x64D4, 0x64BE, 0x6574, 0x66C6, 0x66C9, 0x66B9, 0x66C4, + 0x66C7, 0x66B8, 0x6A3D, 0x6A38, 0x6A3A, 0x6A59, 0x6A6B, 0x6A58, + 0x6A39, 0x6A44, 0x6A62, 0x6A61, 0x6A4B, 0x6A47, 0x6A35, 0x6A5F, + 0x6A48, 0x6B59, 0x6B77, 0x6C05, 0x6FC2, 0x6FB1, 0x6FA1, 0, +plane bf +at 0x40 + 0x6FC3, 0x6FA4, 0x6FC1, 0x6FA7, 0x6FB3, 0x6FC0, 0x6FB9, 0x6FB6, + 0x6FA6, 0x6FA0, 0x6FB4, 0x71BE, 0x71C9, 0x71D0, 0x71D2, 0x71C8, + 0x71D5, 0x71B9, 0x71CE, 0x71D9, 0x71DC, 0x71C3, 0x71C4, 0x7368, + 0x749C, 0x74A3, 0x7498, 0x749F, 0x749E, 0x74E2, 0x750C, 0x750D, + 0x7634, 0x7638, 0x763A, 0x76E7, 0x76E5, 0x77A0, 0x779E, 0x779F, + 0x77A5, 0x78E8, 0x78DA, 0x78EC, 0x78E7, 0x79A6, 0x7A4D, 0x7A4E, + 0x7A46, 0x7A4C, 0x7A4B, 0x7ABA, 0x7BD9, 0x7C11, 0x7BC9, 0x7BE4, + 0x7BDB, 0x7BE1, 0x7BE9, 0x7BE6, 0x7CD5, 0x7CD6, 0x7E0A, 0, +at 0xA0 + 0, 0x7E11, 0x7E08, 0x7E1B, 0x7E23, 0x7E1E, 0x7E1D, 0x7E09, + 0x7E10, 0x7F79, 0x7FB2, 0x7FF0, 0x7FF1, 0x7FEE, 0x8028, 0x81B3, + 0x81A9, 0x81A8, 0x81FB, 0x8208, 0x8258, 0x8259, 0x854A, 0x8559, + 0x8548, 0x8568, 0x8569, 0x8543, 0x8549, 0x856D, 0x856A, 0x855E, + 0x8783, 0x879F, 0x879E, 0x87A2, 0x878D, 0x8861, 0x892A, 0x8932, + 0x8925, 0x892B, 0x8921, 0x89AA, 0x89A6, 0x8AE6, 0x8AFA, 0x8AEB, + 0x8AF1, 0x8B00, 0x8ADC, 0x8AE7, 0x8AEE, 0x8AFE, 0x8B01, 0x8B02, + 0x8AF7, 0x8AED, 0x8AF3, 0x8AF6, 0x8AFC, 0x8C6B, 0x8C6D, 0x8C93, + 0x8CF4, 0x8E44, 0x8E31, 0x8E34, 0x8E42, 0x8E39, 0x8E35, 0x8F3B, + 0x8F2F, 0x8F38, 0x8F33, 0x8FA8, 0x8FA6, 0x9075, 0x9074, 0x9078, + 0x9072, 0x907C, 0x907A, 0x9134, 0x9192, 0x9320, 0x9336, 0x92F8, + 0x9333, 0x932F, 0x9322, 0x92FC, 0x932B, 0x9304, 0x931A, 0, +plane c0 +at 0x40 + 0x9310, 0x9326, 0x9321, 0x9315, 0x932E, 0x9319, 0x95BB, 0x96A7, + 0x96A8, 0x96AA, 0x96D5, 0x970E, 0x9711, 0x9716, 0x970D, 0x9713, + 0x970F, 0x975B, 0x975C, 0x9766, 0x9798, 0x9830, 0x9838, 0x983B, + 0x9837, 0x982D, 0x9839, 0x9824, 0x9910, 0x9928, 0x991E, 0x991B, + 0x9921, 0x991A, 0x99ED, 0x99E2, 0x99F1, 0x9AB8, 0x9ABC, 0x9AFB, + 0x9AED, 0x9B28, 0x9B91, 0x9D15, 0x9D23, 0x9D26, 0x9D28, 0x9D12, + 0x9D1B, 0x9ED8, 0x9ED4, 0x9F8D, 0x9F9C, 0x512A, 0x511F, 0x5121, + 0x5132, 0x52F5, 0x568E, 0x5680, 0x5690, 0x5685, 0x5687, 0, +at 0xA0 + 0, 0x568F, 0x58D5, 0x58D3, 0x58D1, 0x58CE, 0x5B30, 0x5B2A, + 0x5B24, 0x5B7A, 0x5C37, 0x5C68, 0x5DBC, 0x5DBA, 0x5DBD, 0x5DB8, + 0x5E6B, 0x5F4C, 0x5FBD, 0x61C9, 0x61C2, 0x61C7, 0x61E6, 0x61CB, + 0x6232, 0x6234, 0x64CE, 0x64CA, 0x64D8, 0x64E0, 0x64F0, 0x64E6, + 0x64EC, 0x64F1, 0x64E2, 0x64ED, 0x6582, 0x6583, 0x66D9, 0x66D6, + 0x6A80, 0x6A94, 0x6A84, 0x6AA2, 0x6A9C, 0x6ADB, 0x6AA3, 0x6A7E, + 0x6A97, 0x6A90, 0x6AA0, 0x6B5C, 0x6BAE, 0x6BDA, 0x6C08, 0x6FD8, + 0x6FF1, 0x6FDF, 0x6FE0, 0x6FDB, 0x6FE4, 0x6FEB, 0x6FEF, 0x6F80, + 0x6FEC, 0x6FE1, 0x6FE9, 0x6FD5, 0x6FEE, 0x6FF0, 0x71E7, 0x71DF, + 0x71EE, 0x71E6, 0x71E5, 0x71ED, 0x71EC, 0x71F4, 0x71E0, 0x7235, + 0x7246, 0x7370, 0x7372, 0x74A9, 0x74B0, 0x74A6, 0x74A8, 0x7646, + 0x7642, 0x764C, 0x76EA, 0x77B3, 0x77AA, 0x77B0, 0x77AC, 0, +plane c1 +at 0x40 + 0x77A7, 0x77AD, 0x77EF, 0x78F7, 0x78FA, 0x78F4, 0x78EF, 0x7901, + 0x79A7, 0x79AA, 0x7A57, 0x7ABF, 0x7C07, 0x7C0D, 0x7BFE, 0x7BF7, + 0x7C0C, 0x7BE0, 0x7CE0, 0x7CDC, 0x7CDE, 0x7CE2, 0x7CDF, 0x7CD9, + 0x7CDD, 0x7E2E, 0x7E3E, 0x7E46, 0x7E37, 0x7E32, 0x7E43, 0x7E2B, + 0x7E3D, 0x7E31, 0x7E45, 0x7E41, 0x7E34, 0x7E39, 0x7E48, 0x7E35, + 0x7E3F, 0x7E2F, 0x7F44, 0x7FF3, 0x7FFC, 0x8071, 0x8072, 0x8070, + 0x806F, 0x8073, 0x81C6, 0x81C3, 0x81BA, 0x81C2, 0x81C0, 0x81BF, + 0x81BD, 0x81C9, 0x81BE, 0x81E8, 0x8209, 0x8271, 0x85AA, 0, +at 0xA0 + 0, 0x8584, 0x857E, 0x859C, 0x8591, 0x8594, 0x85AF, 0x859B, + 0x8587, 0x85A8, 0x858A, 0x8667, 0x87C0, 0x87D1, 0x87B3, 0x87D2, + 0x87C6, 0x87AB, 0x87BB, 0x87BA, 0x87C8, 0x87CB, 0x893B, 0x8936, + 0x8944, 0x8938, 0x893D, 0x89AC, 0x8B0E, 0x8B17, 0x8B19, 0x8B1B, + 0x8B0A, 0x8B20, 0x8B1D, 0x8B04, 0x8B10, 0x8C41, 0x8C3F, 0x8C73, + 0x8CFA, 0x8CFD, 0x8CFC, 0x8CF8, 0x8CFB, 0x8DA8, 0x8E49, 0x8E4B, + 0x8E48, 0x8E4A, 0x8F44, 0x8F3E, 0x8F42, 0x8F45, 0x8F3F, 0x907F, + 0x907D, 0x9084, 0x9081, 0x9082, 0x9080, 0x9139, 0x91A3, 0x919E, + 0x919C, 0x934D, 0x9382, 0x9328, 0x9375, 0x934A, 0x9365, 0x934B, + 0x9318, 0x937E, 0x936C, 0x935B, 0x9370, 0x935A, 0x9354, 0x95CA, + 0x95CB, 0x95CC, 0x95C8, 0x95C6, 0x96B1, 0x96B8, 0x96D6, 0x971C, + 0x971E, 0x97A0, 0x97D3, 0x9846, 0x98B6, 0x9935, 0x9A01, 0, +plane c2 +at 0x40 + 0x99FF, 0x9BAE, 0x9BAB, 0x9BAA, 0x9BAD, 0x9D3B, 0x9D3F, 0x9E8B, + 0x9ECF, 0x9EDE, 0x9EDC, 0x9EDD, 0x9EDB, 0x9F3E, 0x9F4B, 0x53E2, + 0x5695, 0x56AE, 0x58D9, 0x58D8, 0x5B38, 0x5F5D, 0x61E3, 0x6233, + 0x64F4, 0x64F2, 0x64FE, 0x6506, 0x64FA, 0x64FB, 0x64F7, 0x65B7, + 0x66DC, 0x6726, 0x6AB3, 0x6AAC, 0x6AC3, 0x6ABB, 0x6AB8, 0x6AC2, + 0x6AAE, 0x6AAF, 0x6B5F, 0x6B78, 0x6BAF, 0x7009, 0x700B, 0x6FFE, + 0x7006, 0x6FFA, 0x7011, 0x700F, 0x71FB, 0x71FC, 0x71FE, 0x71F8, + 0x7377, 0x7375, 0x74A7, 0x74BF, 0x7515, 0x7656, 0x7658, 0, +at 0xA0 + 0, 0x7652, 0x77BD, 0x77BF, 0x77BB, 0x77BC, 0x790E, 0x79AE, + 0x7A61, 0x7A62, 0x7A60, 0x7AC4, 0x7AC5, 0x7C2B, 0x7C27, 0x7C2A, + 0x7C1E, 0x7C23, 0x7C21, 0x7CE7, 0x7E54, 0x7E55, 0x7E5E, 0x7E5A, + 0x7E61, 0x7E52, 0x7E59, 0x7F48, 0x7FF9, 0x7FFB, 0x8077, 0x8076, + 0x81CD, 0x81CF, 0x820A, 0x85CF, 0x85A9, 0x85CD, 0x85D0, 0x85C9, + 0x85B0, 0x85BA, 0x85B9, 0x85A6, 0x87EF, 0x87EC, 0x87F2, 0x87E0, + 0x8986, 0x89B2, 0x89F4, 0x8B28, 0x8B39, 0x8B2C, 0x8B2B, 0x8C50, + 0x8D05, 0x8E59, 0x8E63, 0x8E66, 0x8E64, 0x8E5F, 0x8E55, 0x8EC0, + 0x8F49, 0x8F4D, 0x9087, 0x9083, 0x9088, 0x91AB, 0x91AC, 0x91D0, + 0x9394, 0x938A, 0x9396, 0x93A2, 0x93B3, 0x93AE, 0x93AC, 0x93B0, + 0x9398, 0x939A, 0x9397, 0x95D4, 0x95D6, 0x95D0, 0x95D5, 0x96E2, + 0x96DC, 0x96D9, 0x96DB, 0x96DE, 0x9724, 0x97A3, 0x97A6, 0, +plane c3 +at 0x40 + 0x97AD, 0x97F9, 0x984D, 0x984F, 0x984C, 0x984E, 0x9853, 0x98BA, + 0x993E, 0x993F, 0x993D, 0x992E, 0x99A5, 0x9A0E, 0x9AC1, 0x9B03, + 0x9B06, 0x9B4F, 0x9B4E, 0x9B4D, 0x9BCA, 0x9BC9, 0x9BFD, 0x9BC8, + 0x9BC0, 0x9D51, 0x9D5D, 0x9D60, 0x9EE0, 0x9F15, 0x9F2C, 0x5133, + 0x56A5, 0x58DE, 0x58DF, 0x58E2, 0x5BF5, 0x9F90, 0x5EEC, 0x61F2, + 0x61F7, 0x61F6, 0x61F5, 0x6500, 0x650F, 0x66E0, 0x66DD, 0x6AE5, + 0x6ADD, 0x6ADA, 0x6AD3, 0x701B, 0x701F, 0x7028, 0x701A, 0x701D, + 0x7015, 0x7018, 0x7206, 0x720D, 0x7258, 0x72A2, 0x7378, 0, +at 0xA0 + 0, 0x737A, 0x74BD, 0x74CA, 0x74E3, 0x7587, 0x7586, 0x765F, + 0x7661, 0x77C7, 0x7919, 0x79B1, 0x7A6B, 0x7A69, 0x7C3E, 0x7C3F, + 0x7C38, 0x7C3D, 0x7C37, 0x7C40, 0x7E6B, 0x7E6D, 0x7E79, 0x7E69, + 0x7E6A, 0x7F85, 0x7E73, 0x7FB6, 0x7FB9, 0x7FB8, 0x81D8, 0x85E9, + 0x85DD, 0x85EA, 0x85D5, 0x85E4, 0x85E5, 0x85F7, 0x87FB, 0x8805, + 0x880D, 0x87F9, 0x87FE, 0x8960, 0x895F, 0x8956, 0x895E, 0x8B41, + 0x8B5C, 0x8B58, 0x8B49, 0x8B5A, 0x8B4E, 0x8B4F, 0x8B46, 0x8B59, + 0x8D08, 0x8D0A, 0x8E7C, 0x8E72, 0x8E87, 0x8E76, 0x8E6C, 0x8E7A, + 0x8E74, 0x8F54, 0x8F4E, 0x8FAD, 0x908A, 0x908B, 0x91B1, 0x91AE, + 0x93E1, 0x93D1, 0x93DF, 0x93C3, 0x93C8, 0x93DC, 0x93DD, 0x93D6, + 0x93E2, 0x93CD, 0x93D8, 0x93E4, 0x93D7, 0x93E8, 0x95DC, 0x96B4, + 0x96E3, 0x972A, 0x9727, 0x9761, 0x97DC, 0x97FB, 0x985E, 0, +plane c4 +at 0x40 + 0x9858, 0x985B, 0x98BC, 0x9945, 0x9949, 0x9A16, 0x9A19, 0x9B0D, + 0x9BE8, 0x9BE7, 0x9BD6, 0x9BDB, 0x9D89, 0x9D61, 0x9D72, 0x9D6A, + 0x9D6C, 0x9E92, 0x9E97, 0x9E93, 0x9EB4, 0x52F8, 0x56A8, 0x56B7, + 0x56B6, 0x56B4, 0x56BC, 0x58E4, 0x5B40, 0x5B43, 0x5B7D, 0x5BF6, + 0x5DC9, 0x61F8, 0x61FA, 0x6518, 0x6514, 0x6519, 0x66E6, 0x6727, + 0x6AEC, 0x703E, 0x7030, 0x7032, 0x7210, 0x737B, 0x74CF, 0x7662, + 0x7665, 0x7926, 0x792A, 0x792C, 0x792B, 0x7AC7, 0x7AF6, 0x7C4C, + 0x7C43, 0x7C4D, 0x7CEF, 0x7CF0, 0x8FAE, 0x7E7D, 0x7E7C, 0, +at 0xA0 + 0, 0x7E82, 0x7F4C, 0x8000, 0x81DA, 0x8266, 0x85FB, 0x85F9, + 0x8611, 0x85FA, 0x8606, 0x860B, 0x8607, 0x860A, 0x8814, 0x8815, + 0x8964, 0x89BA, 0x89F8, 0x8B70, 0x8B6C, 0x8B66, 0x8B6F, 0x8B5F, + 0x8B6B, 0x8D0F, 0x8D0D, 0x8E89, 0x8E81, 0x8E85, 0x8E82, 0x91B4, + 0x91CB, 0x9418, 0x9403, 0x93FD, 0x95E1, 0x9730, 0x98C4, 0x9952, + 0x9951, 0x99A8, 0x9A2B, 0x9A30, 0x9A37, 0x9A35, 0x9C13, 0x9C0D, + 0x9E79, 0x9EB5, 0x9EE8, 0x9F2F, 0x9F5F, 0x9F63, 0x9F61, 0x5137, + 0x5138, 0x56C1, 0x56C0, 0x56C2, 0x5914, 0x5C6C, 0x5DCD, 0x61FC, + 0x61FE, 0x651D, 0x651C, 0x6595, 0x66E9, 0x6AFB, 0x6B04, 0x6AFA, + 0x6BB2, 0x704C, 0x721B, 0x72A7, 0x74D6, 0x74D4, 0x7669, 0x77D3, + 0x7C50, 0x7E8F, 0x7E8C, 0x7FBC, 0x8617, 0x862D, 0x861A, 0x8823, + 0x8822, 0x8821, 0x881F, 0x896A, 0x896C, 0x89BD, 0x8B74, 0, +plane c5 +at 0x40 + 0x8B77, 0x8B7D, 0x8D13, 0x8E8A, 0x8E8D, 0x8E8B, 0x8F5F, 0x8FAF, + 0x91BA, 0x942E, 0x9433, 0x9435, 0x943A, 0x9438, 0x9432, 0x942B, + 0x95E2, 0x9738, 0x9739, 0x9732, 0x97FF, 0x9867, 0x9865, 0x9957, + 0x9A45, 0x9A43, 0x9A40, 0x9A3E, 0x9ACF, 0x9B54, 0x9B51, 0x9C2D, + 0x9C25, 0x9DAF, 0x9DB4, 0x9DC2, 0x9DB8, 0x9E9D, 0x9EEF, 0x9F19, + 0x9F5C, 0x9F66, 0x9F67, 0x513C, 0x513B, 0x56C8, 0x56CA, 0x56C9, + 0x5B7F, 0x5DD4, 0x5DD2, 0x5F4E, 0x61FF, 0x6524, 0x6B0A, 0x6B61, + 0x7051, 0x7058, 0x7380, 0x74E4, 0x758A, 0x766E, 0x766C, 0, +at 0xA0 + 0, 0x79B3, 0x7C60, 0x7C5F, 0x807E, 0x807D, 0x81DF, 0x8972, + 0x896F, 0x89FC, 0x8B80, 0x8D16, 0x8D17, 0x8E91, 0x8E93, 0x8F61, + 0x9148, 0x9444, 0x9451, 0x9452, 0x973D, 0x973E, 0x97C3, 0x97C1, + 0x986B, 0x9955, 0x9A55, 0x9A4D, 0x9AD2, 0x9B1A, 0x9C49, 0x9C31, + 0x9C3E, 0x9C3B, 0x9DD3, 0x9DD7, 0x9F34, 0x9F6C, 0x9F6A, 0x9F94, + 0x56CC, 0x5DD6, 0x6200, 0x6523, 0x652B, 0x652A, 0x66EC, 0x6B10, + 0x74DA, 0x7ACA, 0x7C64, 0x7C63, 0x7C65, 0x7E93, 0x7E96, 0x7E94, + 0x81E2, 0x8638, 0x863F, 0x8831, 0x8B8A, 0x9090, 0x908F, 0x9463, + 0x9460, 0x9464, 0x9768, 0x986F, 0x995C, 0x9A5A, 0x9A5B, 0x9A57, + 0x9AD3, 0x9AD4, 0x9AD1, 0x9C54, 0x9C57, 0x9C56, 0x9DE5, 0x9E9F, + 0x9EF4, 0x56D1, 0x58E9, 0x652C, 0x705E, 0x7671, 0x7672, 0x77D7, + 0x7F50, 0x7F88, 0x8836, 0x8839, 0x8862, 0x8B93, 0x8B92, 0, +plane c6 +at 0x40 + 0x8B96, 0x8277, 0x8D1B, 0x91C0, 0x946A, 0x9742, 0x9748, 0x9744, + 0x97C6, 0x9870, 0x9A5F, 0x9B22, 0x9B58, 0x9C5F, 0x9DF9, 0x9DFA, + 0x9E7C, 0x9E7D, 0x9F07, 0x9F77, 0x9F72, 0x5EF3, 0x6B16, 0x7063, + 0x7C6C, 0x7C6E, 0x883B, 0x89C0, 0x8EA1, 0x91C1, 0x9472, 0x9470, + 0x9871, 0x995E, 0x9AD6, 0x9B23, 0x9ECC, 0x7064, 0x77DA, 0x8B9A, + 0x9477, 0x97C9, 0x9A62, 0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, 0x91C5, + 0x947D, 0x947E, 0x947C, 0x9C77, 0x9C78, 0x9EF7, 0x8C54, 0x947F, + 0x9E1A, 0x7228, 0x9A6A, 0x9B31, 0x9E1B, 0x9E1E, 0x7C72, 0, +at 0xA0 + 0, 0x30FE, 0x309D, 0x309E, 0x3005, 0x3041, 0x3042, 0x3043, + 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, + 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, + 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, + 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, + 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, + 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, + 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, + 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, + 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, + 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, + 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0, +plane c7 +at 0x40 + 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, + 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, + 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, + 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, + 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, + 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, + 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, + 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0, +at 0xA0 + 0, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, + 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, + 0x30F6, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, + 0x041A, 0x041B, 0x041C, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, + 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, + 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, + 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, + 0x044F, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, + 0x2467, 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, + 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0, 0, 0, +plane c8 +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +at 0xA0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane c9 +at 0x40 + 0x4E42, 0x4E5C, 0x51F5, 0x531A, 0x5382, 0x4E07, 0x4E0C, 0x4E47, + 0x4E8D, 0x56D7, 0xFA0C, 0x5C6E, 0x5F73, 0x4E0F, 0x5187, 0x4E0E, + 0x4E2E, 0x4E93, 0x4EC2, 0x4EC9, 0x4EC8, 0x5198, 0x52FC, 0x536C, + 0x53B9, 0x5720, 0x5903, 0x592C, 0x5C10, 0x5DFF, 0x65E1, 0x6BB3, + 0x6BCC, 0x6C14, 0x723F, 0x4E31, 0x4E3C, 0x4EE8, 0x4EDC, 0x4EE9, + 0x4EE1, 0x4EDD, 0x4EDA, 0x520C, 0x531C, 0x534C, 0x5722, 0x5723, + 0x5917, 0x592F, 0x5B81, 0x5B84, 0x5C12, 0x5C3B, 0x5C74, 0x5C73, + 0x5E04, 0x5E80, 0x5E82, 0x5FC9, 0x6209, 0x6250, 0x6C15, 0, +at 0xA0 + 0, 0x6C36, 0x6C43, 0x6C3F, 0x6C3B, 0x72AE, 0x72B0, 0x738A, + 0x79B8, 0x808A, 0x961E, 0x4F0E, 0x4F18, 0x4F2C, 0x4EF5, 0x4F14, + 0x4EF1, 0x4F00, 0x4EF7, 0x4F08, 0x4F1D, 0x4F02, 0x4F05, 0x4F22, + 0x4F13, 0x4F04, 0x4EF4, 0x4F12, 0x51B1, 0x5213, 0x5209, 0x5210, + 0x52A6, 0x5322, 0x531F, 0x534D, 0x538A, 0x5407, 0x56E1, 0x56DF, + 0x572E, 0x572A, 0x5734, 0x593C, 0x5980, 0x597C, 0x5985, 0x597B, + 0x597E, 0x5977, 0x597F, 0x5B56, 0x5C15, 0x5C25, 0x5C7C, 0x5C7A, + 0x5C7B, 0x5C7E, 0x5DDF, 0x5E75, 0x5E84, 0x5F02, 0x5F1A, 0x5F74, + 0x5FD5, 0x5FD4, 0x5FCF, 0x625C, 0x625E, 0x6264, 0x6261, 0x6266, + 0x6262, 0x6259, 0x6260, 0x625A, 0x6265, 0x65EF, 0x65EE, 0x673E, + 0x6739, 0x6738, 0x673B, 0x673A, 0x673F, 0x673C, 0x6733, 0x6C18, + 0x6C46, 0x6C52, 0x6C5C, 0x6C4F, 0x6C4A, 0x6C54, 0x6C4B, 0, +plane ca +at 0x40 + 0x6C4C, 0x7071, 0x725E, 0x72B4, 0x72B5, 0x738E, 0x752A, 0x767F, + 0x7A75, 0x7F51, 0x8278, 0x827C, 0x8280, 0x827D, 0x827F, 0x864D, + 0x897E, 0x9099, 0x9097, 0x9098, 0x909B, 0x9094, 0x9622, 0x9624, + 0x9620, 0x9623, 0x4F56, 0x4F3B, 0x4F62, 0x4F49, 0x4F53, 0x4F64, + 0x4F3E, 0x4F67, 0x4F52, 0x4F5F, 0x4F41, 0x4F58, 0x4F2D, 0x4F33, + 0x4F3F, 0x4F61, 0x518F, 0x51B9, 0x521C, 0x521E, 0x5221, 0x52AD, + 0x52AE, 0x5309, 0x5363, 0x5372, 0x538E, 0x538F, 0x5430, 0x5437, + 0x542A, 0x5454, 0x5445, 0x5419, 0x541C, 0x5425, 0x5418, 0, +at 0xA0 + 0, 0x543D, 0x544F, 0x5441, 0x5428, 0x5424, 0x5447, 0x56EE, + 0x56E7, 0x56E5, 0x5741, 0x5745, 0x574C, 0x5749, 0x574B, 0x5752, + 0x5906, 0x5940, 0x59A6, 0x5998, 0x59A0, 0x5997, 0x598E, 0x59A2, + 0x5990, 0x598F, 0x59A7, 0x59A1, 0x5B8E, 0x5B92, 0x5C28, 0x5C2A, + 0x5C8D, 0x5C8F, 0x5C88, 0x5C8B, 0x5C89, 0x5C92, 0x5C8A, 0x5C86, + 0x5C93, 0x5C95, 0x5DE0, 0x5E0A, 0x5E0E, 0x5E8B, 0x5E89, 0x5E8C, + 0x5E88, 0x5E8D, 0x5F05, 0x5F1D, 0x5F78, 0x5F76, 0x5FD2, 0x5FD1, + 0x5FD0, 0x5FED, 0x5FE8, 0x5FEE, 0x5FF3, 0x5FE1, 0x5FE4, 0x5FE3, + 0x5FFA, 0x5FEF, 0x5FF7, 0x5FFB, 0x6000, 0x5FF4, 0x623A, 0x6283, + 0x628C, 0x628E, 0x628F, 0x6294, 0x6287, 0x6271, 0x627B, 0x627A, + 0x6270, 0x6281, 0x6288, 0x6277, 0x627D, 0x6272, 0x6274, 0x6537, + 0x65F0, 0x65F4, 0x65F3, 0x65F2, 0x65F5, 0x6745, 0x6747, 0, +plane cb +at 0x40 + 0x6759, 0x6755, 0x674C, 0x6748, 0x675D, 0x674D, 0x675A, 0x674B, + 0x6BD0, 0x6C19, 0x6C1A, 0x6C78, 0x6C67, 0x6C6B, 0x6C84, 0x6C8B, + 0x6C8F, 0x6C71, 0x6C6F, 0x6C69, 0x6C9A, 0x6C6D, 0x6C87, 0x6C95, + 0x6C9C, 0x6C66, 0x6C73, 0x6C65, 0x6C7B, 0x6C8E, 0x7074, 0x707A, + 0x7263, 0x72BF, 0x72BD, 0x72C3, 0x72C6, 0x72C1, 0x72BA, 0x72C5, + 0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753A, 0x7539, 0x7594, + 0x7595, 0x7681, 0x793D, 0x8034, 0x8095, 0x8099, 0x8090, 0x8092, + 0x809C, 0x8290, 0x828F, 0x8285, 0x828E, 0x8291, 0x8293, 0, +at 0xA0 + 0, 0x828A, 0x8283, 0x8284, 0x8C78, 0x8FC9, 0x8FBF, 0x909F, + 0x90A1, 0x90A5, 0x909E, 0x90A7, 0x90A0, 0x9630, 0x9628, 0x962F, + 0x962D, 0x4E33, 0x4F98, 0x4F7C, 0x4F85, 0x4F7D, 0x4F80, 0x4F87, + 0x4F76, 0x4F74, 0x4F89, 0x4F84, 0x4F77, 0x4F4C, 0x4F97, 0x4F6A, + 0x4F9A, 0x4F79, 0x4F81, 0x4F78, 0x4F90, 0x4F9C, 0x4F94, 0x4F9E, + 0x4F92, 0x4F82, 0x4F95, 0x4F6B, 0x4F6E, 0x519E, 0x51BC, 0x51BE, + 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, 0x52BC, 0x530A, 0x530B, + 0x533C, 0x5392, 0x5394, 0x5487, 0x547F, 0x5481, 0x5491, 0x5482, + 0x5488, 0x546B, 0x547A, 0x547E, 0x5465, 0x546C, 0x5474, 0x5466, + 0x548D, 0x546F, 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, + 0x56F7, 0x56F9, 0x576F, 0x5772, 0x576D, 0x576B, 0x5771, 0x5770, + 0x5776, 0x5780, 0x5775, 0x577B, 0x5773, 0x5774, 0x5762, 0, +plane cc +at 0x40 + 0x5768, 0x577D, 0x590C, 0x5945, 0x59B5, 0x59BA, 0x59CF, 0x59CE, + 0x59B2, 0x59CC, 0x59C1, 0x59B6, 0x59BC, 0x59C3, 0x59D6, 0x59B1, + 0x59BD, 0x59C0, 0x59C8, 0x59B4, 0x59C7, 0x5B62, 0x5B65, 0x5B93, + 0x5B95, 0x5C44, 0x5C47, 0x5CAE, 0x5CA4, 0x5CA0, 0x5CB5, 0x5CAF, + 0x5CA8, 0x5CAC, 0x5C9F, 0x5CA3, 0x5CAD, 0x5CA2, 0x5CAA, 0x5CA7, + 0x5C9D, 0x5CA5, 0x5CB6, 0x5CB0, 0x5CA6, 0x5E17, 0x5E14, 0x5E19, + 0x5F28, 0x5F22, 0x5F23, 0x5F24, 0x5F54, 0x5F82, 0x5F7E, 0x5F7D, + 0x5FDE, 0x5FE5, 0x602D, 0x6026, 0x6019, 0x6032, 0x600B, 0, +at 0xA0 + 0, 0x6034, 0x600A, 0x6017, 0x6033, 0x601A, 0x601E, 0x602C, + 0x6022, 0x600D, 0x6010, 0x602E, 0x6013, 0x6011, 0x600C, 0x6009, + 0x601C, 0x6214, 0x623D, 0x62AD, 0x62B4, 0x62D1, 0x62BE, 0x62AA, + 0x62B6, 0x62CA, 0x62AE, 0x62B3, 0x62AF, 0x62BB, 0x62A9, 0x62B0, + 0x62B8, 0x653D, 0x65A8, 0x65BB, 0x6609, 0x65FC, 0x6604, 0x6612, + 0x6608, 0x65FB, 0x6603, 0x660B, 0x660D, 0x6605, 0x65FD, 0x6611, + 0x6610, 0x66F6, 0x670A, 0x6785, 0x676C, 0x678E, 0x6792, 0x6776, + 0x677B, 0x6798, 0x6786, 0x6784, 0x6774, 0x678D, 0x678C, 0x677A, + 0x679F, 0x6791, 0x6799, 0x6783, 0x677D, 0x6781, 0x6778, 0x6779, + 0x6794, 0x6B25, 0x6B80, 0x6B7E, 0x6BDE, 0x6C1D, 0x6C93, 0x6CEC, + 0x6CEB, 0x6CEE, 0x6CD9, 0x6CB6, 0x6CD4, 0x6CAD, 0x6CE7, 0x6CB7, + 0x6CD0, 0x6CC2, 0x6CBA, 0x6CC3, 0x6CC6, 0x6CED, 0x6CF2, 0, +plane cd +at 0x40 + 0x6CD2, 0x6CDD, 0x6CB4, 0x6C8A, 0x6C9D, 0x6C80, 0x6CDE, 0x6CC0, + 0x6D30, 0x6CCD, 0x6CC7, 0x6CB0, 0x6CF9, 0x6CCF, 0x6CE9, 0x6CD1, + 0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, + 0x7082, 0x709A, 0x7083, 0x726A, 0x72D6, 0x72CB, 0x72D8, 0x72C9, + 0x72DC, 0x72D2, 0x72D4, 0x72DA, 0x72CC, 0x72D1, 0x73A4, 0x73A1, + 0x73AD, 0x73A6, 0x73A2, 0x73A0, 0x73AC, 0x739D, 0x74DD, 0x74E8, + 0x753F, 0x7540, 0x753E, 0x758C, 0x7598, 0x76AF, 0x76F3, 0x76F1, + 0x76F0, 0x76F5, 0x77F8, 0x77FC, 0x77F9, 0x77FB, 0x77FA, 0, +at 0xA0 + 0, 0x77F7, 0x7942, 0x793F, 0x79C5, 0x7A78, 0x7A7B, 0x7AFB, + 0x7C75, 0x7CFD, 0x8035, 0x808F, 0x80AE, 0x80A3, 0x80B8, 0x80B5, + 0x80AD, 0x8220, 0x82A0, 0x82C0, 0x82AB, 0x829A, 0x8298, 0x829B, + 0x82B5, 0x82A7, 0x82AE, 0x82BC, 0x829E, 0x82BA, 0x82B4, 0x82A8, + 0x82A1, 0x82A9, 0x82C2, 0x82A4, 0x82C3, 0x82B6, 0x82A2, 0x8670, + 0x866F, 0x866D, 0x866E, 0x8C56, 0x8FD2, 0x8FCB, 0x8FD3, 0x8FCD, + 0x8FD6, 0x8FD5, 0x8FD7, 0x90B2, 0x90B4, 0x90AF, 0x90B3, 0x90B0, + 0x9639, 0x963D, 0x963C, 0x963A, 0x9643, 0x4FCD, 0x4FC5, 0x4FD3, + 0x4FB2, 0x4FC9, 0x4FCB, 0x4FC1, 0x4FD4, 0x4FDC, 0x4FD9, 0x4FBB, + 0x4FB3, 0x4FDB, 0x4FC7, 0x4FD6, 0x4FBA, 0x4FC0, 0x4FB9, 0x4FEC, + 0x5244, 0x5249, 0x52C0, 0x52C2, 0x533D, 0x537C, 0x5397, 0x5396, + 0x5399, 0x5398, 0x54BA, 0x54A1, 0x54AD, 0x54A5, 0x54CF, 0, +plane ce +at 0x40 + 0x54C3, 0x830D, 0x54B7, 0x54AE, 0x54D6, 0x54B6, 0x54C5, 0x54C6, + 0x54A0, 0x5470, 0x54BC, 0x54A2, 0x54BE, 0x5472, 0x54DE, 0x54B0, + 0x57B5, 0x579E, 0x579F, 0x57A4, 0x578C, 0x5797, 0x579D, 0x579B, + 0x5794, 0x5798, 0x578F, 0x5799, 0x57A5, 0x579A, 0x5795, 0x58F4, + 0x590D, 0x5953, 0x59E1, 0x59DE, 0x59EE, 0x5A00, 0x59F1, 0x59DD, + 0x59FA, 0x59FD, 0x59FC, 0x59F6, 0x59E4, 0x59F2, 0x59F7, 0x59DB, + 0x59E9, 0x59F3, 0x59F5, 0x59E0, 0x59FE, 0x59F4, 0x59ED, 0x5BA8, + 0x5C4C, 0x5CD0, 0x5CD8, 0x5CCC, 0x5CD7, 0x5CCB, 0x5CDB, 0, +at 0xA0 + 0, 0x5CDE, 0x5CDA, 0x5CC9, 0x5CC7, 0x5CCA, 0x5CD6, 0x5CD3, + 0x5CD4, 0x5CCF, 0x5CC8, 0x5CC6, 0x5CCE, 0x5CDF, 0x5CF8, 0x5DF9, + 0x5E21, 0x5E22, 0x5E23, 0x5E20, 0x5E24, 0x5EB0, 0x5EA4, 0x5EA2, + 0x5E9B, 0x5EA3, 0x5EA5, 0x5F07, 0x5F2E, 0x5F56, 0x5F86, 0x6037, + 0x6039, 0x6054, 0x6072, 0x605E, 0x6045, 0x6053, 0x6047, 0x6049, + 0x605B, 0x604C, 0x6040, 0x6042, 0x605F, 0x6024, 0x6044, 0x6058, + 0x6066, 0x606E, 0x6242, 0x6243, 0x62CF, 0x630D, 0x630B, 0x62F5, + 0x630E, 0x6303, 0x62EB, 0x62F9, 0x630F, 0x630C, 0x62F8, 0x62F6, + 0x6300, 0x6313, 0x6314, 0x62FA, 0x6315, 0x62FB, 0x62F0, 0x6541, + 0x6543, 0x65AA, 0x65BF, 0x6636, 0x6621, 0x6632, 0x6635, 0x661C, + 0x6626, 0x6622, 0x6633, 0x662B, 0x663A, 0x661D, 0x6634, 0x6639, + 0x662E, 0x670F, 0x6710, 0x67C1, 0x67F2, 0x67C8, 0x67BA, 0, +plane cf +at 0x40 + 0x67DC, 0x67BB, 0x67F8, 0x67D8, 0x67C0, 0x67B7, 0x67C5, 0x67EB, + 0x67E4, 0x67DF, 0x67B5, 0x67CD, 0x67B3, 0x67F7, 0x67F6, 0x67EE, + 0x67E3, 0x67C2, 0x67B9, 0x67CE, 0x67E7, 0x67F0, 0x67B2, 0x67FC, + 0x67C6, 0x67ED, 0x67CC, 0x67AE, 0x67E6, 0x67DB, 0x67FA, 0x67C9, + 0x67CA, 0x67C3, 0x67EA, 0x67CB, 0x6B28, 0x6B82, 0x6B84, 0x6BB6, + 0x6BD6, 0x6BD8, 0x6BE0, 0x6C20, 0x6C21, 0x6D28, 0x6D34, 0x6D2D, + 0x6D1F, 0x6D3C, 0x6D3F, 0x6D12, 0x6D0A, 0x6CDA, 0x6D33, 0x6D04, + 0x6D19, 0x6D3A, 0x6D1A, 0x6D11, 0x6D00, 0x6D1D, 0x6D42, 0, +at 0xA0 + 0, 0x6D01, 0x6D18, 0x6D37, 0x6D03, 0x6D0F, 0x6D40, 0x6D07, + 0x6D20, 0x6D2C, 0x6D08, 0x6D22, 0x6D09, 0x6D10, 0x70B7, 0x709F, + 0x70BE, 0x70B1, 0x70B0, 0x70A1, 0x70B4, 0x70B5, 0x70A9, 0x7241, + 0x7249, 0x724A, 0x726C, 0x7270, 0x7273, 0x726E, 0x72CA, 0x72E4, + 0x72E8, 0x72EB, 0x72DF, 0x72EA, 0x72E6, 0x72E3, 0x7385, 0x73CC, + 0x73C2, 0x73C8, 0x73C5, 0x73B9, 0x73B6, 0x73B5, 0x73B4, 0x73EB, + 0x73BF, 0x73C7, 0x73BE, 0x73C3, 0x73C6, 0x73B8, 0x73CB, 0x74EC, + 0x74EE, 0x752E, 0x7547, 0x7548, 0x75A7, 0x75AA, 0x7679, 0x76C4, + 0x7708, 0x7703, 0x7704, 0x7705, 0x770A, 0x76F7, 0x76FB, 0x76FA, + 0x77E7, 0x77E8, 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780F, + 0x780E, 0x7809, 0x7803, 0x7813, 0x794A, 0x794C, 0x794B, 0x7945, + 0x7944, 0x79D5, 0x79CD, 0x79CF, 0x79D6, 0x79CE, 0x7A80, 0, +plane d0 +at 0x40 + 0x7A7E, 0x7AD1, 0x7B00, 0x7B01, 0x7C7A, 0x7C78, 0x7C79, 0x7C7F, + 0x7C80, 0x7C81, 0x7D03, 0x7D08, 0x7D01, 0x7F58, 0x7F91, 0x7F8D, + 0x7FBE, 0x8007, 0x800E, 0x800F, 0x8014, 0x8037, 0x80D8, 0x80C7, + 0x80E0, 0x80D1, 0x80C8, 0x80C2, 0x80D0, 0x80C5, 0x80E3, 0x80D9, + 0x80DC, 0x80CA, 0x80D5, 0x80C9, 0x80CF, 0x80D7, 0x80E6, 0x80CD, + 0x81FF, 0x8221, 0x8294, 0x82D9, 0x82FE, 0x82F9, 0x8307, 0x82E8, + 0x8300, 0x82D5, 0x833A, 0x82EB, 0x82D6, 0x82F4, 0x82EC, 0x82E1, + 0x82F2, 0x82F5, 0x830C, 0x82FB, 0x82F6, 0x82F0, 0x82EA, 0, +at 0xA0 + 0, 0x82E4, 0x82E0, 0x82FA, 0x82F3, 0x82ED, 0x8677, 0x8674, + 0x867C, 0x8673, 0x8841, 0x884E, 0x8867, 0x886A, 0x8869, 0x89D3, + 0x8A04, 0x8A07, 0x8D72, 0x8FE3, 0x8FE1, 0x8FEE, 0x8FE0, 0x90F1, + 0x90BD, 0x90BF, 0x90D5, 0x90C5, 0x90BE, 0x90C7, 0x90CB, 0x90C8, + 0x91D4, 0x91D3, 0x9654, 0x964F, 0x9651, 0x9653, 0x964A, 0x964E, + 0x501E, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501B, 0x4FF5, + 0x4FF4, 0x5033, 0x5037, 0x502C, 0x4FF6, 0x4FF7, 0x5017, 0x501C, + 0x5020, 0x5027, 0x5035, 0x502F, 0x5031, 0x500E, 0x515A, 0x5194, + 0x5193, 0x51CA, 0x51C4, 0x51C5, 0x51C8, 0x51CE, 0x5261, 0x525A, + 0x5252, 0x525E, 0x525F, 0x5255, 0x5262, 0x52CD, 0x530E, 0x539E, + 0x5526, 0x54E2, 0x5517, 0x5512, 0x54E7, 0x54F3, 0x54E4, 0x551A, + 0x54FF, 0x5504, 0x5508, 0x54EB, 0x5511, 0x5505, 0x54F1, 0, +plane d1 +at 0x40 + 0x550A, 0x54FB, 0x54F7, 0x54F8, 0x54E0, 0x550E, 0x5503, 0x550B, + 0x5701, 0x5702, 0x57CC, 0x5832, 0x57D5, 0x57D2, 0x57BA, 0x57C6, + 0x57BD, 0x57BC, 0x57B8, 0x57B6, 0x57BF, 0x57C7, 0x57D0, 0x57B9, + 0x57C1, 0x590E, 0x594A, 0x5A19, 0x5A16, 0x5A2D, 0x5A2E, 0x5A15, + 0x5A0F, 0x5A17, 0x5A0A, 0x5A1E, 0x5A33, 0x5B6C, 0x5BA7, 0x5BAD, + 0x5BAC, 0x5C03, 0x5C56, 0x5C54, 0x5CEC, 0x5CFF, 0x5CEE, 0x5CF1, + 0x5CF7, 0x5D00, 0x5CF9, 0x5E29, 0x5E28, 0x5EA8, 0x5EAE, 0x5EAA, + 0x5EAC, 0x5F33, 0x5F30, 0x5F67, 0x605D, 0x605A, 0x6067, 0, +at 0xA0 + 0, 0x6041, 0x60A2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609D, + 0x6083, 0x6095, 0x609B, 0x6097, 0x6087, 0x609C, 0x608E, 0x6219, + 0x6246, 0x62F2, 0x6310, 0x6356, 0x632C, 0x6344, 0x6345, 0x6336, + 0x6343, 0x63E4, 0x6339, 0x634B, 0x634A, 0x633C, 0x6329, 0x6341, + 0x6334, 0x6358, 0x6354, 0x6359, 0x632D, 0x6347, 0x6333, 0x635A, + 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654A, 0x6546, 0x65C6, + 0x65C3, 0x65C4, 0x65C2, 0x664A, 0x665F, 0x6647, 0x6651, 0x6712, + 0x6713, 0x681F, 0x681A, 0x6849, 0x6832, 0x6833, 0x683B, 0x684B, + 0x684F, 0x6816, 0x6831, 0x681C, 0x6835, 0x682B, 0x682D, 0x682F, + 0x684E, 0x6844, 0x6834, 0x681D, 0x6812, 0x6814, 0x6826, 0x6828, + 0x682E, 0x684D, 0x683A, 0x6825, 0x6820, 0x6B2C, 0x6B2F, 0x6B2D, + 0x6B31, 0x6B34, 0x6B6D, 0x8082, 0x6B88, 0x6BE6, 0x6BE4, 0, +plane d2 +at 0x40 + 0x6BE8, 0x6BE3, 0x6BE2, 0x6BE7, 0x6C25, 0x6D7A, 0x6D63, 0x6D64, + 0x6D76, 0x6D0D, 0x6D61, 0x6D92, 0x6D58, 0x6D62, 0x6D6D, 0x6D6F, + 0x6D91, 0x6D8D, 0x6DEF, 0x6D7F, 0x6D86, 0x6D5E, 0x6D67, 0x6D60, + 0x6D97, 0x6D70, 0x6D7C, 0x6D5F, 0x6D82, 0x6D98, 0x6D2F, 0x6D68, + 0x6D8B, 0x6D7E, 0x6D80, 0x6D84, 0x6D16, 0x6D83, 0x6D7B, 0x6D7D, + 0x6D75, 0x6D90, 0x70DC, 0x70D3, 0x70D1, 0x70DD, 0x70CB, 0x7F39, + 0x70E2, 0x70D7, 0x70D2, 0x70DE, 0x70E0, 0x70D4, 0x70CD, 0x70C5, + 0x70C6, 0x70C7, 0x70DA, 0x70CE, 0x70E1, 0x7242, 0x7278, 0, +at 0xA0 + 0, 0x7277, 0x7276, 0x7300, 0x72FA, 0x72F4, 0x72FE, 0x72F6, + 0x72F3, 0x72FB, 0x7301, 0x73D3, 0x73D9, 0x73E5, 0x73D6, 0x73BC, + 0x73E7, 0x73E3, 0x73E9, 0x73DC, 0x73D2, 0x73DB, 0x73D4, 0x73DD, + 0x73DA, 0x73D7, 0x73D8, 0x73E8, 0x74DE, 0x74DF, 0x74F4, 0x74F5, + 0x7521, 0x755B, 0x755F, 0x75B0, 0x75C1, 0x75BB, 0x75C4, 0x75C0, + 0x75BF, 0x75B6, 0x75BA, 0x768A, 0x76C9, 0x771D, 0x771B, 0x7710, + 0x7713, 0x7712, 0x7723, 0x7711, 0x7715, 0x7719, 0x771A, 0x7722, + 0x7727, 0x7823, 0x782C, 0x7822, 0x7835, 0x782F, 0x7828, 0x782E, + 0x782B, 0x7821, 0x7829, 0x7833, 0x782A, 0x7831, 0x7954, 0x795B, + 0x794F, 0x795C, 0x7953, 0x7952, 0x7951, 0x79EB, 0x79EC, 0x79E0, + 0x79EE, 0x79ED, 0x79EA, 0x79DC, 0x79DE, 0x79DD, 0x7A86, 0x7A89, + 0x7A85, 0x7A8B, 0x7A8C, 0x7A8A, 0x7A87, 0x7AD8, 0x7B10, 0, +plane d3 +at 0x40 + 0x7B04, 0x7B13, 0x7B05, 0x7B0F, 0x7B08, 0x7B0A, 0x7B0E, 0x7B09, + 0x7B12, 0x7C84, 0x7C91, 0x7C8A, 0x7C8C, 0x7C88, 0x7C8D, 0x7C85, + 0x7D1E, 0x7D1D, 0x7D11, 0x7D0E, 0x7D18, 0x7D16, 0x7D13, 0x7D1F, + 0x7D12, 0x7D0F, 0x7D0C, 0x7F5C, 0x7F61, 0x7F5E, 0x7F60, 0x7F5D, + 0x7F5B, 0x7F96, 0x7F92, 0x7FC3, 0x7FC2, 0x7FC0, 0x8016, 0x803E, + 0x8039, 0x80FA, 0x80F2, 0x80F9, 0x80F5, 0x8101, 0x80FB, 0x8100, + 0x8201, 0x822F, 0x8225, 0x8333, 0x832D, 0x8344, 0x8319, 0x8351, + 0x8325, 0x8356, 0x833F, 0x8341, 0x8326, 0x831C, 0x8322, 0, +at 0xA0 + 0, 0x8342, 0x834E, 0x831B, 0x832A, 0x8308, 0x833C, 0x834D, + 0x8316, 0x8324, 0x8320, 0x8337, 0x832F, 0x8329, 0x8347, 0x8345, + 0x834C, 0x8353, 0x831E, 0x832C, 0x834B, 0x8327, 0x8348, 0x8653, + 0x8652, 0x86A2, 0x86A8, 0x8696, 0x868D, 0x8691, 0x869E, 0x8687, + 0x8697, 0x8686, 0x868B, 0x869A, 0x8685, 0x86A5, 0x8699, 0x86A1, + 0x86A7, 0x8695, 0x8698, 0x868E, 0x869D, 0x8690, 0x8694, 0x8843, + 0x8844, 0x886D, 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887F, + 0x886F, 0x8883, 0x887E, 0x8874, 0x887C, 0x8A12, 0x8C47, 0x8C57, + 0x8C7B, 0x8CA4, 0x8CA3, 0x8D76, 0x8D78, 0x8DB5, 0x8DB7, 0x8DB6, + 0x8ED1, 0x8ED3, 0x8FFE, 0x8FF5, 0x9002, 0x8FFF, 0x8FFB, 0x9004, + 0x8FFC, 0x8FF6, 0x90D6, 0x90E0, 0x90D9, 0x90DA, 0x90E3, 0x90DF, + 0x90E5, 0x90D8, 0x90DB, 0x90D7, 0x90DC, 0x90E4, 0x9150, 0, +plane d4 +at 0x40 + 0x914E, 0x914F, 0x91D5, 0x91E2, 0x91DA, 0x965C, 0x965F, 0x96BC, + 0x98E3, 0x9ADF, 0x9B2F, 0x4E7F, 0x5070, 0x506A, 0x5061, 0x505E, + 0x5060, 0x5053, 0x504B, 0x505D, 0x5072, 0x5048, 0x504D, 0x5041, + 0x505B, 0x504A, 0x5062, 0x5015, 0x5045, 0x505F, 0x5069, 0x506B, + 0x5063, 0x5064, 0x5046, 0x5040, 0x506E, 0x5073, 0x5057, 0x5051, + 0x51D0, 0x526B, 0x526D, 0x526C, 0x526E, 0x52D6, 0x52D3, 0x532D, + 0x539C, 0x5575, 0x5576, 0x553C, 0x554D, 0x5550, 0x5534, 0x552A, + 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, 0, +at 0xA0 + 0, 0x550C, 0x5532, 0x5565, 0x554E, 0x5539, 0x5548, 0x552D, + 0x553B, 0x5540, 0x554B, 0x570A, 0x5707, 0x57FB, 0x5814, 0x57E2, + 0x57F6, 0x57DC, 0x57F4, 0x5800, 0x57ED, 0x57FD, 0x5808, 0x57F8, + 0x580B, 0x57F3, 0x57CF, 0x5807, 0x57EE, 0x57E3, 0x57F2, 0x57E5, + 0x57EC, 0x57E1, 0x580E, 0x57FC, 0x5810, 0x57E7, 0x5801, 0x580C, + 0x57F1, 0x57E9, 0x57F0, 0x580D, 0x5804, 0x595C, 0x5A60, 0x5A58, + 0x5A55, 0x5A67, 0x5A5E, 0x5A38, 0x5A35, 0x5A6D, 0x5A50, 0x5A5F, + 0x5A65, 0x5A6C, 0x5A53, 0x5A64, 0x5A57, 0x5A43, 0x5A5D, 0x5A52, + 0x5A44, 0x5A5B, 0x5A48, 0x5A8E, 0x5A3E, 0x5A4D, 0x5A39, 0x5A4C, + 0x5A70, 0x5A69, 0x5A47, 0x5A51, 0x5A56, 0x5A42, 0x5A5C, 0x5B72, + 0x5B6E, 0x5BC1, 0x5BC0, 0x5C59, 0x5D1E, 0x5D0B, 0x5D1D, 0x5D1A, + 0x5D20, 0x5D0C, 0x5D28, 0x5D0D, 0x5D26, 0x5D25, 0x5D0F, 0, +plane d5 +at 0x40 + 0x5D30, 0x5D12, 0x5D23, 0x5D1F, 0x5D2E, 0x5E3E, 0x5E34, 0x5EB1, + 0x5EB4, 0x5EB9, 0x5EB2, 0x5EB3, 0x5F36, 0x5F38, 0x5F9B, 0x5F96, + 0x5F9F, 0x608A, 0x6090, 0x6086, 0x60BE, 0x60B0, 0x60BA, 0x60D3, + 0x60D4, 0x60CF, 0x60E4, 0x60D9, 0x60DD, 0x60C8, 0x60B1, 0x60DB, + 0x60B7, 0x60CA, 0x60BF, 0x60C3, 0x60CD, 0x60C0, 0x6332, 0x6365, + 0x638A, 0x6382, 0x637D, 0x63BD, 0x639E, 0x63AD, 0x639D, 0x6397, + 0x63AB, 0x638E, 0x636F, 0x6387, 0x6390, 0x636E, 0x63AF, 0x6375, + 0x639C, 0x636D, 0x63AE, 0x637C, 0x63A4, 0x633B, 0x639F, 0, +at 0xA0 + 0, 0x6378, 0x6385, 0x6381, 0x6391, 0x638D, 0x6370, 0x6553, + 0x65CD, 0x6665, 0x6661, 0x665B, 0x6659, 0x665C, 0x6662, 0x6718, + 0x6879, 0x6887, 0x6890, 0x689C, 0x686D, 0x686E, 0x68AE, 0x68AB, + 0x6956, 0x686F, 0x68A3, 0x68AC, 0x68A9, 0x6875, 0x6874, 0x68B2, + 0x688F, 0x6877, 0x6892, 0x687C, 0x686B, 0x6872, 0x68AA, 0x6880, + 0x6871, 0x687E, 0x689B, 0x6896, 0x688B, 0x68A0, 0x6889, 0x68A4, + 0x6878, 0x687B, 0x6891, 0x688C, 0x688A, 0x687D, 0x6B36, 0x6B33, + 0x6B37, 0x6B38, 0x6B91, 0x6B8F, 0x6B8D, 0x6B8E, 0x6B8C, 0x6C2A, + 0x6DC0, 0x6DAB, 0x6DB4, 0x6DB3, 0x6E74, 0x6DAC, 0x6DE9, 0x6DE2, + 0x6DB7, 0x6DF6, 0x6DD4, 0x6E00, 0x6DC8, 0x6DE0, 0x6DDF, 0x6DD6, + 0x6DBE, 0x6DE5, 0x6DDC, 0x6DDD, 0x6DDB, 0x6DF4, 0x6DCA, 0x6DBD, + 0x6DED, 0x6DF0, 0x6DBA, 0x6DD5, 0x6DC2, 0x6DCF, 0x6DC9, 0, +plane d6 +at 0x40 + 0x6DD0, 0x6DF2, 0x6DD3, 0x6DFD, 0x6DD7, 0x6DCD, 0x6DE3, 0x6DBB, + 0x70FA, 0x710D, 0x70F7, 0x7117, 0x70F4, 0x710C, 0x70F0, 0x7104, + 0x70F3, 0x7110, 0x70FC, 0x70FF, 0x7106, 0x7113, 0x7100, 0x70F8, + 0x70F6, 0x710B, 0x7102, 0x710E, 0x727E, 0x727B, 0x727C, 0x727F, + 0x731D, 0x7317, 0x7307, 0x7311, 0x7318, 0x730A, 0x7308, 0x72FF, + 0x730F, 0x731E, 0x7388, 0x73F6, 0x73F8, 0x73F5, 0x7404, 0x7401, + 0x73FD, 0x7407, 0x7400, 0x73FA, 0x73FC, 0x73FF, 0x740C, 0x740B, + 0x73F4, 0x7408, 0x7564, 0x7563, 0x75CE, 0x75D2, 0x75CF, 0, +at 0xA0 + 0, 0x75CB, 0x75CC, 0x75D1, 0x75D0, 0x768F, 0x7689, 0x76D3, + 0x7739, 0x772F, 0x772D, 0x7731, 0x7732, 0x7734, 0x7733, 0x773D, + 0x7725, 0x773B, 0x7735, 0x7848, 0x7852, 0x7849, 0x784D, 0x784A, + 0x784C, 0x7826, 0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796A, + 0x7963, 0x796B, 0x7961, 0x79BB, 0x79FA, 0x79F8, 0x79F6, 0x79F7, + 0x7A8F, 0x7A94, 0x7A90, 0x7B35, 0x7B47, 0x7B34, 0x7B25, 0x7B30, + 0x7B22, 0x7B24, 0x7B33, 0x7B18, 0x7B2A, 0x7B1D, 0x7B31, 0x7B2B, + 0x7B2D, 0x7B2F, 0x7B32, 0x7B38, 0x7B1A, 0x7B23, 0x7C94, 0x7C98, + 0x7C96, 0x7CA3, 0x7D35, 0x7D3D, 0x7D38, 0x7D36, 0x7D3A, 0x7D45, + 0x7D2C, 0x7D29, 0x7D41, 0x7D47, 0x7D3E, 0x7D3F, 0x7D4A, 0x7D3B, + 0x7D28, 0x7F63, 0x7F95, 0x7F9C, 0x7F9D, 0x7F9B, 0x7FCA, 0x7FCB, + 0x7FCD, 0x7FD0, 0x7FD1, 0x7FC7, 0x7FCF, 0x7FC9, 0x801F, 0, +plane d7 +at 0x40 + 0x801E, 0x801B, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119, + 0x811B, 0x812D, 0x811F, 0x812C, 0x811E, 0x8121, 0x8115, 0x8127, + 0x811D, 0x8122, 0x8211, 0x8238, 0x8233, 0x823A, 0x8234, 0x8232, + 0x8274, 0x8390, 0x83A3, 0x83A8, 0x838D, 0x837A, 0x8373, 0x83A4, + 0x8374, 0x838F, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83A9, + 0x837D, 0x8383, 0x838C, 0x839D, 0x839B, 0x83AA, 0x838B, 0x837E, + 0x83A5, 0x83AF, 0x8388, 0x8397, 0x83B0, 0x837F, 0x83A6, 0x8387, + 0x83AE, 0x8376, 0x839A, 0x8659, 0x8656, 0x86BF, 0x86B7, 0, +at 0xA0 + 0, 0x86C2, 0x86C1, 0x86C5, 0x86BA, 0x86B0, 0x86C8, 0x86B9, + 0x86B3, 0x86B8, 0x86CC, 0x86B4, 0x86BB, 0x86BC, 0x86C3, 0x86BD, + 0x86BE, 0x8852, 0x8889, 0x8895, 0x88A8, 0x88A2, 0x88AA, 0x889A, + 0x8891, 0x88A1, 0x889F, 0x8898, 0x88A7, 0x8899, 0x889B, 0x8897, + 0x88A4, 0x88AC, 0x888C, 0x8893, 0x888E, 0x8982, 0x89D6, 0x89D9, + 0x89D5, 0x8A30, 0x8A27, 0x8A2C, 0x8A1E, 0x8C39, 0x8C3B, 0x8C5C, + 0x8C5D, 0x8C7D, 0x8CA5, 0x8D7D, 0x8D7B, 0x8D79, 0x8DBC, 0x8DC2, + 0x8DB9, 0x8DBF, 0x8DC1, 0x8ED8, 0x8EDE, 0x8EDD, 0x8EDC, 0x8ED7, + 0x8EE0, 0x8EE1, 0x9024, 0x900B, 0x9011, 0x901C, 0x900C, 0x9021, + 0x90EF, 0x90EA, 0x90F0, 0x90F4, 0x90F2, 0x90F3, 0x90D4, 0x90EB, + 0x90EC, 0x90E9, 0x9156, 0x9158, 0x915A, 0x9153, 0x9155, 0x91EC, + 0x91F4, 0x91F1, 0x91F3, 0x91F8, 0x91E4, 0x91F9, 0x91EA, 0, +plane d8 +at 0x40 + 0x91EB, 0x91F7, 0x91E8, 0x91EE, 0x957A, 0x9586, 0x9588, 0x967C, + 0x966D, 0x966B, 0x9671, 0x966F, 0x96BF, 0x976A, 0x9804, 0x98E5, + 0x9997, 0x509B, 0x5095, 0x5094, 0x509E, 0x508B, 0x50A3, 0x5083, + 0x508C, 0x508E, 0x509D, 0x5068, 0x509C, 0x5092, 0x5082, 0x5087, + 0x515F, 0x51D4, 0x5312, 0x5311, 0x53A4, 0x53A7, 0x5591, 0x55A8, + 0x55A5, 0x55AD, 0x5577, 0x5645, 0x55A2, 0x5593, 0x5588, 0x558F, + 0x55B5, 0x5581, 0x55A3, 0x5592, 0x55A4, 0x557D, 0x558C, 0x55A6, + 0x557F, 0x5595, 0x55A1, 0x558E, 0x570C, 0x5829, 0x5837, 0, +at 0xA0 + 0, 0x5819, 0x581E, 0x5827, 0x5823, 0x5828, 0x57F5, 0x5848, + 0x5825, 0x581C, 0x581B, 0x5833, 0x583F, 0x5836, 0x582E, 0x5839, + 0x5838, 0x582D, 0x582C, 0x583B, 0x5961, 0x5AAF, 0x5A94, 0x5A9F, + 0x5A7A, 0x5AA2, 0x5A9E, 0x5A78, 0x5AA6, 0x5A7C, 0x5AA5, 0x5AAC, + 0x5A95, 0x5AAE, 0x5A37, 0x5A84, 0x5A8A, 0x5A97, 0x5A83, 0x5A8B, + 0x5AA9, 0x5A7B, 0x5A7D, 0x5A8C, 0x5A9C, 0x5A8F, 0x5A93, 0x5A9D, + 0x5BEA, 0x5BCD, 0x5BCB, 0x5BD4, 0x5BD1, 0x5BCA, 0x5BCE, 0x5C0C, + 0x5C30, 0x5D37, 0x5D43, 0x5D6B, 0x5D41, 0x5D4B, 0x5D3F, 0x5D35, + 0x5D51, 0x5D4E, 0x5D55, 0x5D33, 0x5D3A, 0x5D52, 0x5D3D, 0x5D31, + 0x5D59, 0x5D42, 0x5D39, 0x5D49, 0x5D38, 0x5D3C, 0x5D32, 0x5D36, + 0x5D40, 0x5D45, 0x5E44, 0x5E41, 0x5F58, 0x5FA6, 0x5FA5, 0x5FAB, + 0x60C9, 0x60B9, 0x60CC, 0x60E2, 0x60CE, 0x60C4, 0x6114, 0, +plane d9 +at 0x40 + 0x60F2, 0x610A, 0x6116, 0x6105, 0x60F5, 0x6113, 0x60F8, 0x60FC, + 0x60FE, 0x60C1, 0x6103, 0x6118, 0x611D, 0x6110, 0x60FF, 0x6104, + 0x610B, 0x624A, 0x6394, 0x63B1, 0x63B0, 0x63CE, 0x63E5, 0x63E8, + 0x63EF, 0x63C3, 0x649D, 0x63F3, 0x63CA, 0x63E0, 0x63F6, 0x63D5, + 0x63F2, 0x63F5, 0x6461, 0x63DF, 0x63BE, 0x63DD, 0x63DC, 0x63C4, + 0x63D8, 0x63D3, 0x63C2, 0x63C7, 0x63CC, 0x63CB, 0x63C8, 0x63F0, + 0x63D7, 0x63D9, 0x6532, 0x6567, 0x656A, 0x6564, 0x655C, 0x6568, + 0x6565, 0x658C, 0x659D, 0x659E, 0x65AE, 0x65D0, 0x65D2, 0, +at 0xA0 + 0, 0x667C, 0x666C, 0x667B, 0x6680, 0x6671, 0x6679, 0x666A, + 0x6672, 0x6701, 0x690C, 0x68D3, 0x6904, 0x68DC, 0x692A, 0x68EC, + 0x68EA, 0x68F1, 0x690F, 0x68D6, 0x68F7, 0x68EB, 0x68E4, 0x68F6, + 0x6913, 0x6910, 0x68F3, 0x68E1, 0x6907, 0x68CC, 0x6908, 0x6970, + 0x68B4, 0x6911, 0x68EF, 0x68C6, 0x6914, 0x68F8, 0x68D0, 0x68FD, + 0x68FC, 0x68E8, 0x690B, 0x690A, 0x6917, 0x68CE, 0x68C8, 0x68DD, + 0x68DE, 0x68E6, 0x68F4, 0x68D1, 0x6906, 0x68D4, 0x68E9, 0x6915, + 0x6925, 0x68C7, 0x6B39, 0x6B3B, 0x6B3F, 0x6B3C, 0x6B94, 0x6B97, + 0x6B99, 0x6B95, 0x6BBD, 0x6BF0, 0x6BF2, 0x6BF3, 0x6C30, 0x6DFC, + 0x6E46, 0x6E47, 0x6E1F, 0x6E49, 0x6E88, 0x6E3C, 0x6E3D, 0x6E45, + 0x6E62, 0x6E2B, 0x6E3F, 0x6E41, 0x6E5D, 0x6E73, 0x6E1C, 0x6E33, + 0x6E4B, 0x6E40, 0x6E51, 0x6E3B, 0x6E03, 0x6E2E, 0x6E5E, 0, +plane da +at 0x40 + 0x6E68, 0x6E5C, 0x6E61, 0x6E31, 0x6E28, 0x6E60, 0x6E71, 0x6E6B, + 0x6E39, 0x6E22, 0x6E30, 0x6E53, 0x6E65, 0x6E27, 0x6E78, 0x6E64, + 0x6E77, 0x6E55, 0x6E79, 0x6E52, 0x6E66, 0x6E35, 0x6E36, 0x6E5A, + 0x7120, 0x711E, 0x712F, 0x70FB, 0x712E, 0x7131, 0x7123, 0x7125, + 0x7122, 0x7132, 0x711F, 0x7128, 0x713A, 0x711B, 0x724B, 0x725A, + 0x7288, 0x7289, 0x7286, 0x7285, 0x728B, 0x7312, 0x730B, 0x7330, + 0x7322, 0x7331, 0x7333, 0x7327, 0x7332, 0x732D, 0x7326, 0x7323, + 0x7335, 0x730C, 0x742E, 0x742C, 0x7430, 0x742B, 0x7416, 0, +at 0xA0 + 0, 0x741A, 0x7421, 0x742D, 0x7431, 0x7424, 0x7423, 0x741D, + 0x7429, 0x7420, 0x7432, 0x74FB, 0x752F, 0x756F, 0x756C, 0x75E7, + 0x75DA, 0x75E1, 0x75E6, 0x75DD, 0x75DF, 0x75E4, 0x75D7, 0x7695, + 0x7692, 0x76DA, 0x7746, 0x7747, 0x7744, 0x774D, 0x7745, 0x774A, + 0x774E, 0x774B, 0x774C, 0x77DE, 0x77EC, 0x7860, 0x7864, 0x7865, + 0x785C, 0x786D, 0x7871, 0x786A, 0x786E, 0x7870, 0x7869, 0x7868, + 0x785E, 0x7862, 0x7974, 0x7973, 0x7972, 0x7970, 0x7A02, 0x7A0A, + 0x7A03, 0x7A0C, 0x7A04, 0x7A99, 0x7AE6, 0x7AE4, 0x7B4A, 0x7B3B, + 0x7B44, 0x7B48, 0x7B4C, 0x7B4E, 0x7B40, 0x7B58, 0x7B45, 0x7CA2, + 0x7C9E, 0x7CA8, 0x7CA1, 0x7D58, 0x7D6F, 0x7D63, 0x7D53, 0x7D56, + 0x7D67, 0x7D6A, 0x7D4F, 0x7D6D, 0x7D5C, 0x7D6B, 0x7D52, 0x7D54, + 0x7D69, 0x7D51, 0x7D5F, 0x7D4E, 0x7F3E, 0x7F3F, 0x7F65, 0, +plane db +at 0x40 + 0x7F66, 0x7FA2, 0x7FA0, 0x7FA1, 0x7FD7, 0x8051, 0x804F, 0x8050, + 0x80FE, 0x80D4, 0x8143, 0x814A, 0x8152, 0x814F, 0x8147, 0x813D, + 0x814D, 0x813A, 0x81E6, 0x81EE, 0x81F7, 0x81F8, 0x81F9, 0x8204, + 0x823C, 0x823D, 0x823F, 0x8275, 0x833B, 0x83CF, 0x83F9, 0x8423, + 0x83C0, 0x83E8, 0x8412, 0x83E7, 0x83E4, 0x83FC, 0x83F6, 0x8410, + 0x83C6, 0x83C8, 0x83EB, 0x83E3, 0x83BF, 0x8401, 0x83DD, 0x83E5, + 0x83D8, 0x83FF, 0x83E1, 0x83CB, 0x83CE, 0x83D6, 0x83F5, 0x83C9, + 0x8409, 0x840F, 0x83DE, 0x8411, 0x8406, 0x83C2, 0x83F3, 0, +at 0xA0 + 0, 0x83D5, 0x83FA, 0x83C7, 0x83D1, 0x83EA, 0x8413, 0x83C3, + 0x83EC, 0x83EE, 0x83C4, 0x83FB, 0x83D7, 0x83E2, 0x841B, 0x83DB, + 0x83FE, 0x86D8, 0x86E2, 0x86E6, 0x86D3, 0x86E3, 0x86DA, 0x86EA, + 0x86DD, 0x86EB, 0x86DC, 0x86EC, 0x86E9, 0x86D7, 0x86E8, 0x86D1, + 0x8848, 0x8856, 0x8855, 0x88BA, 0x88D7, 0x88B9, 0x88B8, 0x88C0, + 0x88BE, 0x88B6, 0x88BC, 0x88B7, 0x88BD, 0x88B2, 0x8901, 0x88C9, + 0x8995, 0x8998, 0x8997, 0x89DD, 0x89DA, 0x89DB, 0x8A4E, 0x8A4D, + 0x8A39, 0x8A59, 0x8A40, 0x8A57, 0x8A58, 0x8A44, 0x8A45, 0x8A52, + 0x8A48, 0x8A51, 0x8A4A, 0x8A4C, 0x8A4F, 0x8C5F, 0x8C81, 0x8C80, + 0x8CBA, 0x8CBE, 0x8CB0, 0x8CB9, 0x8CB5, 0x8D84, 0x8D80, 0x8D89, + 0x8DD8, 0x8DD3, 0x8DCD, 0x8DC7, 0x8DD6, 0x8DDC, 0x8DCF, 0x8DD5, + 0x8DD9, 0x8DC8, 0x8DD7, 0x8DC5, 0x8EEF, 0x8EF7, 0x8EFA, 0, +plane dc +at 0x40 + 0x8EF9, 0x8EE6, 0x8EEE, 0x8EE5, 0x8EF5, 0x8EE7, 0x8EE8, 0x8EF6, + 0x8EEB, 0x8EF1, 0x8EEC, 0x8EF4, 0x8EE9, 0x902D, 0x9034, 0x902F, + 0x9106, 0x912C, 0x9104, 0x90FF, 0x90FC, 0x9108, 0x90F9, 0x90FB, + 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915F, + 0x9162, 0x9160, 0x9201, 0x920A, 0x9225, 0x9203, 0x921A, 0x9226, + 0x920F, 0x920C, 0x9200, 0x9212, 0x91FF, 0x91FD, 0x9206, 0x9204, + 0x9227, 0x9202, 0x921C, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216, + 0x957B, 0x958D, 0x958C, 0x9590, 0x9687, 0x967E, 0x9688, 0, +at 0xA0 + 0, 0x9689, 0x9683, 0x9680, 0x96C2, 0x96C8, 0x96C3, 0x96F1, + 0x96F0, 0x976C, 0x9770, 0x976E, 0x9807, 0x98A9, 0x98EB, 0x9CE6, + 0x9EF9, 0x4E83, 0x4E84, 0x4EB6, 0x50BD, 0x50BF, 0x50C6, 0x50AE, + 0x50C4, 0x50CA, 0x50B4, 0x50C8, 0x50C2, 0x50B0, 0x50C1, 0x50BA, + 0x50B1, 0x50CB, 0x50C9, 0x50B6, 0x50B8, 0x51D7, 0x527A, 0x5278, + 0x527B, 0x527C, 0x55C3, 0x55DB, 0x55CC, 0x55D0, 0x55CB, 0x55CA, + 0x55DD, 0x55C0, 0x55D4, 0x55C4, 0x55E9, 0x55BF, 0x55D2, 0x558D, + 0x55CF, 0x55D5, 0x55E2, 0x55D6, 0x55C8, 0x55F2, 0x55CD, 0x55D9, + 0x55C2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584F, 0x584D, 0x5849, + 0x586F, 0x5855, 0x584E, 0x585D, 0x5859, 0x5865, 0x585B, 0x583D, + 0x5863, 0x5871, 0x58FC, 0x5AC7, 0x5AC4, 0x5ACB, 0x5ABA, 0x5AB8, + 0x5AB1, 0x5AB5, 0x5AB0, 0x5ABF, 0x5AC8, 0x5ABB, 0x5AC6, 0, +plane dd +at 0x40 + 0x5AB7, 0x5AC0, 0x5ACA, 0x5AB4, 0x5AB6, 0x5ACD, 0x5AB9, 0x5A90, + 0x5BD6, 0x5BD8, 0x5BD9, 0x5C1F, 0x5C33, 0x5D71, 0x5D63, 0x5D4A, + 0x5D65, 0x5D72, 0x5D6C, 0x5D5E, 0x5D68, 0x5D67, 0x5D62, 0x5DF0, + 0x5E4F, 0x5E4E, 0x5E4A, 0x5E4D, 0x5E4B, 0x5EC5, 0x5ECC, 0x5EC6, + 0x5ECB, 0x5EC7, 0x5F40, 0x5FAF, 0x5FAD, 0x60F7, 0x6149, 0x614A, + 0x612B, 0x6145, 0x6136, 0x6132, 0x612E, 0x6146, 0x612F, 0x614F, + 0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63C5, + 0x63F1, 0x63EB, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0, +at 0xA0 + 0, 0x6433, 0x6443, 0x641F, 0x6415, 0x6418, 0x6439, 0x6437, + 0x6422, 0x6423, 0x640C, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, + 0x642F, 0x640A, 0x641A, 0x6440, 0x6425, 0x6427, 0x640B, 0x63E7, + 0x641B, 0x642E, 0x6421, 0x640E, 0x656F, 0x6592, 0x65D3, 0x6686, + 0x668C, 0x6695, 0x6690, 0x668B, 0x668A, 0x6699, 0x6694, 0x6678, + 0x6720, 0x6966, 0x695F, 0x6938, 0x694E, 0x6962, 0x6971, 0x693F, + 0x6945, 0x696A, 0x6939, 0x6942, 0x6957, 0x6959, 0x697A, 0x6948, + 0x6949, 0x6935, 0x696C, 0x6933, 0x693D, 0x6965, 0x68F0, 0x6978, + 0x6934, 0x6969, 0x6940, 0x696F, 0x6944, 0x6976, 0x6958, 0x6941, + 0x6974, 0x694C, 0x693B, 0x694B, 0x6937, 0x695C, 0x694F, 0x6951, + 0x6932, 0x6952, 0x692F, 0x697B, 0x693C, 0x6B46, 0x6B45, 0x6B43, + 0x6B42, 0x6B48, 0x6B41, 0x6B9B, 0xFA0D, 0x6BFB, 0x6BFC, 0, +plane de +at 0x40 + 0x6BF9, 0x6BF7, 0x6BF8, 0x6E9B, 0x6ED6, 0x6EC8, 0x6E8F, 0x6EC0, + 0x6E9F, 0x6E93, 0x6E94, 0x6EA0, 0x6EB1, 0x6EB9, 0x6EC6, 0x6ED2, + 0x6EBD, 0x6EC1, 0x6E9E, 0x6EC9, 0x6EB7, 0x6EB0, 0x6ECD, 0x6EA6, + 0x6ECF, 0x6EB2, 0x6EBE, 0x6EC3, 0x6EDC, 0x6ED8, 0x6E99, 0x6E92, + 0x6E8E, 0x6E8D, 0x6EA4, 0x6EA1, 0x6EBF, 0x6EB3, 0x6ED0, 0x6ECA, + 0x6E97, 0x6EAE, 0x6EA3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160, + 0x7141, 0x715D, 0x7162, 0x7172, 0x7178, 0x716A, 0x7161, 0x7142, + 0x7158, 0x7143, 0x714B, 0x7170, 0x715F, 0x7150, 0x7153, 0, +at 0xA0 + 0, 0x7144, 0x714D, 0x715A, 0x724F, 0x728D, 0x728C, 0x7291, + 0x7290, 0x728E, 0x733C, 0x7342, 0x733B, 0x733A, 0x7340, 0x734A, + 0x7349, 0x7444, 0x744A, 0x744B, 0x7452, 0x7451, 0x7457, 0x7440, + 0x744F, 0x7450, 0x744E, 0x7442, 0x7446, 0x744D, 0x7454, 0x74E1, + 0x74FF, 0x74FE, 0x74FD, 0x751D, 0x7579, 0x7577, 0x6983, 0x75EF, + 0x760F, 0x7603, 0x75F7, 0x75FE, 0x75FC, 0x75F9, 0x75F8, 0x7610, + 0x75FB, 0x75F6, 0x75ED, 0x75F5, 0x75FD, 0x7699, 0x76B5, 0x76DD, + 0x7755, 0x775F, 0x7760, 0x7752, 0x7756, 0x775A, 0x7769, 0x7767, + 0x7754, 0x7759, 0x776D, 0x77E0, 0x7887, 0x789A, 0x7894, 0x788F, + 0x7884, 0x7895, 0x7885, 0x7886, 0x78A1, 0x7883, 0x7879, 0x7899, + 0x7880, 0x7896, 0x787B, 0x797C, 0x7982, 0x797D, 0x7979, 0x7A11, + 0x7A18, 0x7A19, 0x7A12, 0x7A17, 0x7A15, 0x7A22, 0x7A13, 0, +plane df +at 0x40 + 0x7A1B, 0x7A10, 0x7AA3, 0x7AA2, 0x7A9E, 0x7AEB, 0x7B66, 0x7B64, + 0x7B6D, 0x7B74, 0x7B69, 0x7B72, 0x7B65, 0x7B73, 0x7B71, 0x7B70, + 0x7B61, 0x7B78, 0x7B76, 0x7B63, 0x7CB2, 0x7CB4, 0x7CAF, 0x7D88, + 0x7D86, 0x7D80, 0x7D8D, 0x7D7F, 0x7D85, 0x7D7A, 0x7D8E, 0x7D7B, + 0x7D83, 0x7D7C, 0x7D8C, 0x7D94, 0x7D84, 0x7D7D, 0x7D92, 0x7F6D, + 0x7F6B, 0x7F67, 0x7F68, 0x7F6C, 0x7FA6, 0x7FA5, 0x7FA7, 0x7FDB, + 0x7FDC, 0x8021, 0x8164, 0x8160, 0x8177, 0x815C, 0x8169, 0x815B, + 0x8162, 0x8172, 0x6721, 0x815E, 0x8176, 0x8167, 0x816F, 0, +at 0xA0 + 0, 0x8144, 0x8161, 0x821D, 0x8249, 0x8244, 0x8240, 0x8242, + 0x8245, 0x84F1, 0x843F, 0x8456, 0x8476, 0x8479, 0x848F, 0x848D, + 0x8465, 0x8451, 0x8440, 0x8486, 0x8467, 0x8430, 0x844D, 0x847D, + 0x845A, 0x8459, 0x8474, 0x8473, 0x845D, 0x8507, 0x845E, 0x8437, + 0x843A, 0x8434, 0x847A, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429, + 0x83D9, 0x844B, 0x842F, 0x8442, 0x842D, 0x845F, 0x8470, 0x8439, + 0x844E, 0x844C, 0x8452, 0x846F, 0x84C5, 0x848E, 0x843B, 0x8447, + 0x8436, 0x8433, 0x8468, 0x847E, 0x8444, 0x842B, 0x8460, 0x8454, + 0x846E, 0x8450, 0x870B, 0x8704, 0x86F7, 0x870C, 0x86FA, 0x86D6, + 0x86F5, 0x874D, 0x86F8, 0x870E, 0x8709, 0x8701, 0x86F6, 0x870D, + 0x8705, 0x88D6, 0x88CB, 0x88CD, 0x88CE, 0x88DE, 0x88DB, 0x88DA, + 0x88CC, 0x88D0, 0x8985, 0x899B, 0x89DF, 0x89E5, 0x89E4, 0, +plane e0 +at 0x40 + 0x89E1, 0x89E0, 0x89E2, 0x89DC, 0x89E6, 0x8A76, 0x8A86, 0x8A7F, + 0x8A61, 0x8A3F, 0x8A77, 0x8A82, 0x8A84, 0x8A75, 0x8A83, 0x8A81, + 0x8A74, 0x8A7A, 0x8C3C, 0x8C4B, 0x8C4A, 0x8C65, 0x8C64, 0x8C66, + 0x8C86, 0x8C84, 0x8C85, 0x8CCC, 0x8D68, 0x8D69, 0x8D91, 0x8D8C, + 0x8D8E, 0x8D8F, 0x8D8D, 0x8D93, 0x8D94, 0x8D90, 0x8D92, 0x8DF0, + 0x8DE0, 0x8DEC, 0x8DF1, 0x8DEE, 0x8DD0, 0x8DE9, 0x8DE3, 0x8DE2, + 0x8DE7, 0x8DF2, 0x8DEB, 0x8DF4, 0x8F06, 0x8EFF, 0x8F01, 0x8F00, + 0x8F05, 0x8F07, 0x8F08, 0x8F02, 0x8F0B, 0x9052, 0x903F, 0, +at 0xA0 + 0, 0x9044, 0x9049, 0x903D, 0x9110, 0x910D, 0x910F, 0x9111, + 0x9116, 0x9114, 0x910B, 0x910E, 0x916E, 0x916F, 0x9248, 0x9252, + 0x9230, 0x923A, 0x9266, 0x9233, 0x9265, 0x925E, 0x9283, 0x922E, + 0x924A, 0x9246, 0x926D, 0x926C, 0x924F, 0x9260, 0x9267, 0x926F, + 0x9236, 0x9261, 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, 0x9272, + 0x924E, 0x9253, 0x924C, 0x9256, 0x9232, 0x959F, 0x959C, 0x959E, + 0x959B, 0x9692, 0x9693, 0x9691, 0x9697, 0x96CE, 0x96FA, 0x96FD, + 0x96F8, 0x96F5, 0x9773, 0x9777, 0x9778, 0x9772, 0x980F, 0x980D, + 0x980E, 0x98AC, 0x98F6, 0x98F9, 0x99AF, 0x99B2, 0x99B0, 0x99B5, + 0x9AAD, 0x9AAB, 0x9B5B, 0x9CEA, 0x9CED, 0x9CE7, 0x9E80, 0x9EFD, + 0x50E6, 0x50D4, 0x50D7, 0x50E8, 0x50F3, 0x50DB, 0x50EA, 0x50DD, + 0x50E4, 0x50D3, 0x50EC, 0x50F0, 0x50EF, 0x50E3, 0x50E0, 0, +plane e1 +at 0x40 + 0x51D8, 0x5280, 0x5281, 0x52E9, 0x52EB, 0x5330, 0x53AC, 0x5627, + 0x5615, 0x560C, 0x5612, 0x55FC, 0x560F, 0x561C, 0x5601, 0x5613, + 0x5602, 0x55FA, 0x561D, 0x5604, 0x55FF, 0x55F9, 0x5889, 0x587C, + 0x5890, 0x5898, 0x5886, 0x5881, 0x587F, 0x5874, 0x588B, 0x587A, + 0x5887, 0x5891, 0x588E, 0x5876, 0x5882, 0x5888, 0x587B, 0x5894, + 0x588F, 0x58FE, 0x596B, 0x5ADC, 0x5AEE, 0x5AE5, 0x5AD5, 0x5AEA, + 0x5ADA, 0x5AED, 0x5AEB, 0x5AF3, 0x5AE2, 0x5AE0, 0x5ADB, 0x5AEC, + 0x5ADE, 0x5ADD, 0x5AD9, 0x5AE8, 0x5ADF, 0x5B77, 0x5BE0, 0, +at 0xA0 + 0, 0x5BE3, 0x5C63, 0x5D82, 0x5D80, 0x5D7D, 0x5D86, 0x5D7A, + 0x5D81, 0x5D77, 0x5D8A, 0x5D89, 0x5D88, 0x5D7E, 0x5D7C, 0x5D8D, + 0x5D79, 0x5D7F, 0x5E58, 0x5E59, 0x5E53, 0x5ED8, 0x5ED1, 0x5ED7, + 0x5ECE, 0x5EDC, 0x5ED5, 0x5ED9, 0x5ED2, 0x5ED4, 0x5F44, 0x5F43, + 0x5F6F, 0x5FB6, 0x612C, 0x6128, 0x6141, 0x615E, 0x6171, 0x6173, + 0x6152, 0x6153, 0x6172, 0x616C, 0x6180, 0x6174, 0x6154, 0x617A, + 0x615B, 0x6165, 0x613B, 0x616A, 0x6161, 0x6156, 0x6229, 0x6227, + 0x622B, 0x642B, 0x644D, 0x645B, 0x645D, 0x6474, 0x6476, 0x6472, + 0x6473, 0x647D, 0x6475, 0x6466, 0x64A6, 0x644E, 0x6482, 0x645E, + 0x645C, 0x644B, 0x6453, 0x6460, 0x6450, 0x647F, 0x643F, 0x646C, + 0x646B, 0x6459, 0x6465, 0x6477, 0x6573, 0x65A0, 0x66A1, 0x66A0, + 0x669F, 0x6705, 0x6704, 0x6722, 0x69B1, 0x69B6, 0x69C9, 0, +plane e2 +at 0x40 + 0x69A0, 0x69CE, 0x6996, 0x69B0, 0x69AC, 0x69BC, 0x6991, 0x6999, + 0x698E, 0x69A7, 0x698D, 0x69A9, 0x69BE, 0x69AF, 0x69BF, 0x69C4, + 0x69BD, 0x69A4, 0x69D4, 0x69B9, 0x69CA, 0x699A, 0x69CF, 0x69B3, + 0x6993, 0x69AA, 0x69A1, 0x699E, 0x69D9, 0x6997, 0x6990, 0x69C2, + 0x69B5, 0x69A5, 0x69C6, 0x6B4A, 0x6B4D, 0x6B4B, 0x6B9E, 0x6B9F, + 0x6BA0, 0x6BC3, 0x6BC4, 0x6BFE, 0x6ECE, 0x6EF5, 0x6EF1, 0x6F03, + 0x6F25, 0x6EF8, 0x6F37, 0x6EFB, 0x6F2E, 0x6F09, 0x6F4E, 0x6F19, + 0x6F1A, 0x6F27, 0x6F18, 0x6F3B, 0x6F12, 0x6EED, 0x6F0A, 0, +at 0xA0 + 0, 0x6F36, 0x6F73, 0x6EF9, 0x6EEE, 0x6F2D, 0x6F40, 0x6F30, + 0x6F3C, 0x6F35, 0x6EEB, 0x6F07, 0x6F0E, 0x6F43, 0x6F05, 0x6EFD, + 0x6EF6, 0x6F39, 0x6F1C, 0x6EFC, 0x6F3A, 0x6F1F, 0x6F0D, 0x6F1E, + 0x6F08, 0x6F21, 0x7187, 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, + 0x718F, 0x717B, 0x7186, 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, + 0x7295, 0x7293, 0x7343, 0x734D, 0x7351, 0x734C, 0x7462, 0x7473, + 0x7471, 0x7475, 0x7472, 0x7467, 0x746E, 0x7500, 0x7502, 0x7503, + 0x757D, 0x7590, 0x7616, 0x7608, 0x760C, 0x7615, 0x7611, 0x760A, + 0x7614, 0x76B8, 0x7781, 0x777C, 0x7785, 0x7782, 0x776E, 0x7780, + 0x776F, 0x777E, 0x7783, 0x78B2, 0x78AA, 0x78B4, 0x78AD, 0x78A8, + 0x787E, 0x78AB, 0x789E, 0x78A5, 0x78A0, 0x78AC, 0x78A2, 0x78A4, + 0x7998, 0x798A, 0x798B, 0x7996, 0x7995, 0x7994, 0x7993, 0, +plane e3 +at 0x40 + 0x7997, 0x7988, 0x7992, 0x7990, 0x7A2B, 0x7A4A, 0x7A30, 0x7A2F, + 0x7A28, 0x7A26, 0x7AA8, 0x7AAB, 0x7AAC, 0x7AEE, 0x7B88, 0x7B9C, + 0x7B8A, 0x7B91, 0x7B90, 0x7B96, 0x7B8D, 0x7B8C, 0x7B9B, 0x7B8E, + 0x7B85, 0x7B98, 0x5284, 0x7B99, 0x7BA4, 0x7B82, 0x7CBB, 0x7CBF, + 0x7CBC, 0x7CBA, 0x7DA7, 0x7DB7, 0x7DC2, 0x7DA3, 0x7DAA, 0x7DC1, + 0x7DC0, 0x7DC5, 0x7D9D, 0x7DCE, 0x7DC4, 0x7DC6, 0x7DCB, 0x7DCC, + 0x7DAF, 0x7DB9, 0x7D96, 0x7DBC, 0x7D9F, 0x7DA6, 0x7DAE, 0x7DA9, + 0x7DA1, 0x7DC9, 0x7F73, 0x7FE2, 0x7FE3, 0x7FE5, 0x7FDE, 0, +at 0xA0 + 0, 0x8024, 0x805D, 0x805C, 0x8189, 0x8186, 0x8183, 0x8187, + 0x818D, 0x818C, 0x818B, 0x8215, 0x8497, 0x84A4, 0x84A1, 0x849F, + 0x84BA, 0x84CE, 0x84C2, 0x84AC, 0x84AE, 0x84AB, 0x84B9, 0x84B4, + 0x84C1, 0x84CD, 0x84AA, 0x849A, 0x84B1, 0x84D0, 0x849D, 0x84A7, + 0x84BB, 0x84A2, 0x8494, 0x84C7, 0x84CC, 0x849B, 0x84A9, 0x84AF, + 0x84A8, 0x84D6, 0x8498, 0x84B6, 0x84CF, 0x84A0, 0x84D7, 0x84D4, + 0x84D2, 0x84DB, 0x84B0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, + 0x876B, 0x8740, 0x872E, 0x871E, 0x8721, 0x8719, 0x871B, 0x8743, + 0x872C, 0x8741, 0x873E, 0x8746, 0x8720, 0x8732, 0x872A, 0x872D, + 0x873C, 0x8712, 0x873A, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727, + 0x8738, 0x8724, 0x871A, 0x8730, 0x8711, 0x88F7, 0x88E7, 0x88F1, + 0x88F2, 0x88FA, 0x88FE, 0x88EE, 0x88FC, 0x88F6, 0x88FB, 0, +plane e4 +at 0x40 + 0x88F0, 0x88EC, 0x88EB, 0x899D, 0x89A1, 0x899F, 0x899E, 0x89E9, + 0x89EB, 0x89E8, 0x8AAB, 0x8A99, 0x8A8B, 0x8A92, 0x8A8F, 0x8A96, + 0x8C3D, 0x8C68, 0x8C69, 0x8CD5, 0x8CCF, 0x8CD7, 0x8D96, 0x8E09, + 0x8E02, 0x8DFF, 0x8E0D, 0x8DFD, 0x8E0A, 0x8E03, 0x8E07, 0x8E06, + 0x8E05, 0x8DFE, 0x8E00, 0x8E04, 0x8F10, 0x8F11, 0x8F0E, 0x8F0D, + 0x9123, 0x911C, 0x9120, 0x9122, 0x911F, 0x911D, 0x911A, 0x9124, + 0x9121, 0x911B, 0x917A, 0x9172, 0x9179, 0x9173, 0x92A5, 0x92A4, + 0x9276, 0x929B, 0x927A, 0x92A0, 0x9294, 0x92AA, 0x928D, 0, +at 0xA0 + 0, 0x92A6, 0x929A, 0x92AB, 0x9279, 0x9297, 0x927F, 0x92A3, + 0x92EE, 0x928E, 0x9282, 0x9295, 0x92A2, 0x927D, 0x9288, 0x92A1, + 0x928A, 0x9286, 0x928C, 0x9299, 0x92A7, 0x927E, 0x9287, 0x92A9, + 0x929D, 0x928B, 0x922D, 0x969E, 0x96A1, 0x96FF, 0x9758, 0x977D, + 0x977A, 0x977E, 0x9783, 0x9780, 0x9782, 0x977B, 0x9784, 0x9781, + 0x977F, 0x97CE, 0x97CD, 0x9816, 0x98AD, 0x98AE, 0x9902, 0x9900, + 0x9907, 0x999D, 0x999C, 0x99C3, 0x99B9, 0x99BB, 0x99BA, 0x99C2, + 0x99BD, 0x99C7, 0x9AB1, 0x9AE3, 0x9AE7, 0x9B3E, 0x9B3F, 0x9B60, + 0x9B61, 0x9B5F, 0x9CF1, 0x9CF2, 0x9CF5, 0x9EA7, 0x50FF, 0x5103, + 0x5130, 0x50F8, 0x5106, 0x5107, 0x50F6, 0x50FE, 0x510B, 0x510C, + 0x50FD, 0x510A, 0x528B, 0x528C, 0x52F1, 0x52EF, 0x5648, 0x5642, + 0x564C, 0x5635, 0x5641, 0x564A, 0x5649, 0x5646, 0x5658, 0, +plane e5 +at 0x40 + 0x565A, 0x5640, 0x5633, 0x563D, 0x562C, 0x563E, 0x5638, 0x562A, + 0x563A, 0x571A, 0x58AB, 0x589D, 0x58B1, 0x58A0, 0x58A3, 0x58AF, + 0x58AC, 0x58A5, 0x58A1, 0x58FF, 0x5AFF, 0x5AF4, 0x5AFD, 0x5AF7, + 0x5AF6, 0x5B03, 0x5AF8, 0x5B02, 0x5AF9, 0x5B01, 0x5B07, 0x5B05, + 0x5B0F, 0x5C67, 0x5D99, 0x5D97, 0x5D9F, 0x5D92, 0x5DA2, 0x5D93, + 0x5D95, 0x5DA0, 0x5D9C, 0x5DA1, 0x5D9A, 0x5D9E, 0x5E69, 0x5E5D, + 0x5E60, 0x5E5C, 0x7DF3, 0x5EDB, 0x5EDE, 0x5EE1, 0x5F49, 0x5FB2, + 0x618B, 0x6183, 0x6179, 0x61B1, 0x61B0, 0x61A2, 0x6189, 0, +at 0xA0 + 0, 0x619B, 0x6193, 0x61AF, 0x61AD, 0x619F, 0x6192, 0x61AA, + 0x61A1, 0x618D, 0x6166, 0x61B3, 0x622D, 0x646E, 0x6470, 0x6496, + 0x64A0, 0x6485, 0x6497, 0x649C, 0x648F, 0x648B, 0x648A, 0x648C, + 0x64A3, 0x649F, 0x6468, 0x64B1, 0x6498, 0x6576, 0x657A, 0x6579, + 0x657B, 0x65B2, 0x65B3, 0x66B5, 0x66B0, 0x66A9, 0x66B2, 0x66B7, + 0x66AA, 0x66AF, 0x6A00, 0x6A06, 0x6A17, 0x69E5, 0x69F8, 0x6A15, + 0x69F1, 0x69E4, 0x6A20, 0x69FF, 0x69EC, 0x69E2, 0x6A1B, 0x6A1D, + 0x69FE, 0x6A27, 0x69F2, 0x69EE, 0x6A14, 0x69F7, 0x69E7, 0x6A40, + 0x6A08, 0x69E6, 0x69FB, 0x6A0D, 0x69FC, 0x69EB, 0x6A09, 0x6A04, + 0x6A18, 0x6A25, 0x6A0F, 0x69F6, 0x6A26, 0x6A07, 0x69F4, 0x6A16, + 0x6B51, 0x6BA5, 0x6BA3, 0x6BA2, 0x6BA6, 0x6C01, 0x6C00, 0x6BFF, + 0x6C02, 0x6F41, 0x6F26, 0x6F7E, 0x6F87, 0x6FC6, 0x6F92, 0, +plane e6 +at 0x40 + 0x6F8D, 0x6F89, 0x6F8C, 0x6F62, 0x6F4F, 0x6F85, 0x6F5A, 0x6F96, + 0x6F76, 0x6F6C, 0x6F82, 0x6F55, 0x6F72, 0x6F52, 0x6F50, 0x6F57, + 0x6F94, 0x6F93, 0x6F5D, 0x6F00, 0x6F61, 0x6F6B, 0x6F7D, 0x6F67, + 0x6F90, 0x6F53, 0x6F8B, 0x6F69, 0x6F7F, 0x6F95, 0x6F63, 0x6F77, + 0x6F6A, 0x6F7B, 0x71B2, 0x71AF, 0x719B, 0x71B0, 0x71A0, 0x719A, + 0x71A9, 0x71B5, 0x719D, 0x71A5, 0x719E, 0x71A4, 0x71A1, 0x71AA, + 0x719C, 0x71A7, 0x71B3, 0x7298, 0x729A, 0x7358, 0x7352, 0x735E, + 0x735F, 0x7360, 0x735D, 0x735B, 0x7361, 0x735A, 0x7359, 0, +at 0xA0 + 0, 0x7362, 0x7487, 0x7489, 0x748A, 0x7486, 0x7481, 0x747D, + 0x7485, 0x7488, 0x747C, 0x7479, 0x7508, 0x7507, 0x757E, 0x7625, + 0x761E, 0x7619, 0x761D, 0x761C, 0x7623, 0x761A, 0x7628, 0x761B, + 0x769C, 0x769D, 0x769E, 0x769B, 0x778D, 0x778F, 0x7789, 0x7788, + 0x78CD, 0x78BB, 0x78CF, 0x78CC, 0x78D1, 0x78CE, 0x78D4, 0x78C8, + 0x78C3, 0x78C4, 0x78C9, 0x799A, 0x79A1, 0x79A0, 0x799C, 0x79A2, + 0x799B, 0x6B76, 0x7A39, 0x7AB2, 0x7AB4, 0x7AB3, 0x7BB7, 0x7BCB, + 0x7BBE, 0x7BAC, 0x7BCE, 0x7BAF, 0x7BB9, 0x7BCA, 0x7BB5, 0x7CC5, + 0x7CC8, 0x7CCC, 0x7CCB, 0x7DF7, 0x7DDB, 0x7DEA, 0x7DE7, 0x7DD7, + 0x7DE1, 0x7E03, 0x7DFA, 0x7DE6, 0x7DF6, 0x7DF1, 0x7DF0, 0x7DEE, + 0x7DDF, 0x7F76, 0x7FAC, 0x7FB0, 0x7FAD, 0x7FED, 0x7FEB, 0x7FEA, + 0x7FEC, 0x7FE6, 0x7FE8, 0x8064, 0x8067, 0x81A3, 0x819F, 0, +plane e7 +at 0x40 + 0x819E, 0x8195, 0x81A2, 0x8199, 0x8197, 0x8216, 0x824F, 0x8253, + 0x8252, 0x8250, 0x824E, 0x8251, 0x8524, 0x853B, 0x850F, 0x8500, + 0x8529, 0x850E, 0x8509, 0x850D, 0x851F, 0x850A, 0x8527, 0x851C, + 0x84FB, 0x852B, 0x84FA, 0x8508, 0x850C, 0x84F4, 0x852A, 0x84F2, + 0x8515, 0x84F7, 0x84EB, 0x84F3, 0x84FC, 0x8512, 0x84EA, 0x84E9, + 0x8516, 0x84FE, 0x8528, 0x851D, 0x852E, 0x8502, 0x84FD, 0x851E, + 0x84F6, 0x8531, 0x8526, 0x84E7, 0x84E8, 0x84F0, 0x84EF, 0x84F9, + 0x8518, 0x8520, 0x8530, 0x850B, 0x8519, 0x852F, 0x8662, 0, +at 0xA0 + 0, 0x8756, 0x8763, 0x8764, 0x8777, 0x87E1, 0x8773, 0x8758, + 0x8754, 0x875B, 0x8752, 0x8761, 0x875A, 0x8751, 0x875E, 0x876D, + 0x876A, 0x8750, 0x874E, 0x875F, 0x875D, 0x876F, 0x876C, 0x877A, + 0x876E, 0x875C, 0x8765, 0x874F, 0x877B, 0x8775, 0x8762, 0x8767, + 0x8769, 0x885A, 0x8905, 0x890C, 0x8914, 0x890B, 0x8917, 0x8918, + 0x8919, 0x8906, 0x8916, 0x8911, 0x890E, 0x8909, 0x89A2, 0x89A4, + 0x89A3, 0x89ED, 0x89F0, 0x89EC, 0x8ACF, 0x8AC6, 0x8AB8, 0x8AD3, + 0x8AD1, 0x8AD4, 0x8AD5, 0x8ABB, 0x8AD7, 0x8ABE, 0x8AC0, 0x8AC5, + 0x8AD8, 0x8AC3, 0x8ABA, 0x8ABD, 0x8AD9, 0x8C3E, 0x8C4D, 0x8C8F, + 0x8CE5, 0x8CDF, 0x8CD9, 0x8CE8, 0x8CDA, 0x8CDD, 0x8CE7, 0x8DA0, + 0x8D9C, 0x8DA1, 0x8D9B, 0x8E20, 0x8E23, 0x8E25, 0x8E24, 0x8E2E, + 0x8E15, 0x8E1B, 0x8E16, 0x8E11, 0x8E19, 0x8E26, 0x8E27, 0, +plane e8 +at 0x40 + 0x8E14, 0x8E12, 0x8E18, 0x8E13, 0x8E1C, 0x8E17, 0x8E1A, 0x8F2C, + 0x8F24, 0x8F18, 0x8F1A, 0x8F20, 0x8F23, 0x8F16, 0x8F17, 0x9073, + 0x9070, 0x906F, 0x9067, 0x906B, 0x912F, 0x912B, 0x9129, 0x912A, + 0x9132, 0x9126, 0x912E, 0x9185, 0x9186, 0x918A, 0x9181, 0x9182, + 0x9184, 0x9180, 0x92D0, 0x92C3, 0x92C4, 0x92C0, 0x92D9, 0x92B6, + 0x92CF, 0x92F1, 0x92DF, 0x92D8, 0x92E9, 0x92D7, 0x92DD, 0x92CC, + 0x92EF, 0x92C2, 0x92E8, 0x92CA, 0x92C8, 0x92CE, 0x92E6, 0x92CD, + 0x92D5, 0x92C9, 0x92E0, 0x92DE, 0x92E7, 0x92D1, 0x92D3, 0, +at 0xA0 + 0, 0x92B5, 0x92E1, 0x92C6, 0x92B4, 0x957C, 0x95AC, 0x95AB, + 0x95AE, 0x95B0, 0x96A4, 0x96A2, 0x96D3, 0x9705, 0x9708, 0x9702, + 0x975A, 0x978A, 0x978E, 0x9788, 0x97D0, 0x97CF, 0x981E, 0x981D, + 0x9826, 0x9829, 0x9828, 0x9820, 0x981B, 0x9827, 0x98B2, 0x9908, + 0x98FA, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99DC, 0x99CD, + 0x99CF, 0x99D3, 0x99D4, 0x99CE, 0x99C9, 0x99D6, 0x99D8, 0x99CB, + 0x99D7, 0x99CC, 0x9AB3, 0x9AEC, 0x9AEB, 0x9AF3, 0x9AF2, 0x9AF1, + 0x9B46, 0x9B43, 0x9B67, 0x9B74, 0x9B71, 0x9B66, 0x9B76, 0x9B75, + 0x9B70, 0x9B68, 0x9B64, 0x9B6C, 0x9CFC, 0x9CFA, 0x9CFD, 0x9CFF, + 0x9CF7, 0x9D07, 0x9D00, 0x9CF9, 0x9CFB, 0x9D08, 0x9D05, 0x9D04, + 0x9E83, 0x9ED3, 0x9F0F, 0x9F10, 0x511C, 0x5113, 0x5117, 0x511A, + 0x5111, 0x51DE, 0x5334, 0x53E1, 0x5670, 0x5660, 0x566E, 0, +plane e9 +at 0x40 + 0x5673, 0x5666, 0x5663, 0x566D, 0x5672, 0x565E, 0x5677, 0x571C, + 0x571B, 0x58C8, 0x58BD, 0x58C9, 0x58BF, 0x58BA, 0x58C2, 0x58BC, + 0x58C6, 0x5B17, 0x5B19, 0x5B1B, 0x5B21, 0x5B14, 0x5B13, 0x5B10, + 0x5B16, 0x5B28, 0x5B1A, 0x5B20, 0x5B1E, 0x5BEF, 0x5DAC, 0x5DB1, + 0x5DA9, 0x5DA7, 0x5DB5, 0x5DB0, 0x5DAE, 0x5DAA, 0x5DA8, 0x5DB2, + 0x5DAD, 0x5DAF, 0x5DB4, 0x5E67, 0x5E68, 0x5E66, 0x5E6F, 0x5EE9, + 0x5EE7, 0x5EE6, 0x5EE8, 0x5EE5, 0x5F4B, 0x5FBC, 0x619D, 0x61A8, + 0x6196, 0x61C5, 0x61B4, 0x61C6, 0x61C1, 0x61CC, 0x61BA, 0, +at 0xA0 + 0, 0x61BF, 0x61B8, 0x618C, 0x64D7, 0x64D6, 0x64D0, 0x64CF, + 0x64C9, 0x64BD, 0x6489, 0x64C3, 0x64DB, 0x64F3, 0x64D9, 0x6533, + 0x657F, 0x657C, 0x65A2, 0x66C8, 0x66BE, 0x66C0, 0x66CA, 0x66CB, + 0x66CF, 0x66BD, 0x66BB, 0x66BA, 0x66CC, 0x6723, 0x6A34, 0x6A66, + 0x6A49, 0x6A67, 0x6A32, 0x6A68, 0x6A3E, 0x6A5D, 0x6A6D, 0x6A76, + 0x6A5B, 0x6A51, 0x6A28, 0x6A5A, 0x6A3B, 0x6A3F, 0x6A41, 0x6A6A, + 0x6A64, 0x6A50, 0x6A4F, 0x6A54, 0x6A6F, 0x6A69, 0x6A60, 0x6A3C, + 0x6A5E, 0x6A56, 0x6A55, 0x6A4D, 0x6A4E, 0x6A46, 0x6B55, 0x6B54, + 0x6B56, 0x6BA7, 0x6BAA, 0x6BAB, 0x6BC8, 0x6BC7, 0x6C04, 0x6C03, + 0x6C06, 0x6FAD, 0x6FCB, 0x6FA3, 0x6FC7, 0x6FBC, 0x6FCE, 0x6FC8, + 0x6F5E, 0x6FC4, 0x6FBD, 0x6F9E, 0x6FCA, 0x6FA8, 0x7004, 0x6FA5, + 0x6FAE, 0x6FBA, 0x6FAC, 0x6FAA, 0x6FCF, 0x6FBF, 0x6FB8, 0, +plane ea +at 0x40 + 0x6FA2, 0x6FC9, 0x6FAB, 0x6FCD, 0x6FAF, 0x6FB2, 0x6FB0, 0x71C5, + 0x71C2, 0x71BF, 0x71B8, 0x71D6, 0x71C0, 0x71C1, 0x71CB, 0x71D4, + 0x71CA, 0x71C7, 0x71CF, 0x71BD, 0x71D8, 0x71BC, 0x71C6, 0x71DA, + 0x71DB, 0x729D, 0x729E, 0x7369, 0x7366, 0x7367, 0x736C, 0x7365, + 0x736B, 0x736A, 0x747F, 0x749A, 0x74A0, 0x7494, 0x7492, 0x7495, + 0x74A1, 0x750B, 0x7580, 0x762F, 0x762D, 0x7631, 0x763D, 0x7633, + 0x763C, 0x7635, 0x7632, 0x7630, 0x76BB, 0x76E6, 0x779A, 0x779D, + 0x77A1, 0x779C, 0x779B, 0x77A2, 0x77A3, 0x7795, 0x7799, 0, +at 0xA0 + 0, 0x7797, 0x78DD, 0x78E9, 0x78E5, 0x78EA, 0x78DE, 0x78E3, + 0x78DB, 0x78E1, 0x78E2, 0x78ED, 0x78DF, 0x78E0, 0x79A4, 0x7A44, + 0x7A48, 0x7A47, 0x7AB6, 0x7AB8, 0x7AB5, 0x7AB1, 0x7AB7, 0x7BDE, + 0x7BE3, 0x7BE7, 0x7BDD, 0x7BD5, 0x7BE5, 0x7BDA, 0x7BE8, 0x7BF9, + 0x7BD4, 0x7BEA, 0x7BE2, 0x7BDC, 0x7BEB, 0x7BD8, 0x7BDF, 0x7CD2, + 0x7CD4, 0x7CD7, 0x7CD0, 0x7CD1, 0x7E12, 0x7E21, 0x7E17, 0x7E0C, + 0x7E1F, 0x7E20, 0x7E13, 0x7E0E, 0x7E1C, 0x7E15, 0x7E1A, 0x7E22, + 0x7E0B, 0x7E0F, 0x7E16, 0x7E0D, 0x7E14, 0x7E25, 0x7E24, 0x7F43, + 0x7F7B, 0x7F7C, 0x7F7A, 0x7FB1, 0x7FEF, 0x802A, 0x8029, 0x806C, + 0x81B1, 0x81A6, 0x81AE, 0x81B9, 0x81B5, 0x81AB, 0x81B0, 0x81AC, + 0x81B4, 0x81B2, 0x81B7, 0x81A7, 0x81F2, 0x8255, 0x8256, 0x8257, + 0x8556, 0x8545, 0x856B, 0x854D, 0x8553, 0x8561, 0x8558, 0, +plane eb +at 0x40 + 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547, + 0x8563, 0x853E, 0x855B, 0x8571, 0x854E, 0x856E, 0x8575, 0x8555, + 0x8567, 0x8560, 0x858C, 0x8566, 0x855D, 0x8554, 0x8565, 0x856C, + 0x8663, 0x8665, 0x8664, 0x879B, 0x878F, 0x8797, 0x8793, 0x8792, + 0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87A3, 0x8785, + 0x8790, 0x8791, 0x879D, 0x8784, 0x8794, 0x879C, 0x879A, 0x8789, + 0x891E, 0x8926, 0x8930, 0x892D, 0x892E, 0x8927, 0x8931, 0x8922, + 0x8929, 0x8923, 0x892F, 0x892C, 0x891F, 0x89F1, 0x8AE0, 0, +at 0xA0 + 0, 0x8AE2, 0x8AF2, 0x8AF4, 0x8AF5, 0x8ADD, 0x8B14, 0x8AE4, + 0x8ADF, 0x8AF0, 0x8AC8, 0x8ADE, 0x8AE1, 0x8AE8, 0x8AFF, 0x8AEF, + 0x8AFB, 0x8C91, 0x8C92, 0x8C90, 0x8CF5, 0x8CEE, 0x8CF1, 0x8CF0, + 0x8CF3, 0x8D6C, 0x8D6E, 0x8DA5, 0x8DA7, 0x8E33, 0x8E3E, 0x8E38, + 0x8E40, 0x8E45, 0x8E36, 0x8E3C, 0x8E3D, 0x8E41, 0x8E30, 0x8E3F, + 0x8EBD, 0x8F36, 0x8F2E, 0x8F35, 0x8F32, 0x8F39, 0x8F37, 0x8F34, + 0x9076, 0x9079, 0x907B, 0x9086, 0x90FA, 0x9133, 0x9135, 0x9136, + 0x9193, 0x9190, 0x9191, 0x918D, 0x918F, 0x9327, 0x931E, 0x9308, + 0x931F, 0x9306, 0x930F, 0x937A, 0x9338, 0x933C, 0x931B, 0x9323, + 0x9312, 0x9301, 0x9346, 0x932D, 0x930E, 0x930D, 0x92CB, 0x931D, + 0x92FA, 0x9325, 0x9313, 0x92F9, 0x92F7, 0x9334, 0x9302, 0x9324, + 0x92FF, 0x9329, 0x9339, 0x9335, 0x932A, 0x9314, 0x930C, 0, +plane ec +at 0x40 + 0x930B, 0x92FE, 0x9309, 0x9300, 0x92FB, 0x9316, 0x95BC, 0x95CD, + 0x95BE, 0x95B9, 0x95BA, 0x95B6, 0x95BF, 0x95B5, 0x95BD, 0x96A9, + 0x96D4, 0x970B, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97F0, + 0x97F8, 0x9835, 0x982F, 0x9832, 0x9924, 0x991F, 0x9927, 0x9929, + 0x999E, 0x99EE, 0x99EC, 0x99E5, 0x99E4, 0x99F0, 0x99E3, 0x99EA, + 0x99E9, 0x99E7, 0x9AB9, 0x9ABF, 0x9AB4, 0x9ABB, 0x9AF6, 0x9AFA, + 0x9AF9, 0x9AF7, 0x9B33, 0x9B80, 0x9B85, 0x9B87, 0x9B7C, 0x9B7E, + 0x9B7B, 0x9B82, 0x9B93, 0x9B92, 0x9B90, 0x9B7A, 0x9B95, 0, +at 0xA0 + 0, 0x9B7D, 0x9B88, 0x9D25, 0x9D17, 0x9D20, 0x9D1E, 0x9D14, + 0x9D29, 0x9D1D, 0x9D18, 0x9D22, 0x9D10, 0x9D19, 0x9D1F, 0x9E88, + 0x9E86, 0x9E87, 0x9EAE, 0x9EAD, 0x9ED5, 0x9ED6, 0x9EFA, 0x9F12, + 0x9F3D, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129, 0x52F4, + 0x5693, 0x568C, 0x568D, 0x5686, 0x5684, 0x5683, 0x567E, 0x5682, + 0x567F, 0x5681, 0x58D6, 0x58D4, 0x58CF, 0x58D2, 0x5B2D, 0x5B25, + 0x5B32, 0x5B23, 0x5B2C, 0x5B27, 0x5B26, 0x5B2F, 0x5B2E, 0x5B7B, + 0x5BF1, 0x5BF2, 0x5DB7, 0x5E6C, 0x5E6A, 0x5FBE, 0x5FBB, 0x61C3, + 0x61B5, 0x61BC, 0x61E7, 0x61E0, 0x61E5, 0x61E4, 0x61E8, 0x61DE, + 0x64EF, 0x64E9, 0x64E3, 0x64EB, 0x64E4, 0x64E8, 0x6581, 0x6580, + 0x65B6, 0x65DA, 0x66D2, 0x6A8D, 0x6A96, 0x6A81, 0x6AA5, 0x6A89, + 0x6A9F, 0x6A9B, 0x6AA1, 0x6A9E, 0x6A87, 0x6A93, 0x6A8E, 0, +plane ed +at 0x40 + 0x6A95, 0x6A83, 0x6AA8, 0x6AA4, 0x6A91, 0x6A7F, 0x6AA6, 0x6A9A, + 0x6A85, 0x6A8C, 0x6A92, 0x6B5B, 0x6BAD, 0x6C09, 0x6FCC, 0x6FA9, + 0x6FF4, 0x6FD4, 0x6FE3, 0x6FDC, 0x6FED, 0x6FE7, 0x6FE6, 0x6FDE, + 0x6FF2, 0x6FDD, 0x6FE2, 0x6FE8, 0x71E1, 0x71F1, 0x71E8, 0x71F2, + 0x71E4, 0x71F0, 0x71E2, 0x7373, 0x736E, 0x736F, 0x7497, 0x74B2, + 0x74AB, 0x7490, 0x74AA, 0x74AD, 0x74B1, 0x74A5, 0x74AF, 0x7510, + 0x7511, 0x7512, 0x750F, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647, + 0x76A4, 0x76E9, 0x77B5, 0x77AB, 0x77B2, 0x77B7, 0x77B6, 0, +at 0xA0 + 0, 0x77B4, 0x77B1, 0x77A8, 0x77F0, 0x78F3, 0x78FD, 0x7902, + 0x78FB, 0x78FC, 0x78F2, 0x7905, 0x78F9, 0x78FE, 0x7904, 0x79AB, + 0x79A8, 0x7A5C, 0x7A5B, 0x7A56, 0x7A58, 0x7A54, 0x7A5A, 0x7ABE, + 0x7AC0, 0x7AC1, 0x7C05, 0x7C0F, 0x7BF2, 0x7C00, 0x7BFF, 0x7BFB, + 0x7C0E, 0x7BF4, 0x7C0B, 0x7BF3, 0x7C02, 0x7C09, 0x7C03, 0x7C01, + 0x7BF8, 0x7BFD, 0x7C06, 0x7BF0, 0x7BF1, 0x7C10, 0x7C0A, 0x7CE8, + 0x7E2D, 0x7E3C, 0x7E42, 0x7E33, 0x9848, 0x7E38, 0x7E2A, 0x7E49, + 0x7E40, 0x7E47, 0x7E29, 0x7E4C, 0x7E30, 0x7E3B, 0x7E36, 0x7E44, + 0x7E3A, 0x7F45, 0x7F7F, 0x7F7E, 0x7F7D, 0x7FF4, 0x7FF2, 0x802C, + 0x81BB, 0x81C4, 0x81CC, 0x81CA, 0x81C5, 0x81C7, 0x81BC, 0x81E9, + 0x825B, 0x825A, 0x825C, 0x8583, 0x8580, 0x858F, 0x85A7, 0x8595, + 0x85A0, 0x858B, 0x85A3, 0x857B, 0x85A4, 0x859A, 0x859E, 0, +plane ee +at 0x40 + 0x8577, 0x857C, 0x8589, 0x85A1, 0x857A, 0x8578, 0x8557, 0x858E, + 0x8596, 0x8586, 0x858D, 0x8599, 0x859D, 0x8581, 0x85A2, 0x8582, + 0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859F, 0x8668, + 0x87BE, 0x87AA, 0x87AD, 0x87C5, 0x87B0, 0x87AC, 0x87B9, 0x87B5, + 0x87BC, 0x87AE, 0x87C9, 0x87C3, 0x87C2, 0x87CC, 0x87B7, 0x87AF, + 0x87C4, 0x87CA, 0x87B4, 0x87B6, 0x87BF, 0x87B8, 0x87BD, 0x87DE, + 0x87B2, 0x8935, 0x8933, 0x893C, 0x893E, 0x8941, 0x8952, 0x8937, + 0x8942, 0x89AD, 0x89AF, 0x89AE, 0x89F2, 0x89F3, 0x8B1E, 0, +at 0xA0 + 0, 0x8B18, 0x8B16, 0x8B11, 0x8B05, 0x8B0B, 0x8B22, 0x8B0F, + 0x8B12, 0x8B15, 0x8B07, 0x8B0D, 0x8B08, 0x8B06, 0x8B1C, 0x8B13, + 0x8B1A, 0x8C4F, 0x8C70, 0x8C72, 0x8C71, 0x8C6F, 0x8C95, 0x8C94, + 0x8CF9, 0x8D6F, 0x8E4E, 0x8E4D, 0x8E53, 0x8E50, 0x8E4C, 0x8E47, + 0x8F43, 0x8F40, 0x9085, 0x907E, 0x9138, 0x919A, 0x91A2, 0x919B, + 0x9199, 0x919F, 0x91A1, 0x919D, 0x91A0, 0x93A1, 0x9383, 0x93AF, + 0x9364, 0x9356, 0x9347, 0x937C, 0x9358, 0x935C, 0x9376, 0x9349, + 0x9350, 0x9351, 0x9360, 0x936D, 0x938F, 0x934C, 0x936A, 0x9379, + 0x9357, 0x9355, 0x9352, 0x934F, 0x9371, 0x9377, 0x937B, 0x9361, + 0x935E, 0x9363, 0x9367, 0x9380, 0x934E, 0x9359, 0x95C7, 0x95C0, + 0x95C9, 0x95C3, 0x95C5, 0x95B7, 0x96AE, 0x96B0, 0x96AC, 0x9720, + 0x971F, 0x9718, 0x971D, 0x9719, 0x979A, 0x97A1, 0x979C, 0, +plane ef +at 0x40 + 0x979E, 0x979D, 0x97D5, 0x97D4, 0x97F1, 0x9841, 0x9844, 0x984A, + 0x9849, 0x9845, 0x9843, 0x9925, 0x992B, 0x992C, 0x992A, 0x9933, + 0x9932, 0x992F, 0x992D, 0x9931, 0x9930, 0x9998, 0x99A3, 0x99A1, + 0x9A02, 0x99FA, 0x99F4, 0x99F7, 0x99F9, 0x99F8, 0x99F6, 0x99FB, + 0x99FD, 0x99FE, 0x99FC, 0x9A03, 0x9ABE, 0x9AFE, 0x9AFD, 0x9B01, + 0x9AFC, 0x9B48, 0x9B9A, 0x9BA8, 0x9B9E, 0x9B9B, 0x9BA6, 0x9BA1, + 0x9BA5, 0x9BA4, 0x9B86, 0x9BA2, 0x9BA0, 0x9BAF, 0x9D33, 0x9D41, + 0x9D67, 0x9D36, 0x9D2E, 0x9D2F, 0x9D31, 0x9D38, 0x9D30, 0, +at 0xA0 + 0, 0x9D45, 0x9D42, 0x9D43, 0x9D3E, 0x9D37, 0x9D40, 0x9D3D, + 0x7FF5, 0x9D2D, 0x9E8A, 0x9E89, 0x9E8D, 0x9EB0, 0x9EC8, 0x9EDA, + 0x9EFB, 0x9EFF, 0x9F24, 0x9F23, 0x9F22, 0x9F54, 0x9FA0, 0x5131, + 0x512D, 0x512E, 0x5698, 0x569C, 0x5697, 0x569A, 0x569D, 0x5699, + 0x5970, 0x5B3C, 0x5C69, 0x5C6A, 0x5DC0, 0x5E6D, 0x5E6E, 0x61D8, + 0x61DF, 0x61ED, 0x61EE, 0x61F1, 0x61EA, 0x61F0, 0x61EB, 0x61D6, + 0x61E9, 0x64FF, 0x6504, 0x64FD, 0x64F8, 0x6501, 0x6503, 0x64FC, + 0x6594, 0x65DB, 0x66DA, 0x66DB, 0x66D8, 0x6AC5, 0x6AB9, 0x6ABD, + 0x6AE1, 0x6AC6, 0x6ABA, 0x6AB6, 0x6AB7, 0x6AC7, 0x6AB4, 0x6AAD, + 0x6B5E, 0x6BC9, 0x6C0B, 0x7007, 0x700C, 0x700D, 0x7001, 0x7005, + 0x7014, 0x700E, 0x6FFF, 0x7000, 0x6FFB, 0x7026, 0x6FFC, 0x6FF7, + 0x700A, 0x7201, 0x71FF, 0x71F9, 0x7203, 0x71FD, 0x7376, 0, +plane f0 +at 0x40 + 0x74B8, 0x74C0, 0x74B5, 0x74C1, 0x74BE, 0x74B6, 0x74BB, 0x74C2, + 0x7514, 0x7513, 0x765C, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657, + 0x765A, 0x76A6, 0x76BD, 0x76EC, 0x77C2, 0x77BA, 0x78FF, 0x790C, + 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, 0x79AD, 0x79AC, + 0x7A5F, 0x7C1C, 0x7C29, 0x7C19, 0x7C20, 0x7C1F, 0x7C2D, 0x7C1D, + 0x7C26, 0x7C28, 0x7C22, 0x7C25, 0x7C30, 0x7E5C, 0x7E50, 0x7E56, + 0x7E63, 0x7E58, 0x7E62, 0x7E5F, 0x7E51, 0x7E60, 0x7E57, 0x7E53, + 0x7FB5, 0x7FB3, 0x7FF7, 0x7FF8, 0x8075, 0x81D1, 0x81D2, 0, +at 0xA0 + 0, 0x81D0, 0x825F, 0x825E, 0x85B4, 0x85C6, 0x85C0, 0x85C3, + 0x85C2, 0x85B3, 0x85B5, 0x85BD, 0x85C7, 0x85C4, 0x85BF, 0x85CB, + 0x85CE, 0x85C8, 0x85C5, 0x85B1, 0x85B6, 0x85D2, 0x8624, 0x85B8, + 0x85B7, 0x85BE, 0x8669, 0x87E7, 0x87E6, 0x87E2, 0x87DB, 0x87EB, + 0x87EA, 0x87E5, 0x87DF, 0x87F3, 0x87E4, 0x87D4, 0x87DC, 0x87D3, + 0x87ED, 0x87D8, 0x87E3, 0x87A4, 0x87D7, 0x87D9, 0x8801, 0x87F4, + 0x87E8, 0x87DD, 0x8953, 0x894B, 0x894F, 0x894C, 0x8946, 0x8950, + 0x8951, 0x8949, 0x8B2A, 0x8B27, 0x8B23, 0x8B33, 0x8B30, 0x8B35, + 0x8B47, 0x8B2F, 0x8B3C, 0x8B3E, 0x8B31, 0x8B25, 0x8B37, 0x8B26, + 0x8B36, 0x8B2E, 0x8B24, 0x8B3B, 0x8B3D, 0x8B3A, 0x8C42, 0x8C75, + 0x8C99, 0x8C98, 0x8C97, 0x8CFE, 0x8D04, 0x8D02, 0x8D00, 0x8E5C, + 0x8E62, 0x8E60, 0x8E57, 0x8E56, 0x8E5E, 0x8E65, 0x8E67, 0, +plane f1 +at 0x40 + 0x8E5B, 0x8E5A, 0x8E61, 0x8E5D, 0x8E69, 0x8E54, 0x8F46, 0x8F47, + 0x8F48, 0x8F4B, 0x9128, 0x913A, 0x913B, 0x913E, 0x91A8, 0x91A5, + 0x91A7, 0x91AF, 0x91AA, 0x93B5, 0x938C, 0x9392, 0x93B7, 0x939B, + 0x939D, 0x9389, 0x93A7, 0x938E, 0x93AA, 0x939E, 0x93A6, 0x9395, + 0x9388, 0x9399, 0x939F, 0x938D, 0x93B1, 0x9391, 0x93B2, 0x93A4, + 0x93A8, 0x93B4, 0x93A3, 0x93A5, 0x95D2, 0x95D3, 0x95D1, 0x96B3, + 0x96D7, 0x96DA, 0x5DC2, 0x96DF, 0x96D8, 0x96DD, 0x9723, 0x9722, + 0x9725, 0x97AC, 0x97AE, 0x97A8, 0x97AB, 0x97A4, 0x97AA, 0, +at 0xA0 + 0, 0x97A2, 0x97A5, 0x97D7, 0x97D9, 0x97D6, 0x97D8, 0x97FA, + 0x9850, 0x9851, 0x9852, 0x98B8, 0x9941, 0x993C, 0x993A, 0x9A0F, + 0x9A0B, 0x9A09, 0x9A0D, 0x9A04, 0x9A11, 0x9A0A, 0x9A05, 0x9A07, + 0x9A06, 0x9AC0, 0x9ADC, 0x9B08, 0x9B04, 0x9B05, 0x9B29, 0x9B35, + 0x9B4A, 0x9B4C, 0x9B4B, 0x9BC7, 0x9BC6, 0x9BC3, 0x9BBF, 0x9BC1, + 0x9BB5, 0x9BB8, 0x9BD3, 0x9BB6, 0x9BC4, 0x9BB9, 0x9BBD, 0x9D5C, + 0x9D53, 0x9D4F, 0x9D4A, 0x9D5B, 0x9D4B, 0x9D59, 0x9D56, 0x9D4C, + 0x9D57, 0x9D52, 0x9D54, 0x9D5F, 0x9D58, 0x9D5A, 0x9E8E, 0x9E8C, + 0x9EDF, 0x9F01, 0x9F00, 0x9F16, 0x9F25, 0x9F2B, 0x9F2A, 0x9F29, + 0x9F28, 0x9F4C, 0x9F55, 0x5134, 0x5135, 0x5296, 0x52F7, 0x53B4, + 0x56AB, 0x56AD, 0x56A6, 0x56A7, 0x56AA, 0x56AC, 0x58DA, 0x58DD, + 0x58DB, 0x5912, 0x5B3D, 0x5B3E, 0x5B3F, 0x5DC3, 0x5E70, 0, +plane f2 +at 0x40 + 0x5FBF, 0x61FB, 0x6507, 0x6510, 0x650D, 0x6509, 0x650C, 0x650E, + 0x6584, 0x65DE, 0x65DD, 0x66DE, 0x6AE7, 0x6AE0, 0x6ACC, 0x6AD1, + 0x6AD9, 0x6ACB, 0x6ADF, 0x6ADC, 0x6AD0, 0x6AEB, 0x6ACF, 0x6ACD, + 0x6ADE, 0x6B60, 0x6BB0, 0x6C0C, 0x7019, 0x7027, 0x7020, 0x7016, + 0x702B, 0x7021, 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701C, + 0x702A, 0x720C, 0x720A, 0x7207, 0x7202, 0x7205, 0x72A5, 0x72A6, + 0x72A4, 0x72A3, 0x72A1, 0x74CB, 0x74C5, 0x74B7, 0x74C3, 0x7516, + 0x7660, 0x77C9, 0x77CA, 0x77C4, 0x77F1, 0x791D, 0x791B, 0, +at 0xA0 + 0, 0x7921, 0x791C, 0x7917, 0x791E, 0x79B0, 0x7A67, 0x7A68, + 0x7C33, 0x7C3C, 0x7C39, 0x7C2C, 0x7C3B, 0x7CEC, 0x7CEA, 0x7E76, + 0x7E75, 0x7E78, 0x7E70, 0x7E77, 0x7E6F, 0x7E7A, 0x7E72, 0x7E74, + 0x7E68, 0x7F4B, 0x7F4A, 0x7F83, 0x7F86, 0x7FB7, 0x7FFD, 0x7FFE, + 0x8078, 0x81D7, 0x81D5, 0x8264, 0x8261, 0x8263, 0x85EB, 0x85F1, + 0x85ED, 0x85D9, 0x85E1, 0x85E8, 0x85DA, 0x85D7, 0x85EC, 0x85F2, + 0x85F8, 0x85D8, 0x85DF, 0x85E3, 0x85DC, 0x85D1, 0x85F0, 0x85E6, + 0x85EF, 0x85DE, 0x85E2, 0x8800, 0x87FA, 0x8803, 0x87F6, 0x87F7, + 0x8809, 0x880C, 0x880B, 0x8806, 0x87FC, 0x8808, 0x87FF, 0x880A, + 0x8802, 0x8962, 0x895A, 0x895B, 0x8957, 0x8961, 0x895C, 0x8958, + 0x895D, 0x8959, 0x8988, 0x89B7, 0x89B6, 0x89F6, 0x8B50, 0x8B48, + 0x8B4A, 0x8B40, 0x8B53, 0x8B56, 0x8B54, 0x8B4B, 0x8B55, 0, +plane f3 +at 0x40 + 0x8B51, 0x8B42, 0x8B52, 0x8B57, 0x8C43, 0x8C77, 0x8C76, 0x8C9A, + 0x8D06, 0x8D07, 0x8D09, 0x8DAC, 0x8DAA, 0x8DAD, 0x8DAB, 0x8E6D, + 0x8E78, 0x8E73, 0x8E6A, 0x8E6F, 0x8E7B, 0x8EC2, 0x8F52, 0x8F51, + 0x8F4F, 0x8F50, 0x8F53, 0x8FB4, 0x9140, 0x913F, 0x91B0, 0x91AD, + 0x93DE, 0x93C7, 0x93CF, 0x93C2, 0x93DA, 0x93D0, 0x93F9, 0x93EC, + 0x93CC, 0x93D9, 0x93A9, 0x93E6, 0x93CA, 0x93D4, 0x93EE, 0x93E3, + 0x93D5, 0x93C4, 0x93CE, 0x93C0, 0x93D2, 0x93E7, 0x957D, 0x95DA, + 0x95DB, 0x96E1, 0x9729, 0x972B, 0x972C, 0x9728, 0x9726, 0, +at 0xA0 + 0, 0x97B3, 0x97B7, 0x97B6, 0x97DD, 0x97DE, 0x97DF, 0x985C, + 0x9859, 0x985D, 0x9857, 0x98BF, 0x98BD, 0x98BB, 0x98BE, 0x9948, + 0x9947, 0x9943, 0x99A6, 0x99A7, 0x9A1A, 0x9A15, 0x9A25, 0x9A1D, + 0x9A24, 0x9A1B, 0x9A22, 0x9A20, 0x9A27, 0x9A23, 0x9A1E, 0x9A1C, + 0x9A14, 0x9AC2, 0x9B0B, 0x9B0A, 0x9B0E, 0x9B0C, 0x9B37, 0x9BEA, + 0x9BEB, 0x9BE0, 0x9BDE, 0x9BE4, 0x9BE6, 0x9BE2, 0x9BF0, 0x9BD4, + 0x9BD7, 0x9BEC, 0x9BDC, 0x9BD9, 0x9BE5, 0x9BD5, 0x9BE1, 0x9BDA, + 0x9D77, 0x9D81, 0x9D8A, 0x9D84, 0x9D88, 0x9D71, 0x9D80, 0x9D78, + 0x9D86, 0x9D8B, 0x9D8C, 0x9D7D, 0x9D6B, 0x9D74, 0x9D75, 0x9D70, + 0x9D69, 0x9D85, 0x9D73, 0x9D7B, 0x9D82, 0x9D6F, 0x9D79, 0x9D7F, + 0x9D87, 0x9D68, 0x9E94, 0x9E91, 0x9EC0, 0x9EFC, 0x9F2D, 0x9F40, + 0x9F41, 0x9F4D, 0x9F56, 0x9F57, 0x9F58, 0x5337, 0x56B2, 0, +plane f4 +at 0x40 + 0x56B5, 0x56B3, 0x58E3, 0x5B45, 0x5DC6, 0x5DC7, 0x5EEE, 0x5EEF, + 0x5FC0, 0x5FC1, 0x61F9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65DF, + 0x66E8, 0x66E3, 0x66E4, 0x6AF3, 0x6AF0, 0x6AEA, 0x6AE8, 0x6AF9, + 0x6AF1, 0x6AEE, 0x6AEF, 0x703C, 0x7035, 0x702F, 0x7037, 0x7034, + 0x7031, 0x7042, 0x7038, 0x703F, 0x703A, 0x7039, 0x7040, 0x703B, + 0x7033, 0x7041, 0x7213, 0x7214, 0x72A8, 0x737D, 0x737C, 0x74BA, + 0x76AB, 0x76AA, 0x76BE, 0x76ED, 0x77CC, 0x77CE, 0x77CF, 0x77CD, + 0x77F2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, 0, +at 0xA0 + 0, 0x79B2, 0x7A6E, 0x7A6C, 0x7A6D, 0x7AF7, 0x7C49, 0x7C48, + 0x7C4A, 0x7C47, 0x7C45, 0x7CEE, 0x7E7B, 0x7E7E, 0x7E81, 0x7E80, + 0x7FBA, 0x7FFF, 0x8079, 0x81DB, 0x81D9, 0x820B, 0x8268, 0x8269, + 0x8622, 0x85FF, 0x8601, 0x85FE, 0x861B, 0x8600, 0x85F6, 0x8604, + 0x8609, 0x8605, 0x860C, 0x85FD, 0x8819, 0x8810, 0x8811, 0x8817, + 0x8813, 0x8816, 0x8963, 0x8966, 0x89B9, 0x89F7, 0x8B60, 0x8B6A, + 0x8B5D, 0x8B68, 0x8B63, 0x8B65, 0x8B67, 0x8B6D, 0x8DAE, 0x8E86, + 0x8E88, 0x8E84, 0x8F59, 0x8F56, 0x8F57, 0x8F55, 0x8F58, 0x8F5A, + 0x908D, 0x9143, 0x9141, 0x91B7, 0x91B5, 0x91B2, 0x91B3, 0x940B, + 0x9413, 0x93FB, 0x9420, 0x940F, 0x9414, 0x93FE, 0x9415, 0x9410, + 0x9428, 0x9419, 0x940D, 0x93F5, 0x9400, 0x93F7, 0x9407, 0x940E, + 0x9416, 0x9412, 0x93FA, 0x9409, 0x93F8, 0x940A, 0x93FF, 0, +plane f5 +at 0x40 + 0x93FC, 0x940C, 0x93F6, 0x9411, 0x9406, 0x95DE, 0x95E0, 0x95DF, + 0x972E, 0x972F, 0x97B9, 0x97BB, 0x97FD, 0x97FE, 0x9860, 0x9862, + 0x9863, 0x985F, 0x98C1, 0x98C2, 0x9950, 0x994E, 0x9959, 0x994C, + 0x994B, 0x9953, 0x9A32, 0x9A34, 0x9A31, 0x9A2C, 0x9A2A, 0x9A36, + 0x9A29, 0x9A2E, 0x9A38, 0x9A2D, 0x9AC7, 0x9ACA, 0x9AC6, 0x9B10, + 0x9B12, 0x9B11, 0x9C0B, 0x9C08, 0x9BF7, 0x9C05, 0x9C12, 0x9BF8, + 0x9C40, 0x9C07, 0x9C0E, 0x9C06, 0x9C17, 0x9C14, 0x9C09, 0x9D9F, + 0x9D99, 0x9DA4, 0x9D9D, 0x9D92, 0x9D98, 0x9D90, 0x9D9B, 0, +at 0xA0 + 0, 0x9DA0, 0x9D94, 0x9D9C, 0x9DAA, 0x9D97, 0x9DA1, 0x9D9A, + 0x9DA2, 0x9DA8, 0x9D9E, 0x9DA3, 0x9DBF, 0x9DA9, 0x9D96, 0x9DA6, + 0x9DA7, 0x9E99, 0x9E9B, 0x9E9A, 0x9EE5, 0x9EE4, 0x9EE7, 0x9EE6, + 0x9F30, 0x9F2E, 0x9F5B, 0x9F60, 0x9F5E, 0x9F5D, 0x9F59, 0x9F91, + 0x513A, 0x5139, 0x5298, 0x5297, 0x56C3, 0x56BD, 0x56BE, 0x5B48, + 0x5B47, 0x5DCB, 0x5DCF, 0x5EF1, 0x61FD, 0x651B, 0x6B02, 0x6AFC, + 0x6B03, 0x6AF8, 0x6B00, 0x7043, 0x7044, 0x704A, 0x7048, 0x7049, + 0x7045, 0x7046, 0x721D, 0x721A, 0x7219, 0x737E, 0x7517, 0x766A, + 0x77D0, 0x792D, 0x7931, 0x792F, 0x7C54, 0x7C53, 0x7CF2, 0x7E8A, + 0x7E87, 0x7E88, 0x7E8B, 0x7E86, 0x7E8D, 0x7F4D, 0x7FBB, 0x8030, + 0x81DD, 0x8618, 0x862A, 0x8626, 0x861F, 0x8623, 0x861C, 0x8619, + 0x8627, 0x862E, 0x8621, 0x8620, 0x8629, 0x861E, 0x8625, 0, +plane f6 +at 0x40 + 0x8829, 0x881D, 0x881B, 0x8820, 0x8824, 0x881C, 0x882B, 0x884A, + 0x896D, 0x8969, 0x896E, 0x896B, 0x89FA, 0x8B79, 0x8B78, 0x8B45, + 0x8B7A, 0x8B7B, 0x8D10, 0x8D14, 0x8DAF, 0x8E8E, 0x8E8C, 0x8F5E, + 0x8F5B, 0x8F5D, 0x9146, 0x9144, 0x9145, 0x91B9, 0x943F, 0x943B, + 0x9436, 0x9429, 0x943D, 0x943C, 0x9430, 0x9439, 0x942A, 0x9437, + 0x942C, 0x9440, 0x9431, 0x95E5, 0x95E4, 0x95E3, 0x9735, 0x973A, + 0x97BF, 0x97E1, 0x9864, 0x98C9, 0x98C6, 0x98C0, 0x9958, 0x9956, + 0x9A39, 0x9A3D, 0x9A46, 0x9A44, 0x9A42, 0x9A41, 0x9A3A, 0, +at 0xA0 + 0, 0x9A3F, 0x9ACD, 0x9B15, 0x9B17, 0x9B18, 0x9B16, 0x9B3A, + 0x9B52, 0x9C2B, 0x9C1D, 0x9C1C, 0x9C2C, 0x9C23, 0x9C28, 0x9C29, + 0x9C24, 0x9C21, 0x9DB7, 0x9DB6, 0x9DBC, 0x9DC1, 0x9DC7, 0x9DCA, + 0x9DCF, 0x9DBE, 0x9DC5, 0x9DC3, 0x9DBB, 0x9DB5, 0x9DCE, 0x9DB9, + 0x9DBA, 0x9DAC, 0x9DC8, 0x9DB1, 0x9DAD, 0x9DCC, 0x9DB3, 0x9DCD, + 0x9DB2, 0x9E7A, 0x9E9C, 0x9EEB, 0x9EEE, 0x9EED, 0x9F1B, 0x9F18, + 0x9F1A, 0x9F31, 0x9F4E, 0x9F65, 0x9F64, 0x9F92, 0x4EB9, 0x56C6, + 0x56C5, 0x56CB, 0x5971, 0x5B4B, 0x5B4C, 0x5DD5, 0x5DD1, 0x5EF2, + 0x6521, 0x6520, 0x6526, 0x6522, 0x6B0B, 0x6B08, 0x6B09, 0x6C0D, + 0x7055, 0x7056, 0x7057, 0x7052, 0x721E, 0x721F, 0x72A9, 0x737F, + 0x74D8, 0x74D5, 0x74D9, 0x74D7, 0x766D, 0x76AD, 0x7935, 0x79B4, + 0x7A70, 0x7A71, 0x7C57, 0x7C5C, 0x7C59, 0x7C5B, 0x7C5A, 0, +plane f7 +at 0x40 + 0x7CF4, 0x7CF1, 0x7E91, 0x7F4F, 0x7F87, 0x81DE, 0x826B, 0x8634, + 0x8635, 0x8633, 0x862C, 0x8632, 0x8636, 0x882C, 0x8828, 0x8826, + 0x882A, 0x8825, 0x8971, 0x89BF, 0x89BE, 0x89FB, 0x8B7E, 0x8B84, + 0x8B82, 0x8B86, 0x8B85, 0x8B7F, 0x8D15, 0x8E95, 0x8E94, 0x8E9A, + 0x8E92, 0x8E90, 0x8E96, 0x8E97, 0x8F60, 0x8F62, 0x9147, 0x944C, + 0x9450, 0x944A, 0x944B, 0x944F, 0x9447, 0x9445, 0x9448, 0x9449, + 0x9446, 0x973F, 0x97E3, 0x986A, 0x9869, 0x98CB, 0x9954, 0x995B, + 0x9A4E, 0x9A53, 0x9A54, 0x9A4C, 0x9A4F, 0x9A48, 0x9A4A, 0, +at 0xA0 + 0, 0x9A49, 0x9A52, 0x9A50, 0x9AD0, 0x9B19, 0x9B2B, 0x9B3B, + 0x9B56, 0x9B55, 0x9C46, 0x9C48, 0x9C3F, 0x9C44, 0x9C39, 0x9C33, + 0x9C41, 0x9C3C, 0x9C37, 0x9C34, 0x9C32, 0x9C3D, 0x9C36, 0x9DDB, + 0x9DD2, 0x9DDE, 0x9DDA, 0x9DCB, 0x9DD0, 0x9DDC, 0x9DD1, 0x9DDF, + 0x9DE9, 0x9DD9, 0x9DD8, 0x9DD6, 0x9DF5, 0x9DD5, 0x9DDD, 0x9EB6, + 0x9EF0, 0x9F35, 0x9F33, 0x9F32, 0x9F42, 0x9F6B, 0x9F95, 0x9FA2, + 0x513D, 0x5299, 0x58E8, 0x58E7, 0x5972, 0x5B4D, 0x5DD8, 0x882F, + 0x5F4F, 0x6201, 0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66EB, + 0x6B11, 0x6B12, 0x6B0F, 0x6BCA, 0x705B, 0x705A, 0x7222, 0x7382, + 0x7381, 0x7383, 0x7670, 0x77D4, 0x7C67, 0x7C66, 0x7E95, 0x826C, + 0x863A, 0x8640, 0x8639, 0x863C, 0x8631, 0x863B, 0x863E, 0x8830, + 0x8832, 0x882E, 0x8833, 0x8976, 0x8974, 0x8973, 0x89FE, 0, +plane f8 +at 0x40 + 0x8B8C, 0x8B8E, 0x8B8B, 0x8B88, 0x8C45, 0x8D19, 0x8E98, 0x8F64, + 0x8F63, 0x91BC, 0x9462, 0x9455, 0x945D, 0x9457, 0x945E, 0x97C4, + 0x97C5, 0x9800, 0x9A56, 0x9A59, 0x9B1E, 0x9B1F, 0x9B20, 0x9C52, + 0x9C58, 0x9C50, 0x9C4A, 0x9C4D, 0x9C4B, 0x9C55, 0x9C59, 0x9C4C, + 0x9C4E, 0x9DFB, 0x9DF7, 0x9DEF, 0x9DE3, 0x9DEB, 0x9DF8, 0x9DE4, + 0x9DF6, 0x9DE1, 0x9DEE, 0x9DE6, 0x9DF2, 0x9DF0, 0x9DE2, 0x9DEC, + 0x9DF4, 0x9DF3, 0x9DE8, 0x9DED, 0x9EC2, 0x9ED0, 0x9EF2, 0x9EF3, + 0x9F06, 0x9F1C, 0x9F38, 0x9F37, 0x9F36, 0x9F43, 0x9F4F, 0, +at 0xA0 + 0, 0x9F71, 0x9F70, 0x9F6E, 0x9F6F, 0x56D3, 0x56CD, 0x5B4E, + 0x5C6D, 0x652D, 0x66ED, 0x66EE, 0x6B13, 0x705F, 0x7061, 0x705D, + 0x7060, 0x7223, 0x74DB, 0x74E5, 0x77D5, 0x7938, 0x79B7, 0x79B6, + 0x7C6A, 0x7E97, 0x7F89, 0x826D, 0x8643, 0x8838, 0x8837, 0x8835, + 0x884B, 0x8B94, 0x8B95, 0x8E9E, 0x8E9F, 0x8EA0, 0x8E9D, 0x91BE, + 0x91BD, 0x91C2, 0x946B, 0x9468, 0x9469, 0x96E5, 0x9746, 0x9743, + 0x9747, 0x97C7, 0x97E5, 0x9A5E, 0x9AD5, 0x9B59, 0x9C63, 0x9C67, + 0x9C66, 0x9C62, 0x9C5E, 0x9C60, 0x9E02, 0x9DFE, 0x9E07, 0x9E03, + 0x9E06, 0x9E05, 0x9E00, 0x9E01, 0x9E09, 0x9DFF, 0x9DFD, 0x9E04, + 0x9EA0, 0x9F1E, 0x9F46, 0x9F74, 0x9F75, 0x9F76, 0x56D4, 0x652E, + 0x65B8, 0x6B18, 0x6B19, 0x6B17, 0x6B1A, 0x7062, 0x7226, 0x72AA, + 0x77D8, 0x77D9, 0x7939, 0x7C69, 0x7C6B, 0x7CF6, 0x7E9A, 0, +plane f9 +at 0x40 + 0x7E98, 0x7E9B, 0x7E99, 0x81E0, 0x81E1, 0x8646, 0x8647, 0x8648, + 0x8979, 0x897A, 0x897C, 0x897B, 0x89FF, 0x8B98, 0x8B99, 0x8EA5, + 0x8EA4, 0x8EA3, 0x946E, 0x946D, 0x946F, 0x9471, 0x9473, 0x9749, + 0x9872, 0x995F, 0x9C68, 0x9C6E, 0x9C6D, 0x9E0B, 0x9E0D, 0x9E10, + 0x9E0F, 0x9E12, 0x9E11, 0x9EA1, 0x9EF5, 0x9F09, 0x9F47, 0x9F78, + 0x9F7B, 0x9F7A, 0x9F79, 0x571E, 0x7066, 0x7C6F, 0x883C, 0x8DB2, + 0x8EA6, 0x91C3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9A60, 0x9C74, + 0x9C73, 0x9C71, 0x9C75, 0x9E14, 0x9E13, 0x9EF6, 0x9F0A, 0, +at 0xA0 + 0, 0x9FA4, 0x7068, 0x7065, 0x7CF7, 0x866A, 0x883E, 0x883D, + 0x883F, 0x8B9E, 0x8C9C, 0x8EA9, 0x8EC9, 0x974B, 0x9873, 0x9874, + 0x98CC, 0x9961, 0x99AB, 0x9A64, 0x9A66, 0x9A67, 0x9B24, 0x9E15, + 0x9E17, 0x9F48, 0x6207, 0x6B1E, 0x7227, 0x864C, 0x8EA8, 0x9482, + 0x9480, 0x9481, 0x9A69, 0x9A68, 0x9B2E, 0x9E19, 0x7229, 0x864B, + 0x8B9F, 0x9483, 0x9C79, 0x9EB7, 0x7675, 0x9A6B, 0x9C7A, 0x9E1D, + 0x7069, 0x706A, 0x9EA4, 0x9F7E, 0x9F49, 0x9F98, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fa +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +at 0xA0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fb +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +at 0xA0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fc +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +at 0xA0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fd +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +at 0xA0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fe +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +at 0xA0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/ugb.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/ugb.map new file mode 100755 index 00000000..2f59ac1e --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/ugb.map @@ -0,0 +1,1236 @@ +# +# GB 2312-80 +# + +plane a1 +at 0xa0 + 0, 0x3000, 0x3001, 0x3002, 0x00B7, 0x02C9, 0x02C7, 0x00A8, + 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x2019, + 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, + 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x3011, + 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F, + 0x222A, 0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220, + 0x2312, 0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D, + 0x221D, 0x2260, 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235, + 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04, + 0x00A4, 0xFFE0, 0xFFE1, 0x2030, 0x00A7, 0x2116, 0x2606, 0x2605, + 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, + 0x25B2, 0x203B, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0, +plane a2 +at 0xa0 + 0, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, + 0x2177, 0x2178, 0x2179, 0, 0, 0, 0, 0, + 0, 0x2488, 0x2489, 0x248A, 0x248B, 0x248C, 0x248D, 0x248E, + 0x248F, 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, + 0x2497, 0x2498, 0x2499, 0x249A, 0x249B, 0x2474, 0x2475, 0x2476, + 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, + 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, + 0x2487, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, + 0x2467, 0x2468, 0x2469, 0, 0, 0x3220, 0x3221, 0x3222, + 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0, + 0, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, + 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0, 0, 0, +plane a3 +at 0xa0 + 0, 0xFF01, 0xFF02, 0xFF03, 0xFFE5, 0xFF05, 0xFF06, 0xFF07, + 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, + 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, + 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, + 0xFF20, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, + 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, + 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, + 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F, + 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, + 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, + 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, + 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3, 0, +plane a4 +at 0xa0 + 0, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, + 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, + 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, + 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, + 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, + 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, + 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, + 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, + 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, + 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, + 0x3090, 0x3091, 0x3092, 0x3093, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a5 +at 0xa0 + 0, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, + 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, + 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, + 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, + 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, + 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, + 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, + 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, + 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, + 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, + 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a6 +at 0xa0 + 0, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, + 0x03A9, 0, 0, 0, 0, 0, 0, 0, + 0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, + 0x03C9, 0, 0, 0, 0, 0, 0, 0, + 0xFE35, 0xFE36, 0xFE39, 0xFE3A, 0xFE3F, 0xFE40, 0xFE3D, 0xFE3E, + 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0, 0, 0xFE3B, 0xFE3C, + 0xFE37, 0xFE38, 0xFE31, 0, 0xFE33, 0xFE34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a7 +at 0xa0 + 0, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, + 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, + 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, + 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, + 0x042E, 0x042F, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, + 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, + 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, + 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, + 0x044E, 0x044F, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a8 +at 0xa0 + 0, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, 0x011B, + 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2, + 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA, + 0x01DC, 0x00FC, 0x00EA, 0x0251, 0xE7C7, 0x0144, 0x0148, 0xE7C8, + 0x0261, 0, 0, 0, 0, 0x3105, 0x3106, 0x3107, + 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, + 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, + 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, 0x311F, + 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, + 0x3128, 0x3129, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a9 +at 0xa0 + 0, 0, 0, 0, 0x2500, 0x2501, 0x2502, 0x2503, + 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, + 0x250C, 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, + 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, + 0x251C, 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, + 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, + 0x252C, 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, + 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, + 0x253C, 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, + 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, 0x254B, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane b0 +at 0xa0 + 0, 0x554A, 0x963F, 0x57C3, 0x6328, 0x54CE, 0x5509, 0x54C0, + 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E, 0x788D, 0x7231, 0x9698, + 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309, 0x6697, 0x5CB8, 0x80FA, + 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9, 0x6556, 0x71AC, 0x7FF1, + 0x8884, 0x50B2, 0x5965, 0x61CA, 0x6FB3, 0x82AD, 0x634C, 0x6252, + 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4, 0x5DF4, 0x62D4, 0x8DCB, + 0x9776, 0x628A, 0x8019, 0x575D, 0x9738, 0x7F62, 0x7238, 0x767D, + 0x67CF, 0x767E, 0x6446, 0x4F70, 0x8D25, 0x62DC, 0x7A17, 0x6591, + 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881, 0x677F, 0x7248, 0x626E, + 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E, 0x7ECA, 0x90A6, 0x5E2E, + 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2, 0x78C5, 0x868C, 0x9551, + 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305, 0x8912, 0x5265, 0, +plane b1 +at 0xa0 + 0x775C, 0x8584, 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D, 0x62B1, + 0x62A5, 0x66B4, 0x8C79, 0x9C8D, 0x7206, 0x676F, 0x7891, 0x60B2, + 0x5351, 0x5317, 0x8F88, 0x80CC, 0x8D1D, 0x94A1, 0x500D, 0x72C8, + 0x5907, 0x60EB, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C, 0x7B28, + 0x5D29, 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C, 0x9F3B, + 0x6BD4, 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D, 0x6BD5, + 0x6BD9, 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D, 0x5F0A, + 0x5FC5, 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD, 0x8FB9, + 0x7F16, 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8, 0x8FA9, + 0x8FAB, 0x904D, 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6, 0x618B, + 0x522B, 0x762A, 0x5F6C, 0x658C, 0x6FD2, 0x6EE8, 0x5BBE, 0x6448, + 0x5175, 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x997C, 0x70B3, 0, +plane b2 +at 0xa0 + 0x77E4, 0x75C5, 0x5E76, 0x73BB, 0x83E0, 0x64AD, 0x62E8, 0x94B5, + 0x6CE2, 0x535A, 0x52C3, 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B, + 0x8236, 0x8116, 0x818A, 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C, + 0x54FA, 0x8865, 0x57E0, 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, + 0x6016, 0x64E6, 0x731C, 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C, + 0x8E29, 0x91C7, 0x5F69, 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695, + 0x6B8B, 0x60ED, 0x60E8, 0x707F, 0x82CD, 0x8231, 0x4ED3, 0x6CA7, + 0x85CF, 0x64CD, 0x7CD9, 0x69FD, 0x66F9, 0x8349, 0x5395, 0x7B56, + 0x4FA7, 0x518C, 0x6D4B, 0x5C42, 0x8E6D, 0x63D2, 0x53C9, 0x832C, + 0x8336, 0x67E5, 0x78B4, 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8BE7, + 0x62C6, 0x67F4, 0x8C7A, 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17, + 0x7F20, 0x94F2, 0x4EA7, 0x9610, 0x98A4, 0x660C, 0x7316, 0, +plane b3 +at 0xa0 + 0x7883, 0x573A, 0x5C1D, 0x5E38, 0x957F, 0x507F, 0x80A0, 0x5382, + 0x655E, 0x7545, 0x5531, 0x5021, 0x8D85, 0x6284, 0x949E, 0x671D, + 0x5632, 0x6F6E, 0x5DE2, 0x5435, 0x7092, 0x8F66, 0x626F, 0x64A4, + 0x63A3, 0x5F7B, 0x6F88, 0x90F4, 0x81E3, 0x8FB0, 0x5C18, 0x6668, + 0x5FF1, 0x6C89, 0x9648, 0x8D81, 0x886C, 0x6491, 0x79F0, 0x57CE, + 0x6A59, 0x6210, 0x5448, 0x4E58, 0x7A0B, 0x60E9, 0x6F84, 0x8BDA, + 0x627F, 0x901E, 0x9A8B, 0x79E4, 0x5403, 0x75F4, 0x6301, 0x5319, + 0x6C60, 0x8FDF, 0x5F1B, 0x9A70, 0x803B, 0x9F7F, 0x4F88, 0x5C3A, + 0x8D64, 0x7FC5, 0x65A5, 0x70BD, 0x5145, 0x51B2, 0x866B, 0x5D07, + 0x5BA0, 0x62BD, 0x916C, 0x7574, 0x8E0C, 0x7A20, 0x6101, 0x7B79, + 0x4EC7, 0x7EF8, 0x7785, 0x4E11, 0x81ED, 0x521D, 0x51FA, 0x6A71, + 0x53A8, 0x8E87, 0x9504, 0x96CF, 0x6EC1, 0x9664, 0x695A, 0, +plane b4 +at 0xa0 + 0x790C, 0x7840, 0x50A8, 0x77D7, 0x6410, 0x89E6, 0x5904, 0x63E3, + 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239, 0x5598, 0x4E32, 0x75AE, + 0x7A97, 0x5E62, 0x5E8A, 0x95EF, 0x521B, 0x5439, 0x708A, 0x6376, + 0x9524, 0x5782, 0x6625, 0x693F, 0x9187, 0x5507, 0x6DF3, 0x7EAF, + 0x8822, 0x6233, 0x7EF0, 0x75B5, 0x8328, 0x78C1, 0x96CC, 0x8F9E, + 0x6148, 0x74F7, 0x8BCD, 0x6B64, 0x523A, 0x8D50, 0x6B21, 0x806A, + 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B, 0x51D1, 0x7C97, 0x918B, + 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C, 0x6467, 0x5D14, 0x50AC, + 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0, 0x6751, 0x5B58, 0x5BF8, + 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B, 0x9519, 0x642D, 0x8FBE, + 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6B79, 0x50A3, 0x6234, + 0x5E26, 0x6B86, 0x4EE3, 0x8D37, 0x888B, 0x5F85, 0x902E, 0, +plane b5 +at 0xa0 + 0x7992, 0x6020, 0x803D, 0x62C5, 0x4E39, 0x5355, 0x90F8, 0x63B8, + 0x80C6, 0x65E6, 0x6C2E, 0x4F46, 0x60EE, 0x6DE1, 0x8BDE, 0x5F39, + 0x86CB, 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, 0x5200, 0x6363, + 0x8E48, 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B, 0x60BC, + 0x9053, 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F, 0x767B, + 0x7B49, 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4, 0x8FEA, + 0x654C, 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5, 0x5E95, + 0x5730, 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14, 0x98A0, + 0x6382, 0x6EC7, 0x7898, 0x70B9, 0x5178, 0x975B, 0x57AB, 0x7535, + 0x4F43, 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6DC0, 0x6BBF, 0x7889, + 0x53FC, 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x9493, 0x8C03, + 0x8DCC, 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, 0x53E0, 0, +plane b6 +at 0xa0 + 0x7A1C, 0x4E01, 0x76EF, 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D, + 0x5B9A, 0x8BA2, 0x4E22, 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8, + 0x680B, 0x4F97, 0x606B, 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597, + 0x9661, 0x8C46, 0x9017, 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A, + 0x72EC, 0x8BFB, 0x5835, 0x7779, 0x8D4C, 0x675C, 0x9540, 0x809A, + 0x5EA6, 0x6E21, 0x5992, 0x7AEF, 0x77ED, 0x953B, 0x6BB5, 0x65AD, + 0x7F0E, 0x5806, 0x5151, 0x961F, 0x5BF9, 0x58A9, 0x5428, 0x8E72, + 0x6566, 0x987F, 0x56E4, 0x949D, 0x76FE, 0x9041, 0x6387, 0x54C6, + 0x591A, 0x593A, 0x579B, 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241, + 0x60F0, 0x5815, 0x86FE, 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9, + 0x5A25, 0x6076, 0x5384, 0x627C, 0x904F, 0x9102, 0x997F, 0x6069, + 0x800C, 0x513F, 0x8033, 0x5C14, 0x9975, 0x6D31, 0x4E8C, 0, +plane b7 +at 0xa0 + 0x7AA2, 0x8D30, 0x53D1, 0x7F5A, 0x7B4F, 0x4F10, 0x4E4F, 0x9600, + 0x6CD5, 0x73D0, 0x85E9, 0x5E06, 0x756A, 0x7FFB, 0x6A0A, 0x77FE, + 0x9492, 0x7E41, 0x51E1, 0x70E6, 0x53CD, 0x8FD4, 0x8303, 0x8D29, + 0x72AF, 0x996D, 0x6CDB, 0x574A, 0x82B3, 0x65B9, 0x80AA, 0x623F, + 0x9632, 0x59A8, 0x4EFF, 0x8BBF, 0x7EBA, 0x653E, 0x83F2, 0x975E, + 0x5561, 0x98DE, 0x80A5, 0x532A, 0x8BFD, 0x5420, 0x80BA, 0x5E9F, + 0x6CB8, 0x8D39, 0x82AC, 0x915A, 0x5429, 0x6C1B, 0x5206, 0x7EB7, + 0x575F, 0x711A, 0x6C7E, 0x7C89, 0x594B, 0x4EFD, 0x5FFF, 0x6124, + 0x7CAA, 0x4E30, 0x5C01, 0x67AB, 0x8702, 0x5CF0, 0x950B, 0x98CE, + 0x75AF, 0x70FD, 0x9022, 0x51AF, 0x7F1D, 0x8BBD, 0x5949, 0x51E4, + 0x4F5B, 0x5426, 0x592B, 0x6577, 0x80A4, 0x5B75, 0x6276, 0x62C2, + 0x8F90, 0x5E45, 0x6C1F, 0x7B26, 0x4F0F, 0x4FD8, 0x670D, 0, +plane b8 +at 0xa0 + 0x7B2D, 0x6D6E, 0x6DAA, 0x798F, 0x88B1, 0x5F17, 0x752B, 0x629A, + 0x8F85, 0x4FEF, 0x91DC, 0x65A7, 0x812F, 0x8151, 0x5E9C, 0x8150, + 0x8D74, 0x526F, 0x8986, 0x8D4B, 0x590D, 0x5085, 0x4ED8, 0x961C, + 0x7236, 0x8179, 0x8D1F, 0x5BCC, 0x8BA3, 0x9644, 0x5987, 0x7F1A, + 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539, 0x6982, 0x9499, 0x76D6, + 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1, 0x7AFF, 0x809D, 0x8D76, + 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188, 0x521A, 0x94A2, 0x7F38, + 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760, 0x7BD9, 0x768B, 0x9AD8, + 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550, 0x7A3F, 0x544A, 0x54E5, + 0x6B4C, 0x6401, 0x6208, 0x9E3D, 0x80F3, 0x7599, 0x5272, 0x9769, + 0x845B, 0x683C, 0x86E4, 0x9601, 0x9694, 0x94EC, 0x4E2A, 0x5404, + 0x7ED9, 0x6839, 0x8DDF, 0x8015, 0x66F4, 0x5E9A, 0x7FB9, 0, +plane b9 +at 0xa0 + 0x7BC4, 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F, 0x606D, + 0x9F9A, 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9, 0x6C5E, + 0x62F1, 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF, 0x72D7, + 0x57A2, 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495, 0x7B8D, + 0x4F30, 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA, 0x9AA8, + 0x8C37, 0x80A1, 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E, 0x74DC, + 0x5250, 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A, 0x68FA, + 0x5173, 0x5B98, 0x51A0, 0x89C2, 0x7BA1, 0x9986, 0x7F50, 0x60EF, + 0x704C, 0x8D2F, 0x5149, 0x5E7F, 0x901B, 0x7470, 0x89C4, 0x572D, + 0x7845, 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, 0x8BE1, 0x7678, + 0x6842, 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA, 0x68CD, + 0x9505, 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8, 0, +plane ba +at 0xa0 + 0x7C42, 0x9AB8, 0x5B69, 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87, + 0x9163, 0x61A8, 0x90AF, 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD, + 0x558A, 0x7F55, 0x7FF0, 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D, + 0x710A, 0x6C57, 0x6C49, 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E, + 0x8C6A, 0x6BEB, 0x90DD, 0x597D, 0x8017, 0x53F7, 0x6D69, 0x5475, + 0x559D, 0x8377, 0x83CF, 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408, + 0x76D2, 0x8C89, 0x9602, 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64, + 0x8D3A, 0x563F, 0x9ED1, 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC, + 0x4EA8, 0x6A2A, 0x8861, 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679, + 0x9E3F, 0x6D2A, 0x5B8F, 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334, + 0x543C, 0x539A, 0x5019, 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A, + 0x58F6, 0x846B, 0x80E1, 0x8774, 0x72D0, 0x7CCA, 0x6E56, 0, +plane bb +at 0xa0 + 0x7CBB, 0x5F27, 0x864E, 0x552C, 0x62A4, 0x4E92, 0x6CAA, 0x6237, + 0x82B1, 0x54D7, 0x534E, 0x733E, 0x6ED1, 0x753B, 0x5212, 0x5316, + 0x8BDD, 0x69D0, 0x5F8A, 0x6000, 0x6DEE, 0x574F, 0x6B22, 0x73AF, + 0x6853, 0x8FD8, 0x7F13, 0x6362, 0x60A3, 0x5524, 0x75EA, 0x8C62, + 0x7115, 0x6DA3, 0x5BA6, 0x5E7B, 0x8352, 0x614C, 0x9EC4, 0x78FA, + 0x8757, 0x7C27, 0x7687, 0x51F0, 0x60F6, 0x714C, 0x6643, 0x5E4C, + 0x604D, 0x8C0E, 0x7070, 0x6325, 0x8F89, 0x5FBD, 0x6062, 0x86D4, + 0x56DE, 0x6BC1, 0x6094, 0x6167, 0x5349, 0x60E0, 0x6666, 0x8D3F, + 0x79FD, 0x4F1A, 0x70E9, 0x6C47, 0x8BB3, 0x8BF2, 0x7ED8, 0x8364, + 0x660F, 0x5A5A, 0x9B42, 0x6D51, 0x6DF7, 0x8C41, 0x6D3B, 0x4F19, + 0x706B, 0x83B7, 0x6216, 0x60D1, 0x970D, 0x8D27, 0x7978, 0x51FB, + 0x573E, 0x57FA, 0x673A, 0x7578, 0x7A3D, 0x79EF, 0x7B95, 0, +plane bc +at 0xa0 + 0x7D36, 0x808C, 0x9965, 0x8FF9, 0x6FC0, 0x8BA5, 0x9E21, 0x59EC, + 0x7EE9, 0x7F09, 0x5409, 0x6781, 0x68D8, 0x8F91, 0x7C4D, 0x96C6, + 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373, 0x5AC9, 0x7EA7, 0x6324, + 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280, 0x5180, 0x5B63, 0x4F0E, + 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4, 0x5BC2, 0x8BA1, 0x8BB0, + 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7, 0x7EAA, 0x5609, 0x67B7, + 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A, 0x988A, 0x8D3E, 0x7532, + 0x94BE, 0x5047, 0x7A3C, 0x4EF7, 0x67B6, 0x9A7E, 0x5AC1, 0x6B7C, + 0x76D1, 0x575A, 0x5C16, 0x7B3A, 0x95F4, 0x714E, 0x517C, 0x80A9, + 0x8270, 0x5978, 0x7F04, 0x8327, 0x68C0, 0x67EC, 0x78B1, 0x7877, + 0x62E3, 0x6361, 0x7B80, 0x4FED, 0x526A, 0x51CF, 0x8350, 0x69DB, + 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E, 0x7BAD, 0x4EF6, 0, +plane bd +at 0xa0 + 0x7D98, 0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85, 0x6DA7, + 0x5EFA, 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586, 0x848B, + 0x6868, 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549, 0x6912, + 0x7901, 0x7126, 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84, 0x5A07, + 0x56BC, 0x6405, 0x94F0, 0x77EB, 0x4FA5, 0x811A, 0x72E1, 0x89D2, + 0x997A, 0x7F34, 0x7EDE, 0x527F, 0x6559, 0x9175, 0x8F7F, 0x8F83, + 0x53EB, 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857, 0x9636, + 0x622A, 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, 0x776B, 0x7AED, + 0x6D01, 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5, 0x754C, + 0x501F, 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B, 0x65A4, + 0x91D1, 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5, 0x8C28, + 0x8FDB, 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78, 0, +plane be +at 0xa0 + 0x7DFA, 0x5C3D, 0x52B2, 0x8346, 0x5162, 0x830E, 0x775B, 0x6676, + 0x9CB8, 0x4EAC, 0x60CA, 0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, 0x8B66, + 0x666F, 0x9888, 0x9759, 0x5883, 0x656C, 0x955C, 0x5F84, 0x75C9, + 0x9756, 0x7ADF, 0x7ADE, 0x51C0, 0x70AF, 0x7A98, 0x63EA, 0x7A76, + 0x7EA0, 0x7396, 0x97ED, 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9, + 0x6551, 0x65E7, 0x81FC, 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0, + 0x62D8, 0x72D9, 0x75BD, 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480, + 0x77E9, 0x4E3E, 0x6CAE, 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177, + 0x8DDD, 0x8E1E, 0x952F, 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267, + 0x6350, 0x9E43, 0x5A1F, 0x5026, 0x7737, 0x5377, 0x7EE2, 0x6485, + 0x652B, 0x6289, 0x6398, 0x5014, 0x7235, 0x89C9, 0x51B3, 0x8BC0, + 0x7EDD, 0x5747, 0x83CC, 0x94A7, 0x519B, 0x541B, 0x5CFB, 0, +plane bf +at 0xa0 + 0x7E5D, 0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, 0x9A8F, 0x5580, 0x5496, + 0x5361, 0x54AF, 0x5F00, 0x63E9, 0x6977, 0x51EF, 0x6168, 0x520A, + 0x582A, 0x52D8, 0x574E, 0x780D, 0x770B, 0x5EB7, 0x6177, 0x7CE0, + 0x625B, 0x6297, 0x4EA2, 0x7095, 0x8003, 0x62F7, 0x70E4, 0x9760, + 0x5777, 0x82DB, 0x67EF, 0x68F5, 0x78D5, 0x9897, 0x79D1, 0x58F3, + 0x54B3, 0x53EF, 0x6E34, 0x514B, 0x523B, 0x5BA2, 0x8BFE, 0x80AF, + 0x5543, 0x57A6, 0x6073, 0x5751, 0x542D, 0x7A7A, 0x6050, 0x5B54, + 0x63A7, 0x62A0, 0x53E3, 0x6263, 0x5BC7, 0x67AF, 0x54ED, 0x7A9F, + 0x82E6, 0x9177, 0x5E93, 0x88E4, 0x5938, 0x57AE, 0x630E, 0x8DE8, + 0x80EF, 0x5757, 0x7B77, 0x4FA9, 0x5FEB, 0x5BBD, 0x6B3E, 0x5321, + 0x7B50, 0x72C2, 0x6846, 0x77FF, 0x7736, 0x65F7, 0x51B5, 0x4E8F, + 0x76D4, 0x5CBF, 0x7AA5, 0x8475, 0x594E, 0x9B41, 0x5080, 0, +plane c0 +at 0xa0 + 0x7F53, 0x9988, 0x6127, 0x6E83, 0x5764, 0x6606, 0x6346, 0x56F0, + 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783, 0x62C9, 0x5587, 0x8721, + 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765, 0x8D56, 0x84DD, 0x5A6A, + 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170, 0x6F9C, 0x8C30, 0x63FD, + 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5, 0x7405, 0x6994, 0x72FC, + 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x635E, 0x52B3, 0x7262, 0x8001, + 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6D9D, 0x52D2, 0x4E50, 0x96F7, + 0x956D, 0x857E, 0x78CA, 0x7D2F, 0x5121, 0x5792, 0x64C2, 0x808B, + 0x7C7B, 0x6CEA, 0x68F1, 0x695E, 0x51B7, 0x5398, 0x68A8, 0x7281, + 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13, 0x7406, 0x674E, 0x91CC, + 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F, 0x6817, 0x4E3D, 0x5389, + 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088, 0x4F8B, 0x4FD0, 0, +plane c1 +at 0xa0 + 0x7FE3, 0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B, 0x7483, + 0x54E9, 0x4FE9, 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9, 0x601C, + 0x6D9F, 0x5E18, 0x655B, 0x8138, 0x94FE, 0x604B, 0x70BC, 0x7EC3, + 0x7CAE, 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x4E24, 0x8F86, 0x91CF, + 0x667E, 0x4EAE, 0x8C05, 0x64A9, 0x804A, 0x50DA, 0x7597, 0x71CE, + 0x5BE5, 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, 0x5ED6, 0x6599, + 0x5217, 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797, 0x78F7, + 0x9716, 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41, 0x541D, + 0x62CE, 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36, 0x7F9A, + 0x51CC, 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4, 0x6E9C, + 0x7409, 0x69B4, 0x786B, 0x998F, 0x7559, 0x5218, 0x7624, 0x6D41, + 0x67F3, 0x516D, 0x9F99, 0x804B, 0x5499, 0x7B3C, 0x7ABF, 0, +plane c2 +at 0xa0 + 0x807D, 0x9686, 0x5784, 0x62E2, 0x9647, 0x697C, 0x5A04, 0x6402, + 0x7BD3, 0x6F0F, 0x964B, 0x82A6, 0x5362, 0x9885, 0x5E90, 0x7089, + 0x63B3, 0x5364, 0x864F, 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF, + 0x8D42, 0x9E7F, 0x6F5E, 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74, + 0x5415, 0x94DD, 0x4FA3, 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651, + 0x6C2F, 0x5F8B, 0x7387, 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A, + 0x6EE6, 0x5375, 0x4E71, 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26, + 0x4ED1, 0x6CA6, 0x7EB6, 0x8BBA, 0x841D, 0x87BA, 0x7F57, 0x903B, + 0x9523, 0x7BA9, 0x9AA1, 0x88F8, 0x843D, 0x6D1B, 0x9A86, 0x7EDC, + 0x5988, 0x9EBB, 0x739B, 0x7801, 0x8682, 0x9A6C, 0x9A82, 0x561B, + 0x5417, 0x57CB, 0x4E70, 0x9EA6, 0x5356, 0x8FC8, 0x8109, 0x7792, + 0x9992, 0x86EE, 0x6EE1, 0x8513, 0x66FC, 0x6162, 0x6F2B, 0, +plane c3 +at 0xa0 + 0x813F, 0x8C29, 0x8292, 0x832B, 0x76F2, 0x6C13, 0x5FD9, 0x83BD, + 0x732B, 0x8305, 0x951A, 0x6BDB, 0x77DB, 0x94C6, 0x536F, 0x8302, + 0x5192, 0x5E3D, 0x8C8C, 0x8D38, 0x4E48, 0x73AB, 0x679A, 0x6885, + 0x9176, 0x9709, 0x7164, 0x6CA1, 0x7709, 0x5A92, 0x9541, 0x6BCF, + 0x7F8E, 0x6627, 0x5BD0, 0x59B9, 0x5A9A, 0x95E8, 0x95F7, 0x4EEC, + 0x840C, 0x8499, 0x6AAC, 0x76DF, 0x9530, 0x731B, 0x68A6, 0x5B5F, + 0x772F, 0x919A, 0x9761, 0x7CDC, 0x8FF7, 0x8C1C, 0x5F25, 0x7C73, + 0x79D8, 0x89C5, 0x6CCC, 0x871C, 0x5BC6, 0x5E42, 0x68C9, 0x7720, + 0x7EF5, 0x5195, 0x514D, 0x52C9, 0x5A29, 0x7F05, 0x9762, 0x82D7, + 0x63CF, 0x7784, 0x85D0, 0x79D2, 0x6E3A, 0x5E99, 0x5999, 0x8511, + 0x706D, 0x6C11, 0x62BF, 0x76BF, 0x654F, 0x60AF, 0x95FD, 0x660E, + 0x879F, 0x9E23, 0x94ED, 0x540D, 0x547D, 0x8C2C, 0x6478, 0, +plane c4 +at 0xa0 + 0x81D3, 0x6479, 0x8611, 0x6A21, 0x819C, 0x78E8, 0x6469, 0x9B54, + 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8, 0x6CAB, 0x6F20, 0x5BDE, + 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7, 0x7261, 0x4EA9, 0x59C6, + 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF, 0x6155, 0x6728, 0x76EE, + 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA, 0x5450, 0x94A0, 0x90A3, + 0x5A1C, 0x7EB3, 0x6C16, 0x4E43, 0x5976, 0x8010, 0x5948, 0x5357, + 0x7537, 0x96BE, 0x56CA, 0x6320, 0x8111, 0x607C, 0x95F9, 0x6DD6, + 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD, 0x59AE, 0x9713, 0x502A, + 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F, 0x817B, 0x9006, 0x6EBA, + 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5, 0x637B, 0x5FF5, 0x5A18, + 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042, 0x5B7D, 0x556E, 0x954A, + 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE, 0x51DD, 0x5B81, 0, +plane c5 +at 0xa0 + 0x8269, 0x62E7, 0x6CDE, 0x725B, 0x626D, 0x94AE, 0x7EBD, 0x8113, + 0x6D53, 0x519C, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973, 0x6696, + 0x8650, 0x759F, 0x632A, 0x61E6, 0x7CEF, 0x8BFA, 0x54E6, 0x6B27, + 0x9E25, 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, 0x556A, 0x8DB4, + 0x722C, 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C, 0x5F98, + 0x6E43, 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC, 0x7554, + 0x5224, 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6, 0x629B, + 0x5486, 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478, 0x80DA, + 0x57F9, 0x88F4, 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B, 0x55B7, + 0x76C6, 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC, 0x68DA, + 0x787C, 0x7BF7, 0x81A8, 0x670B, 0x9E4F, 0x6367, 0x78B0, 0x576F, + 0x7812, 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7, 0, +plane c6 +at 0xa0 + 0x833D, 0x5564, 0x813E, 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB, + 0x5C41, 0x8B6C, 0x7BC7, 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02, + 0x74E2, 0x7968, 0x6487, 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1, + 0x8058, 0x4E52, 0x576A, 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6, + 0x8BC4, 0x5C4F, 0x5761, 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44, + 0x8FEB, 0x7C95, 0x5256, 0x6251, 0x94FA, 0x4EC6, 0x8386, 0x8461, + 0x83E9, 0x84B2, 0x57D4, 0x6734, 0x5703, 0x666E, 0x6D66, 0x8C31, + 0x66DD, 0x7011, 0x671F, 0x6B3A, 0x6816, 0x621A, 0x59BB, 0x4E03, + 0x51C4, 0x6F06, 0x67D2, 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67, + 0x7566, 0x5D0E, 0x8110, 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91, + 0x8D77, 0x5C82, 0x4E5E, 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668, + 0x6C14, 0x8FC4, 0x5F03, 0x6C7D, 0x6CE3, 0x8BAB, 0x6390, 0, +plane c7 +at 0xa0 + 0x83ED, 0x6070, 0x6D3D, 0x7275, 0x6266, 0x948E, 0x94C5, 0x5343, + 0x8FC1, 0x7B7E, 0x4EDF, 0x8C26, 0x4E7E, 0x9ED4, 0x94B1, 0x94B3, + 0x524D, 0x6F5C, 0x9063, 0x6D45, 0x8C34, 0x5811, 0x5D4C, 0x6B20, + 0x6B49, 0x67AA, 0x545B, 0x8154, 0x7F8C, 0x5899, 0x8537, 0x5F3A, + 0x62A2, 0x6A47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77A7, 0x4E54, + 0x4FA8, 0x5DE7, 0x9798, 0x64AC, 0x7FD8, 0x5CED, 0x4FCF, 0x7A8D, + 0x5207, 0x8304, 0x4E14, 0x602F, 0x7A83, 0x94A6, 0x4FB5, 0x4EB2, + 0x79E6, 0x7434, 0x52E4, 0x82B9, 0x64D2, 0x79BD, 0x5BDD, 0x6C81, + 0x9752, 0x8F7B, 0x6C22, 0x503E, 0x537F, 0x6E05, 0x64CE, 0x6674, + 0x6C30, 0x60C5, 0x9877, 0x8BF7, 0x5E86, 0x743C, 0x7A77, 0x79CB, + 0x4E18, 0x90B1, 0x7403, 0x6C42, 0x56DA, 0x914B, 0x6CC5, 0x8D8B, + 0x533A, 0x86C6, 0x66F2, 0x8EAF, 0x5C48, 0x9A71, 0x6E20, 0, +plane c8 +at 0xa0 + 0x847C, 0x53D6, 0x5A36, 0x9F8B, 0x8DA3, 0x53BB, 0x5708, 0x98A7, + 0x6743, 0x919B, 0x6CC9, 0x5168, 0x75CA, 0x62F3, 0x72AC, 0x5238, + 0x529D, 0x7F3A, 0x7094, 0x7638, 0x5374, 0x9E4A, 0x69B7, 0x786E, + 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3, 0x5189, 0x67D3, 0x74E4, + 0x58E4, 0x6518, 0x56B7, 0x8BA9, 0x9976, 0x6270, 0x7ED5, 0x60F9, + 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD, 0x97E7, 0x4EFB, 0x8BA4, + 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD, 0x65E5, 0x620E, 0x8338, + 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6, 0x5BB9, 0x7ED2, 0x5197, + 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5B7A, 0x5982, + 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925, 0x8F6F, 0x962E, 0x854A, + 0x745E, 0x9510, 0x95F0, 0x6DA6, 0x82E5, 0x5F31, 0x6492, 0x6D12, + 0x8428, 0x816E, 0x9CC3, 0x585E, 0x8D5B, 0x4E09, 0x53C1, 0, +plane c9 +at 0xa0 + 0x8502, 0x4F1E, 0x6563, 0x6851, 0x55D3, 0x4E27, 0x6414, 0x9A9A, + 0x626B, 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, 0x50E7, 0x838E, + 0x7802, 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565, 0x715E, + 0x7B5B, 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220, 0x717D, + 0x886B, 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584, 0x6C55, + 0x6247, 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C, 0x4E0A, + 0x5C1A, 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D, 0x52FA, + 0x97F6, 0x5C11, 0x54E8, 0x90B5, 0x7ECD, 0x5962, 0x8D4A, 0x86C7, + 0x820C, 0x820D, 0x8D66, 0x6444, 0x5C04, 0x6151, 0x6D89, 0x793E, + 0x8BBE, 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1, 0x5A20, + 0x7EC5, 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, 0x80BE, 0x614E, + 0x6E17, 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3, 0, +plane ca +at 0xa0 + 0x8581, 0x7701, 0x76DB, 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931, + 0x72EE, 0x65BD, 0x6E7F, 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3, + 0x62FE, 0x65F6, 0x4EC0, 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2, + 0x77E2, 0x4F7F, 0x5C4E, 0x9A76, 0x59CB, 0x5F0F, 0x793A, 0x58EB, + 0x4E16, 0x67FF, 0x4E8B, 0x62ED, 0x8A93, 0x901D, 0x52BF, 0x662F, + 0x55DC, 0x566C, 0x9002, 0x4ED5, 0x4F8D, 0x91CA, 0x9970, 0x6C0F, + 0x5E02, 0x6043, 0x5BA4, 0x89C6, 0x8BD5, 0x6536, 0x624B, 0x9996, + 0x5B88, 0x5BFF, 0x6388, 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C, + 0x67A2, 0x68B3, 0x6B8A, 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1, + 0x758F, 0x4E66, 0x8D4E, 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9, + 0x7F72, 0x8700, 0x9ECD, 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811, + 0x675F, 0x620D, 0x7AD6, 0x5885, 0x5EB6, 0x6570, 0x6F31, 0, +plane cb +at 0xa0 + 0x85F8, 0x6055, 0x5237, 0x800D, 0x6454, 0x8870, 0x7529, 0x5E05, + 0x6813, 0x62F4, 0x971C, 0x53CC, 0x723D, 0x8C01, 0x6C34, 0x7761, + 0x7A0E, 0x542E, 0x77AC, 0x987A, 0x821C, 0x8BF4, 0x7855, 0x6714, + 0x70C1, 0x65AF, 0x6495, 0x5636, 0x601D, 0x79C1, 0x53F8, 0x4E1D, + 0x6B7B, 0x8086, 0x5BFA, 0x55E3, 0x56DB, 0x4F3A, 0x4F3C, 0x9972, + 0x5DF3, 0x677E, 0x8038, 0x6002, 0x9882, 0x9001, 0x5B8B, 0x8BBC, + 0x8BF5, 0x641C, 0x8258, 0x64DE, 0x55FD, 0x82CF, 0x9165, 0x4FD7, + 0x7D20, 0x901F, 0x7C9F, 0x50F3, 0x5851, 0x6EAF, 0x5BBF, 0x8BC9, + 0x8083, 0x9178, 0x849C, 0x7B97, 0x867D, 0x968B, 0x968F, 0x7EE5, + 0x9AD3, 0x788E, 0x5C81, 0x7A57, 0x9042, 0x96A7, 0x795F, 0x5B59, + 0x635F, 0x7B0B, 0x84D1, 0x68AD, 0x5506, 0x7F29, 0x7410, 0x7D22, + 0x9501, 0x6240, 0x584C, 0x4ED6, 0x5B83, 0x5979, 0x5854, 0, +plane cc +at 0xa0 + 0x866A, 0x736D, 0x631E, 0x8E4B, 0x8E0F, 0x80CE, 0x82D4, 0x62AC, + 0x53F0, 0x6CF0, 0x915E, 0x592A, 0x6001, 0x6C70, 0x574D, 0x644A, + 0x8D2A, 0x762B, 0x6EE9, 0x575B, 0x6A80, 0x75F0, 0x6F6D, 0x8C2D, + 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3, 0x63A2, 0x53F9, 0x70AD, + 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0, 0x819B, 0x5510, 0x7CD6, + 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB, 0x638F, 0x6D9B, 0x6ED4, + 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8, 0x9676, 0x8BA8, 0x5957, + 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A, 0x68AF, 0x5254, 0x8E22, + 0x9511, 0x63D0, 0x9898, 0x8E44, 0x557C, 0x4F53, 0x66FF, 0x568F, + 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929, 0x6DFB, 0x586B, 0x7530, + 0x751C, 0x606C, 0x8214, 0x8146, 0x6311, 0x6761, 0x8FE2, 0x773A, + 0x8DF3, 0x8D34, 0x94C1, 0x5E16, 0x5385, 0x542C, 0x70C3, 0, +plane cd +at 0xa0 + 0x8716, 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A, 0x8247, + 0x901A, 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64, 0x7AE5, + 0x6876, 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295, 0x5934, + 0x900F, 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014, 0x6D82, + 0x5C60, 0x571F, 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8, 0x9893, + 0x817F, 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0, 0x62D6, + 0x6258, 0x8131, 0x9E35, 0x9640, 0x9A6E, 0x9A7C, 0x692D, 0x59A5, + 0x62D3, 0x553E, 0x6316, 0x54C7, 0x86D9, 0x6D3C, 0x5A03, 0x74E6, + 0x889C, 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, 0x73A9, 0x987D, + 0x4E38, 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696, 0x60CB, + 0x5B9B, 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1, 0x6789, + 0x7F51, 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01, 0, +plane ce +at 0xa0 + 0x87A4, 0x5DCD, 0x5FAE, 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4, + 0x552F, 0x60DF, 0x4E3A, 0x6F4D, 0x7EF4, 0x82C7, 0x840E, 0x59D4, + 0x4F1F, 0x4F2A, 0x5C3E, 0x7EAC, 0x672A, 0x851A, 0x5473, 0x754F, + 0x80C3, 0x5582, 0x9B4F, 0x4F4D, 0x6E2D, 0x8C13, 0x5C09, 0x6170, + 0x536B, 0x761F, 0x6E29, 0x868A, 0x6587, 0x95FB, 0x7EB9, 0x543B, + 0x7A33, 0x7D0A, 0x95EE, 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717, + 0x6DA1, 0x7A9D, 0x6211, 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB, + 0x545C, 0x94A8, 0x4E4C, 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C, + 0x68A7, 0x543E, 0x5434, 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348, + 0x821E, 0x4F0D, 0x4FAE, 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269, + 0x52FF, 0x52A1, 0x609F, 0x8BEF, 0x6614, 0x7199, 0x6790, 0x897F, + 0x7852, 0x77FD, 0x6670, 0x563B, 0x5438, 0x9521, 0x727A, 0, +plane cf +at 0xa0 + 0x8823, 0x7A00, 0x606F, 0x5E0C, 0x6089, 0x819D, 0x5915, 0x60DC, + 0x7184, 0x70EF, 0x6EAA, 0x6C50, 0x7280, 0x6A84, 0x88AD, 0x5E2D, + 0x4E60, 0x5AB3, 0x559C, 0x94E3, 0x6D17, 0x7CFB, 0x9699, 0x620F, + 0x7EC6, 0x778E, 0x867E, 0x5323, 0x971E, 0x8F96, 0x6687, 0x5CE1, + 0x4FA0, 0x72ED, 0x4E0B, 0x53A6, 0x590F, 0x5413, 0x6380, 0x9528, + 0x5148, 0x4ED9, 0x9C9C, 0x7EA4, 0x54B8, 0x8D24, 0x8854, 0x8237, + 0x95F2, 0x6D8E, 0x5F26, 0x5ACC, 0x663E, 0x9669, 0x73B0, 0x732E, + 0x53BF, 0x817A, 0x9985, 0x7FA1, 0x5BAA, 0x9677, 0x9650, 0x7EBF, + 0x76F8, 0x53A2, 0x9576, 0x9999, 0x7BB1, 0x8944, 0x6E58, 0x4E61, + 0x7FD4, 0x7965, 0x8BE6, 0x60F3, 0x54CD, 0x4EAB, 0x9879, 0x5DF7, + 0x6A61, 0x50CF, 0x5411, 0x8C61, 0x8427, 0x785D, 0x9704, 0x524A, + 0x54EE, 0x56A3, 0x9500, 0x6D88, 0x5BB5, 0x6DC6, 0x6653, 0, +plane d0 +at 0xa0 + 0x88AA, 0x5C0F, 0x5B5D, 0x6821, 0x8096, 0x5578, 0x7B11, 0x6548, + 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B, 0x534F, 0x631F, 0x643A, + 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199, 0x68B0, 0x5378, 0x87F9, + 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51, 0x85AA, 0x82AF, 0x950C, + 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3, 0x4FE1, 0x8845, 0x661F, + 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211, 0x578B, 0x5F62, 0x90A2, + 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027, 0x59D3, 0x5144, 0x51F6, + 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A, 0x4F11, 0x4FEE, 0x7F9E, + 0x673D, 0x55C5, 0x9508, 0x79C0, 0x8896, 0x7EE3, 0x589F, 0x620C, + 0x9700, 0x865A, 0x5618, 0x987B, 0x5F90, 0x8BB8, 0x84C4, 0x9157, + 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064, 0x7D6E, 0x5A7F, 0x7EEA, + 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC, 0x65CB, 0x7384, 0, +plane d1 +at 0xa0 + 0x8937, 0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B, 0x5B66, + 0x7A74, 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC, 0x8BE2, + 0x5BFB, 0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF, 0x900A, + 0x8FC5, 0x538B, 0x62BC, 0x9E26, 0x9E2D, 0x5440, 0x4E2B, 0x82BD, + 0x7259, 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x54D1, 0x4E9A, + 0x8BB6, 0x7109, 0x54BD, 0x9609, 0x70DF, 0x6DF9, 0x76D0, 0x4E25, + 0x7814, 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, 0x960E, 0x708E, + 0x6CBF, 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273, 0x5830, + 0x71D5, 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130, 0x5BB4, + 0x8C1A, 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768, 0x626C, + 0x4F6F, 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0, 0x75D2, + 0x517B, 0x6837, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476, 0, +plane d2 +at 0xa0 + 0x89A1, 0x6447, 0x5C27, 0x9065, 0x7A91, 0x8C23, 0x59DA, 0x54AC, + 0x8200, 0x836F, 0x8981, 0x8000, 0x6930, 0x564E, 0x8036, 0x7237, + 0x91CE, 0x51B6, 0x4E5F, 0x9875, 0x6396, 0x4E1A, 0x53F6, 0x66F3, + 0x814B, 0x591C, 0x6DB2, 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1, + 0x4F9D, 0x4F0A, 0x8863, 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA, + 0x80F0, 0x7591, 0x6C82, 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681, + 0x501A, 0x5DF2, 0x4E59, 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613, + 0x9091, 0x5C79, 0x4EBF, 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB, + 0x4EA6, 0x88D4, 0x610F, 0x6BC5, 0x5FC6, 0x4E49, 0x76CA, 0x6EA2, + 0x8BE3, 0x8BAE, 0x8C0A, 0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, 0x7ECE, + 0x8335, 0x836B, 0x56E0, 0x6BB7, 0x97F3, 0x9634, 0x59FB, 0x541F, + 0x94F6, 0x6DEB, 0x5BC5, 0x996E, 0x5C39, 0x5F15, 0x9690, 0, +plane d3 +at 0xa0 + 0x8A1D, 0x5370, 0x82F1, 0x6A31, 0x5A74, 0x9E70, 0x5E94, 0x7F28, + 0x83B9, 0x8424, 0x8425, 0x8367, 0x8747, 0x8FCE, 0x8D62, 0x76C8, + 0x5F71, 0x9896, 0x786C, 0x6620, 0x54DF, 0x62E5, 0x4F63, 0x81C3, + 0x75C8, 0x5EB8, 0x96CD, 0x8E0A, 0x86F9, 0x548F, 0x6CF3, 0x6D8C, + 0x6C38, 0x607F, 0x52C7, 0x7528, 0x5E7D, 0x4F18, 0x60A0, 0x5FE7, + 0x5C24, 0x7531, 0x90AE, 0x94C0, 0x72B9, 0x6CB9, 0x6E38, 0x9149, + 0x6709, 0x53CB, 0x53F3, 0x4F51, 0x91C9, 0x8BF1, 0x53C8, 0x5E7C, + 0x8FC2, 0x6DE4, 0x4E8E, 0x76C2, 0x6986, 0x865E, 0x611A, 0x8206, + 0x4F59, 0x4FDE, 0x903E, 0x9C7C, 0x6109, 0x6E1D, 0x6E14, 0x9685, + 0x4E88, 0x5A31, 0x96E8, 0x4E0E, 0x5C7F, 0x79B9, 0x5B87, 0x8BED, + 0x7FBD, 0x7389, 0x57DF, 0x828B, 0x90C1, 0x5401, 0x9047, 0x55BB, + 0x5CEA, 0x5FA1, 0x6108, 0x6B32, 0x72F1, 0x80B2, 0x8A89, 0, +plane d4 +at 0xa0 + 0x8A80, 0x6D74, 0x5BD3, 0x88D5, 0x9884, 0x8C6B, 0x9A6D, 0x9E33, + 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881, 0x539F, 0x63F4, 0x8F95, + 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90, 0x7F18, 0x8FDC, 0x82D1, + 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6, 0x8D8A, 0x8DC3, 0x94A5, + 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x9605, 0x8018, 0x4E91, 0x90E7, + 0x5300, 0x9668, 0x5141, 0x8FD0, 0x8574, 0x915D, 0x6655, 0x97F5, + 0x5B55, 0x531D, 0x7838, 0x6742, 0x683D, 0x54C9, 0x707E, 0x5BB0, + 0x8F7D, 0x518D, 0x5728, 0x54B1, 0x6512, 0x6682, 0x8D5E, 0x8D43, + 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF, 0x85FB, 0x67A3, 0x65E9, + 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020, 0x7682, 0x7076, 0x71E5, + 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C, 0x600E, 0x589E, 0x618E, + 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23, 0x672D, 0x8F67, 0, +plane d5 +at 0xa0 + 0x8AE3, 0x94E1, 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B, 0x4E4D, + 0x70B8, 0x8BC8, 0x6458, 0x658B, 0x5B85, 0x7A84, 0x503A, 0x5BE8, + 0x77BB, 0x6BE1, 0x8A79, 0x7C98, 0x6CBE, 0x76CF, 0x65A9, 0x8F97, + 0x5D2D, 0x5C55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7AD9, 0x6E5B, + 0x7EFD, 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, 0x638C, 0x6DA8, + 0x6756, 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634, 0x969C, + 0x62DB, 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69, 0x5146, + 0x8087, 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99, 0x8005, + 0x9517, 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F, 0x7504, + 0x7827, 0x81FB, 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9, 0x8BCA, + 0x9707, 0x632F, 0x9547, 0x9635, 0x84B8, 0x6323, 0x7741, 0x5F81, + 0x72F0, 0x4E89, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F, 0, +plane d6 +at 0xa0 + 0x8B45, 0x5E27, 0x75C7, 0x90D1, 0x8BC1, 0x829D, 0x679D, 0x652F, + 0x5431, 0x8718, 0x77E5, 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7, + 0x804C, 0x76F4, 0x690D, 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740, + 0x6307, 0x6B62, 0x8DBE, 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A, + 0x63B7, 0x81F3, 0x81F4, 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A, + 0x79E9, 0x7A1A, 0x8D28, 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92, + 0x4E2D, 0x76C5, 0x5FE0, 0x949F, 0x8877, 0x7EC8, 0x79CD, 0x80BF, + 0x91CD, 0x4EF2, 0x4F17, 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8BCC, + 0x7CA5, 0x8F74, 0x8098, 0x5E1A, 0x5492, 0x76B1, 0x5B99, 0x663C, + 0x9AA4, 0x73E0, 0x682A, 0x86DB, 0x6731, 0x732A, 0x8BF8, 0x8BDB, + 0x9010, 0x7AF9, 0x70DB, 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B, + 0x8457, 0x67F1, 0x52A9, 0x86C0, 0x8D2E, 0x94F8, 0x7B51, 0, +plane d7 +at 0xa0 + 0x8C1E, 0x4F4F, 0x6CE8, 0x795D, 0x9A7B, 0x6293, 0x722A, 0x62FD, + 0x4E13, 0x7816, 0x8F6C, 0x64B0, 0x8D5A, 0x7BC6, 0x6869, 0x5E84, + 0x88C5, 0x5986, 0x649E, 0x58EE, 0x72B6, 0x690E, 0x9525, 0x8FFD, + 0x8D58, 0x5760, 0x7F00, 0x8C06, 0x51C6, 0x6349, 0x62D9, 0x5353, + 0x684C, 0x7422, 0x8301, 0x914C, 0x5544, 0x7740, 0x707C, 0x6D4A, + 0x5179, 0x54A8, 0x8D44, 0x59FF, 0x6ECB, 0x6DC4, 0x5B5C, 0x7D2B, + 0x4ED4, 0x7C7D, 0x6ED3, 0x5B50, 0x81EA, 0x6E0D, 0x5B57, 0x9B03, + 0x68D5, 0x8E2A, 0x5B97, 0x7EFC, 0x603B, 0x7EB5, 0x90B9, 0x8D70, + 0x594F, 0x63CD, 0x79DF, 0x8DB3, 0x5352, 0x65CF, 0x7956, 0x8BC5, + 0x963B, 0x7EC4, 0x94BB, 0x7E82, 0x5634, 0x9189, 0x6700, 0x7F6A, + 0x5C0A, 0x9075, 0x6628, 0x5DE6, 0x4F50, 0x67DE, 0x505A, 0x4F5C, + 0x5750, 0x5EA7, 0, 0, 0, 0, 0, 0, +plane d8 +at 0xa0 + 0x8CAD, 0x4E8D, 0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, 0x4E15, + 0x4E98, 0x4E1E, 0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, 0x4E3F, + 0x5315, 0x4E47, 0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, 0x80E4, + 0x9997, 0x6BD3, 0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, 0x4E5C, + 0x4E69, 0x4E93, 0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, 0x538D, + 0x539D, 0x53A3, 0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, 0x53F5, + 0x5326, 0x532E, 0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, 0x5208, + 0x520E, 0x522D, 0x5233, 0x523F, 0x5240, 0x524C, 0x525E, 0x5261, + 0x525C, 0x84AF, 0x527D, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, + 0x7F54, 0x4EBB, 0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, 0x4EEB, + 0x4EDE, 0x4F1B, 0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x4F25, 0x4F27, + 0x4F09, 0x4F2B, 0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D, 0, +plane d9 +at 0xa0 + 0x8D0D, 0x4F5F, 0x4F57, 0x4F32, 0x4F3D, 0x4F76, 0x4F74, 0x4F91, + 0x4F89, 0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC, + 0x4F94, 0x4FE6, 0x4FE8, 0x4FEA, 0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC, + 0x4FD1, 0x4FDF, 0x4FF8, 0x5029, 0x504C, 0x4FF3, 0x502C, 0x500F, + 0x502E, 0x502D, 0x4FFE, 0x501C, 0x500C, 0x5025, 0x5028, 0x507E, + 0x5043, 0x5055, 0x5048, 0x504E, 0x506C, 0x507B, 0x50A5, 0x50A7, + 0x50A9, 0x50BA, 0x50D6, 0x5106, 0x50ED, 0x50EC, 0x50E6, 0x50EE, + 0x5107, 0x510B, 0x4EDD, 0x6C3D, 0x4F58, 0x4F65, 0x4FCE, 0x9FA0, + 0x6C46, 0x7C74, 0x516E, 0x5DFD, 0x9EC9, 0x9998, 0x5181, 0x5914, + 0x52F9, 0x530D, 0x8A07, 0x5310, 0x51EB, 0x5919, 0x5155, 0x4EA0, + 0x5156, 0x4EB3, 0x886E, 0x88A4, 0x4EB5, 0x8114, 0x88D2, 0x7980, + 0x5B34, 0x8803, 0x7FB8, 0x51AB, 0x51B1, 0x51BD, 0x51BC, 0, +plane da +at 0xa0 + 0x8DD4, 0x51C7, 0x5196, 0x51A2, 0x51A5, 0x8BA0, 0x8BA6, 0x8BA7, + 0x8BAA, 0x8BB4, 0x8BB5, 0x8BB7, 0x8BC2, 0x8BC3, 0x8BCB, 0x8BCF, + 0x8BCE, 0x8BD2, 0x8BD3, 0x8BD4, 0x8BD6, 0x8BD8, 0x8BD9, 0x8BDC, + 0x8BDF, 0x8BE0, 0x8BE4, 0x8BE8, 0x8BE9, 0x8BEE, 0x8BF0, 0x8BF3, + 0x8BF6, 0x8BF9, 0x8BFC, 0x8BFF, 0x8C00, 0x8C02, 0x8C04, 0x8C07, + 0x8C0C, 0x8C0F, 0x8C11, 0x8C12, 0x8C14, 0x8C15, 0x8C16, 0x8C19, + 0x8C1B, 0x8C18, 0x8C1D, 0x8C1F, 0x8C20, 0x8C21, 0x8C25, 0x8C27, + 0x8C2A, 0x8C2B, 0x8C2E, 0x8C2F, 0x8C32, 0x8C33, 0x8C35, 0x8C36, + 0x5369, 0x537A, 0x961D, 0x9622, 0x9621, 0x9631, 0x962A, 0x963D, + 0x963C, 0x9642, 0x9649, 0x9654, 0x965F, 0x9667, 0x966C, 0x9672, + 0x9674, 0x9688, 0x968D, 0x9697, 0x96B0, 0x9097, 0x909B, 0x909D, + 0x9099, 0x90AC, 0x90A1, 0x90B4, 0x90B3, 0x90B6, 0x90BA, 0, +plane db +at 0xa0 + 0x8E71, 0x90B8, 0x90B0, 0x90CF, 0x90C5, 0x90BE, 0x90D0, 0x90C4, + 0x90C7, 0x90D3, 0x90E6, 0x90E2, 0x90DC, 0x90D7, 0x90DB, 0x90EB, + 0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, 0x9123, 0x9131, 0x912F, + 0x9139, 0x9143, 0x9146, 0x520D, 0x5942, 0x52A2, 0x52AC, 0x52AD, + 0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, 0x53DF, 0x71EE, 0x77CD, + 0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, 0x5F01, 0x755A, 0x5DEF, + 0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, 0x58C5, 0x58D1, 0x5729, + 0x572C, 0x572A, 0x5733, 0x5739, 0x572E, 0x572F, 0x575C, 0x573B, + 0x5742, 0x5769, 0x5785, 0x576B, 0x5786, 0x577C, 0x577B, 0x5768, + 0x576D, 0x5776, 0x5773, 0x57AD, 0x57A4, 0x578C, 0x57B2, 0x57CF, + 0x57A7, 0x57B4, 0x5793, 0x57A0, 0x57D5, 0x57D8, 0x57DA, 0x57D9, + 0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, 0x57E4, 0x57DD, 0, +plane dc +at 0xa0 + 0x8EE4, 0x580B, 0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, 0x5819, + 0x5844, 0x5820, 0x5865, 0x586C, 0x5881, 0x5889, 0x589A, 0x5880, + 0x99A8, 0x9F19, 0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, 0x828A, + 0x82A8, 0x8284, 0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, 0x82B8, + 0x82BE, 0x82B0, 0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, 0x82AE, + 0x82CB, 0x82CC, 0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, 0x829F, + 0x82C4, 0x82CE, 0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, 0x830F, + 0x8307, 0x82DC, 0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, 0x82D3, + 0x8311, 0x831A, 0x8306, 0x8314, 0x8315, 0x82E0, 0x82D5, 0x831C, + 0x8351, 0x835B, 0x835C, 0x8308, 0x8392, 0x833C, 0x8334, 0x8331, + 0x839B, 0x835E, 0x832F, 0x834F, 0x8347, 0x8343, 0x835F, 0x8340, + 0x8317, 0x8360, 0x832D, 0x833A, 0x8333, 0x8366, 0x8365, 0, +plane dd +at 0xa0 + 0x8F44, 0x8368, 0x831B, 0x8369, 0x836C, 0x836A, 0x836D, 0x836E, + 0x83B0, 0x8378, 0x83B3, 0x83B4, 0x83A0, 0x83AA, 0x8393, 0x839C, + 0x8385, 0x837C, 0x83B6, 0x83A9, 0x837D, 0x83B8, 0x837B, 0x8398, + 0x839E, 0x83A8, 0x83BA, 0x83BC, 0x83C1, 0x8401, 0x83E5, 0x83D8, + 0x5807, 0x8418, 0x840B, 0x83DD, 0x83FD, 0x83D6, 0x841C, 0x8438, + 0x8411, 0x8406, 0x83D4, 0x83DF, 0x840F, 0x8403, 0x83F8, 0x83F9, + 0x83EA, 0x83C5, 0x83C0, 0x8426, 0x83F0, 0x83E1, 0x845C, 0x8451, + 0x845A, 0x8459, 0x8473, 0x8487, 0x8488, 0x847A, 0x8489, 0x8478, + 0x843C, 0x8446, 0x8469, 0x8476, 0x848C, 0x848E, 0x8431, 0x846D, + 0x84C1, 0x84CD, 0x84D0, 0x84E6, 0x84BD, 0x84D3, 0x84CA, 0x84BF, + 0x84BA, 0x84E0, 0x84A1, 0x84B9, 0x84B4, 0x8497, 0x84E5, 0x84E3, + 0x850C, 0x750D, 0x8538, 0x84F0, 0x8539, 0x851F, 0x853A, 0, +plane de +at 0xa0 + 0x9018, 0x8556, 0x853B, 0x84FF, 0x84FC, 0x8559, 0x8548, 0x8568, + 0x8564, 0x855E, 0x857A, 0x77A2, 0x8543, 0x8572, 0x857B, 0x85A4, + 0x85A8, 0x8587, 0x858F, 0x8579, 0x85AE, 0x859C, 0x8585, 0x85B9, + 0x85B7, 0x85B0, 0x85D3, 0x85C1, 0x85DC, 0x85FF, 0x8627, 0x8605, + 0x8629, 0x8616, 0x863C, 0x5EFE, 0x5F08, 0x593C, 0x5941, 0x8037, + 0x5955, 0x595A, 0x5958, 0x530F, 0x5C22, 0x5C25, 0x5C2C, 0x5C34, + 0x624C, 0x626A, 0x629F, 0x62BB, 0x62CA, 0x62DA, 0x62D7, 0x62EE, + 0x6322, 0x62F6, 0x6339, 0x634B, 0x6343, 0x63AD, 0x63F6, 0x6371, + 0x637A, 0x638E, 0x63B4, 0x636D, 0x63AC, 0x638A, 0x6369, 0x63AE, + 0x63BC, 0x63F2, 0x63F8, 0x63E0, 0x63FF, 0x63C4, 0x63DE, 0x63CE, + 0x6452, 0x63C6, 0x63BE, 0x6445, 0x6441, 0x640B, 0x641B, 0x6420, + 0x640C, 0x6426, 0x6421, 0x645E, 0x6484, 0x646D, 0x6496, 0, +plane df +at 0xa0 + 0x90C0, 0x647A, 0x64B7, 0x64B8, 0x6499, 0x64BA, 0x64C0, 0x64D0, + 0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, 0x652E, 0x5F0B, 0x5FD2, + 0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, 0x53E9, 0x53E8, 0x53FB, + 0x5412, 0x5416, 0x5406, 0x544B, 0x5452, 0x5453, 0x5454, 0x5456, + 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494, + 0x5477, 0x5471, 0x5464, 0x549A, 0x549B, 0x5484, 0x5476, 0x5466, + 0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, 0x54D2, 0x54A7, 0x54A6, + 0x54D3, 0x54D4, 0x5472, 0x54A3, 0x54D5, 0x54BB, 0x54BF, 0x54CC, + 0x54D9, 0x54DA, 0x54DC, 0x54A9, 0x54AA, 0x54A4, 0x54DD, 0x54CF, + 0x54DE, 0x551B, 0x54E7, 0x5520, 0x54FD, 0x5514, 0x54F3, 0x5522, + 0x5523, 0x550F, 0x5511, 0x5527, 0x552A, 0x5567, 0x558F, 0x55B5, + 0x5549, 0x556D, 0x5541, 0x5555, 0x553F, 0x5550, 0x553C, 0, +plane e0 +at 0xa0 + 0x9144, 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, + 0x555C, 0x558B, 0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, 0x5581, + 0x559F, 0x557E, 0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, 0x55BE, + 0x5594, 0x5599, 0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, 0x55EB, + 0x55EC, 0x55D4, 0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, 0x55F2, + 0x55F3, 0x55CC, 0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F94, 0x561E, + 0x5608, 0x560C, 0x5601, 0x5624, 0x5623, 0x55FE, 0x5600, 0x5627, + 0x562D, 0x5658, 0x5639, 0x5657, 0x562C, 0x564D, 0x5662, 0x5659, + 0x565C, 0x564C, 0x5654, 0x5686, 0x5664, 0x5671, 0x566B, 0x567B, + 0x567C, 0x5685, 0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, 0x56E1, + 0x56F5, 0x56EB, 0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, 0x571C, + 0x5E0F, 0x5E19, 0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C, 0, +plane e1 +at 0xa0 + 0x91E5, 0x5E37, 0x5E44, 0x5E54, 0x5E5B, 0x5E5E, 0x5E61, 0x5C8C, + 0x5C7A, 0x5C8D, 0x5C90, 0x5C96, 0x5C88, 0x5C98, 0x5C99, 0x5C91, + 0x5C9A, 0x5C9C, 0x5CB5, 0x5CA2, 0x5CBD, 0x5CAC, 0x5CAB, 0x5CB1, + 0x5CA3, 0x5CC1, 0x5CB7, 0x5CC4, 0x5CD2, 0x5CE4, 0x5CCB, 0x5CE5, + 0x5D02, 0x5D03, 0x5D27, 0x5D26, 0x5D2E, 0x5D24, 0x5D1E, 0x5D06, + 0x5D1B, 0x5D58, 0x5D3E, 0x5D34, 0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F, + 0x5D5D, 0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, 0x5D74, 0x5D82, 0x5D99, + 0x5D9D, 0x8C73, 0x5DB7, 0x5DC5, 0x5F73, 0x5F77, 0x5F82, 0x5F87, + 0x5F89, 0x5F8C, 0x5F95, 0x5F99, 0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5, + 0x5FBC, 0x8862, 0x5F61, 0x72AD, 0x72B0, 0x72B4, 0x72B7, 0x72B8, + 0x72C3, 0x72C1, 0x72CE, 0x72CD, 0x72D2, 0x72E8, 0x72EF, 0x72E9, + 0x72F2, 0x72F4, 0x72F7, 0x7301, 0x72F3, 0x7303, 0x72FA, 0, +plane e2 +at 0xa0 + 0x9245, 0x72FB, 0x7317, 0x7313, 0x7321, 0x730A, 0x731E, 0x731D, + 0x7315, 0x7322, 0x7339, 0x7325, 0x732C, 0x7338, 0x7331, 0x7350, + 0x734D, 0x7357, 0x7360, 0x736C, 0x736F, 0x737E, 0x821B, 0x5925, + 0x98E7, 0x5924, 0x5902, 0x9963, 0x9967, 0x9968, 0x9969, 0x996A, + 0x996B, 0x996C, 0x9974, 0x9977, 0x997D, 0x9980, 0x9984, 0x9987, + 0x998A, 0x998D, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, 0x5E80, + 0x5E91, 0x5E8B, 0x5E96, 0x5EA5, 0x5EA0, 0x5EB9, 0x5EB5, 0x5EBE, + 0x5EB3, 0x8D53, 0x5ED2, 0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, 0x81BA, + 0x5FC4, 0x5FC9, 0x5FD6, 0x5FCF, 0x6003, 0x5FEE, 0x6004, 0x5FE1, + 0x5FE4, 0x5FFE, 0x6005, 0x6006, 0x5FEA, 0x5FED, 0x5FF8, 0x6019, + 0x6035, 0x6026, 0x601B, 0x600F, 0x600D, 0x6029, 0x602B, 0x600A, + 0x603F, 0x6021, 0x6078, 0x6079, 0x607B, 0x607A, 0x6042, 0, +plane e3 +at 0xa0 + 0x92A7, 0x606A, 0x607D, 0x6096, 0x609A, 0x60AD, 0x609D, 0x6083, + 0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, 0x60B1, 0x60DD, 0x60D8, + 0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60F4, + 0x6100, 0x610E, 0x612B, 0x614A, 0x6175, 0x61AC, 0x6194, 0x61A7, + 0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, 0x95E9, 0x95EB, 0x95F1, + 0x95F3, 0x95F5, 0x95F6, 0x95FC, 0x95FE, 0x9603, 0x9604, 0x9606, + 0x9608, 0x960A, 0x960B, 0x960C, 0x960D, 0x960F, 0x9612, 0x9615, + 0x9616, 0x9617, 0x9619, 0x961A, 0x4E2C, 0x723F, 0x6215, 0x6C35, + 0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, 0x6C90, 0x6C94, 0x6C8C, + 0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, 0x6CA9, 0x6CD0, 0x6CD4, + 0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, 0x6CB2, 0x6CE0, 0x6CD6, + 0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, 0x6CEF, 0x6CFE, 0, +plane e4 +at 0xa0 + 0x9309, 0x6D39, 0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, 0x6D04, + 0x6D19, 0x6D0E, 0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, 0x6D4F, + 0x6D52, 0x6D54, 0x6D33, 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, 0x6D5E, + 0x6D93, 0x6D94, 0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, 0x6DC7, + 0x6DC5, 0x6DDE, 0x6E0E, 0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, 0x6DDD, + 0x6DD9, 0x6E16, 0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, 0x6E4E, + 0x6E6B, 0x6EB2, 0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, 0x6E25, + 0x6E44, 0x6EDF, 0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, 0x6EA5, + 0x6EA7, 0x6EBD, 0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, 0x6E8F, + 0x6EC2, 0x6E9F, 0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, 0x6EF9, + 0x6F2F, 0x6F36, 0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, 0x6F89, + 0x6F8D, 0x6F8C, 0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1, 0, +plane e5 +at 0xa0 + 0x936B, 0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE, + 0x6FDE, 0x6FE0, 0x6FEF, 0x701A, 0x7023, 0x701B, 0x7039, 0x7035, + 0x704F, 0x705E, 0x5B80, 0x5B84, 0x5B95, 0x5B93, 0x5BA5, 0x5BB8, + 0x752F, 0x9A9E, 0x6434, 0x5BE4, 0x5BEE, 0x8930, 0x5BF0, 0x8E47, + 0x8B07, 0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9, + 0x8FE6, 0x8FF3, 0x8FE8, 0x9005, 0x9004, 0x900B, 0x9026, 0x9011, + 0x900D, 0x9016, 0x9021, 0x9035, 0x9036, 0x902D, 0x902F, 0x9044, + 0x9051, 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905B, 0x66B9, + 0x9074, 0x907D, 0x9082, 0x9088, 0x9083, 0x908B, 0x5F50, 0x5F57, + 0x5F56, 0x5F58, 0x5C3B, 0x54AB, 0x5C50, 0x5C59, 0x5B71, 0x5C63, + 0x5C66, 0x7FBC, 0x5F2A, 0x5F29, 0x5F2D, 0x8274, 0x5F3C, 0x9B3B, + 0x5C6E, 0x5981, 0x5983, 0x598D, 0x59A9, 0x59AA, 0x59A3, 0, +plane e6 +at 0xa0 + 0x93CD, 0x5997, 0x59CA, 0x59AB, 0x599E, 0x59A4, 0x59D2, 0x59B2, + 0x59AF, 0x59D7, 0x59BE, 0x5A05, 0x5A06, 0x59DD, 0x5A08, 0x59E3, + 0x59D8, 0x59F9, 0x5A0C, 0x5A09, 0x5A32, 0x5A34, 0x5A11, 0x5A23, + 0x5A13, 0x5A40, 0x5A67, 0x5A4A, 0x5A55, 0x5A3C, 0x5A62, 0x5A75, + 0x80EC, 0x5AAA, 0x5A9B, 0x5A77, 0x5A7A, 0x5ABE, 0x5AEB, 0x5AB2, + 0x5AD2, 0x5AD4, 0x5AB8, 0x5AE0, 0x5AE3, 0x5AF1, 0x5AD6, 0x5AE6, + 0x5AD8, 0x5ADC, 0x5B09, 0x5B17, 0x5B16, 0x5B32, 0x5B37, 0x5B40, + 0x5C15, 0x5C1C, 0x5B5A, 0x5B65, 0x5B73, 0x5B51, 0x5B53, 0x5B62, + 0x9A75, 0x9A77, 0x9A78, 0x9A7A, 0x9A7F, 0x9A7D, 0x9A80, 0x9A81, + 0x9A85, 0x9A88, 0x9A8A, 0x9A90, 0x9A92, 0x9A93, 0x9A96, 0x9A98, + 0x9A9B, 0x9A9C, 0x9A9D, 0x9A9F, 0x9AA0, 0x9AA2, 0x9AA3, 0x9AA5, + 0x9AA7, 0x7E9F, 0x7EA1, 0x7EA3, 0x7EA5, 0x7EA8, 0x7EA9, 0, +plane e7 +at 0xa0 + 0x942E, 0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, 0x7EC1, 0x7EC2, 0x7EC9, + 0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, 0x7EDB, 0x7EE0, 0x7EE1, + 0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, 0x7EF2, 0x7F0D, 0x7EF6, + 0x7EFA, 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, 0x7F03, 0x7F07, 0x7F08, + 0x7F0B, 0x7F0C, 0x7F0F, 0x7F11, 0x7F12, 0x7F17, 0x7F19, 0x7F1C, + 0x7F1B, 0x7F1F, 0x7F21, 0x7F22, 0x7F23, 0x7F24, 0x7F25, 0x7F26, + 0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, 0x7F2F, 0x7F30, 0x7F31, + 0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, 0x5DDB, 0x753E, 0x9095, + 0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, 0x73CF, 0x73C2, 0x73D1, + 0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, 0x73E5, 0x73D9, 0x987C, + 0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, 0x73F2, 0x740F, 0x742A, + 0x745B, 0x7426, 0x7425, 0x7428, 0x7430, 0x742E, 0x742C, 0, +plane e8 +at 0xa0 + 0x9520, 0x741B, 0x741A, 0x7441, 0x745C, 0x7457, 0x7455, 0x7459, + 0x7477, 0x746D, 0x747E, 0x749C, 0x748E, 0x7480, 0x7481, 0x7487, + 0x748B, 0x749E, 0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74D2, 0x74BA, + 0x97EA, 0x97EB, 0x97EC, 0x674C, 0x6753, 0x675E, 0x6748, 0x6769, + 0x67A5, 0x6787, 0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, 0x67A8, + 0x679E, 0x67AD, 0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, 0x67D8, + 0x680A, 0x67E9, 0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, 0x67B3, + 0x67DD, 0x6800, 0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, 0x67FD, + 0x6832, 0x6833, 0x6860, 0x6861, 0x684E, 0x6862, 0x6844, 0x6864, + 0x6883, 0x681D, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683E, + 0x684A, 0x6849, 0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, 0x6893, + 0x686B, 0x68C2, 0x696E, 0x68FC, 0x691F, 0x6920, 0x68F9, 0, +plane e9 +at 0xa0 + 0x95CB, 0x6924, 0x68F0, 0x690B, 0x6901, 0x6957, 0x68E3, 0x6910, + 0x6971, 0x6939, 0x6960, 0x6942, 0x695D, 0x6984, 0x696B, 0x6980, + 0x6998, 0x6978, 0x6934, 0x69CC, 0x6987, 0x6988, 0x69CE, 0x6989, + 0x6966, 0x6963, 0x6979, 0x699B, 0x69A7, 0x69BB, 0x69AB, 0x69AD, + 0x69D4, 0x69B1, 0x69C1, 0x69CA, 0x69DF, 0x6995, 0x69E0, 0x698D, + 0x69FF, 0x6A2F, 0x69ED, 0x6A17, 0x6A18, 0x6A65, 0x69F2, 0x6A44, + 0x6A3E, 0x6AA0, 0x6A50, 0x6A5B, 0x6A35, 0x6A8E, 0x6A79, 0x6A3D, + 0x6A28, 0x6A58, 0x6A7C, 0x6A91, 0x6A90, 0x6AA9, 0x6A97, 0x6AAB, + 0x7337, 0x7352, 0x6B81, 0x6B82, 0x6B87, 0x6B84, 0x6B92, 0x6B93, + 0x6B8D, 0x6B9A, 0x6B9B, 0x6BA1, 0x6BAA, 0x8F6B, 0x8F6D, 0x8F71, + 0x8F72, 0x8F73, 0x8F75, 0x8F76, 0x8F78, 0x8F77, 0x8F79, 0x8F7A, + 0x8F7C, 0x8F7E, 0x8F81, 0x8F82, 0x8F84, 0x8F87, 0x8F8B, 0, +plane ea +at 0xa0 + 0x968A, 0x8F8D, 0x8F8E, 0x8F8F, 0x8F98, 0x8F9A, 0x8ECE, 0x620B, + 0x6217, 0x621B, 0x621F, 0x6222, 0x6221, 0x6225, 0x6224, 0x622C, + 0x81E7, 0x74EF, 0x74F4, 0x74FF, 0x750F, 0x7511, 0x7513, 0x6534, + 0x65EE, 0x65EF, 0x65F0, 0x660A, 0x6619, 0x6772, 0x6603, 0x6615, + 0x6600, 0x7085, 0x66F7, 0x661D, 0x6634, 0x6631, 0x6636, 0x6635, + 0x8006, 0x665F, 0x6654, 0x6641, 0x664F, 0x6656, 0x6661, 0x6657, + 0x6677, 0x6684, 0x668C, 0x66A7, 0x669D, 0x66BE, 0x66DB, 0x66DC, + 0x66E6, 0x66E9, 0x8D32, 0x8D33, 0x8D36, 0x8D3B, 0x8D3D, 0x8D40, + 0x8D45, 0x8D46, 0x8D48, 0x8D49, 0x8D47, 0x8D4D, 0x8D55, 0x8D59, + 0x89C7, 0x89CA, 0x89CB, 0x89CC, 0x89CE, 0x89CF, 0x89D0, 0x89D1, + 0x726E, 0x729F, 0x725D, 0x7266, 0x726F, 0x727E, 0x727F, 0x7284, + 0x728B, 0x728D, 0x728F, 0x7292, 0x6308, 0x6332, 0x63B0, 0, +plane eb +at 0xa0 + 0x9720, 0x643F, 0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5, + 0x6BF9, 0x6C05, 0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x6C18, 0x6C19, + 0x6C1A, 0x6C21, 0x6C29, 0x6C24, 0x6C2A, 0x6C32, 0x6535, 0x6555, + 0x656B, 0x724D, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809F, + 0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, 0x80B1, 0x80AB, 0x80AD, + 0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, 0x80EA, 0x80DB, 0x80C2, + 0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, 0x80DD, 0x80EB, 0x80F1, + 0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, 0x80FC, 0x6715, 0x8112, + 0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, 0x8132, 0x8148, 0x814C, + 0x8153, 0x8174, 0x8159, 0x815A, 0x8171, 0x8160, 0x8169, 0x817C, + 0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, 0x8188, 0x8182, 0x8191, + 0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, 0x81CA, 0x81BB, 0, +plane ec +at 0xa0 + 0x979D, 0x81C1, 0x81A6, 0x6B24, 0x6B37, 0x6B39, 0x6B43, 0x6B46, + 0x6B59, 0x98D1, 0x98D2, 0x98D3, 0x98D5, 0x98D9, 0x98DA, 0x6BB3, + 0x5F40, 0x6BC2, 0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, 0x65C6, + 0x65C4, 0x65C3, 0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, 0x709C, + 0x7096, 0x709D, 0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, 0x70E8, + 0x70CA, 0x7110, 0x7113, 0x7116, 0x712F, 0x7131, 0x7173, 0x715C, + 0x7168, 0x7145, 0x7172, 0x714A, 0x7178, 0x717A, 0x7198, 0x71B3, + 0x71B5, 0x71A8, 0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, 0x721D, + 0x7228, 0x706C, 0x7118, 0x7166, 0x71B9, 0x623E, 0x623D, 0x6243, + 0x6248, 0x6249, 0x793B, 0x7940, 0x7946, 0x7949, 0x795B, 0x795C, + 0x7953, 0x795A, 0x7962, 0x7957, 0x7960, 0x796F, 0x7967, 0x797A, + 0x7985, 0x798A, 0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0, 0, +plane ed +at 0xa0 + 0x980E, 0x603C, 0x605D, 0x605A, 0x6067, 0x6041, 0x6059, 0x6063, + 0x60AB, 0x6106, 0x610D, 0x615D, 0x61A9, 0x619D, 0x61CB, 0x61D1, + 0x6206, 0x8080, 0x807F, 0x6C93, 0x6CF6, 0x6DFC, 0x77F6, 0x77F8, + 0x7800, 0x7809, 0x7817, 0x7818, 0x7811, 0x65AB, 0x782D, 0x781C, + 0x781D, 0x7839, 0x783A, 0x783B, 0x781F, 0x783C, 0x7825, 0x782C, + 0x7823, 0x7829, 0x784E, 0x786D, 0x7856, 0x7857, 0x7826, 0x7850, + 0x7847, 0x784C, 0x786A, 0x789B, 0x7893, 0x789A, 0x7887, 0x789C, + 0x78A1, 0x78A3, 0x78B2, 0x78B9, 0x78A5, 0x78D4, 0x78D9, 0x78C9, + 0x78EC, 0x78F2, 0x7905, 0x78F4, 0x7913, 0x7924, 0x791E, 0x7934, + 0x9F9B, 0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, 0x7704, 0x770D, 0x76F9, + 0x7707, 0x7708, 0x771A, 0x7722, 0x7719, 0x772D, 0x7726, 0x7735, + 0x7738, 0x7750, 0x7751, 0x7747, 0x7743, 0x775A, 0x7768, 0, +plane ee +at 0xa0 + 0x986E, 0x7762, 0x7765, 0x777F, 0x778D, 0x777D, 0x7780, 0x778C, + 0x7791, 0x779F, 0x77A0, 0x77B0, 0x77B5, 0x77BD, 0x753A, 0x7540, + 0x754E, 0x754B, 0x7548, 0x755B, 0x7572, 0x7579, 0x7583, 0x7F58, + 0x7F61, 0x7F5F, 0x8A48, 0x7F68, 0x7F74, 0x7F71, 0x7F79, 0x7F81, + 0x7F7E, 0x76CD, 0x76E5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948B, + 0x948A, 0x948C, 0x948D, 0x948F, 0x9490, 0x9494, 0x9497, 0x9495, + 0x949A, 0x949B, 0x949C, 0x94A3, 0x94A4, 0x94AB, 0x94AA, 0x94AD, + 0x94AC, 0x94AF, 0x94B0, 0x94B2, 0x94B4, 0x94B6, 0x94B7, 0x94B8, + 0x94B9, 0x94BA, 0x94BC, 0x94BD, 0x94BF, 0x94C4, 0x94C8, 0x94C9, + 0x94CA, 0x94CB, 0x94CC, 0x94CD, 0x94CE, 0x94D0, 0x94D1, 0x94D2, + 0x94D5, 0x94D6, 0x94D7, 0x94D9, 0x94D8, 0x94DB, 0x94DE, 0x94DF, + 0x94E0, 0x94E2, 0x94E4, 0x94E5, 0x94E7, 0x94E8, 0x94EA, 0, +plane ef +at 0xa0 + 0x9907, 0x94E9, 0x94EB, 0x94EE, 0x94EF, 0x94F3, 0x94F4, 0x94F5, + 0x94F7, 0x94F9, 0x94FC, 0x94FD, 0x94FF, 0x9503, 0x9502, 0x9506, + 0x9507, 0x9509, 0x950A, 0x950D, 0x950E, 0x950F, 0x9512, 0x9513, + 0x9514, 0x9515, 0x9516, 0x9518, 0x951B, 0x951D, 0x951E, 0x951F, + 0x9522, 0x952A, 0x952B, 0x9529, 0x952C, 0x9531, 0x9532, 0x9534, + 0x9536, 0x9537, 0x9538, 0x953C, 0x953E, 0x953F, 0x9542, 0x9535, + 0x9544, 0x9545, 0x9546, 0x9549, 0x954C, 0x954E, 0x954F, 0x9552, + 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955B, 0x955E, + 0x955F, 0x955D, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567, + 0x9568, 0x9569, 0x956A, 0x956B, 0x956C, 0x956F, 0x9571, 0x9572, + 0x9573, 0x953A, 0x77E7, 0x77EC, 0x96C9, 0x79D5, 0x79ED, 0x79E3, + 0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, 0x7A1E, 0x7A14, 0, +plane f0 +at 0xa0 + 0x9989, 0x7A39, 0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, 0x7688, + 0x768E, 0x7693, 0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, 0x9E20, + 0x9E22, 0x9E28, 0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, 0x9E31, + 0x9E36, 0x9E38, 0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, 0x9E42, + 0x9E44, 0x9E46, 0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, 0x9E4E, + 0x9E51, 0x9E55, 0x9E57, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, 0x9E63, + 0x9E66, 0x9E67, 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, 0x9E71, + 0x9E6D, 0x9E73, 0x7592, 0x7594, 0x7596, 0x75A0, 0x759D, 0x75AC, + 0x75A3, 0x75B3, 0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, 0x75C3, + 0x75C2, 0x75D6, 0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, 0x75EB, + 0x75E7, 0x7603, 0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, 0x7605, + 0x760C, 0x7617, 0x760A, 0x7625, 0x7618, 0x7615, 0x7619, 0, +plane f1 +at 0xa0 + 0x99F9, 0x761B, 0x763C, 0x7622, 0x7620, 0x7640, 0x762D, 0x7630, + 0x763F, 0x7635, 0x7643, 0x763E, 0x7633, 0x764D, 0x765E, 0x7654, + 0x765C, 0x7656, 0x766B, 0x766F, 0x7FCA, 0x7AE6, 0x7A78, 0x7A79, + 0x7A80, 0x7A86, 0x7A88, 0x7A95, 0x7AA6, 0x7AA0, 0x7AAC, 0x7AA8, + 0x7AAD, 0x7AB3, 0x8864, 0x8869, 0x8872, 0x887D, 0x887F, 0x8882, + 0x88A2, 0x88C6, 0x88B7, 0x88BC, 0x88C9, 0x88E2, 0x88CE, 0x88E3, + 0x88E5, 0x88F1, 0x891A, 0x88FC, 0x88E8, 0x88FE, 0x88F0, 0x8921, + 0x8919, 0x8913, 0x891B, 0x890A, 0x8934, 0x892B, 0x8936, 0x8941, + 0x8966, 0x897B, 0x758B, 0x80E5, 0x76B2, 0x76B4, 0x77DC, 0x8012, + 0x8014, 0x8016, 0x801C, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, + 0x8029, 0x8028, 0x8031, 0x800B, 0x8035, 0x8043, 0x8046, 0x804D, + 0x8052, 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883, 0, +plane f2 +at 0xa0 + 0x9A59, 0x9889, 0x988C, 0x988D, 0x988F, 0x9894, 0x989A, 0x989B, + 0x989E, 0x989F, 0x98A1, 0x98A2, 0x98A5, 0x98A6, 0x864D, 0x8654, + 0x866C, 0x866E, 0x867F, 0x867A, 0x867C, 0x867B, 0x86A8, 0x868D, + 0x868B, 0x86AC, 0x869D, 0x86A7, 0x86A3, 0x86AA, 0x8693, 0x86A9, + 0x86B6, 0x86C4, 0x86B5, 0x86CE, 0x86B0, 0x86BA, 0x86B1, 0x86AF, + 0x86C9, 0x86CF, 0x86B4, 0x86E9, 0x86F1, 0x86F2, 0x86ED, 0x86F3, + 0x86D0, 0x8713, 0x86DE, 0x86F4, 0x86DF, 0x86D8, 0x86D1, 0x8703, + 0x8707, 0x86F8, 0x8708, 0x870A, 0x870D, 0x8709, 0x8723, 0x873B, + 0x871E, 0x8725, 0x872E, 0x871A, 0x873E, 0x8748, 0x8734, 0x8731, + 0x8729, 0x8737, 0x873F, 0x8782, 0x8722, 0x877D, 0x877E, 0x877B, + 0x8760, 0x8770, 0x874C, 0x876E, 0x878B, 0x8753, 0x8763, 0x877C, + 0x8764, 0x8759, 0x8765, 0x8793, 0x87AF, 0x87A8, 0x87D2, 0, +plane f3 +at 0xa0 + 0x9B06, 0x87C6, 0x8788, 0x8785, 0x87AD, 0x8797, 0x8783, 0x87AB, + 0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, 0x87D3, 0x87BD, 0x87D1, + 0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, 0x87EE, 0x8816, 0x8813, + 0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, 0x883C, 0x7F36, 0x7F42, + 0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, 0x7B08, 0x7B03, 0x7B04, + 0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, 0x7B38, 0x7B2A, 0x7B19, + 0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, 0x7B33, 0x7B3E, 0x7B1E, + 0x7B58, 0x7B5A, 0x7B45, 0x7B75, 0x7B4C, 0x7B5D, 0x7B60, 0x7B6E, + 0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, 0x7BA6, 0x7BA7, 0x7BB8, + 0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, 0x7B9C, 0x7BA2, 0x7BAB, + 0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, 0x7BDA, 0x7BE5, 0x7BE6, + 0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, 0x7C16, 0x7C0B, 0, +plane f4 +at 0xa0 + 0x9B7B, 0x7C1F, 0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, 0x81FE, + 0x8201, 0x8202, 0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, 0x8223, + 0x822D, 0x822F, 0x8228, 0x822B, 0x8238, 0x823B, 0x8233, 0x8234, + 0x823E, 0x8244, 0x8249, 0x824B, 0x824F, 0x825A, 0x825F, 0x8268, + 0x887E, 0x8885, 0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, 0x7F9F, + 0x7FA7, 0x7FAF, 0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, 0x7C9D, + 0x7C9C, 0x7C9E, 0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, 0x7CC7, + 0x7CCC, 0x7CCD, 0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, 0x66A8, + 0x7FBF, 0x7FCE, 0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FEE, + 0x7FF3, 0x7CF8, 0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, 0x9EB8, + 0x9EB4, 0x8D73, 0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, 0x8D6D, + 0x8C47, 0x8C49, 0x914A, 0x9150, 0x914E, 0x914F, 0x9164, 0, +plane f5 +at 0xa0 + 0x9BDB, 0x9162, 0x9161, 0x9170, 0x9169, 0x916F, 0x917D, 0x917E, + 0x9172, 0x9174, 0x9179, 0x918C, 0x9185, 0x9190, 0x918D, 0x9191, + 0x91A2, 0x91A3, 0x91AA, 0x91AD, 0x91AE, 0x91AF, 0x91B5, 0x91B4, + 0x91BA, 0x8C55, 0x9E7E, 0x8DB8, 0x8DEB, 0x8E05, 0x8E59, 0x8E69, + 0x8DB5, 0x8DBF, 0x8DBC, 0x8DBA, 0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA, + 0x8DDE, 0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8, + 0x8DE3, 0x8DF9, 0x8DFB, 0x8DE4, 0x8E09, 0x8DFD, 0x8E14, 0x8E1D, + 0x8E1F, 0x8E2C, 0x8E2E, 0x8E23, 0x8E2F, 0x8E3A, 0x8E40, 0x8E39, + 0x8E35, 0x8E3D, 0x8E31, 0x8E49, 0x8E41, 0x8E42, 0x8E51, 0x8E52, + 0x8E4A, 0x8E70, 0x8E76, 0x8E7C, 0x8E6F, 0x8E74, 0x8E85, 0x8E8F, + 0x8E94, 0x8E90, 0x8E9C, 0x8E9E, 0x8C78, 0x8C82, 0x8C8A, 0x8C85, + 0x8C98, 0x8C94, 0x659B, 0x89D6, 0x89DE, 0x89DA, 0x89DC, 0, +plane f6 +at 0xa0 + 0x9C3B, 0x89E5, 0x89EB, 0x89EF, 0x8A3E, 0x8B26, 0x9753, 0x96E9, + 0x96F3, 0x96EF, 0x9706, 0x9701, 0x9708, 0x970F, 0x970E, 0x972A, + 0x972D, 0x9730, 0x973E, 0x9F80, 0x9F83, 0x9F85, 0x9F86, 0x9F87, + 0x9F88, 0x9F89, 0x9F8A, 0x9F8C, 0x9EFE, 0x9F0B, 0x9F0D, 0x96B9, + 0x96BC, 0x96BD, 0x96CE, 0x96D2, 0x77BF, 0x96E0, 0x928E, 0x92AE, + 0x92C8, 0x933E, 0x936A, 0x93CA, 0x938F, 0x943E, 0x946B, 0x9C7F, + 0x9C82, 0x9C85, 0x9C86, 0x9C87, 0x9C88, 0x7A23, 0x9C8B, 0x9C8E, + 0x9C90, 0x9C91, 0x9C92, 0x9C94, 0x9C95, 0x9C9A, 0x9C9B, 0x9C9E, + 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA5, 0x9CA6, 0x9CA7, + 0x9CA8, 0x9CA9, 0x9CAB, 0x9CAD, 0x9CAE, 0x9CB0, 0x9CB1, 0x9CB2, + 0x9CB3, 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CBA, 0x9CBB, 0x9CBC, + 0x9CBD, 0x9CC4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CCA, 0x9CCB, 0, +plane f7 +at 0xa0 + 0x9CE1, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x9CD4, + 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x9CE2, + 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x97A3, + 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x9ABA, + 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x9AD1, + 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x98E8, + 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x9AE1, 0x9AE6, 0x9AEF, + 0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, 0x9B0F, 0x9B13, 0x9B1F, + 0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, 0x9E87, 0x9E88, 0x9E8B, + 0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EE0, + 0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, 0x9EEA, 0x9EEF, 0x9F22, + 0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, 0x9F3E, 0x9F44, 0, +plane f8 +at 0xa0 + 0x9D42, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane f9 +at 0xa0 + 0x9DA2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fa +at 0xa0 + 0x9E02, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fb +at 0xa0 + 0x9EAA, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fc +at 0xa0 + 0x9F31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fd +at 0xa0 + 0xF9F1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fe +at 0xa0 + 0xE864, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/ugbk.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/ugbk.map new file mode 100755 index 00000000..3d4370e6 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/ugbk.map @@ -0,0 +1,3295 @@ +# GBK --> Unicode conversion table: +# generated by Chen Xiangyang (chenxy@sun.ihep.ac.cn) +# +# it contains all 21886 characters of GBK character set, it also contains +# some unused codes in order to make the array easy to use. +# Code range: first byte: 0x81 -- 0xFE 126 +# second byte: 0x40 -- 0xFF 192 +# code points: 126 x 192 = 24192 +# +# Usage: +# +# unsigned short GBK_code, unicode; +# int pos; +# pos = ((GBK_code>>8)-0x81)*192 + ((GBK_Code&0x00FF)-0x40); +# unicode = gbk2uni[pos]; +# +# Converted to ttf2pt1 map format by Sergey Babkin +# + +plane 81 +at 0x40 + 0x4E02, 0x4E04, 0x4E05, 0x4E06, 0x4E0F, 0x4E12, 0x4E17, 0x4E1F, + 0x4E20, 0x4E21, 0x4E23, 0x4E26, 0x4E29, 0x4E2E, 0x4E2F, 0x4E31, + 0x4E33, 0x4E35, 0x4E37, 0x4E3C, 0x4E40, 0x4E41, 0x4E42, 0x4E44, + 0x4E46, 0x4E4A, 0x4E51, 0x4E55, 0x4E57, 0x4E5A, 0x4E5B, 0x4E62, + 0x4E63, 0x4E64, 0x4E65, 0x4E67, 0x4E68, 0x4E6A, 0x4E6B, 0x4E6C, + 0x4E6D, 0x4E6E, 0x4E6F, 0x4E72, 0x4E74, 0x4E75, 0x4E76, 0x4E77, + 0x4E78, 0x4E79, 0x4E7A, 0x4E7B, 0x4E7C, 0x4E7D, 0x4E7F, 0x4E80, + 0x4E81, 0x4E82, 0x4E83, 0x4E84, 0x4E85, 0x4E87, 0x4E8A, 0, + 0x4E90, 0x4E96, 0x4E97, 0x4E99, 0x4E9C, 0x4E9D, 0x4E9E, 0x4EA3, + 0x4EAA, 0x4EAF, 0x4EB0, 0x4EB1, 0x4EB4, 0x4EB6, 0x4EB7, 0x4EB8, + 0x4EB9, 0x4EBC, 0x4EBD, 0x4EBE, 0x4EC8, 0x4ECC, 0x4ECF, 0x4ED0, + 0x4ED2, 0x4EDA, 0x4EDB, 0x4EDC, 0x4EE0, 0x4EE2, 0x4EE6, 0x4EE7, + 0x4EE9, 0x4EED, 0x4EEE, 0x4EEF, 0x4EF1, 0x4EF4, 0x4EF8, 0x4EF9, + 0x4EFA, 0x4EFC, 0x4EFE, 0x4F00, 0x4F02, 0x4F03, 0x4F04, 0x4F05, + 0x4F06, 0x4F07, 0x4F08, 0x4F0B, 0x4F0C, 0x4F12, 0x4F13, 0x4F14, + 0x4F15, 0x4F16, 0x4F1C, 0x4F1D, 0x4F21, 0x4F23, 0x4F28, 0x4F29, + 0x4F2C, 0x4F2D, 0x4F2E, 0x4F31, 0x4F33, 0x4F35, 0x4F37, 0x4F39, + 0x4F3B, 0x4F3E, 0x4F3F, 0x4F40, 0x4F41, 0x4F42, 0x4F44, 0x4F45, + 0x4F47, 0x4F48, 0x4F49, 0x4F4A, 0x4F4B, 0x4F4C, 0x4F52, 0x4F54, + 0x4F56, 0x4F61, 0x4F62, 0x4F66, 0x4F68, 0x4F6A, 0x4F6B, 0x4F6D, + 0x4F6E, 0x4F71, 0x4F72, 0x4F75, 0x4F77, 0x4F78, 0x4F79, 0x4F7A, + 0x4F7D, 0x4F80, 0x4F81, 0x4F82, 0x4F85, 0x4F86, 0x4F87, 0x4F8A, + 0x4F8C, 0x4F8E, 0x4F90, 0x4F92, 0x4F93, 0x4F95, 0x4F96, 0x4F98, + 0x4F99, 0x4F9A, 0x4F9C, 0x4F9E, 0x4F9F, 0x4FA1, 0x4FA2, 0, +plane 82 +at 0x40 + 0x4FA4, 0x4FAB, 0x4FAD, 0x4FB0, 0x4FB1, 0x4FB2, 0x4FB3, 0x4FB4, + 0x4FB6, 0x4FB7, 0x4FB8, 0x4FB9, 0x4FBA, 0x4FBB, 0x4FBC, 0x4FBD, + 0x4FBE, 0x4FC0, 0x4FC1, 0x4FC2, 0x4FC6, 0x4FC7, 0x4FC8, 0x4FC9, + 0x4FCB, 0x4FCC, 0x4FCD, 0x4FD2, 0x4FD3, 0x4FD4, 0x4FD5, 0x4FD6, + 0x4FD9, 0x4FDB, 0x4FE0, 0x4FE2, 0x4FE4, 0x4FE5, 0x4FE7, 0x4FEB, + 0x4FEC, 0x4FF0, 0x4FF2, 0x4FF4, 0x4FF5, 0x4FF6, 0x4FF7, 0x4FF9, + 0x4FFB, 0x4FFC, 0x4FFD, 0x4FFF, 0x5000, 0x5001, 0x5002, 0x5003, + 0x5004, 0x5005, 0x5006, 0x5007, 0x5008, 0x5009, 0x500A, 0, + 0x500B, 0x500E, 0x5010, 0x5011, 0x5013, 0x5015, 0x5016, 0x5017, + 0x501B, 0x501D, 0x501E, 0x5020, 0x5022, 0x5023, 0x5024, 0x5027, + 0x502B, 0x502F, 0x5030, 0x5031, 0x5032, 0x5033, 0x5034, 0x5035, + 0x5036, 0x5037, 0x5038, 0x5039, 0x503B, 0x503D, 0x503F, 0x5040, + 0x5041, 0x5042, 0x5044, 0x5045, 0x5046, 0x5049, 0x504A, 0x504B, + 0x504D, 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5056, 0x5057, + 0x5058, 0x5059, 0x505B, 0x505D, 0x505E, 0x505F, 0x5060, 0x5061, + 0x5062, 0x5063, 0x5064, 0x5066, 0x5067, 0x5068, 0x5069, 0x506A, + 0x506B, 0x506D, 0x506E, 0x506F, 0x5070, 0x5071, 0x5072, 0x5073, + 0x5074, 0x5075, 0x5078, 0x5079, 0x507A, 0x507C, 0x507D, 0x5081, + 0x5082, 0x5083, 0x5084, 0x5086, 0x5087, 0x5089, 0x508A, 0x508B, + 0x508C, 0x508E, 0x508F, 0x5090, 0x5091, 0x5092, 0x5093, 0x5094, + 0x5095, 0x5096, 0x5097, 0x5098, 0x5099, 0x509A, 0x509B, 0x509C, + 0x509D, 0x509E, 0x509F, 0x50A0, 0x50A1, 0x50A2, 0x50A4, 0x50A6, + 0x50AA, 0x50AB, 0x50AD, 0x50AE, 0x50AF, 0x50B0, 0x50B1, 0x50B3, + 0x50B4, 0x50B5, 0x50B6, 0x50B7, 0x50B8, 0x50B9, 0x50BC, 0, +plane 83 +at 0x40 + 0x50BD, 0x50BE, 0x50BF, 0x50C0, 0x50C1, 0x50C2, 0x50C3, 0x50C4, + 0x50C5, 0x50C6, 0x50C7, 0x50C8, 0x50C9, 0x50CA, 0x50CB, 0x50CC, + 0x50CD, 0x50CE, 0x50D0, 0x50D1, 0x50D2, 0x50D3, 0x50D4, 0x50D5, + 0x50D7, 0x50D8, 0x50D9, 0x50DB, 0x50DC, 0x50DD, 0x50DE, 0x50DF, + 0x50E0, 0x50E1, 0x50E2, 0x50E3, 0x50E4, 0x50E5, 0x50E8, 0x50E9, + 0x50EA, 0x50EB, 0x50EF, 0x50F0, 0x50F1, 0x50F2, 0x50F4, 0x50F6, + 0x50F7, 0x50F8, 0x50F9, 0x50FA, 0x50FC, 0x50FD, 0x50FE, 0x50FF, + 0x5100, 0x5101, 0x5102, 0x5103, 0x5104, 0x5105, 0x5108, 0, + 0x5109, 0x510A, 0x510C, 0x510D, 0x510E, 0x510F, 0x5110, 0x5111, + 0x5113, 0x5114, 0x5115, 0x5116, 0x5117, 0x5118, 0x5119, 0x511A, + 0x511B, 0x511C, 0x511D, 0x511E, 0x511F, 0x5120, 0x5122, 0x5123, + 0x5124, 0x5125, 0x5126, 0x5127, 0x5128, 0x5129, 0x512A, 0x512B, + 0x512C, 0x512D, 0x512E, 0x512F, 0x5130, 0x5131, 0x5132, 0x5133, + 0x5134, 0x5135, 0x5136, 0x5137, 0x5138, 0x5139, 0x513A, 0x513B, + 0x513C, 0x513D, 0x513E, 0x5142, 0x5147, 0x514A, 0x514C, 0x514E, + 0x514F, 0x5150, 0x5152, 0x5153, 0x5157, 0x5158, 0x5159, 0x515B, + 0x515D, 0x515E, 0x515F, 0x5160, 0x5161, 0x5163, 0x5164, 0x5166, + 0x5167, 0x5169, 0x516A, 0x516F, 0x5172, 0x517A, 0x517E, 0x517F, + 0x5183, 0x5184, 0x5186, 0x5187, 0x518A, 0x518B, 0x518E, 0x518F, + 0x5190, 0x5191, 0x5193, 0x5194, 0x5198, 0x519A, 0x519D, 0x519E, + 0x519F, 0x51A1, 0x51A3, 0x51A6, 0x51A7, 0x51A8, 0x51A9, 0x51AA, + 0x51AD, 0x51AE, 0x51B4, 0x51B8, 0x51B9, 0x51BA, 0x51BE, 0x51BF, + 0x51C1, 0x51C2, 0x51C3, 0x51C5, 0x51C8, 0x51CA, 0x51CD, 0x51CE, + 0x51D0, 0x51D2, 0x51D3, 0x51D4, 0x51D5, 0x51D6, 0x51D7, 0, +plane 84 +at 0x40 + 0x51D8, 0x51D9, 0x51DA, 0x51DC, 0x51DE, 0x51DF, 0x51E2, 0x51E3, + 0x51E5, 0x51E6, 0x51E7, 0x51E8, 0x51E9, 0x51EA, 0x51EC, 0x51EE, + 0x51F1, 0x51F2, 0x51F4, 0x51F7, 0x51FE, 0x5204, 0x5205, 0x5209, + 0x520B, 0x520C, 0x520F, 0x5210, 0x5213, 0x5214, 0x5215, 0x521C, + 0x521E, 0x521F, 0x5221, 0x5222, 0x5223, 0x5225, 0x5226, 0x5227, + 0x522A, 0x522C, 0x522F, 0x5231, 0x5232, 0x5234, 0x5235, 0x523C, + 0x523E, 0x5244, 0x5245, 0x5246, 0x5247, 0x5248, 0x5249, 0x524B, + 0x524E, 0x524F, 0x5252, 0x5253, 0x5255, 0x5257, 0x5258, 0, + 0x5259, 0x525A, 0x525B, 0x525D, 0x525F, 0x5260, 0x5262, 0x5263, + 0x5264, 0x5266, 0x5268, 0x526B, 0x526C, 0x526D, 0x526E, 0x5270, + 0x5271, 0x5273, 0x5274, 0x5275, 0x5276, 0x5277, 0x5278, 0x5279, + 0x527A, 0x527B, 0x527C, 0x527E, 0x5280, 0x5283, 0x5284, 0x5285, + 0x5286, 0x5287, 0x5289, 0x528A, 0x528B, 0x528C, 0x528D, 0x528E, + 0x528F, 0x5291, 0x5292, 0x5294, 0x5295, 0x5296, 0x5297, 0x5298, + 0x5299, 0x529A, 0x529C, 0x52A4, 0x52A5, 0x52A6, 0x52A7, 0x52AE, + 0x52AF, 0x52B0, 0x52B4, 0x52B5, 0x52B6, 0x52B7, 0x52B8, 0x52B9, + 0x52BA, 0x52BB, 0x52BC, 0x52BD, 0x52C0, 0x52C1, 0x52C2, 0x52C4, + 0x52C5, 0x52C6, 0x52C8, 0x52CA, 0x52CC, 0x52CD, 0x52CE, 0x52CF, + 0x52D1, 0x52D3, 0x52D4, 0x52D5, 0x52D7, 0x52D9, 0x52DA, 0x52DB, + 0x52DC, 0x52DD, 0x52DE, 0x52E0, 0x52E1, 0x52E2, 0x52E3, 0x52E5, + 0x52E6, 0x52E7, 0x52E8, 0x52E9, 0x52EA, 0x52EB, 0x52EC, 0x52ED, + 0x52EE, 0x52EF, 0x52F1, 0x52F2, 0x52F3, 0x52F4, 0x52F5, 0x52F6, + 0x52F7, 0x52F8, 0x52FB, 0x52FC, 0x52FD, 0x5301, 0x5302, 0x5303, + 0x5304, 0x5307, 0x5309, 0x530A, 0x530B, 0x530C, 0x530E, 0, +plane 85 +at 0x40 + 0x5311, 0x5312, 0x5313, 0x5314, 0x5318, 0x531B, 0x531C, 0x531E, + 0x531F, 0x5322, 0x5324, 0x5325, 0x5327, 0x5328, 0x5329, 0x532B, + 0x532C, 0x532D, 0x532F, 0x5330, 0x5331, 0x5332, 0x5333, 0x5334, + 0x5335, 0x5336, 0x5337, 0x5338, 0x533C, 0x533D, 0x5340, 0x5342, + 0x5344, 0x5346, 0x534B, 0x534C, 0x534D, 0x5350, 0x5354, 0x5358, + 0x5359, 0x535B, 0x535D, 0x5365, 0x5368, 0x536A, 0x536C, 0x536D, + 0x5372, 0x5376, 0x5379, 0x537B, 0x537C, 0x537D, 0x537E, 0x5380, + 0x5381, 0x5383, 0x5387, 0x5388, 0x538A, 0x538E, 0x538F, 0, + 0x5390, 0x5391, 0x5392, 0x5393, 0x5394, 0x5396, 0x5397, 0x5399, + 0x539B, 0x539C, 0x539E, 0x53A0, 0x53A1, 0x53A4, 0x53A7, 0x53AA, + 0x53AB, 0x53AC, 0x53AD, 0x53AF, 0x53B0, 0x53B1, 0x53B2, 0x53B3, + 0x53B4, 0x53B5, 0x53B7, 0x53B8, 0x53B9, 0x53BA, 0x53BC, 0x53BD, + 0x53BE, 0x53C0, 0x53C3, 0x53C4, 0x53C5, 0x53C6, 0x53C7, 0x53CE, + 0x53CF, 0x53D0, 0x53D2, 0x53D3, 0x53D5, 0x53DA, 0x53DC, 0x53DD, + 0x53DE, 0x53E1, 0x53E2, 0x53E7, 0x53F4, 0x53FA, 0x53FE, 0x53FF, + 0x5400, 0x5402, 0x5405, 0x5407, 0x540B, 0x5414, 0x5418, 0x5419, + 0x541A, 0x541C, 0x5422, 0x5424, 0x5425, 0x542A, 0x5430, 0x5433, + 0x5436, 0x5437, 0x543A, 0x543D, 0x543F, 0x5441, 0x5442, 0x5444, + 0x5445, 0x5447, 0x5449, 0x544C, 0x544D, 0x544E, 0x544F, 0x5451, + 0x545A, 0x545D, 0x545E, 0x545F, 0x5460, 0x5461, 0x5463, 0x5465, + 0x5467, 0x5469, 0x546A, 0x546B, 0x546C, 0x546D, 0x546E, 0x546F, + 0x5470, 0x5474, 0x5479, 0x547A, 0x547E, 0x547F, 0x5481, 0x5483, + 0x5485, 0x5487, 0x5488, 0x5489, 0x548A, 0x548D, 0x5491, 0x5493, + 0x5497, 0x5498, 0x549C, 0x549E, 0x549F, 0x54A0, 0x54A1, 0, +plane 86 +at 0x40 + 0x54A2, 0x54A5, 0x54AE, 0x54B0, 0x54B2, 0x54B5, 0x54B6, 0x54B7, + 0x54B9, 0x54BA, 0x54BC, 0x54BE, 0x54C3, 0x54C5, 0x54CA, 0x54CB, + 0x54D6, 0x54D8, 0x54DB, 0x54E0, 0x54E1, 0x54E2, 0x54E3, 0x54E4, + 0x54EB, 0x54EC, 0x54EF, 0x54F0, 0x54F1, 0x54F4, 0x54F5, 0x54F6, + 0x54F7, 0x54F8, 0x54F9, 0x54FB, 0x54FE, 0x5500, 0x5502, 0x5503, + 0x5504, 0x5505, 0x5508, 0x550A, 0x550B, 0x550C, 0x550D, 0x550E, + 0x5512, 0x5513, 0x5515, 0x5516, 0x5517, 0x5518, 0x5519, 0x551A, + 0x551C, 0x551D, 0x551E, 0x551F, 0x5521, 0x5525, 0x5526, 0, + 0x5528, 0x5529, 0x552B, 0x552D, 0x5532, 0x5534, 0x5535, 0x5536, + 0x5538, 0x5539, 0x553A, 0x553B, 0x553D, 0x5540, 0x5542, 0x5545, + 0x5547, 0x5548, 0x554B, 0x554C, 0x554D, 0x554E, 0x554F, 0x5551, + 0x5552, 0x5553, 0x5554, 0x5557, 0x5558, 0x5559, 0x555A, 0x555B, + 0x555D, 0x555E, 0x555F, 0x5560, 0x5562, 0x5563, 0x5568, 0x5569, + 0x556B, 0x556F, 0x5570, 0x5571, 0x5572, 0x5573, 0x5574, 0x5579, + 0x557A, 0x557D, 0x557F, 0x5585, 0x5586, 0x558C, 0x558D, 0x558E, + 0x5590, 0x5592, 0x5593, 0x5595, 0x5596, 0x5597, 0x559A, 0x559B, + 0x559E, 0x55A0, 0x55A1, 0x55A2, 0x55A3, 0x55A4, 0x55A5, 0x55A6, + 0x55A8, 0x55A9, 0x55AA, 0x55AB, 0x55AC, 0x55AD, 0x55AE, 0x55AF, + 0x55B0, 0x55B2, 0x55B4, 0x55B6, 0x55B8, 0x55BA, 0x55BC, 0x55BF, + 0x55C0, 0x55C1, 0x55C2, 0x55C3, 0x55C6, 0x55C7, 0x55C8, 0x55CA, + 0x55CB, 0x55CE, 0x55CF, 0x55D0, 0x55D5, 0x55D7, 0x55D8, 0x55D9, + 0x55DA, 0x55DB, 0x55DE, 0x55E0, 0x55E2, 0x55E7, 0x55E9, 0x55ED, + 0x55EE, 0x55F0, 0x55F1, 0x55F4, 0x55F6, 0x55F8, 0x55F9, 0x55FA, + 0x55FB, 0x55FC, 0x55FF, 0x5602, 0x5603, 0x5604, 0x5605, 0, +plane 87 +at 0x40 + 0x5606, 0x5607, 0x560A, 0x560B, 0x560D, 0x5610, 0x5611, 0x5612, + 0x5613, 0x5614, 0x5615, 0x5616, 0x5617, 0x5619, 0x561A, 0x561C, + 0x561D, 0x5620, 0x5621, 0x5622, 0x5625, 0x5626, 0x5628, 0x5629, + 0x562A, 0x562B, 0x562E, 0x562F, 0x5630, 0x5633, 0x5635, 0x5637, + 0x5638, 0x563A, 0x563C, 0x563D, 0x563E, 0x5640, 0x5641, 0x5642, + 0x5643, 0x5644, 0x5645, 0x5646, 0x5647, 0x5648, 0x5649, 0x564A, + 0x564B, 0x564F, 0x5650, 0x5651, 0x5652, 0x5653, 0x5655, 0x5656, + 0x565A, 0x565B, 0x565D, 0x565E, 0x565F, 0x5660, 0x5661, 0, + 0x5663, 0x5665, 0x5666, 0x5667, 0x566D, 0x566E, 0x566F, 0x5670, + 0x5672, 0x5673, 0x5674, 0x5675, 0x5677, 0x5678, 0x5679, 0x567A, + 0x567D, 0x567E, 0x567F, 0x5680, 0x5681, 0x5682, 0x5683, 0x5684, + 0x5687, 0x5688, 0x5689, 0x568A, 0x568B, 0x568C, 0x568D, 0x5690, + 0x5691, 0x5692, 0x5694, 0x5695, 0x5696, 0x5697, 0x5698, 0x5699, + 0x569A, 0x569B, 0x569C, 0x569D, 0x569E, 0x569F, 0x56A0, 0x56A1, + 0x56A2, 0x56A4, 0x56A5, 0x56A6, 0x56A7, 0x56A8, 0x56A9, 0x56AA, + 0x56AB, 0x56AC, 0x56AD, 0x56AE, 0x56B0, 0x56B1, 0x56B2, 0x56B3, + 0x56B4, 0x56B5, 0x56B6, 0x56B8, 0x56B9, 0x56BA, 0x56BB, 0x56BD, + 0x56BE, 0x56BF, 0x56C0, 0x56C1, 0x56C2, 0x56C3, 0x56C4, 0x56C5, + 0x56C6, 0x56C7, 0x56C8, 0x56C9, 0x56CB, 0x56CC, 0x56CD, 0x56CE, + 0x56CF, 0x56D0, 0x56D1, 0x56D2, 0x56D3, 0x56D5, 0x56D6, 0x56D8, + 0x56D9, 0x56DC, 0x56E3, 0x56E5, 0x56E6, 0x56E7, 0x56E8, 0x56E9, + 0x56EA, 0x56EC, 0x56EE, 0x56EF, 0x56F2, 0x56F3, 0x56F6, 0x56F7, + 0x56F8, 0x56FB, 0x56FC, 0x5700, 0x5701, 0x5702, 0x5705, 0x5707, + 0x570B, 0x570C, 0x570D, 0x570E, 0x570F, 0x5710, 0x5711, 0, +plane 88 +at 0x40 + 0x5712, 0x5713, 0x5714, 0x5715, 0x5716, 0x5717, 0x5718, 0x5719, + 0x571A, 0x571B, 0x571D, 0x571E, 0x5720, 0x5721, 0x5722, 0x5724, + 0x5725, 0x5726, 0x5727, 0x572B, 0x5731, 0x5732, 0x5734, 0x5735, + 0x5736, 0x5737, 0x5738, 0x573C, 0x573D, 0x573F, 0x5741, 0x5743, + 0x5744, 0x5745, 0x5746, 0x5748, 0x5749, 0x574B, 0x5752, 0x5753, + 0x5754, 0x5755, 0x5756, 0x5758, 0x5759, 0x5762, 0x5763, 0x5765, + 0x5767, 0x576C, 0x576E, 0x5770, 0x5771, 0x5772, 0x5774, 0x5775, + 0x5778, 0x5779, 0x577A, 0x577D, 0x577E, 0x577F, 0x5780, 0, + 0x5781, 0x5787, 0x5788, 0x5789, 0x578A, 0x578D, 0x578E, 0x578F, + 0x5790, 0x5791, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, 0x5799, + 0x579A, 0x579C, 0x579D, 0x579E, 0x579F, 0x57A5, 0x57A8, 0x57AA, + 0x57AC, 0x57AF, 0x57B0, 0x57B1, 0x57B3, 0x57B5, 0x57B6, 0x57B7, + 0x57B9, 0x57BA, 0x57BB, 0x57BC, 0x57BD, 0x57BE, 0x57BF, 0x57C0, + 0x57C1, 0x57C4, 0x57C5, 0x57C6, 0x57C7, 0x57C8, 0x57C9, 0x57CA, + 0x57CC, 0x57CD, 0x57D0, 0x57D1, 0x57D3, 0x57D6, 0x57D7, 0x57DB, + 0x57DC, 0x57DE, 0x57E1, 0x57E2, 0x57E3, 0x57E5, 0x57E6, 0x57E7, + 0x57E8, 0x57E9, 0x57EA, 0x57EB, 0x57EC, 0x57EE, 0x57F0, 0x57F1, + 0x57F2, 0x57F3, 0x57F5, 0x57F6, 0x57F7, 0x57FB, 0x57FC, 0x57FE, + 0x57FF, 0x5801, 0x5803, 0x5804, 0x5805, 0x5808, 0x5809, 0x580A, + 0x580C, 0x580E, 0x580F, 0x5810, 0x5812, 0x5813, 0x5814, 0x5816, + 0x5817, 0x5818, 0x581A, 0x581B, 0x581C, 0x581D, 0x581F, 0x5822, + 0x5823, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582B, 0x582C, + 0x582D, 0x582E, 0x582F, 0x5831, 0x5832, 0x5833, 0x5834, 0x5836, + 0x5837, 0x5838, 0x5839, 0x583A, 0x583B, 0x583C, 0x583D, 0, +plane 89 +at 0x40 + 0x583E, 0x583F, 0x5840, 0x5841, 0x5842, 0x5843, 0x5845, 0x5846, + 0x5847, 0x5848, 0x5849, 0x584A, 0x584B, 0x584E, 0x584F, 0x5850, + 0x5852, 0x5853, 0x5855, 0x5856, 0x5857, 0x5859, 0x585A, 0x585B, + 0x585C, 0x585D, 0x585F, 0x5860, 0x5861, 0x5862, 0x5863, 0x5864, + 0x5866, 0x5867, 0x5868, 0x5869, 0x586A, 0x586D, 0x586E, 0x586F, + 0x5870, 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877, + 0x5878, 0x5879, 0x587A, 0x587B, 0x587C, 0x587D, 0x587F, 0x5882, + 0x5884, 0x5886, 0x5887, 0x5888, 0x588A, 0x588B, 0x588C, 0, + 0x588D, 0x588E, 0x588F, 0x5890, 0x5891, 0x5894, 0x5895, 0x5896, + 0x5897, 0x5898, 0x589B, 0x589C, 0x589D, 0x58A0, 0x58A1, 0x58A2, + 0x58A3, 0x58A4, 0x58A5, 0x58A6, 0x58A7, 0x58AA, 0x58AB, 0x58AC, + 0x58AD, 0x58AE, 0x58AF, 0x58B0, 0x58B1, 0x58B2, 0x58B3, 0x58B4, + 0x58B5, 0x58B6, 0x58B7, 0x58B8, 0x58B9, 0x58BA, 0x58BB, 0x58BD, + 0x58BE, 0x58BF, 0x58C0, 0x58C2, 0x58C3, 0x58C4, 0x58C6, 0x58C7, + 0x58C8, 0x58C9, 0x58CA, 0x58CB, 0x58CC, 0x58CD, 0x58CE, 0x58CF, + 0x58D0, 0x58D2, 0x58D3, 0x58D4, 0x58D6, 0x58D7, 0x58D8, 0x58D9, + 0x58DA, 0x58DB, 0x58DC, 0x58DD, 0x58DE, 0x58DF, 0x58E0, 0x58E1, + 0x58E2, 0x58E3, 0x58E5, 0x58E6, 0x58E7, 0x58E8, 0x58E9, 0x58EA, + 0x58ED, 0x58EF, 0x58F1, 0x58F2, 0x58F4, 0x58F5, 0x58F7, 0x58F8, + 0x58FA, 0x58FB, 0x58FC, 0x58FD, 0x58FE, 0x58FF, 0x5900, 0x5901, + 0x5903, 0x5905, 0x5906, 0x5908, 0x5909, 0x590A, 0x590B, 0x590C, + 0x590E, 0x5910, 0x5911, 0x5912, 0x5913, 0x5917, 0x5918, 0x591B, + 0x591D, 0x591E, 0x5920, 0x5921, 0x5922, 0x5923, 0x5926, 0x5928, + 0x592C, 0x5930, 0x5932, 0x5933, 0x5935, 0x5936, 0x593B, 0, +plane 8a +at 0x40 + 0x593D, 0x593E, 0x593F, 0x5940, 0x5943, 0x5945, 0x5946, 0x594A, + 0x594C, 0x594D, 0x5950, 0x5952, 0x5953, 0x5959, 0x595B, 0x595C, + 0x595D, 0x595E, 0x595F, 0x5961, 0x5963, 0x5964, 0x5966, 0x5967, + 0x5968, 0x5969, 0x596A, 0x596B, 0x596C, 0x596D, 0x596E, 0x596F, + 0x5970, 0x5971, 0x5972, 0x5975, 0x5977, 0x597A, 0x597B, 0x597C, + 0x597E, 0x597F, 0x5980, 0x5985, 0x5989, 0x598B, 0x598C, 0x598E, + 0x598F, 0x5990, 0x5991, 0x5994, 0x5995, 0x5998, 0x599A, 0x599B, + 0x599C, 0x599D, 0x599F, 0x59A0, 0x59A1, 0x59A2, 0x59A6, 0, + 0x59A7, 0x59AC, 0x59AD, 0x59B0, 0x59B1, 0x59B3, 0x59B4, 0x59B5, + 0x59B6, 0x59B7, 0x59B8, 0x59BA, 0x59BC, 0x59BD, 0x59BF, 0x59C0, + 0x59C1, 0x59C2, 0x59C3, 0x59C4, 0x59C5, 0x59C7, 0x59C8, 0x59C9, + 0x59CC, 0x59CD, 0x59CE, 0x59CF, 0x59D5, 0x59D6, 0x59D9, 0x59DB, + 0x59DE, 0x59DF, 0x59E0, 0x59E1, 0x59E2, 0x59E4, 0x59E6, 0x59E7, + 0x59E9, 0x59EA, 0x59EB, 0x59ED, 0x59EE, 0x59EF, 0x59F0, 0x59F1, + 0x59F2, 0x59F3, 0x59F4, 0x59F5, 0x59F6, 0x59F7, 0x59F8, 0x59FA, + 0x59FC, 0x59FD, 0x59FE, 0x5A00, 0x5A02, 0x5A0A, 0x5A0B, 0x5A0D, + 0x5A0E, 0x5A0F, 0x5A10, 0x5A12, 0x5A14, 0x5A15, 0x5A16, 0x5A17, + 0x5A19, 0x5A1A, 0x5A1B, 0x5A1D, 0x5A1E, 0x5A21, 0x5A22, 0x5A24, + 0x5A26, 0x5A27, 0x5A28, 0x5A2A, 0x5A2B, 0x5A2C, 0x5A2D, 0x5A2E, + 0x5A2F, 0x5A30, 0x5A33, 0x5A35, 0x5A37, 0x5A38, 0x5A39, 0x5A3A, + 0x5A3B, 0x5A3D, 0x5A3E, 0x5A3F, 0x5A41, 0x5A42, 0x5A43, 0x5A44, + 0x5A45, 0x5A47, 0x5A48, 0x5A4B, 0x5A4C, 0x5A4D, 0x5A4E, 0x5A4F, + 0x5A50, 0x5A51, 0x5A52, 0x5A53, 0x5A54, 0x5A56, 0x5A57, 0x5A58, + 0x5A59, 0x5A5B, 0x5A5C, 0x5A5D, 0x5A5E, 0x5A5F, 0x5A60, 0, +plane 8b +at 0x40 + 0x5A61, 0x5A63, 0x5A64, 0x5A65, 0x5A66, 0x5A68, 0x5A69, 0x5A6B, + 0x5A6C, 0x5A6D, 0x5A6E, 0x5A6F, 0x5A70, 0x5A71, 0x5A72, 0x5A73, + 0x5A78, 0x5A79, 0x5A7B, 0x5A7C, 0x5A7D, 0x5A7E, 0x5A80, 0x5A81, + 0x5A82, 0x5A83, 0x5A84, 0x5A85, 0x5A86, 0x5A87, 0x5A88, 0x5A89, + 0x5A8A, 0x5A8B, 0x5A8C, 0x5A8D, 0x5A8E, 0x5A8F, 0x5A90, 0x5A91, + 0x5A93, 0x5A94, 0x5A95, 0x5A96, 0x5A97, 0x5A98, 0x5A99, 0x5A9C, + 0x5A9D, 0x5A9E, 0x5A9F, 0x5AA0, 0x5AA1, 0x5AA2, 0x5AA3, 0x5AA4, + 0x5AA5, 0x5AA6, 0x5AA7, 0x5AA8, 0x5AA9, 0x5AAB, 0x5AAC, 0, + 0x5AAD, 0x5AAE, 0x5AAF, 0x5AB0, 0x5AB1, 0x5AB4, 0x5AB6, 0x5AB7, + 0x5AB9, 0x5ABA, 0x5ABB, 0x5ABC, 0x5ABD, 0x5ABF, 0x5AC0, 0x5AC3, + 0x5AC4, 0x5AC5, 0x5AC6, 0x5AC7, 0x5AC8, 0x5ACA, 0x5ACB, 0x5ACD, + 0x5ACE, 0x5ACF, 0x5AD0, 0x5AD1, 0x5AD3, 0x5AD5, 0x5AD7, 0x5AD9, + 0x5ADA, 0x5ADB, 0x5ADD, 0x5ADE, 0x5ADF, 0x5AE2, 0x5AE4, 0x5AE5, + 0x5AE7, 0x5AE8, 0x5AEA, 0x5AEC, 0x5AED, 0x5AEE, 0x5AEF, 0x5AF0, + 0x5AF2, 0x5AF3, 0x5AF4, 0x5AF5, 0x5AF6, 0x5AF7, 0x5AF8, 0x5AF9, + 0x5AFA, 0x5AFB, 0x5AFC, 0x5AFD, 0x5AFE, 0x5AFF, 0x5B00, 0x5B01, + 0x5B02, 0x5B03, 0x5B04, 0x5B05, 0x5B06, 0x5B07, 0x5B08, 0x5B0A, + 0x5B0B, 0x5B0C, 0x5B0D, 0x5B0E, 0x5B0F, 0x5B10, 0x5B11, 0x5B12, + 0x5B13, 0x5B14, 0x5B15, 0x5B18, 0x5B19, 0x5B1A, 0x5B1B, 0x5B1C, + 0x5B1D, 0x5B1E, 0x5B1F, 0x5B20, 0x5B21, 0x5B22, 0x5B23, 0x5B24, + 0x5B25, 0x5B26, 0x5B27, 0x5B28, 0x5B29, 0x5B2A, 0x5B2B, 0x5B2C, + 0x5B2D, 0x5B2E, 0x5B2F, 0x5B30, 0x5B31, 0x5B33, 0x5B35, 0x5B36, + 0x5B38, 0x5B39, 0x5B3A, 0x5B3B, 0x5B3C, 0x5B3D, 0x5B3E, 0x5B3F, + 0x5B41, 0x5B42, 0x5B43, 0x5B44, 0x5B45, 0x5B46, 0x5B47, 0, +plane 8c +at 0x40 + 0x5B48, 0x5B49, 0x5B4A, 0x5B4B, 0x5B4C, 0x5B4D, 0x5B4E, 0x5B4F, + 0x5B52, 0x5B56, 0x5B5E, 0x5B60, 0x5B61, 0x5B67, 0x5B68, 0x5B6B, + 0x5B6D, 0x5B6E, 0x5B6F, 0x5B72, 0x5B74, 0x5B76, 0x5B77, 0x5B78, + 0x5B79, 0x5B7B, 0x5B7C, 0x5B7E, 0x5B7F, 0x5B82, 0x5B86, 0x5B8A, + 0x5B8D, 0x5B8E, 0x5B90, 0x5B91, 0x5B92, 0x5B94, 0x5B96, 0x5B9F, + 0x5BA7, 0x5BA8, 0x5BA9, 0x5BAC, 0x5BAD, 0x5BAE, 0x5BAF, 0x5BB1, + 0x5BB2, 0x5BB7, 0x5BBA, 0x5BBB, 0x5BBC, 0x5BC0, 0x5BC1, 0x5BC3, + 0x5BC8, 0x5BC9, 0x5BCA, 0x5BCB, 0x5BCD, 0x5BCE, 0x5BCF, 0, + 0x5BD1, 0x5BD4, 0x5BD5, 0x5BD6, 0x5BD7, 0x5BD8, 0x5BD9, 0x5BDA, + 0x5BDB, 0x5BDC, 0x5BE0, 0x5BE2, 0x5BE3, 0x5BE6, 0x5BE7, 0x5BE9, + 0x5BEA, 0x5BEB, 0x5BEC, 0x5BED, 0x5BEF, 0x5BF1, 0x5BF2, 0x5BF3, + 0x5BF4, 0x5BF5, 0x5BF6, 0x5BF7, 0x5BFD, 0x5BFE, 0x5C00, 0x5C02, + 0x5C03, 0x5C05, 0x5C07, 0x5C08, 0x5C0B, 0x5C0C, 0x5C0D, 0x5C0E, + 0x5C10, 0x5C12, 0x5C13, 0x5C17, 0x5C19, 0x5C1B, 0x5C1E, 0x5C1F, + 0x5C20, 0x5C21, 0x5C23, 0x5C26, 0x5C28, 0x5C29, 0x5C2A, 0x5C2B, + 0x5C2D, 0x5C2E, 0x5C2F, 0x5C30, 0x5C32, 0x5C33, 0x5C35, 0x5C36, + 0x5C37, 0x5C43, 0x5C44, 0x5C46, 0x5C47, 0x5C4C, 0x5C4D, 0x5C52, + 0x5C53, 0x5C54, 0x5C56, 0x5C57, 0x5C58, 0x5C5A, 0x5C5B, 0x5C5C, + 0x5C5D, 0x5C5F, 0x5C62, 0x5C64, 0x5C67, 0x5C68, 0x5C69, 0x5C6A, + 0x5C6B, 0x5C6C, 0x5C6D, 0x5C70, 0x5C72, 0x5C73, 0x5C74, 0x5C75, + 0x5C76, 0x5C77, 0x5C78, 0x5C7B, 0x5C7C, 0x5C7D, 0x5C7E, 0x5C80, + 0x5C83, 0x5C84, 0x5C85, 0x5C86, 0x5C87, 0x5C89, 0x5C8A, 0x5C8B, + 0x5C8E, 0x5C8F, 0x5C92, 0x5C93, 0x5C95, 0x5C9D, 0x5C9E, 0x5C9F, + 0x5CA0, 0x5CA1, 0x5CA4, 0x5CA5, 0x5CA6, 0x5CA7, 0x5CA8, 0, +plane 8d +at 0x40 + 0x5CAA, 0x5CAE, 0x5CAF, 0x5CB0, 0x5CB2, 0x5CB4, 0x5CB6, 0x5CB9, + 0x5CBA, 0x5CBB, 0x5CBC, 0x5CBE, 0x5CC0, 0x5CC2, 0x5CC3, 0x5CC5, + 0x5CC6, 0x5CC7, 0x5CC8, 0x5CC9, 0x5CCA, 0x5CCC, 0x5CCD, 0x5CCE, + 0x5CCF, 0x5CD0, 0x5CD1, 0x5CD3, 0x5CD4, 0x5CD5, 0x5CD6, 0x5CD7, + 0x5CD8, 0x5CDA, 0x5CDB, 0x5CDC, 0x5CDD, 0x5CDE, 0x5CDF, 0x5CE0, + 0x5CE2, 0x5CE3, 0x5CE7, 0x5CE9, 0x5CEB, 0x5CEC, 0x5CEE, 0x5CEF, + 0x5CF1, 0x5CF2, 0x5CF3, 0x5CF4, 0x5CF5, 0x5CF6, 0x5CF7, 0x5CF8, + 0x5CF9, 0x5CFA, 0x5CFC, 0x5CFD, 0x5CFE, 0x5CFF, 0x5D00, 0, + 0x5D01, 0x5D04, 0x5D05, 0x5D08, 0x5D09, 0x5D0A, 0x5D0B, 0x5D0C, + 0x5D0D, 0x5D0F, 0x5D10, 0x5D11, 0x5D12, 0x5D13, 0x5D15, 0x5D17, + 0x5D18, 0x5D19, 0x5D1A, 0x5D1C, 0x5D1D, 0x5D1F, 0x5D20, 0x5D21, + 0x5D22, 0x5D23, 0x5D25, 0x5D28, 0x5D2A, 0x5D2B, 0x5D2C, 0x5D2F, + 0x5D30, 0x5D31, 0x5D32, 0x5D33, 0x5D35, 0x5D36, 0x5D37, 0x5D38, + 0x5D39, 0x5D3A, 0x5D3B, 0x5D3C, 0x5D3F, 0x5D40, 0x5D41, 0x5D42, + 0x5D43, 0x5D44, 0x5D45, 0x5D46, 0x5D48, 0x5D49, 0x5D4D, 0x5D4E, + 0x5D4F, 0x5D50, 0x5D51, 0x5D52, 0x5D53, 0x5D54, 0x5D55, 0x5D56, + 0x5D57, 0x5D59, 0x5D5A, 0x5D5C, 0x5D5E, 0x5D5F, 0x5D60, 0x5D61, + 0x5D62, 0x5D63, 0x5D64, 0x5D65, 0x5D66, 0x5D67, 0x5D68, 0x5D6A, + 0x5D6D, 0x5D6E, 0x5D70, 0x5D71, 0x5D72, 0x5D73, 0x5D75, 0x5D76, + 0x5D77, 0x5D78, 0x5D79, 0x5D7A, 0x5D7B, 0x5D7C, 0x5D7D, 0x5D7E, + 0x5D7F, 0x5D80, 0x5D81, 0x5D83, 0x5D84, 0x5D85, 0x5D86, 0x5D87, + 0x5D88, 0x5D89, 0x5D8A, 0x5D8B, 0x5D8C, 0x5D8D, 0x5D8E, 0x5D8F, + 0x5D90, 0x5D91, 0x5D92, 0x5D93, 0x5D94, 0x5D95, 0x5D96, 0x5D97, + 0x5D98, 0x5D9A, 0x5D9B, 0x5D9C, 0x5D9E, 0x5D9F, 0x5DA0, 0, +plane 8e +at 0x40 + 0x5DA1, 0x5DA2, 0x5DA3, 0x5DA4, 0x5DA5, 0x5DA6, 0x5DA7, 0x5DA8, + 0x5DA9, 0x5DAA, 0x5DAB, 0x5DAC, 0x5DAD, 0x5DAE, 0x5DAF, 0x5DB0, + 0x5DB1, 0x5DB2, 0x5DB3, 0x5DB4, 0x5DB5, 0x5DB6, 0x5DB8, 0x5DB9, + 0x5DBA, 0x5DBB, 0x5DBC, 0x5DBD, 0x5DBE, 0x5DBF, 0x5DC0, 0x5DC1, + 0x5DC2, 0x5DC3, 0x5DC4, 0x5DC6, 0x5DC7, 0x5DC8, 0x5DC9, 0x5DCA, + 0x5DCB, 0x5DCC, 0x5DCE, 0x5DCF, 0x5DD0, 0x5DD1, 0x5DD2, 0x5DD3, + 0x5DD4, 0x5DD5, 0x5DD6, 0x5DD7, 0x5DD8, 0x5DD9, 0x5DDA, 0x5DDC, + 0x5DDF, 0x5DE0, 0x5DE3, 0x5DE4, 0x5DEA, 0x5DEC, 0x5DED, 0, + 0x5DF0, 0x5DF5, 0x5DF6, 0x5DF8, 0x5DF9, 0x5DFA, 0x5DFB, 0x5DFC, + 0x5DFF, 0x5E00, 0x5E04, 0x5E07, 0x5E09, 0x5E0A, 0x5E0B, 0x5E0D, + 0x5E0E, 0x5E12, 0x5E13, 0x5E17, 0x5E1E, 0x5E1F, 0x5E20, 0x5E21, + 0x5E22, 0x5E23, 0x5E24, 0x5E25, 0x5E28, 0x5E29, 0x5E2A, 0x5E2B, + 0x5E2C, 0x5E2F, 0x5E30, 0x5E32, 0x5E33, 0x5E34, 0x5E35, 0x5E36, + 0x5E39, 0x5E3A, 0x5E3E, 0x5E3F, 0x5E40, 0x5E41, 0x5E43, 0x5E46, + 0x5E47, 0x5E48, 0x5E49, 0x5E4A, 0x5E4B, 0x5E4D, 0x5E4E, 0x5E4F, + 0x5E50, 0x5E51, 0x5E52, 0x5E53, 0x5E56, 0x5E57, 0x5E58, 0x5E59, + 0x5E5A, 0x5E5C, 0x5E5D, 0x5E5F, 0x5E60, 0x5E63, 0x5E64, 0x5E65, + 0x5E66, 0x5E67, 0x5E68, 0x5E69, 0x5E6A, 0x5E6B, 0x5E6C, 0x5E6D, + 0x5E6E, 0x5E6F, 0x5E70, 0x5E71, 0x5E75, 0x5E77, 0x5E79, 0x5E7E, + 0x5E81, 0x5E82, 0x5E83, 0x5E85, 0x5E88, 0x5E89, 0x5E8C, 0x5E8D, + 0x5E8E, 0x5E92, 0x5E98, 0x5E9B, 0x5E9D, 0x5EA1, 0x5EA2, 0x5EA3, + 0x5EA4, 0x5EA8, 0x5EA9, 0x5EAA, 0x5EAB, 0x5EAC, 0x5EAE, 0x5EAF, + 0x5EB0, 0x5EB1, 0x5EB2, 0x5EB4, 0x5EBA, 0x5EBB, 0x5EBC, 0x5EBD, + 0x5EBF, 0x5EC0, 0x5EC1, 0x5EC2, 0x5EC3, 0x5EC4, 0x5EC5, 0, +plane 8f +at 0x40 + 0x5EC6, 0x5EC7, 0x5EC8, 0x5ECB, 0x5ECC, 0x5ECD, 0x5ECE, 0x5ECF, + 0x5ED0, 0x5ED4, 0x5ED5, 0x5ED7, 0x5ED8, 0x5ED9, 0x5EDA, 0x5EDC, + 0x5EDD, 0x5EDE, 0x5EDF, 0x5EE0, 0x5EE1, 0x5EE2, 0x5EE3, 0x5EE4, + 0x5EE5, 0x5EE6, 0x5EE7, 0x5EE9, 0x5EEB, 0x5EEC, 0x5EED, 0x5EEE, + 0x5EEF, 0x5EF0, 0x5EF1, 0x5EF2, 0x5EF3, 0x5EF5, 0x5EF8, 0x5EF9, + 0x5EFB, 0x5EFC, 0x5EFD, 0x5F05, 0x5F06, 0x5F07, 0x5F09, 0x5F0C, + 0x5F0D, 0x5F0E, 0x5F10, 0x5F12, 0x5F14, 0x5F16, 0x5F19, 0x5F1A, + 0x5F1C, 0x5F1D, 0x5F1E, 0x5F21, 0x5F22, 0x5F23, 0x5F24, 0, + 0x5F28, 0x5F2B, 0x5F2C, 0x5F2E, 0x5F30, 0x5F32, 0x5F33, 0x5F34, + 0x5F35, 0x5F36, 0x5F37, 0x5F38, 0x5F3B, 0x5F3D, 0x5F3E, 0x5F3F, + 0x5F41, 0x5F42, 0x5F43, 0x5F44, 0x5F45, 0x5F46, 0x5F47, 0x5F48, + 0x5F49, 0x5F4A, 0x5F4B, 0x5F4C, 0x5F4D, 0x5F4E, 0x5F4F, 0x5F51, + 0x5F54, 0x5F59, 0x5F5A, 0x5F5B, 0x5F5C, 0x5F5E, 0x5F5F, 0x5F60, + 0x5F63, 0x5F65, 0x5F67, 0x5F68, 0x5F6B, 0x5F6E, 0x5F6F, 0x5F72, + 0x5F74, 0x5F75, 0x5F76, 0x5F78, 0x5F7A, 0x5F7D, 0x5F7E, 0x5F7F, + 0x5F83, 0x5F86, 0x5F8D, 0x5F8E, 0x5F8F, 0x5F91, 0x5F93, 0x5F94, + 0x5F96, 0x5F9A, 0x5F9B, 0x5F9D, 0x5F9E, 0x5F9F, 0x5FA0, 0x5FA2, + 0x5FA3, 0x5FA4, 0x5FA5, 0x5FA6, 0x5FA7, 0x5FA9, 0x5FAB, 0x5FAC, + 0x5FAF, 0x5FB0, 0x5FB1, 0x5FB2, 0x5FB3, 0x5FB4, 0x5FB6, 0x5FB8, + 0x5FB9, 0x5FBA, 0x5FBB, 0x5FBE, 0x5FBF, 0x5FC0, 0x5FC1, 0x5FC2, + 0x5FC7, 0x5FC8, 0x5FCA, 0x5FCB, 0x5FCE, 0x5FD3, 0x5FD4, 0x5FD5, + 0x5FDA, 0x5FDB, 0x5FDC, 0x5FDE, 0x5FDF, 0x5FE2, 0x5FE3, 0x5FE5, + 0x5FE6, 0x5FE8, 0x5FE9, 0x5FEC, 0x5FEF, 0x5FF0, 0x5FF2, 0x5FF3, + 0x5FF4, 0x5FF6, 0x5FF7, 0x5FF9, 0x5FFA, 0x5FFC, 0x6007, 0, +plane 90 +at 0x40 + 0x6008, 0x6009, 0x600B, 0x600C, 0x6010, 0x6011, 0x6013, 0x6017, + 0x6018, 0x601A, 0x601E, 0x601F, 0x6022, 0x6023, 0x6024, 0x602C, + 0x602D, 0x602E, 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6036, + 0x6037, 0x6038, 0x6039, 0x603A, 0x603D, 0x603E, 0x6040, 0x6044, + 0x6045, 0x6046, 0x6047, 0x6048, 0x6049, 0x604A, 0x604C, 0x604E, + 0x604F, 0x6051, 0x6053, 0x6054, 0x6056, 0x6057, 0x6058, 0x605B, + 0x605C, 0x605E, 0x605F, 0x6060, 0x6061, 0x6065, 0x6066, 0x606E, + 0x6071, 0x6072, 0x6074, 0x6075, 0x6077, 0x607E, 0x6080, 0, + 0x6081, 0x6082, 0x6085, 0x6086, 0x6087, 0x6088, 0x608A, 0x608B, + 0x608E, 0x608F, 0x6090, 0x6091, 0x6093, 0x6095, 0x6097, 0x6098, + 0x6099, 0x609C, 0x609E, 0x60A1, 0x60A2, 0x60A4, 0x60A5, 0x60A7, + 0x60A9, 0x60AA, 0x60AE, 0x60B0, 0x60B3, 0x60B5, 0x60B6, 0x60B7, + 0x60B9, 0x60BA, 0x60BD, 0x60BE, 0x60BF, 0x60C0, 0x60C1, 0x60C2, + 0x60C3, 0x60C4, 0x60C7, 0x60C8, 0x60C9, 0x60CC, 0x60CD, 0x60CE, + 0x60CF, 0x60D0, 0x60D2, 0x60D3, 0x60D4, 0x60D6, 0x60D7, 0x60D9, + 0x60DB, 0x60DE, 0x60E1, 0x60E2, 0x60E3, 0x60E4, 0x60E5, 0x60EA, + 0x60F1, 0x60F2, 0x60F5, 0x60F7, 0x60F8, 0x60FB, 0x60FC, 0x60FD, + 0x60FE, 0x60FF, 0x6102, 0x6103, 0x6104, 0x6105, 0x6107, 0x610A, + 0x610B, 0x610C, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116, + 0x6117, 0x6118, 0x6119, 0x611B, 0x611C, 0x611D, 0x611E, 0x6121, + 0x6122, 0x6125, 0x6128, 0x6129, 0x612A, 0x612C, 0x612D, 0x612E, + 0x612F, 0x6130, 0x6131, 0x6132, 0x6133, 0x6134, 0x6135, 0x6136, + 0x6137, 0x6138, 0x6139, 0x613A, 0x613B, 0x613C, 0x613D, 0x613E, + 0x6140, 0x6141, 0x6142, 0x6143, 0x6144, 0x6145, 0x6146, 0, +plane 91 +at 0x40 + 0x6147, 0x6149, 0x614B, 0x614D, 0x614F, 0x6150, 0x6152, 0x6153, + 0x6154, 0x6156, 0x6157, 0x6158, 0x6159, 0x615A, 0x615B, 0x615C, + 0x615E, 0x615F, 0x6160, 0x6161, 0x6163, 0x6164, 0x6165, 0x6166, + 0x6169, 0x616A, 0x616B, 0x616C, 0x616D, 0x616E, 0x616F, 0x6171, + 0x6172, 0x6173, 0x6174, 0x6176, 0x6178, 0x6179, 0x617A, 0x617B, + 0x617C, 0x617D, 0x617E, 0x617F, 0x6180, 0x6181, 0x6182, 0x6183, + 0x6184, 0x6185, 0x6186, 0x6187, 0x6188, 0x6189, 0x618A, 0x618C, + 0x618D, 0x618F, 0x6190, 0x6191, 0x6192, 0x6193, 0x6195, 0, + 0x6196, 0x6197, 0x6198, 0x6199, 0x619A, 0x619B, 0x619C, 0x619E, + 0x619F, 0x61A0, 0x61A1, 0x61A2, 0x61A3, 0x61A4, 0x61A5, 0x61A6, + 0x61AA, 0x61AB, 0x61AD, 0x61AE, 0x61AF, 0x61B0, 0x61B1, 0x61B2, + 0x61B3, 0x61B4, 0x61B5, 0x61B6, 0x61B8, 0x61B9, 0x61BA, 0x61BB, + 0x61BC, 0x61BD, 0x61BF, 0x61C0, 0x61C1, 0x61C3, 0x61C4, 0x61C5, + 0x61C6, 0x61C7, 0x61C9, 0x61CC, 0x61CD, 0x61CE, 0x61CF, 0x61D0, + 0x61D3, 0x61D5, 0x61D6, 0x61D7, 0x61D8, 0x61D9, 0x61DA, 0x61DB, + 0x61DC, 0x61DD, 0x61DE, 0x61DF, 0x61E0, 0x61E1, 0x61E2, 0x61E3, + 0x61E4, 0x61E5, 0x61E7, 0x61E8, 0x61E9, 0x61EA, 0x61EB, 0x61EC, + 0x61ED, 0x61EE, 0x61EF, 0x61F0, 0x61F1, 0x61F2, 0x61F3, 0x61F4, + 0x61F6, 0x61F7, 0x61F8, 0x61F9, 0x61FA, 0x61FB, 0x61FC, 0x61FD, + 0x61FE, 0x6200, 0x6201, 0x6202, 0x6203, 0x6204, 0x6205, 0x6207, + 0x6209, 0x6213, 0x6214, 0x6219, 0x621C, 0x621D, 0x621E, 0x6220, + 0x6223, 0x6226, 0x6227, 0x6228, 0x6229, 0x622B, 0x622D, 0x622F, + 0x6230, 0x6231, 0x6232, 0x6235, 0x6236, 0x6238, 0x6239, 0x623A, + 0x623B, 0x623C, 0x6242, 0x6244, 0x6245, 0x6246, 0x624A, 0, +plane 92 +at 0x40 + 0x624F, 0x6250, 0x6255, 0x6256, 0x6257, 0x6259, 0x625A, 0x625C, + 0x625D, 0x625E, 0x625F, 0x6260, 0x6261, 0x6262, 0x6264, 0x6265, + 0x6268, 0x6271, 0x6272, 0x6274, 0x6275, 0x6277, 0x6278, 0x627A, + 0x627B, 0x627D, 0x6281, 0x6282, 0x6283, 0x6285, 0x6286, 0x6287, + 0x6288, 0x628B, 0x628C, 0x628D, 0x628E, 0x628F, 0x6290, 0x6294, + 0x6299, 0x629C, 0x629D, 0x629E, 0x62A3, 0x62A6, 0x62A7, 0x62A9, + 0x62AA, 0x62AD, 0x62AE, 0x62AF, 0x62B0, 0x62B2, 0x62B3, 0x62B4, + 0x62B6, 0x62B7, 0x62B8, 0x62BA, 0x62BE, 0x62C0, 0x62C1, 0, + 0x62C3, 0x62CB, 0x62CF, 0x62D1, 0x62D5, 0x62DD, 0x62DE, 0x62E0, + 0x62E1, 0x62E4, 0x62EA, 0x62EB, 0x62F0, 0x62F2, 0x62F5, 0x62F8, + 0x62F9, 0x62FA, 0x62FB, 0x6300, 0x6303, 0x6304, 0x6305, 0x6306, + 0x630A, 0x630B, 0x630C, 0x630D, 0x630F, 0x6310, 0x6312, 0x6313, + 0x6314, 0x6315, 0x6317, 0x6318, 0x6319, 0x631C, 0x6326, 0x6327, + 0x6329, 0x632C, 0x632D, 0x632E, 0x6330, 0x6331, 0x6333, 0x6334, + 0x6335, 0x6336, 0x6337, 0x6338, 0x633B, 0x633C, 0x633E, 0x633F, + 0x6340, 0x6341, 0x6344, 0x6347, 0x6348, 0x634A, 0x6351, 0x6352, + 0x6353, 0x6354, 0x6356, 0x6357, 0x6358, 0x6359, 0x635A, 0x635B, + 0x635C, 0x635D, 0x6360, 0x6364, 0x6365, 0x6366, 0x6368, 0x636A, + 0x636B, 0x636C, 0x636F, 0x6370, 0x6372, 0x6373, 0x6374, 0x6375, + 0x6378, 0x6379, 0x637C, 0x637D, 0x637E, 0x637F, 0x6381, 0x6383, + 0x6384, 0x6385, 0x6386, 0x638B, 0x638D, 0x6391, 0x6393, 0x6394, + 0x6395, 0x6397, 0x6399, 0x639A, 0x639B, 0x639C, 0x639D, 0x639E, + 0x639F, 0x63A1, 0x63A4, 0x63A6, 0x63AB, 0x63AF, 0x63B1, 0x63B2, + 0x63B5, 0x63B6, 0x63B9, 0x63BB, 0x63BD, 0x63BF, 0x63C0, 0, +plane 93 +at 0x40 + 0x63C1, 0x63C2, 0x63C3, 0x63C5, 0x63C7, 0x63C8, 0x63CA, 0x63CB, + 0x63CC, 0x63D1, 0x63D3, 0x63D4, 0x63D5, 0x63D7, 0x63D8, 0x63D9, + 0x63DA, 0x63DB, 0x63DC, 0x63DD, 0x63DF, 0x63E2, 0x63E4, 0x63E5, + 0x63E6, 0x63E7, 0x63E8, 0x63EB, 0x63EC, 0x63EE, 0x63EF, 0x63F0, + 0x63F1, 0x63F3, 0x63F5, 0x63F7, 0x63F9, 0x63FA, 0x63FB, 0x63FC, + 0x63FE, 0x6403, 0x6404, 0x6406, 0x6407, 0x6408, 0x6409, 0x640A, + 0x640D, 0x640E, 0x6411, 0x6412, 0x6415, 0x6416, 0x6417, 0x6418, + 0x6419, 0x641A, 0x641D, 0x641F, 0x6422, 0x6423, 0x6424, 0, + 0x6425, 0x6427, 0x6428, 0x6429, 0x642B, 0x642E, 0x642F, 0x6430, + 0x6431, 0x6432, 0x6433, 0x6435, 0x6436, 0x6437, 0x6438, 0x6439, + 0x643B, 0x643C, 0x643E, 0x6440, 0x6442, 0x6443, 0x6449, 0x644B, + 0x644C, 0x644D, 0x644E, 0x644F, 0x6450, 0x6451, 0x6453, 0x6455, + 0x6456, 0x6457, 0x6459, 0x645A, 0x645B, 0x645C, 0x645D, 0x645F, + 0x6460, 0x6461, 0x6462, 0x6463, 0x6464, 0x6465, 0x6466, 0x6468, + 0x646A, 0x646B, 0x646C, 0x646E, 0x646F, 0x6470, 0x6471, 0x6472, + 0x6473, 0x6474, 0x6475, 0x6476, 0x6477, 0x647B, 0x647C, 0x647D, + 0x647E, 0x647F, 0x6480, 0x6481, 0x6483, 0x6486, 0x6488, 0x6489, + 0x648A, 0x648B, 0x648C, 0x648D, 0x648E, 0x648F, 0x6490, 0x6493, + 0x6494, 0x6497, 0x6498, 0x649A, 0x649B, 0x649C, 0x649D, 0x649F, + 0x64A0, 0x64A1, 0x64A2, 0x64A3, 0x64A5, 0x64A6, 0x64A7, 0x64A8, + 0x64AA, 0x64AB, 0x64AF, 0x64B1, 0x64B2, 0x64B3, 0x64B4, 0x64B6, + 0x64B9, 0x64BB, 0x64BD, 0x64BE, 0x64BF, 0x64C1, 0x64C3, 0x64C4, + 0x64C6, 0x64C7, 0x64C8, 0x64C9, 0x64CA, 0x64CB, 0x64CC, 0x64CF, + 0x64D1, 0x64D3, 0x64D4, 0x64D5, 0x64D6, 0x64D9, 0x64DA, 0, +plane 94 +at 0x40 + 0x64DB, 0x64DC, 0x64DD, 0x64DF, 0x64E0, 0x64E1, 0x64E3, 0x64E5, + 0x64E7, 0x64E8, 0x64E9, 0x64EA, 0x64EB, 0x64EC, 0x64ED, 0x64EE, + 0x64EF, 0x64F0, 0x64F1, 0x64F2, 0x64F3, 0x64F4, 0x64F5, 0x64F6, + 0x64F7, 0x64F8, 0x64F9, 0x64FA, 0x64FB, 0x64FC, 0x64FD, 0x64FE, + 0x64FF, 0x6501, 0x6502, 0x6503, 0x6504, 0x6505, 0x6506, 0x6507, + 0x6508, 0x650A, 0x650B, 0x650C, 0x650D, 0x650E, 0x650F, 0x6510, + 0x6511, 0x6513, 0x6514, 0x6515, 0x6516, 0x6517, 0x6519, 0x651A, + 0x651B, 0x651C, 0x651D, 0x651E, 0x651F, 0x6520, 0x6521, 0, + 0x6522, 0x6523, 0x6524, 0x6526, 0x6527, 0x6528, 0x6529, 0x652A, + 0x652C, 0x652D, 0x6530, 0x6531, 0x6532, 0x6533, 0x6537, 0x653A, + 0x653C, 0x653D, 0x6540, 0x6541, 0x6542, 0x6543, 0x6544, 0x6546, + 0x6547, 0x654A, 0x654B, 0x654D, 0x654E, 0x6550, 0x6552, 0x6553, + 0x6554, 0x6557, 0x6558, 0x655A, 0x655C, 0x655F, 0x6560, 0x6561, + 0x6564, 0x6565, 0x6567, 0x6568, 0x6569, 0x656A, 0x656D, 0x656E, + 0x656F, 0x6571, 0x6573, 0x6575, 0x6576, 0x6578, 0x6579, 0x657A, + 0x657B, 0x657C, 0x657D, 0x657E, 0x657F, 0x6580, 0x6581, 0x6582, + 0x6583, 0x6584, 0x6585, 0x6586, 0x6588, 0x6589, 0x658A, 0x658D, + 0x658E, 0x658F, 0x6592, 0x6594, 0x6595, 0x6596, 0x6598, 0x659A, + 0x659D, 0x659E, 0x65A0, 0x65A2, 0x65A3, 0x65A6, 0x65A8, 0x65AA, + 0x65AC, 0x65AE, 0x65B1, 0x65B2, 0x65B3, 0x65B4, 0x65B5, 0x65B6, + 0x65B7, 0x65B8, 0x65BA, 0x65BB, 0x65BE, 0x65BF, 0x65C0, 0x65C2, + 0x65C7, 0x65C8, 0x65C9, 0x65CA, 0x65CD, 0x65D0, 0x65D1, 0x65D3, + 0x65D4, 0x65D5, 0x65D8, 0x65D9, 0x65DA, 0x65DB, 0x65DC, 0x65DD, + 0x65DE, 0x65DF, 0x65E1, 0x65E3, 0x65E4, 0x65EA, 0x65EB, 0, +plane 95 +at 0x40 + 0x65F2, 0x65F3, 0x65F4, 0x65F5, 0x65F8, 0x65F9, 0x65FB, 0x65FC, + 0x65FD, 0x65FE, 0x65FF, 0x6601, 0x6604, 0x6605, 0x6607, 0x6608, + 0x6609, 0x660B, 0x660D, 0x6610, 0x6611, 0x6612, 0x6616, 0x6617, + 0x6618, 0x661A, 0x661B, 0x661C, 0x661E, 0x6621, 0x6622, 0x6623, + 0x6624, 0x6626, 0x6629, 0x662A, 0x662B, 0x662C, 0x662E, 0x6630, + 0x6632, 0x6633, 0x6637, 0x6638, 0x6639, 0x663A, 0x663B, 0x663D, + 0x663F, 0x6640, 0x6642, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648, + 0x6649, 0x664A, 0x664D, 0x664E, 0x6650, 0x6651, 0x6658, 0, + 0x6659, 0x665B, 0x665C, 0x665D, 0x665E, 0x6660, 0x6662, 0x6663, + 0x6665, 0x6667, 0x6669, 0x666A, 0x666B, 0x666C, 0x666D, 0x6671, + 0x6672, 0x6673, 0x6675, 0x6678, 0x6679, 0x667B, 0x667C, 0x667D, + 0x667F, 0x6680, 0x6681, 0x6683, 0x6685, 0x6686, 0x6688, 0x6689, + 0x668A, 0x668B, 0x668D, 0x668E, 0x668F, 0x6690, 0x6692, 0x6693, + 0x6694, 0x6695, 0x6698, 0x6699, 0x669A, 0x669B, 0x669C, 0x669E, + 0x669F, 0x66A0, 0x66A1, 0x66A2, 0x66A3, 0x66A4, 0x66A5, 0x66A6, + 0x66A9, 0x66AA, 0x66AB, 0x66AC, 0x66AD, 0x66AF, 0x66B0, 0x66B1, + 0x66B2, 0x66B3, 0x66B5, 0x66B6, 0x66B7, 0x66B8, 0x66BA, 0x66BB, + 0x66BC, 0x66BD, 0x66BF, 0x66C0, 0x66C1, 0x66C2, 0x66C3, 0x66C4, + 0x66C5, 0x66C6, 0x66C7, 0x66C8, 0x66C9, 0x66CA, 0x66CB, 0x66CC, + 0x66CD, 0x66CE, 0x66CF, 0x66D0, 0x66D1, 0x66D2, 0x66D3, 0x66D4, + 0x66D5, 0x66D6, 0x66D7, 0x66D8, 0x66DA, 0x66DE, 0x66DF, 0x66E0, + 0x66E1, 0x66E2, 0x66E3, 0x66E4, 0x66E5, 0x66E7, 0x66E8, 0x66EA, + 0x66EB, 0x66EC, 0x66ED, 0x66EE, 0x66EF, 0x66F1, 0x66F5, 0x66F6, + 0x66F8, 0x66FA, 0x66FB, 0x66FD, 0x6701, 0x6702, 0x6703, 0, +plane 96 +at 0x40 + 0x6704, 0x6705, 0x6706, 0x6707, 0x670C, 0x670E, 0x670F, 0x6711, + 0x6712, 0x6713, 0x6716, 0x6718, 0x6719, 0x671A, 0x671C, 0x671E, + 0x6720, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6727, 0x6729, + 0x672E, 0x6730, 0x6732, 0x6733, 0x6736, 0x6737, 0x6738, 0x6739, + 0x673B, 0x673C, 0x673E, 0x673F, 0x6741, 0x6744, 0x6745, 0x6747, + 0x674A, 0x674B, 0x674D, 0x6752, 0x6754, 0x6755, 0x6757, 0x6758, + 0x6759, 0x675A, 0x675B, 0x675D, 0x6762, 0x6763, 0x6764, 0x6766, + 0x6767, 0x676B, 0x676C, 0x676E, 0x6771, 0x6774, 0x6776, 0, + 0x6778, 0x6779, 0x677A, 0x677B, 0x677D, 0x6780, 0x6782, 0x6783, + 0x6785, 0x6786, 0x6788, 0x678A, 0x678C, 0x678D, 0x678E, 0x678F, + 0x6791, 0x6792, 0x6793, 0x6794, 0x6796, 0x6799, 0x679B, 0x679F, + 0x67A0, 0x67A1, 0x67A4, 0x67A6, 0x67A9, 0x67AC, 0x67AE, 0x67B1, + 0x67B2, 0x67B4, 0x67B9, 0x67BA, 0x67BB, 0x67BC, 0x67BD, 0x67BE, + 0x67BF, 0x67C0, 0x67C2, 0x67C5, 0x67C6, 0x67C7, 0x67C8, 0x67C9, + 0x67CA, 0x67CB, 0x67CC, 0x67CD, 0x67CE, 0x67D5, 0x67D6, 0x67D7, + 0x67DB, 0x67DF, 0x67E1, 0x67E3, 0x67E4, 0x67E6, 0x67E7, 0x67E8, + 0x67EA, 0x67EB, 0x67ED, 0x67EE, 0x67F2, 0x67F5, 0x67F6, 0x67F7, + 0x67F8, 0x67F9, 0x67FA, 0x67FB, 0x67FC, 0x67FE, 0x6801, 0x6802, + 0x6803, 0x6804, 0x6806, 0x680D, 0x6810, 0x6812, 0x6814, 0x6815, + 0x6818, 0x6819, 0x681A, 0x681B, 0x681C, 0x681E, 0x681F, 0x6820, + 0x6822, 0x6823, 0x6824, 0x6825, 0x6826, 0x6827, 0x6828, 0x682B, + 0x682C, 0x682D, 0x682E, 0x682F, 0x6830, 0x6831, 0x6834, 0x6835, + 0x6836, 0x683A, 0x683B, 0x683F, 0x6847, 0x684B, 0x684D, 0x684F, + 0x6852, 0x6856, 0x6857, 0x6858, 0x6859, 0x685A, 0x685B, 0, +plane 97 +at 0x40 + 0x685C, 0x685D, 0x685E, 0x685F, 0x686A, 0x686C, 0x686D, 0x686E, + 0x686F, 0x6870, 0x6871, 0x6872, 0x6873, 0x6875, 0x6878, 0x6879, + 0x687A, 0x687B, 0x687C, 0x687D, 0x687E, 0x687F, 0x6880, 0x6882, + 0x6884, 0x6887, 0x6888, 0x6889, 0x688A, 0x688B, 0x688C, 0x688D, + 0x688E, 0x6890, 0x6891, 0x6892, 0x6894, 0x6895, 0x6896, 0x6898, + 0x6899, 0x689A, 0x689B, 0x689C, 0x689D, 0x689E, 0x689F, 0x68A0, + 0x68A1, 0x68A3, 0x68A4, 0x68A5, 0x68A9, 0x68AA, 0x68AB, 0x68AC, + 0x68AE, 0x68B1, 0x68B2, 0x68B4, 0x68B6, 0x68B7, 0x68B8, 0, + 0x68B9, 0x68BA, 0x68BB, 0x68BC, 0x68BD, 0x68BE, 0x68BF, 0x68C1, + 0x68C3, 0x68C4, 0x68C5, 0x68C6, 0x68C7, 0x68C8, 0x68CA, 0x68CC, + 0x68CE, 0x68CF, 0x68D0, 0x68D1, 0x68D3, 0x68D4, 0x68D6, 0x68D7, + 0x68D9, 0x68DB, 0x68DC, 0x68DD, 0x68DE, 0x68DF, 0x68E1, 0x68E2, + 0x68E4, 0x68E5, 0x68E6, 0x68E7, 0x68E8, 0x68E9, 0x68EA, 0x68EB, + 0x68EC, 0x68ED, 0x68EF, 0x68F2, 0x68F3, 0x68F4, 0x68F6, 0x68F7, + 0x68F8, 0x68FB, 0x68FD, 0x68FE, 0x68FF, 0x6900, 0x6902, 0x6903, + 0x6904, 0x6906, 0x6907, 0x6908, 0x6909, 0x690A, 0x690C, 0x690F, + 0x6911, 0x6913, 0x6914, 0x6915, 0x6916, 0x6917, 0x6918, 0x6919, + 0x691A, 0x691B, 0x691C, 0x691D, 0x691E, 0x6921, 0x6922, 0x6923, + 0x6925, 0x6926, 0x6927, 0x6928, 0x6929, 0x692A, 0x692B, 0x692C, + 0x692E, 0x692F, 0x6931, 0x6932, 0x6933, 0x6935, 0x6936, 0x6937, + 0x6938, 0x693A, 0x693B, 0x693C, 0x693E, 0x6940, 0x6941, 0x6943, + 0x6944, 0x6945, 0x6946, 0x6947, 0x6948, 0x6949, 0x694A, 0x694B, + 0x694C, 0x694D, 0x694E, 0x694F, 0x6950, 0x6951, 0x6952, 0x6953, + 0x6955, 0x6956, 0x6958, 0x6959, 0x695B, 0x695C, 0x695F, 0, +plane 98 +at 0x40 + 0x6961, 0x6962, 0x6964, 0x6965, 0x6967, 0x6968, 0x6969, 0x696A, + 0x696C, 0x696D, 0x696F, 0x6970, 0x6972, 0x6973, 0x6974, 0x6975, + 0x6976, 0x697A, 0x697B, 0x697D, 0x697E, 0x697F, 0x6981, 0x6983, + 0x6985, 0x698A, 0x698B, 0x698C, 0x698E, 0x698F, 0x6990, 0x6991, + 0x6992, 0x6993, 0x6996, 0x6997, 0x6999, 0x699A, 0x699D, 0x699E, + 0x699F, 0x69A0, 0x69A1, 0x69A2, 0x69A3, 0x69A4, 0x69A5, 0x69A6, + 0x69A9, 0x69AA, 0x69AC, 0x69AE, 0x69AF, 0x69B0, 0x69B2, 0x69B3, + 0x69B5, 0x69B6, 0x69B8, 0x69B9, 0x69BA, 0x69BC, 0x69BD, 0, + 0x69BE, 0x69BF, 0x69C0, 0x69C2, 0x69C3, 0x69C4, 0x69C5, 0x69C6, + 0x69C7, 0x69C8, 0x69C9, 0x69CB, 0x69CD, 0x69CF, 0x69D1, 0x69D2, + 0x69D3, 0x69D5, 0x69D6, 0x69D7, 0x69D8, 0x69D9, 0x69DA, 0x69DC, + 0x69DD, 0x69DE, 0x69E1, 0x69E2, 0x69E3, 0x69E4, 0x69E5, 0x69E6, + 0x69E7, 0x69E8, 0x69E9, 0x69EA, 0x69EB, 0x69EC, 0x69EE, 0x69EF, + 0x69F0, 0x69F1, 0x69F3, 0x69F4, 0x69F5, 0x69F6, 0x69F7, 0x69F8, + 0x69F9, 0x69FA, 0x69FB, 0x69FC, 0x69FE, 0x6A00, 0x6A01, 0x6A02, + 0x6A03, 0x6A04, 0x6A05, 0x6A06, 0x6A07, 0x6A08, 0x6A09, 0x6A0B, + 0x6A0C, 0x6A0D, 0x6A0E, 0x6A0F, 0x6A10, 0x6A11, 0x6A12, 0x6A13, + 0x6A14, 0x6A15, 0x6A16, 0x6A19, 0x6A1A, 0x6A1B, 0x6A1C, 0x6A1D, + 0x6A1E, 0x6A20, 0x6A22, 0x6A23, 0x6A24, 0x6A25, 0x6A26, 0x6A27, + 0x6A29, 0x6A2B, 0x6A2C, 0x6A2D, 0x6A2E, 0x6A30, 0x6A32, 0x6A33, + 0x6A34, 0x6A36, 0x6A37, 0x6A38, 0x6A39, 0x6A3A, 0x6A3B, 0x6A3C, + 0x6A3F, 0x6A40, 0x6A41, 0x6A42, 0x6A43, 0x6A45, 0x6A46, 0x6A48, + 0x6A49, 0x6A4A, 0x6A4B, 0x6A4C, 0x6A4D, 0x6A4E, 0x6A4F, 0x6A51, + 0x6A52, 0x6A53, 0x6A54, 0x6A55, 0x6A56, 0x6A57, 0x6A5A, 0, +plane 99 +at 0x40 + 0x6A5C, 0x6A5D, 0x6A5E, 0x6A5F, 0x6A60, 0x6A62, 0x6A63, 0x6A64, + 0x6A66, 0x6A67, 0x6A68, 0x6A69, 0x6A6A, 0x6A6B, 0x6A6C, 0x6A6D, + 0x6A6E, 0x6A6F, 0x6A70, 0x6A72, 0x6A73, 0x6A74, 0x6A75, 0x6A76, + 0x6A77, 0x6A78, 0x6A7A, 0x6A7B, 0x6A7D, 0x6A7E, 0x6A7F, 0x6A81, + 0x6A82, 0x6A83, 0x6A85, 0x6A86, 0x6A87, 0x6A88, 0x6A89, 0x6A8A, + 0x6A8B, 0x6A8C, 0x6A8D, 0x6A8F, 0x6A92, 0x6A93, 0x6A94, 0x6A95, + 0x6A96, 0x6A98, 0x6A99, 0x6A9A, 0x6A9B, 0x6A9C, 0x6A9D, 0x6A9E, + 0x6A9F, 0x6AA1, 0x6AA2, 0x6AA3, 0x6AA4, 0x6AA5, 0x6AA6, 0, + 0x6AA7, 0x6AA8, 0x6AAA, 0x6AAD, 0x6AAE, 0x6AAF, 0x6AB0, 0x6AB1, + 0x6AB2, 0x6AB3, 0x6AB4, 0x6AB5, 0x6AB6, 0x6AB7, 0x6AB8, 0x6AB9, + 0x6ABA, 0x6ABB, 0x6ABC, 0x6ABD, 0x6ABE, 0x6ABF, 0x6AC0, 0x6AC1, + 0x6AC2, 0x6AC3, 0x6AC4, 0x6AC5, 0x6AC6, 0x6AC7, 0x6AC8, 0x6AC9, + 0x6ACA, 0x6ACB, 0x6ACC, 0x6ACD, 0x6ACE, 0x6ACF, 0x6AD0, 0x6AD1, + 0x6AD2, 0x6AD3, 0x6AD4, 0x6AD5, 0x6AD6, 0x6AD7, 0x6AD8, 0x6AD9, + 0x6ADA, 0x6ADB, 0x6ADC, 0x6ADD, 0x6ADE, 0x6ADF, 0x6AE0, 0x6AE1, + 0x6AE2, 0x6AE3, 0x6AE4, 0x6AE5, 0x6AE6, 0x6AE7, 0x6AE8, 0x6AE9, + 0x6AEA, 0x6AEB, 0x6AEC, 0x6AED, 0x6AEE, 0x6AEF, 0x6AF0, 0x6AF1, + 0x6AF2, 0x6AF3, 0x6AF4, 0x6AF5, 0x6AF6, 0x6AF7, 0x6AF8, 0x6AF9, + 0x6AFA, 0x6AFB, 0x6AFC, 0x6AFD, 0x6AFE, 0x6AFF, 0x6B00, 0x6B01, + 0x6B02, 0x6B03, 0x6B04, 0x6B05, 0x6B06, 0x6B07, 0x6B08, 0x6B09, + 0x6B0A, 0x6B0B, 0x6B0C, 0x6B0D, 0x6B0E, 0x6B0F, 0x6B10, 0x6B11, + 0x6B12, 0x6B13, 0x6B14, 0x6B15, 0x6B16, 0x6B17, 0x6B18, 0x6B19, + 0x6B1A, 0x6B1B, 0x6B1C, 0x6B1D, 0x6B1E, 0x6B1F, 0x6B25, 0x6B26, + 0x6B28, 0x6B29, 0x6B2A, 0x6B2B, 0x6B2C, 0x6B2D, 0x6B2E, 0, +plane 9a +at 0x40 + 0x6B2F, 0x6B30, 0x6B31, 0x6B33, 0x6B34, 0x6B35, 0x6B36, 0x6B38, + 0x6B3B, 0x6B3C, 0x6B3D, 0x6B3F, 0x6B40, 0x6B41, 0x6B42, 0x6B44, + 0x6B45, 0x6B48, 0x6B4A, 0x6B4B, 0x6B4D, 0x6B4E, 0x6B4F, 0x6B50, + 0x6B51, 0x6B52, 0x6B53, 0x6B54, 0x6B55, 0x6B56, 0x6B57, 0x6B58, + 0x6B5A, 0x6B5B, 0x6B5C, 0x6B5D, 0x6B5E, 0x6B5F, 0x6B60, 0x6B61, + 0x6B68, 0x6B69, 0x6B6B, 0x6B6C, 0x6B6D, 0x6B6E, 0x6B6F, 0x6B70, + 0x6B71, 0x6B72, 0x6B73, 0x6B74, 0x6B75, 0x6B76, 0x6B77, 0x6B78, + 0x6B7A, 0x6B7D, 0x6B7E, 0x6B7F, 0x6B80, 0x6B85, 0x6B88, 0, + 0x6B8C, 0x6B8E, 0x6B8F, 0x6B90, 0x6B91, 0x6B94, 0x6B95, 0x6B97, + 0x6B98, 0x6B99, 0x6B9C, 0x6B9D, 0x6B9E, 0x6B9F, 0x6BA0, 0x6BA2, + 0x6BA3, 0x6BA4, 0x6BA5, 0x6BA6, 0x6BA7, 0x6BA8, 0x6BA9, 0x6BAB, + 0x6BAC, 0x6BAD, 0x6BAE, 0x6BAF, 0x6BB0, 0x6BB1, 0x6BB2, 0x6BB6, + 0x6BB8, 0x6BB9, 0x6BBA, 0x6BBB, 0x6BBC, 0x6BBD, 0x6BBE, 0x6BC0, + 0x6BC3, 0x6BC4, 0x6BC6, 0x6BC7, 0x6BC8, 0x6BC9, 0x6BCA, 0x6BCC, + 0x6BCE, 0x6BD0, 0x6BD1, 0x6BD8, 0x6BDA, 0x6BDC, 0x6BDD, 0x6BDE, + 0x6BDF, 0x6BE0, 0x6BE2, 0x6BE3, 0x6BE4, 0x6BE5, 0x6BE6, 0x6BE7, + 0x6BE8, 0x6BE9, 0x6BEC, 0x6BED, 0x6BEE, 0x6BF0, 0x6BF1, 0x6BF2, + 0x6BF4, 0x6BF6, 0x6BF7, 0x6BF8, 0x6BFA, 0x6BFB, 0x6BFC, 0x6BFE, + 0x6BFF, 0x6C00, 0x6C01, 0x6C02, 0x6C03, 0x6C04, 0x6C08, 0x6C09, + 0x6C0A, 0x6C0B, 0x6C0C, 0x6C0E, 0x6C12, 0x6C17, 0x6C1C, 0x6C1D, + 0x6C1E, 0x6C20, 0x6C23, 0x6C25, 0x6C2B, 0x6C2C, 0x6C2D, 0x6C31, + 0x6C33, 0x6C36, 0x6C37, 0x6C39, 0x6C3A, 0x6C3B, 0x6C3C, 0x6C3E, + 0x6C3F, 0x6C43, 0x6C44, 0x6C45, 0x6C48, 0x6C4B, 0x6C4C, 0x6C4D, + 0x6C4E, 0x6C4F, 0x6C51, 0x6C52, 0x6C53, 0x6C56, 0x6C58, 0, +plane 9b +at 0x40 + 0x6C59, 0x6C5A, 0x6C62, 0x6C63, 0x6C65, 0x6C66, 0x6C67, 0x6C6B, + 0x6C6C, 0x6C6D, 0x6C6E, 0x6C6F, 0x6C71, 0x6C73, 0x6C75, 0x6C77, + 0x6C78, 0x6C7A, 0x6C7B, 0x6C7C, 0x6C7F, 0x6C80, 0x6C84, 0x6C87, + 0x6C8A, 0x6C8B, 0x6C8D, 0x6C8E, 0x6C91, 0x6C92, 0x6C95, 0x6C96, + 0x6C97, 0x6C98, 0x6C9A, 0x6C9C, 0x6C9D, 0x6C9E, 0x6CA0, 0x6CA2, + 0x6CA8, 0x6CAC, 0x6CAF, 0x6CB0, 0x6CB4, 0x6CB5, 0x6CB6, 0x6CB7, + 0x6CBA, 0x6CC0, 0x6CC1, 0x6CC2, 0x6CC3, 0x6CC6, 0x6CC7, 0x6CC8, + 0x6CCB, 0x6CCD, 0x6CCE, 0x6CCF, 0x6CD1, 0x6CD2, 0x6CD8, 0, + 0x6CD9, 0x6CDA, 0x6CDC, 0x6CDD, 0x6CDF, 0x6CE4, 0x6CE6, 0x6CE7, + 0x6CE9, 0x6CEC, 0x6CED, 0x6CF2, 0x6CF4, 0x6CF9, 0x6CFF, 0x6D00, + 0x6D02, 0x6D03, 0x6D05, 0x6D06, 0x6D08, 0x6D09, 0x6D0A, 0x6D0D, + 0x6D0F, 0x6D10, 0x6D11, 0x6D13, 0x6D14, 0x6D15, 0x6D16, 0x6D18, + 0x6D1C, 0x6D1D, 0x6D1F, 0x6D20, 0x6D21, 0x6D22, 0x6D23, 0x6D24, + 0x6D26, 0x6D28, 0x6D29, 0x6D2C, 0x6D2D, 0x6D2F, 0x6D30, 0x6D34, + 0x6D36, 0x6D37, 0x6D38, 0x6D3A, 0x6D3F, 0x6D40, 0x6D42, 0x6D44, + 0x6D49, 0x6D4C, 0x6D50, 0x6D55, 0x6D56, 0x6D57, 0x6D58, 0x6D5B, + 0x6D5D, 0x6D5F, 0x6D61, 0x6D62, 0x6D64, 0x6D65, 0x6D67, 0x6D68, + 0x6D6B, 0x6D6C, 0x6D6D, 0x6D70, 0x6D71, 0x6D72, 0x6D73, 0x6D75, + 0x6D76, 0x6D79, 0x6D7A, 0x6D7B, 0x6D7D, 0x6D7E, 0x6D7F, 0x6D80, + 0x6D81, 0x6D83, 0x6D84, 0x6D86, 0x6D87, 0x6D8A, 0x6D8B, 0x6D8D, + 0x6D8F, 0x6D90, 0x6D92, 0x6D96, 0x6D97, 0x6D98, 0x6D99, 0x6D9A, + 0x6D9C, 0x6DA2, 0x6DA5, 0x6DAC, 0x6DAD, 0x6DB0, 0x6DB1, 0x6DB3, + 0x6DB4, 0x6DB6, 0x6DB7, 0x6DB9, 0x6DBA, 0x6DBB, 0x6DBC, 0x6DBD, + 0x6DBE, 0x6DC1, 0x6DC2, 0x6DC3, 0x6DC8, 0x6DC9, 0x6DCA, 0, +plane 9c +at 0x40 + 0x6DCD, 0x6DCE, 0x6DCF, 0x6DD0, 0x6DD2, 0x6DD3, 0x6DD4, 0x6DD5, + 0x6DD7, 0x6DDA, 0x6DDB, 0x6DDC, 0x6DDF, 0x6DE2, 0x6DE3, 0x6DE5, + 0x6DE7, 0x6DE8, 0x6DE9, 0x6DEA, 0x6DED, 0x6DEF, 0x6DF0, 0x6DF2, + 0x6DF4, 0x6DF5, 0x6DF6, 0x6DF8, 0x6DFA, 0x6DFD, 0x6DFE, 0x6DFF, + 0x6E00, 0x6E01, 0x6E02, 0x6E03, 0x6E04, 0x6E06, 0x6E07, 0x6E08, + 0x6E09, 0x6E0B, 0x6E0F, 0x6E12, 0x6E13, 0x6E15, 0x6E18, 0x6E19, + 0x6E1B, 0x6E1C, 0x6E1E, 0x6E1F, 0x6E22, 0x6E26, 0x6E27, 0x6E28, + 0x6E2A, 0x6E2C, 0x6E2E, 0x6E30, 0x6E31, 0x6E33, 0x6E35, 0, + 0x6E36, 0x6E37, 0x6E39, 0x6E3B, 0x6E3C, 0x6E3D, 0x6E3E, 0x6E3F, + 0x6E40, 0x6E41, 0x6E42, 0x6E45, 0x6E46, 0x6E47, 0x6E48, 0x6E49, + 0x6E4A, 0x6E4B, 0x6E4C, 0x6E4F, 0x6E50, 0x6E51, 0x6E52, 0x6E55, + 0x6E57, 0x6E59, 0x6E5A, 0x6E5C, 0x6E5D, 0x6E5E, 0x6E60, 0x6E61, + 0x6E62, 0x6E63, 0x6E64, 0x6E65, 0x6E66, 0x6E67, 0x6E68, 0x6E69, + 0x6E6A, 0x6E6C, 0x6E6D, 0x6E6F, 0x6E70, 0x6E71, 0x6E72, 0x6E73, + 0x6E74, 0x6E75, 0x6E76, 0x6E77, 0x6E78, 0x6E79, 0x6E7A, 0x6E7B, + 0x6E7C, 0x6E7D, 0x6E80, 0x6E81, 0x6E82, 0x6E84, 0x6E87, 0x6E88, + 0x6E8A, 0x6E8B, 0x6E8C, 0x6E8D, 0x6E8E, 0x6E91, 0x6E92, 0x6E93, + 0x6E94, 0x6E95, 0x6E96, 0x6E97, 0x6E99, 0x6E9A, 0x6E9B, 0x6E9D, + 0x6E9E, 0x6EA0, 0x6EA1, 0x6EA3, 0x6EA4, 0x6EA6, 0x6EA8, 0x6EA9, + 0x6EAB, 0x6EAC, 0x6EAD, 0x6EAE, 0x6EB0, 0x6EB3, 0x6EB5, 0x6EB8, + 0x6EB9, 0x6EBC, 0x6EBE, 0x6EBF, 0x6EC0, 0x6EC3, 0x6EC4, 0x6EC5, + 0x6EC6, 0x6EC8, 0x6EC9, 0x6ECA, 0x6ECC, 0x6ECD, 0x6ECE, 0x6ED0, + 0x6ED2, 0x6ED6, 0x6ED8, 0x6ED9, 0x6EDB, 0x6EDC, 0x6EDD, 0x6EE3, + 0x6EE7, 0x6EEA, 0x6EEB, 0x6EEC, 0x6EED, 0x6EEE, 0x6EEF, 0, +plane 9d +at 0x40 + 0x6EF0, 0x6EF1, 0x6EF2, 0x6EF3, 0x6EF5, 0x6EF6, 0x6EF7, 0x6EF8, + 0x6EFA, 0x6EFB, 0x6EFC, 0x6EFD, 0x6EFE, 0x6EFF, 0x6F00, 0x6F01, + 0x6F03, 0x6F04, 0x6F05, 0x6F07, 0x6F08, 0x6F0A, 0x6F0B, 0x6F0C, + 0x6F0D, 0x6F0E, 0x6F10, 0x6F11, 0x6F12, 0x6F16, 0x6F17, 0x6F18, + 0x6F19, 0x6F1A, 0x6F1B, 0x6F1C, 0x6F1D, 0x6F1E, 0x6F1F, 0x6F21, + 0x6F22, 0x6F23, 0x6F25, 0x6F26, 0x6F27, 0x6F28, 0x6F2C, 0x6F2E, + 0x6F30, 0x6F32, 0x6F34, 0x6F35, 0x6F37, 0x6F38, 0x6F39, 0x6F3A, + 0x6F3B, 0x6F3C, 0x6F3D, 0x6F3F, 0x6F40, 0x6F41, 0x6F42, 0, + 0x6F43, 0x6F44, 0x6F45, 0x6F48, 0x6F49, 0x6F4A, 0x6F4C, 0x6F4E, + 0x6F4F, 0x6F50, 0x6F51, 0x6F52, 0x6F53, 0x6F54, 0x6F55, 0x6F56, + 0x6F57, 0x6F59, 0x6F5A, 0x6F5B, 0x6F5D, 0x6F5F, 0x6F60, 0x6F61, + 0x6F63, 0x6F64, 0x6F65, 0x6F67, 0x6F68, 0x6F69, 0x6F6A, 0x6F6B, + 0x6F6C, 0x6F6F, 0x6F70, 0x6F71, 0x6F73, 0x6F75, 0x6F76, 0x6F77, + 0x6F79, 0x6F7B, 0x6F7D, 0x6F7E, 0x6F7F, 0x6F80, 0x6F81, 0x6F82, + 0x6F83, 0x6F85, 0x6F86, 0x6F87, 0x6F8A, 0x6F8B, 0x6F8F, 0x6F90, + 0x6F91, 0x6F92, 0x6F93, 0x6F94, 0x6F95, 0x6F96, 0x6F97, 0x6F98, + 0x6F99, 0x6F9A, 0x6F9B, 0x6F9D, 0x6F9E, 0x6F9F, 0x6FA0, 0x6FA2, + 0x6FA3, 0x6FA4, 0x6FA5, 0x6FA6, 0x6FA8, 0x6FA9, 0x6FAA, 0x6FAB, + 0x6FAC, 0x6FAD, 0x6FAE, 0x6FAF, 0x6FB0, 0x6FB1, 0x6FB2, 0x6FB4, + 0x6FB5, 0x6FB7, 0x6FB8, 0x6FBA, 0x6FBB, 0x6FBC, 0x6FBD, 0x6FBE, + 0x6FBF, 0x6FC1, 0x6FC3, 0x6FC4, 0x6FC5, 0x6FC6, 0x6FC7, 0x6FC8, + 0x6FCA, 0x6FCB, 0x6FCC, 0x6FCD, 0x6FCE, 0x6FCF, 0x6FD0, 0x6FD3, + 0x6FD4, 0x6FD5, 0x6FD6, 0x6FD7, 0x6FD8, 0x6FD9, 0x6FDA, 0x6FDB, + 0x6FDC, 0x6FDD, 0x6FDF, 0x6FE2, 0x6FE3, 0x6FE4, 0x6FE5, 0, +plane 9e +at 0x40 + 0x6FE6, 0x6FE7, 0x6FE8, 0x6FE9, 0x6FEA, 0x6FEB, 0x6FEC, 0x6FED, + 0x6FF0, 0x6FF1, 0x6FF2, 0x6FF3, 0x6FF4, 0x6FF5, 0x6FF6, 0x6FF7, + 0x6FF8, 0x6FF9, 0x6FFA, 0x6FFB, 0x6FFC, 0x6FFD, 0x6FFE, 0x6FFF, + 0x7000, 0x7001, 0x7002, 0x7003, 0x7004, 0x7005, 0x7006, 0x7007, + 0x7008, 0x7009, 0x700A, 0x700B, 0x700C, 0x700D, 0x700E, 0x700F, + 0x7010, 0x7012, 0x7013, 0x7014, 0x7015, 0x7016, 0x7017, 0x7018, + 0x7019, 0x701C, 0x701D, 0x701E, 0x701F, 0x7020, 0x7021, 0x7022, + 0x7024, 0x7025, 0x7026, 0x7027, 0x7028, 0x7029, 0x702A, 0, + 0x702B, 0x702C, 0x702D, 0x702E, 0x702F, 0x7030, 0x7031, 0x7032, + 0x7033, 0x7034, 0x7036, 0x7037, 0x7038, 0x703A, 0x703B, 0x703C, + 0x703D, 0x703E, 0x703F, 0x7040, 0x7041, 0x7042, 0x7043, 0x7044, + 0x7045, 0x7046, 0x7047, 0x7048, 0x7049, 0x704A, 0x704B, 0x704D, + 0x704E, 0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055, 0x7056, + 0x7057, 0x7058, 0x7059, 0x705A, 0x705B, 0x705C, 0x705D, 0x705F, + 0x7060, 0x7061, 0x7062, 0x7063, 0x7064, 0x7065, 0x7066, 0x7067, + 0x7068, 0x7069, 0x706A, 0x706E, 0x7071, 0x7072, 0x7073, 0x7074, + 0x7077, 0x7079, 0x707A, 0x707B, 0x707D, 0x7081, 0x7082, 0x7083, + 0x7084, 0x7086, 0x7087, 0x7088, 0x708B, 0x708C, 0x708D, 0x708F, + 0x7090, 0x7091, 0x7093, 0x7097, 0x7098, 0x709A, 0x709B, 0x709E, + 0x709F, 0x70A0, 0x70A1, 0x70A2, 0x70A3, 0x70A4, 0x70A5, 0x70A6, + 0x70A7, 0x70A8, 0x70A9, 0x70AA, 0x70B0, 0x70B2, 0x70B4, 0x70B5, + 0x70B6, 0x70BA, 0x70BE, 0x70BF, 0x70C4, 0x70C5, 0x70C6, 0x70C7, + 0x70C9, 0x70CB, 0x70CC, 0x70CD, 0x70CE, 0x70CF, 0x70D0, 0x70D1, + 0x70D2, 0x70D3, 0x70D4, 0x70D5, 0x70D6, 0x70D7, 0x70DA, 0, +plane 9f +at 0x40 + 0x70DC, 0x70DD, 0x70DE, 0x70E0, 0x70E1, 0x70E2, 0x70E3, 0x70E5, + 0x70EA, 0x70EE, 0x70F0, 0x70F1, 0x70F2, 0x70F3, 0x70F4, 0x70F5, + 0x70F6, 0x70F8, 0x70FA, 0x70FB, 0x70FC, 0x70FE, 0x70FF, 0x7100, + 0x7101, 0x7102, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x7108, + 0x710B, 0x710C, 0x710D, 0x710E, 0x710F, 0x7111, 0x7112, 0x7114, + 0x7117, 0x711B, 0x711C, 0x711D, 0x711E, 0x711F, 0x7120, 0x7121, + 0x7122, 0x7123, 0x7124, 0x7125, 0x7127, 0x7128, 0x7129, 0x712A, + 0x712B, 0x712C, 0x712D, 0x712E, 0x7132, 0x7133, 0x7134, 0, + 0x7135, 0x7137, 0x7138, 0x7139, 0x713A, 0x713B, 0x713C, 0x713D, + 0x713E, 0x713F, 0x7140, 0x7141, 0x7142, 0x7143, 0x7144, 0x7146, + 0x7147, 0x7148, 0x7149, 0x714B, 0x714D, 0x714F, 0x7150, 0x7151, + 0x7152, 0x7153, 0x7154, 0x7155, 0x7156, 0x7157, 0x7158, 0x7159, + 0x715A, 0x715B, 0x715D, 0x715F, 0x7160, 0x7161, 0x7162, 0x7163, + 0x7165, 0x7169, 0x716A, 0x716B, 0x716C, 0x716D, 0x716F, 0x7170, + 0x7171, 0x7174, 0x7175, 0x7176, 0x7177, 0x7179, 0x717B, 0x717C, + 0x717E, 0x717F, 0x7180, 0x7181, 0x7182, 0x7183, 0x7185, 0x7186, + 0x7187, 0x7188, 0x7189, 0x718B, 0x718C, 0x718D, 0x718E, 0x7190, + 0x7191, 0x7192, 0x7193, 0x7195, 0x7196, 0x7197, 0x719A, 0x719B, + 0x719C, 0x719D, 0x719E, 0x71A1, 0x71A2, 0x71A3, 0x71A4, 0x71A5, + 0x71A6, 0x71A7, 0x71A9, 0x71AA, 0x71AB, 0x71AD, 0x71AE, 0x71AF, + 0x71B0, 0x71B1, 0x71B2, 0x71B4, 0x71B6, 0x71B7, 0x71B8, 0x71BA, + 0x71BB, 0x71BC, 0x71BD, 0x71BE, 0x71BF, 0x71C0, 0x71C1, 0x71C2, + 0x71C4, 0x71C5, 0x71C6, 0x71C7, 0x71C8, 0x71C9, 0x71CA, 0x71CB, + 0x71CC, 0x71CD, 0x71CF, 0x71D0, 0x71D1, 0x71D2, 0x71D3, 0, +plane a0 +at 0x40 + 0x71D6, 0x71D7, 0x71D8, 0x71D9, 0x71DA, 0x71DB, 0x71DC, 0x71DD, + 0x71DE, 0x71DF, 0x71E1, 0x71E2, 0x71E3, 0x71E4, 0x71E6, 0x71E8, + 0x71E9, 0x71EA, 0x71EB, 0x71EC, 0x71ED, 0x71EF, 0x71F0, 0x71F1, + 0x71F2, 0x71F3, 0x71F4, 0x71F5, 0x71F6, 0x71F7, 0x71F8, 0x71FA, + 0x71FB, 0x71FC, 0x71FD, 0x71FE, 0x71FF, 0x7200, 0x7201, 0x7202, + 0x7203, 0x7204, 0x7205, 0x7207, 0x7208, 0x7209, 0x720A, 0x720B, + 0x720C, 0x720D, 0x720E, 0x720F, 0x7210, 0x7211, 0x7212, 0x7213, + 0x7214, 0x7215, 0x7216, 0x7217, 0x7218, 0x7219, 0x721A, 0, + 0x721B, 0x721C, 0x721E, 0x721F, 0x7220, 0x7221, 0x7222, 0x7223, + 0x7224, 0x7225, 0x7226, 0x7227, 0x7229, 0x722B, 0x722D, 0x722E, + 0x722F, 0x7232, 0x7233, 0x7234, 0x723A, 0x723C, 0x723E, 0x7240, + 0x7241, 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7249, 0x724A, + 0x724B, 0x724E, 0x724F, 0x7250, 0x7251, 0x7253, 0x7254, 0x7255, + 0x7257, 0x7258, 0x725A, 0x725C, 0x725E, 0x7260, 0x7263, 0x7264, + 0x7265, 0x7268, 0x726A, 0x726B, 0x726C, 0x726D, 0x7270, 0x7271, + 0x7273, 0x7274, 0x7276, 0x7277, 0x7278, 0x727B, 0x727C, 0x727D, + 0x7282, 0x7283, 0x7285, 0x7286, 0x7287, 0x7288, 0x7289, 0x728C, + 0x728E, 0x7290, 0x7291, 0x7293, 0x7294, 0x7295, 0x7296, 0x7297, + 0x7298, 0x7299, 0x729A, 0x729B, 0x729C, 0x729D, 0x729E, 0x72A0, + 0x72A1, 0x72A2, 0x72A3, 0x72A4, 0x72A5, 0x72A6, 0x72A7, 0x72A8, + 0x72A9, 0x72AA, 0x72AB, 0x72AE, 0x72B1, 0x72B2, 0x72B3, 0x72B5, + 0x72BA, 0x72BB, 0x72BC, 0x72BD, 0x72BE, 0x72BF, 0x72C0, 0x72C5, + 0x72C6, 0x72C7, 0x72C9, 0x72CA, 0x72CB, 0x72CC, 0x72CF, 0x72D1, + 0x72D3, 0x72D4, 0x72D5, 0x72D6, 0x72D8, 0x72DA, 0x72DB, 0, +plane a1 +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x3000, 0x3001, 0x3002, 0x00B7, 0x02C9, 0x02C7, 0x00A8, + 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x2019, + 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, + 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x3011, + 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F, + 0x222A, 0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220, + 0x2312, 0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D, + 0x221D, 0x2260, 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235, + 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04, + 0x00A4, 0xFFE0, 0xFFE1, 0x2030, 0x00A7, 0x2116, 0x2606, 0x2605, + 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, + 0x25B2, 0x203B, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0, +plane a2 +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, + 0x2177, 0x2178, 0x2179, 0, 0, 0, 0, 0, + 0, 0x2488, 0x2489, 0x248A, 0x248B, 0x248C, 0x248D, 0x248E, + 0x248F, 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, + 0x2497, 0x2498, 0x2499, 0x249A, 0x249B, 0x2474, 0x2475, 0x2476, + 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, + 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, + 0x2487, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, + 0x2467, 0x2468, 0x2469, 0, 0, 0x3220, 0x3221, 0x3222, + 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0, + 0, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, + 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0, 0, 0, +plane a3 +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0xFF01, 0xFF02, 0xFF03, 0xFFE5, 0xFF05, 0xFF06, 0xFF07, + 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, + 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, + 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, + 0xFF20, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, + 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, + 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, + 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F, + 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, + 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, + 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, + 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3, 0, +plane a4 +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, + 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, + 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, + 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, + 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, + 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, + 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, + 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, + 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, + 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, + 0x3090, 0x3091, 0x3092, 0x3093, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a5 +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, + 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, + 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, + 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, + 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, + 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, + 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, + 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, + 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, + 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, + 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a6 +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, + 0x03A9, 0, 0, 0, 0, 0, 0, 0, + 0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, + 0x03C9, 0, 0, 0, 0, 0, 0, 0, + 0xFE35, 0xFE36, 0xFE39, 0xFE3A, 0xFE3F, 0xFE40, 0xFE3D, 0xFE3E, + 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0, 0, 0xFE3B, 0xFE3C, + 0xFE37, 0xFE38, 0xFE31, 0, 0xFE33, 0xFE34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a7 +at 0x40 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, + 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, + 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, + 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, + 0x042E, 0x042F, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, + 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, + 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, + 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, + 0x044E, 0x044F, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a8 +at 0x40 + 0x02CA, 0x02CB, 0x02D9, 0x2013, 0x2014, 0x2025, 0x2035, 0x2105, + 0x2109, 0x2196, 0x2197, 0x2198, 0x2199, 0x2215, 0x221F, 0x2223, + 0x2252, 0x2266, 0x2267, 0x22BF, 0x2550, 0x2551, 0x2552, 0x2553, + 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, + 0x255C, 0x255D, 0x255E, 0x255F, 0x2560, 0x2561, 0x2562, 0x2563, + 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x256B, + 0x256C, 0x256D, 0x256E, 0x256F, 0x2570, 0x2571, 0x2572, 0x2573, + 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0, + 0x2588, 0x2589, 0x258A, 0x258B, 0x258C, 0x258D, 0x258E, 0x258F, + 0x2593, 0x2594, 0x2595, 0x25BC, 0x25BD, 0x25E2, 0x25E3, 0x25E4, + 0x25E5, 0x2609, 0x2295, 0x3012, 0x301D, 0x301E, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, 0x011B, + 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2, + 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA, + 0x01DC, 0x00FC, 0x00EA, 0x0251, 0xE7C7, 0x0144, 0x0148, 0xE7C8, + 0x0261, 0, 0, 0, 0, 0x3105, 0x3106, 0x3107, + 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, + 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, + 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, 0x311F, + 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, + 0x3128, 0x3129, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane a9 +at 0x40 + 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, + 0x3029, 0x32A3, 0x338E, 0x338F, 0x339C, 0x339D, 0x339E, 0x33A1, + 0x33C4, 0x33CE, 0x33D1, 0x33D2, 0x33D5, 0xFE30, 0xFFE2, 0xFFE4, + 0, 0x2121, 0x3231, 0, 0x2010, 0, 0, 0, + 0x30FC, 0x309B, 0x309C, 0x30FD, 0x30FE, 0x3006, 0x309D, 0x309E, + 0xFE49, 0xFE4A, 0xFE4B, 0xFE4C, 0xFE4D, 0xFE4E, 0xFE4F, 0xFE50, + 0xFE51, 0xFE52, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFE59, 0xFE5A, + 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0xFE5F, 0xFE60, 0xFE61, 0, + 0xFE62, 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0xFE68, 0xFE69, 0xFE6A, + 0xFE6B, 0xE7E7, 0xE7E8, 0xE7E9, 0xE7EA, 0xE7EB, 0xE7EC, 0xE7ED, + 0xE7EE, 0xE7EF, 0xE7F0, 0xE7F1, 0xE7F2, 0xE7F3, 0x3007, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0x2500, 0x2501, 0x2502, 0x2503, + 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, + 0x250C, 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, + 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, + 0x251C, 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, + 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, + 0x252C, 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, + 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, + 0x253C, 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, + 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, 0x254B, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane aa +at 0x40 + 0x72DC, 0x72DD, 0x72DF, 0x72E2, 0x72E3, 0x72E4, 0x72E5, 0x72E6, + 0x72E7, 0x72EA, 0x72EB, 0x72F5, 0x72F6, 0x72F9, 0x72FD, 0x72FE, + 0x72FF, 0x7300, 0x7302, 0x7304, 0x7305, 0x7306, 0x7307, 0x7308, + 0x7309, 0x730B, 0x730C, 0x730D, 0x730F, 0x7310, 0x7311, 0x7312, + 0x7314, 0x7318, 0x7319, 0x731A, 0x731F, 0x7320, 0x7323, 0x7324, + 0x7326, 0x7327, 0x7328, 0x732D, 0x732F, 0x7330, 0x7332, 0x7333, + 0x7335, 0x7336, 0x733A, 0x733B, 0x733C, 0x733D, 0x7340, 0x7341, + 0x7342, 0x7343, 0x7344, 0x7345, 0x7346, 0x7347, 0x7348, 0, + 0x7349, 0x734A, 0x734B, 0x734C, 0x734E, 0x734F, 0x7351, 0x7353, + 0x7354, 0x7355, 0x7356, 0x7358, 0x7359, 0x735A, 0x735B, 0x735C, + 0x735D, 0x735E, 0x735F, 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, + 0x7366, 0x7367, 0x7368, 0x7369, 0x736A, 0x736B, 0x736E, 0x7370, + 0x7371, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane ab +at 0x40 + 0x7372, 0x7373, 0x7374, 0x7375, 0x7376, 0x7377, 0x7378, 0x7379, + 0x737A, 0x737B, 0x737C, 0x737D, 0x737F, 0x7380, 0x7381, 0x7382, + 0x7383, 0x7385, 0x7386, 0x7388, 0x738A, 0x738C, 0x738D, 0x738F, + 0x7390, 0x7392, 0x7393, 0x7394, 0x7395, 0x7397, 0x7398, 0x7399, + 0x739A, 0x739C, 0x739D, 0x739E, 0x73A0, 0x73A1, 0x73A3, 0x73A4, + 0x73A5, 0x73A6, 0x73A7, 0x73A8, 0x73AA, 0x73AC, 0x73AD, 0x73B1, + 0x73B4, 0x73B5, 0x73B6, 0x73B8, 0x73B9, 0x73BC, 0x73BD, 0x73BE, + 0x73BF, 0x73C1, 0x73C3, 0x73C4, 0x73C5, 0x73C6, 0x73C7, 0, + 0x73CB, 0x73CC, 0x73CE, 0x73D2, 0x73D3, 0x73D4, 0x73D5, 0x73D6, + 0x73D7, 0x73D8, 0x73DA, 0x73DB, 0x73DC, 0x73DD, 0x73DF, 0x73E1, + 0x73E2, 0x73E3, 0x73E4, 0x73E6, 0x73E8, 0x73EA, 0x73EB, 0x73EC, + 0x73EE, 0x73EF, 0x73F0, 0x73F1, 0x73F3, 0x73F4, 0x73F5, 0x73F6, + 0x73F7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane ac +at 0x40 + 0x73F8, 0x73F9, 0x73FA, 0x73FB, 0x73FC, 0x73FD, 0x73FE, 0x73FF, + 0x7400, 0x7401, 0x7402, 0x7404, 0x7407, 0x7408, 0x740B, 0x740C, + 0x740D, 0x740E, 0x7411, 0x7412, 0x7413, 0x7414, 0x7415, 0x7416, + 0x7417, 0x7418, 0x7419, 0x741C, 0x741D, 0x741E, 0x741F, 0x7420, + 0x7421, 0x7423, 0x7424, 0x7427, 0x7429, 0x742B, 0x742D, 0x742F, + 0x7431, 0x7432, 0x7437, 0x7438, 0x7439, 0x743A, 0x743B, 0x743D, + 0x743E, 0x743F, 0x7440, 0x7442, 0x7443, 0x7444, 0x7445, 0x7446, + 0x7447, 0x7448, 0x7449, 0x744A, 0x744B, 0x744C, 0x744D, 0, + 0x744E, 0x744F, 0x7450, 0x7451, 0x7452, 0x7453, 0x7454, 0x7456, + 0x7458, 0x745D, 0x7460, 0x7461, 0x7462, 0x7463, 0x7464, 0x7465, + 0x7466, 0x7467, 0x7468, 0x7469, 0x746A, 0x746B, 0x746C, 0x746E, + 0x746F, 0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7478, 0x7479, + 0x747A, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane ad +at 0x40 + 0x747B, 0x747C, 0x747D, 0x747F, 0x7482, 0x7484, 0x7485, 0x7486, + 0x7488, 0x7489, 0x748A, 0x748C, 0x748D, 0x748F, 0x7491, 0x7492, + 0x7493, 0x7494, 0x7495, 0x7496, 0x7497, 0x7498, 0x7499, 0x749A, + 0x749B, 0x749D, 0x749F, 0x74A0, 0x74A1, 0x74A2, 0x74A3, 0x74A4, + 0x74A5, 0x74A6, 0x74AA, 0x74AB, 0x74AC, 0x74AD, 0x74AE, 0x74AF, + 0x74B0, 0x74B1, 0x74B2, 0x74B3, 0x74B4, 0x74B5, 0x74B6, 0x74B7, + 0x74B8, 0x74B9, 0x74BB, 0x74BC, 0x74BD, 0x74BE, 0x74BF, 0x74C0, + 0x74C1, 0x74C2, 0x74C3, 0x74C4, 0x74C5, 0x74C6, 0x74C7, 0, + 0x74C8, 0x74C9, 0x74CA, 0x74CB, 0x74CC, 0x74CD, 0x74CE, 0x74CF, + 0x74D0, 0x74D1, 0x74D3, 0x74D4, 0x74D5, 0x74D6, 0x74D7, 0x74D8, + 0x74D9, 0x74DA, 0x74DB, 0x74DD, 0x74DF, 0x74E1, 0x74E5, 0x74E7, + 0x74E8, 0x74E9, 0x74EA, 0x74EB, 0x74EC, 0x74ED, 0x74F0, 0x74F1, + 0x74F2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane ae +at 0x40 + 0x74F3, 0x74F5, 0x74F8, 0x74F9, 0x74FA, 0x74FB, 0x74FC, 0x74FD, + 0x74FE, 0x7500, 0x7501, 0x7502, 0x7503, 0x7505, 0x7506, 0x7507, + 0x7508, 0x7509, 0x750A, 0x750B, 0x750C, 0x750E, 0x7510, 0x7512, + 0x7514, 0x7515, 0x7516, 0x7517, 0x751B, 0x751D, 0x751E, 0x7520, + 0x7521, 0x7522, 0x7523, 0x7524, 0x7526, 0x7527, 0x752A, 0x752E, + 0x7534, 0x7536, 0x7539, 0x753C, 0x753D, 0x753F, 0x7541, 0x7542, + 0x7543, 0x7544, 0x7546, 0x7547, 0x7549, 0x754A, 0x754D, 0x7550, + 0x7551, 0x7552, 0x7553, 0x7555, 0x7556, 0x7557, 0x7558, 0, + 0x755D, 0x755E, 0x755F, 0x7560, 0x7561, 0x7562, 0x7563, 0x7564, + 0x7567, 0x7568, 0x7569, 0x756B, 0x756C, 0x756D, 0x756E, 0x756F, + 0x7570, 0x7571, 0x7573, 0x7575, 0x7576, 0x7577, 0x757A, 0x757B, + 0x757C, 0x757D, 0x757E, 0x7580, 0x7581, 0x7582, 0x7584, 0x7585, + 0x7587, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane af +at 0x40 + 0x7588, 0x7589, 0x758A, 0x758C, 0x758D, 0x758E, 0x7590, 0x7593, + 0x7595, 0x7598, 0x759B, 0x759C, 0x759E, 0x75A2, 0x75A6, 0x75A7, + 0x75A8, 0x75A9, 0x75AA, 0x75AD, 0x75B6, 0x75B7, 0x75BA, 0x75BB, + 0x75BF, 0x75C0, 0x75C1, 0x75C6, 0x75CB, 0x75CC, 0x75CE, 0x75CF, + 0x75D0, 0x75D1, 0x75D3, 0x75D7, 0x75D9, 0x75DA, 0x75DC, 0x75DD, + 0x75DF, 0x75E0, 0x75E1, 0x75E5, 0x75E9, 0x75EC, 0x75ED, 0x75EE, + 0x75EF, 0x75F2, 0x75F3, 0x75F5, 0x75F6, 0x75F7, 0x75F8, 0x75FA, + 0x75FB, 0x75FD, 0x75FE, 0x7602, 0x7604, 0x7606, 0x7607, 0, + 0x7608, 0x7609, 0x760B, 0x760D, 0x760E, 0x760F, 0x7611, 0x7612, + 0x7613, 0x7614, 0x7616, 0x761A, 0x761C, 0x761D, 0x761E, 0x7621, + 0x7623, 0x7627, 0x7628, 0x762C, 0x762E, 0x762F, 0x7631, 0x7632, + 0x7636, 0x7637, 0x7639, 0x763A, 0x763B, 0x763D, 0x7641, 0x7642, + 0x7644, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane b0 +at 0x40 + 0x7645, 0x7646, 0x7647, 0x7648, 0x7649, 0x764A, 0x764B, 0x764E, + 0x764F, 0x7650, 0x7651, 0x7652, 0x7653, 0x7655, 0x7657, 0x7658, + 0x7659, 0x765A, 0x765B, 0x765D, 0x765F, 0x7660, 0x7661, 0x7662, + 0x7664, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, 0x766A, 0x766C, + 0x766D, 0x766E, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x7675, + 0x7676, 0x7677, 0x7679, 0x767A, 0x767C, 0x767F, 0x7680, 0x7681, + 0x7683, 0x7685, 0x7689, 0x768A, 0x768C, 0x768D, 0x768F, 0x7690, + 0x7692, 0x7694, 0x7695, 0x7697, 0x7698, 0x769A, 0x769B, 0, + 0x769C, 0x769D, 0x769E, 0x769F, 0x76A0, 0x76A1, 0x76A2, 0x76A3, + 0x76A5, 0x76A6, 0x76A7, 0x76A8, 0x76A9, 0x76AA, 0x76AB, 0x76AC, + 0x76AD, 0x76AF, 0x76B0, 0x76B3, 0x76B5, 0x76B6, 0x76B7, 0x76B8, + 0x76B9, 0x76BA, 0x76BB, 0x76BC, 0x76BD, 0x76BE, 0x76C0, 0x76C1, + 0x76C3, 0x554A, 0x963F, 0x57C3, 0x6328, 0x54CE, 0x5509, 0x54C0, + 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E, 0x788D, 0x7231, 0x9698, + 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309, 0x6697, 0x5CB8, 0x80FA, + 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9, 0x6556, 0x71AC, 0x7FF1, + 0x8884, 0x50B2, 0x5965, 0x61CA, 0x6FB3, 0x82AD, 0x634C, 0x6252, + 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4, 0x5DF4, 0x62D4, 0x8DCB, + 0x9776, 0x628A, 0x8019, 0x575D, 0x9738, 0x7F62, 0x7238, 0x767D, + 0x67CF, 0x767E, 0x6446, 0x4F70, 0x8D25, 0x62DC, 0x7A17, 0x6591, + 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881, 0x677F, 0x7248, 0x626E, + 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E, 0x7ECA, 0x90A6, 0x5E2E, + 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2, 0x78C5, 0x868C, 0x9551, + 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305, 0x8912, 0x5265, 0, +plane b1 +at 0x40 + 0x76C4, 0x76C7, 0x76C9, 0x76CB, 0x76CC, 0x76D3, 0x76D5, 0x76D9, + 0x76DA, 0x76DC, 0x76DD, 0x76DE, 0x76E0, 0x76E1, 0x76E2, 0x76E3, + 0x76E4, 0x76E6, 0x76E7, 0x76E8, 0x76E9, 0x76EA, 0x76EB, 0x76EC, + 0x76ED, 0x76F0, 0x76F3, 0x76F5, 0x76F6, 0x76F7, 0x76FA, 0x76FB, + 0x76FD, 0x76FF, 0x7700, 0x7702, 0x7703, 0x7705, 0x7706, 0x770A, + 0x770C, 0x770E, 0x770F, 0x7710, 0x7711, 0x7712, 0x7713, 0x7714, + 0x7715, 0x7716, 0x7717, 0x7718, 0x771B, 0x771C, 0x771D, 0x771E, + 0x7721, 0x7723, 0x7724, 0x7725, 0x7727, 0x772A, 0x772B, 0, + 0x772C, 0x772E, 0x7730, 0x7731, 0x7732, 0x7733, 0x7734, 0x7739, + 0x773B, 0x773D, 0x773E, 0x773F, 0x7742, 0x7744, 0x7745, 0x7746, + 0x7748, 0x7749, 0x774A, 0x774B, 0x774C, 0x774D, 0x774E, 0x774F, + 0x7752, 0x7753, 0x7754, 0x7755, 0x7756, 0x7757, 0x7758, 0x7759, + 0x775C, 0x8584, 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D, 0x62B1, + 0x62A5, 0x66B4, 0x8C79, 0x9C8D, 0x7206, 0x676F, 0x7891, 0x60B2, + 0x5351, 0x5317, 0x8F88, 0x80CC, 0x8D1D, 0x94A1, 0x500D, 0x72C8, + 0x5907, 0x60EB, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C, 0x7B28, + 0x5D29, 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C, 0x9F3B, + 0x6BD4, 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D, 0x6BD5, + 0x6BD9, 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D, 0x5F0A, + 0x5FC5, 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD, 0x8FB9, + 0x7F16, 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8, 0x8FA9, + 0x8FAB, 0x904D, 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6, 0x618B, + 0x522B, 0x762A, 0x5F6C, 0x658C, 0x6FD2, 0x6EE8, 0x5BBE, 0x6448, + 0x5175, 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x997C, 0x70B3, 0, +plane b2 +at 0x40 + 0x775D, 0x775E, 0x775F, 0x7760, 0x7764, 0x7767, 0x7769, 0x776A, + 0x776D, 0x776E, 0x776F, 0x7770, 0x7771, 0x7772, 0x7773, 0x7774, + 0x7775, 0x7776, 0x7777, 0x7778, 0x777A, 0x777B, 0x777C, 0x7781, + 0x7782, 0x7783, 0x7786, 0x7787, 0x7788, 0x7789, 0x778A, 0x778B, + 0x778F, 0x7790, 0x7793, 0x7794, 0x7795, 0x7796, 0x7797, 0x7798, + 0x7799, 0x779A, 0x779B, 0x779C, 0x779D, 0x779E, 0x77A1, 0x77A3, + 0x77A4, 0x77A6, 0x77A8, 0x77AB, 0x77AD, 0x77AE, 0x77AF, 0x77B1, + 0x77B2, 0x77B4, 0x77B6, 0x77B7, 0x77B8, 0x77B9, 0x77BA, 0, + 0x77BC, 0x77BE, 0x77C0, 0x77C1, 0x77C2, 0x77C3, 0x77C4, 0x77C5, + 0x77C6, 0x77C7, 0x77C8, 0x77C9, 0x77CA, 0x77CB, 0x77CC, 0x77CE, + 0x77CF, 0x77D0, 0x77D1, 0x77D2, 0x77D3, 0x77D4, 0x77D5, 0x77D6, + 0x77D8, 0x77D9, 0x77DA, 0x77DD, 0x77DE, 0x77DF, 0x77E0, 0x77E1, + 0x77E4, 0x75C5, 0x5E76, 0x73BB, 0x83E0, 0x64AD, 0x62E8, 0x94B5, + 0x6CE2, 0x535A, 0x52C3, 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B, + 0x8236, 0x8116, 0x818A, 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C, + 0x54FA, 0x8865, 0x57E0, 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, + 0x6016, 0x64E6, 0x731C, 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C, + 0x8E29, 0x91C7, 0x5F69, 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695, + 0x6B8B, 0x60ED, 0x60E8, 0x707F, 0x82CD, 0x8231, 0x4ED3, 0x6CA7, + 0x85CF, 0x64CD, 0x7CD9, 0x69FD, 0x66F9, 0x8349, 0x5395, 0x7B56, + 0x4FA7, 0x518C, 0x6D4B, 0x5C42, 0x8E6D, 0x63D2, 0x53C9, 0x832C, + 0x8336, 0x67E5, 0x78B4, 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8BE7, + 0x62C6, 0x67F4, 0x8C7A, 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17, + 0x7F20, 0x94F2, 0x4EA7, 0x9610, 0x98A4, 0x660C, 0x7316, 0, +plane b3 +at 0x40 + 0x77E6, 0x77E8, 0x77EA, 0x77EF, 0x77F0, 0x77F1, 0x77F2, 0x77F4, + 0x77F5, 0x77F7, 0x77F9, 0x77FA, 0x77FB, 0x77FC, 0x7803, 0x7804, + 0x7805, 0x7806, 0x7807, 0x7808, 0x780A, 0x780B, 0x780E, 0x780F, + 0x7810, 0x7813, 0x7815, 0x7819, 0x781B, 0x781E, 0x7820, 0x7821, + 0x7822, 0x7824, 0x7828, 0x782A, 0x782B, 0x782E, 0x782F, 0x7831, + 0x7832, 0x7833, 0x7835, 0x7836, 0x783D, 0x783F, 0x7841, 0x7842, + 0x7843, 0x7844, 0x7846, 0x7848, 0x7849, 0x784A, 0x784B, 0x784D, + 0x784F, 0x7851, 0x7853, 0x7854, 0x7858, 0x7859, 0x785A, 0, + 0x785B, 0x785C, 0x785E, 0x785F, 0x7860, 0x7861, 0x7862, 0x7863, + 0x7864, 0x7865, 0x7866, 0x7867, 0x7868, 0x7869, 0x786F, 0x7870, + 0x7871, 0x7872, 0x7873, 0x7874, 0x7875, 0x7876, 0x7878, 0x7879, + 0x787A, 0x787B, 0x787D, 0x787E, 0x787F, 0x7880, 0x7881, 0x7882, + 0x7883, 0x573A, 0x5C1D, 0x5E38, 0x957F, 0x507F, 0x80A0, 0x5382, + 0x655E, 0x7545, 0x5531, 0x5021, 0x8D85, 0x6284, 0x949E, 0x671D, + 0x5632, 0x6F6E, 0x5DE2, 0x5435, 0x7092, 0x8F66, 0x626F, 0x64A4, + 0x63A3, 0x5F7B, 0x6F88, 0x90F4, 0x81E3, 0x8FB0, 0x5C18, 0x6668, + 0x5FF1, 0x6C89, 0x9648, 0x8D81, 0x886C, 0x6491, 0x79F0, 0x57CE, + 0x6A59, 0x6210, 0x5448, 0x4E58, 0x7A0B, 0x60E9, 0x6F84, 0x8BDA, + 0x627F, 0x901E, 0x9A8B, 0x79E4, 0x5403, 0x75F4, 0x6301, 0x5319, + 0x6C60, 0x8FDF, 0x5F1B, 0x9A70, 0x803B, 0x9F7F, 0x4F88, 0x5C3A, + 0x8D64, 0x7FC5, 0x65A5, 0x70BD, 0x5145, 0x51B2, 0x866B, 0x5D07, + 0x5BA0, 0x62BD, 0x916C, 0x7574, 0x8E0C, 0x7A20, 0x6101, 0x7B79, + 0x4EC7, 0x7EF8, 0x7785, 0x4E11, 0x81ED, 0x521D, 0x51FA, 0x6A71, + 0x53A8, 0x8E87, 0x9504, 0x96CF, 0x6EC1, 0x9664, 0x695A, 0, +plane b4 +at 0x40 + 0x7884, 0x7885, 0x7886, 0x7888, 0x788A, 0x788B, 0x788F, 0x7890, + 0x7892, 0x7894, 0x7895, 0x7896, 0x7899, 0x789D, 0x789E, 0x78A0, + 0x78A2, 0x78A4, 0x78A6, 0x78A8, 0x78A9, 0x78AA, 0x78AB, 0x78AC, + 0x78AD, 0x78AE, 0x78AF, 0x78B5, 0x78B6, 0x78B7, 0x78B8, 0x78BA, + 0x78BB, 0x78BC, 0x78BD, 0x78BF, 0x78C0, 0x78C2, 0x78C3, 0x78C4, + 0x78C6, 0x78C7, 0x78C8, 0x78CC, 0x78CD, 0x78CE, 0x78CF, 0x78D1, + 0x78D2, 0x78D3, 0x78D6, 0x78D7, 0x78D8, 0x78DA, 0x78DB, 0x78DC, + 0x78DD, 0x78DE, 0x78DF, 0x78E0, 0x78E1, 0x78E2, 0x78E3, 0, + 0x78E4, 0x78E5, 0x78E6, 0x78E7, 0x78E9, 0x78EA, 0x78EB, 0x78ED, + 0x78EE, 0x78EF, 0x78F0, 0x78F1, 0x78F3, 0x78F5, 0x78F6, 0x78F8, + 0x78F9, 0x78FB, 0x78FC, 0x78FD, 0x78FE, 0x78FF, 0x7900, 0x7902, + 0x7903, 0x7904, 0x7906, 0x7907, 0x7908, 0x7909, 0x790A, 0x790B, + 0x790C, 0x7840, 0x50A8, 0x77D7, 0x6410, 0x89E6, 0x5904, 0x63E3, + 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239, 0x5598, 0x4E32, 0x75AE, + 0x7A97, 0x5E62, 0x5E8A, 0x95EF, 0x521B, 0x5439, 0x708A, 0x6376, + 0x9524, 0x5782, 0x6625, 0x693F, 0x9187, 0x5507, 0x6DF3, 0x7EAF, + 0x8822, 0x6233, 0x7EF0, 0x75B5, 0x8328, 0x78C1, 0x96CC, 0x8F9E, + 0x6148, 0x74F7, 0x8BCD, 0x6B64, 0x523A, 0x8D50, 0x6B21, 0x806A, + 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B, 0x51D1, 0x7C97, 0x918B, + 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C, 0x6467, 0x5D14, 0x50AC, + 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0, 0x6751, 0x5B58, 0x5BF8, + 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B, 0x9519, 0x642D, 0x8FBE, + 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6B79, 0x50A3, 0x6234, + 0x5E26, 0x6B86, 0x4EE3, 0x8D37, 0x888B, 0x5F85, 0x902E, 0, +plane b5 +at 0x40 + 0x790D, 0x790E, 0x790F, 0x7910, 0x7911, 0x7912, 0x7914, 0x7915, + 0x7916, 0x7917, 0x7918, 0x7919, 0x791A, 0x791B, 0x791C, 0x791D, + 0x791F, 0x7920, 0x7921, 0x7922, 0x7923, 0x7925, 0x7926, 0x7927, + 0x7928, 0x7929, 0x792A, 0x792B, 0x792C, 0x792D, 0x792E, 0x792F, + 0x7930, 0x7931, 0x7932, 0x7933, 0x7935, 0x7936, 0x7937, 0x7938, + 0x7939, 0x793D, 0x793F, 0x7942, 0x7943, 0x7944, 0x7945, 0x7947, + 0x794A, 0x794B, 0x794C, 0x794D, 0x794E, 0x794F, 0x7950, 0x7951, + 0x7952, 0x7954, 0x7955, 0x7958, 0x7959, 0x7961, 0x7963, 0, + 0x7964, 0x7966, 0x7969, 0x796A, 0x796B, 0x796C, 0x796E, 0x7970, + 0x7971, 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7979, 0x797B, + 0x797C, 0x797D, 0x797E, 0x797F, 0x7982, 0x7983, 0x7986, 0x7987, + 0x7988, 0x7989, 0x798B, 0x798C, 0x798D, 0x798E, 0x7990, 0x7991, + 0x7992, 0x6020, 0x803D, 0x62C5, 0x4E39, 0x5355, 0x90F8, 0x63B8, + 0x80C6, 0x65E6, 0x6C2E, 0x4F46, 0x60EE, 0x6DE1, 0x8BDE, 0x5F39, + 0x86CB, 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, 0x5200, 0x6363, + 0x8E48, 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B, 0x60BC, + 0x9053, 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F, 0x767B, + 0x7B49, 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4, 0x8FEA, + 0x654C, 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5, 0x5E95, + 0x5730, 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14, 0x98A0, + 0x6382, 0x6EC7, 0x7898, 0x70B9, 0x5178, 0x975B, 0x57AB, 0x7535, + 0x4F43, 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6DC0, 0x6BBF, 0x7889, + 0x53FC, 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x9493, 0x8C03, + 0x8DCC, 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, 0x53E0, 0, +plane b6 +at 0x40 + 0x7993, 0x7994, 0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x799B, + 0x799C, 0x799D, 0x799E, 0x799F, 0x79A0, 0x79A1, 0x79A2, 0x79A3, + 0x79A4, 0x79A5, 0x79A6, 0x79A8, 0x79A9, 0x79AA, 0x79AB, 0x79AC, + 0x79AD, 0x79AE, 0x79AF, 0x79B0, 0x79B1, 0x79B2, 0x79B4, 0x79B5, + 0x79B6, 0x79B7, 0x79B8, 0x79BC, 0x79BF, 0x79C2, 0x79C4, 0x79C5, + 0x79C7, 0x79C8, 0x79CA, 0x79CC, 0x79CE, 0x79CF, 0x79D0, 0x79D3, + 0x79D4, 0x79D6, 0x79D7, 0x79D9, 0x79DA, 0x79DB, 0x79DC, 0x79DD, + 0x79DE, 0x79E0, 0x79E1, 0x79E2, 0x79E5, 0x79E8, 0x79EA, 0, + 0x79EC, 0x79EE, 0x79F1, 0x79F2, 0x79F3, 0x79F4, 0x79F5, 0x79F6, + 0x79F7, 0x79F9, 0x79FA, 0x79FC, 0x79FE, 0x79FF, 0x7A01, 0x7A04, + 0x7A05, 0x7A07, 0x7A08, 0x7A09, 0x7A0A, 0x7A0C, 0x7A0F, 0x7A10, + 0x7A11, 0x7A12, 0x7A13, 0x7A15, 0x7A16, 0x7A18, 0x7A19, 0x7A1B, + 0x7A1C, 0x4E01, 0x76EF, 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D, + 0x5B9A, 0x8BA2, 0x4E22, 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8, + 0x680B, 0x4F97, 0x606B, 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597, + 0x9661, 0x8C46, 0x9017, 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A, + 0x72EC, 0x8BFB, 0x5835, 0x7779, 0x8D4C, 0x675C, 0x9540, 0x809A, + 0x5EA6, 0x6E21, 0x5992, 0x7AEF, 0x77ED, 0x953B, 0x6BB5, 0x65AD, + 0x7F0E, 0x5806, 0x5151, 0x961F, 0x5BF9, 0x58A9, 0x5428, 0x8E72, + 0x6566, 0x987F, 0x56E4, 0x949D, 0x76FE, 0x9041, 0x6387, 0x54C6, + 0x591A, 0x593A, 0x579B, 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241, + 0x60F0, 0x5815, 0x86FE, 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9, + 0x5A25, 0x6076, 0x5384, 0x627C, 0x904F, 0x9102, 0x997F, 0x6069, + 0x800C, 0x513F, 0x8033, 0x5C14, 0x9975, 0x6D31, 0x4E8C, 0, +plane b7 +at 0x40 + 0x7A1D, 0x7A1F, 0x7A21, 0x7A22, 0x7A24, 0x7A25, 0x7A26, 0x7A27, + 0x7A28, 0x7A29, 0x7A2A, 0x7A2B, 0x7A2C, 0x7A2D, 0x7A2E, 0x7A2F, + 0x7A30, 0x7A31, 0x7A32, 0x7A34, 0x7A35, 0x7A36, 0x7A38, 0x7A3A, + 0x7A3E, 0x7A40, 0x7A41, 0x7A42, 0x7A43, 0x7A44, 0x7A45, 0x7A47, + 0x7A48, 0x7A49, 0x7A4A, 0x7A4B, 0x7A4C, 0x7A4D, 0x7A4E, 0x7A4F, + 0x7A50, 0x7A52, 0x7A53, 0x7A54, 0x7A55, 0x7A56, 0x7A58, 0x7A59, + 0x7A5A, 0x7A5B, 0x7A5C, 0x7A5D, 0x7A5E, 0x7A5F, 0x7A60, 0x7A61, + 0x7A62, 0x7A63, 0x7A64, 0x7A65, 0x7A66, 0x7A67, 0x7A68, 0, + 0x7A69, 0x7A6A, 0x7A6B, 0x7A6C, 0x7A6D, 0x7A6E, 0x7A6F, 0x7A71, + 0x7A72, 0x7A73, 0x7A75, 0x7A7B, 0x7A7C, 0x7A7D, 0x7A7E, 0x7A82, + 0x7A85, 0x7A87, 0x7A89, 0x7A8A, 0x7A8B, 0x7A8C, 0x7A8E, 0x7A8F, + 0x7A90, 0x7A93, 0x7A94, 0x7A99, 0x7A9A, 0x7A9B, 0x7A9E, 0x7AA1, + 0x7AA2, 0x8D30, 0x53D1, 0x7F5A, 0x7B4F, 0x4F10, 0x4E4F, 0x9600, + 0x6CD5, 0x73D0, 0x85E9, 0x5E06, 0x756A, 0x7FFB, 0x6A0A, 0x77FE, + 0x9492, 0x7E41, 0x51E1, 0x70E6, 0x53CD, 0x8FD4, 0x8303, 0x8D29, + 0x72AF, 0x996D, 0x6CDB, 0x574A, 0x82B3, 0x65B9, 0x80AA, 0x623F, + 0x9632, 0x59A8, 0x4EFF, 0x8BBF, 0x7EBA, 0x653E, 0x83F2, 0x975E, + 0x5561, 0x98DE, 0x80A5, 0x532A, 0x8BFD, 0x5420, 0x80BA, 0x5E9F, + 0x6CB8, 0x8D39, 0x82AC, 0x915A, 0x5429, 0x6C1B, 0x5206, 0x7EB7, + 0x575F, 0x711A, 0x6C7E, 0x7C89, 0x594B, 0x4EFD, 0x5FFF, 0x6124, + 0x7CAA, 0x4E30, 0x5C01, 0x67AB, 0x8702, 0x5CF0, 0x950B, 0x98CE, + 0x75AF, 0x70FD, 0x9022, 0x51AF, 0x7F1D, 0x8BBD, 0x5949, 0x51E4, + 0x4F5B, 0x5426, 0x592B, 0x6577, 0x80A4, 0x5B75, 0x6276, 0x62C2, + 0x8F90, 0x5E45, 0x6C1F, 0x7B26, 0x4F0F, 0x4FD8, 0x670D, 0, +plane b8 +at 0x40 + 0x7AA3, 0x7AA4, 0x7AA7, 0x7AA9, 0x7AAA, 0x7AAB, 0x7AAE, 0x7AAF, + 0x7AB0, 0x7AB1, 0x7AB2, 0x7AB4, 0x7AB5, 0x7AB6, 0x7AB7, 0x7AB8, + 0x7AB9, 0x7ABA, 0x7ABB, 0x7ABC, 0x7ABD, 0x7ABE, 0x7AC0, 0x7AC1, + 0x7AC2, 0x7AC3, 0x7AC4, 0x7AC5, 0x7AC6, 0x7AC7, 0x7AC8, 0x7AC9, + 0x7ACA, 0x7ACC, 0x7ACD, 0x7ACE, 0x7ACF, 0x7AD0, 0x7AD1, 0x7AD2, + 0x7AD3, 0x7AD4, 0x7AD5, 0x7AD7, 0x7AD8, 0x7ADA, 0x7ADB, 0x7ADC, + 0x7ADD, 0x7AE1, 0x7AE2, 0x7AE4, 0x7AE7, 0x7AE8, 0x7AE9, 0x7AEA, + 0x7AEB, 0x7AEC, 0x7AEE, 0x7AF0, 0x7AF1, 0x7AF2, 0x7AF3, 0, + 0x7AF4, 0x7AF5, 0x7AF6, 0x7AF7, 0x7AF8, 0x7AFB, 0x7AFC, 0x7AFE, + 0x7B00, 0x7B01, 0x7B02, 0x7B05, 0x7B07, 0x7B09, 0x7B0C, 0x7B0D, + 0x7B0E, 0x7B10, 0x7B12, 0x7B13, 0x7B16, 0x7B17, 0x7B18, 0x7B1A, + 0x7B1C, 0x7B1D, 0x7B1F, 0x7B21, 0x7B22, 0x7B23, 0x7B27, 0x7B29, + 0x7B2D, 0x6D6E, 0x6DAA, 0x798F, 0x88B1, 0x5F17, 0x752B, 0x629A, + 0x8F85, 0x4FEF, 0x91DC, 0x65A7, 0x812F, 0x8151, 0x5E9C, 0x8150, + 0x8D74, 0x526F, 0x8986, 0x8D4B, 0x590D, 0x5085, 0x4ED8, 0x961C, + 0x7236, 0x8179, 0x8D1F, 0x5BCC, 0x8BA3, 0x9644, 0x5987, 0x7F1A, + 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539, 0x6982, 0x9499, 0x76D6, + 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1, 0x7AFF, 0x809D, 0x8D76, + 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188, 0x521A, 0x94A2, 0x7F38, + 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760, 0x7BD9, 0x768B, 0x9AD8, + 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550, 0x7A3F, 0x544A, 0x54E5, + 0x6B4C, 0x6401, 0x6208, 0x9E3D, 0x80F3, 0x7599, 0x5272, 0x9769, + 0x845B, 0x683C, 0x86E4, 0x9601, 0x9694, 0x94EC, 0x4E2A, 0x5404, + 0x7ED9, 0x6839, 0x8DDF, 0x8015, 0x66F4, 0x5E9A, 0x7FB9, 0, +plane b9 +at 0x40 + 0x7B2F, 0x7B30, 0x7B32, 0x7B34, 0x7B35, 0x7B36, 0x7B37, 0x7B39, + 0x7B3B, 0x7B3D, 0x7B3F, 0x7B40, 0x7B41, 0x7B42, 0x7B43, 0x7B44, + 0x7B46, 0x7B48, 0x7B4A, 0x7B4D, 0x7B4E, 0x7B53, 0x7B55, 0x7B57, + 0x7B59, 0x7B5C, 0x7B5E, 0x7B5F, 0x7B61, 0x7B63, 0x7B64, 0x7B65, + 0x7B66, 0x7B67, 0x7B68, 0x7B69, 0x7B6A, 0x7B6B, 0x7B6C, 0x7B6D, + 0x7B6F, 0x7B70, 0x7B73, 0x7B74, 0x7B76, 0x7B78, 0x7B7A, 0x7B7C, + 0x7B7D, 0x7B7F, 0x7B81, 0x7B82, 0x7B83, 0x7B84, 0x7B86, 0x7B87, + 0x7B88, 0x7B89, 0x7B8A, 0x7B8B, 0x7B8C, 0x7B8E, 0x7B8F, 0, + 0x7B91, 0x7B92, 0x7B93, 0x7B96, 0x7B98, 0x7B99, 0x7B9A, 0x7B9B, + 0x7B9E, 0x7B9F, 0x7BA0, 0x7BA3, 0x7BA4, 0x7BA5, 0x7BAE, 0x7BAF, + 0x7BB0, 0x7BB2, 0x7BB3, 0x7BB5, 0x7BB6, 0x7BB7, 0x7BB9, 0x7BBA, + 0x7BBB, 0x7BBC, 0x7BBD, 0x7BBE, 0x7BBF, 0x7BC0, 0x7BC2, 0x7BC3, + 0x7BC4, 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F, 0x606D, + 0x9F9A, 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9, 0x6C5E, + 0x62F1, 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF, 0x72D7, + 0x57A2, 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495, 0x7B8D, + 0x4F30, 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA, 0x9AA8, + 0x8C37, 0x80A1, 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E, 0x74DC, + 0x5250, 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A, 0x68FA, + 0x5173, 0x5B98, 0x51A0, 0x89C2, 0x7BA1, 0x9986, 0x7F50, 0x60EF, + 0x704C, 0x8D2F, 0x5149, 0x5E7F, 0x901B, 0x7470, 0x89C4, 0x572D, + 0x7845, 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, 0x8BE1, 0x7678, + 0x6842, 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA, 0x68CD, + 0x9505, 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8, 0, +plane ba +at 0x40 + 0x7BC5, 0x7BC8, 0x7BC9, 0x7BCA, 0x7BCB, 0x7BCD, 0x7BCE, 0x7BCF, + 0x7BD0, 0x7BD2, 0x7BD4, 0x7BD5, 0x7BD6, 0x7BD7, 0x7BD8, 0x7BDB, + 0x7BDC, 0x7BDE, 0x7BDF, 0x7BE0, 0x7BE2, 0x7BE3, 0x7BE4, 0x7BE7, + 0x7BE8, 0x7BE9, 0x7BEB, 0x7BEC, 0x7BED, 0x7BEF, 0x7BF0, 0x7BF2, + 0x7BF3, 0x7BF4, 0x7BF5, 0x7BF6, 0x7BF8, 0x7BF9, 0x7BFA, 0x7BFB, + 0x7BFD, 0x7BFF, 0x7C00, 0x7C01, 0x7C02, 0x7C03, 0x7C04, 0x7C05, + 0x7C06, 0x7C08, 0x7C09, 0x7C0A, 0x7C0D, 0x7C0E, 0x7C10, 0x7C11, + 0x7C12, 0x7C13, 0x7C14, 0x7C15, 0x7C17, 0x7C18, 0x7C19, 0, + 0x7C1A, 0x7C1B, 0x7C1C, 0x7C1D, 0x7C1E, 0x7C20, 0x7C21, 0x7C22, + 0x7C23, 0x7C24, 0x7C25, 0x7C28, 0x7C29, 0x7C2B, 0x7C2C, 0x7C2D, + 0x7C2E, 0x7C2F, 0x7C30, 0x7C31, 0x7C32, 0x7C33, 0x7C34, 0x7C35, + 0x7C36, 0x7C37, 0x7C39, 0x7C3A, 0x7C3B, 0x7C3C, 0x7C3D, 0x7C3E, + 0x7C42, 0x9AB8, 0x5B69, 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87, + 0x9163, 0x61A8, 0x90AF, 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD, + 0x558A, 0x7F55, 0x7FF0, 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D, + 0x710A, 0x6C57, 0x6C49, 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E, + 0x8C6A, 0x6BEB, 0x90DD, 0x597D, 0x8017, 0x53F7, 0x6D69, 0x5475, + 0x559D, 0x8377, 0x83CF, 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408, + 0x76D2, 0x8C89, 0x9602, 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64, + 0x8D3A, 0x563F, 0x9ED1, 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC, + 0x4EA8, 0x6A2A, 0x8861, 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679, + 0x9E3F, 0x6D2A, 0x5B8F, 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334, + 0x543C, 0x539A, 0x5019, 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A, + 0x58F6, 0x846B, 0x80E1, 0x8774, 0x72D0, 0x7CCA, 0x6E56, 0, +plane bb +at 0x40 + 0x7C43, 0x7C44, 0x7C45, 0x7C46, 0x7C47, 0x7C48, 0x7C49, 0x7C4A, + 0x7C4B, 0x7C4C, 0x7C4E, 0x7C4F, 0x7C50, 0x7C51, 0x7C52, 0x7C53, + 0x7C54, 0x7C55, 0x7C56, 0x7C57, 0x7C58, 0x7C59, 0x7C5A, 0x7C5B, + 0x7C5C, 0x7C5D, 0x7C5E, 0x7C5F, 0x7C60, 0x7C61, 0x7C62, 0x7C63, + 0x7C64, 0x7C65, 0x7C66, 0x7C67, 0x7C68, 0x7C69, 0x7C6A, 0x7C6B, + 0x7C6C, 0x7C6D, 0x7C6E, 0x7C6F, 0x7C70, 0x7C71, 0x7C72, 0x7C75, + 0x7C76, 0x7C77, 0x7C78, 0x7C79, 0x7C7A, 0x7C7E, 0x7C7F, 0x7C80, + 0x7C81, 0x7C82, 0x7C83, 0x7C84, 0x7C85, 0x7C86, 0x7C87, 0, + 0x7C88, 0x7C8A, 0x7C8B, 0x7C8C, 0x7C8D, 0x7C8E, 0x7C8F, 0x7C90, + 0x7C93, 0x7C94, 0x7C96, 0x7C99, 0x7C9A, 0x7C9B, 0x7CA0, 0x7CA1, + 0x7CA3, 0x7CA6, 0x7CA7, 0x7CA8, 0x7CA9, 0x7CAB, 0x7CAC, 0x7CAD, + 0x7CAF, 0x7CB0, 0x7CB4, 0x7CB5, 0x7CB6, 0x7CB7, 0x7CB8, 0x7CBA, + 0x7CBB, 0x5F27, 0x864E, 0x552C, 0x62A4, 0x4E92, 0x6CAA, 0x6237, + 0x82B1, 0x54D7, 0x534E, 0x733E, 0x6ED1, 0x753B, 0x5212, 0x5316, + 0x8BDD, 0x69D0, 0x5F8A, 0x6000, 0x6DEE, 0x574F, 0x6B22, 0x73AF, + 0x6853, 0x8FD8, 0x7F13, 0x6362, 0x60A3, 0x5524, 0x75EA, 0x8C62, + 0x7115, 0x6DA3, 0x5BA6, 0x5E7B, 0x8352, 0x614C, 0x9EC4, 0x78FA, + 0x8757, 0x7C27, 0x7687, 0x51F0, 0x60F6, 0x714C, 0x6643, 0x5E4C, + 0x604D, 0x8C0E, 0x7070, 0x6325, 0x8F89, 0x5FBD, 0x6062, 0x86D4, + 0x56DE, 0x6BC1, 0x6094, 0x6167, 0x5349, 0x60E0, 0x6666, 0x8D3F, + 0x79FD, 0x4F1A, 0x70E9, 0x6C47, 0x8BB3, 0x8BF2, 0x7ED8, 0x8364, + 0x660F, 0x5A5A, 0x9B42, 0x6D51, 0x6DF7, 0x8C41, 0x6D3B, 0x4F19, + 0x706B, 0x83B7, 0x6216, 0x60D1, 0x970D, 0x8D27, 0x7978, 0x51FB, + 0x573E, 0x57FA, 0x673A, 0x7578, 0x7A3D, 0x79EF, 0x7B95, 0, +plane bc +at 0x40 + 0x7CBF, 0x7CC0, 0x7CC2, 0x7CC3, 0x7CC4, 0x7CC6, 0x7CC9, 0x7CCB, + 0x7CCE, 0x7CCF, 0x7CD0, 0x7CD1, 0x7CD2, 0x7CD3, 0x7CD4, 0x7CD8, + 0x7CDA, 0x7CDB, 0x7CDD, 0x7CDE, 0x7CE1, 0x7CE2, 0x7CE3, 0x7CE4, + 0x7CE5, 0x7CE6, 0x7CE7, 0x7CE9, 0x7CEA, 0x7CEB, 0x7CEC, 0x7CED, + 0x7CEE, 0x7CF0, 0x7CF1, 0x7CF2, 0x7CF3, 0x7CF4, 0x7CF5, 0x7CF6, + 0x7CF7, 0x7CF9, 0x7CFA, 0x7CFC, 0x7CFD, 0x7CFE, 0x7CFF, 0x7D00, + 0x7D01, 0x7D02, 0x7D03, 0x7D04, 0x7D05, 0x7D06, 0x7D07, 0x7D08, + 0x7D09, 0x7D0B, 0x7D0C, 0x7D0D, 0x7D0E, 0x7D0F, 0x7D10, 0, + 0x7D11, 0x7D12, 0x7D13, 0x7D14, 0x7D15, 0x7D16, 0x7D17, 0x7D18, + 0x7D19, 0x7D1A, 0x7D1B, 0x7D1C, 0x7D1D, 0x7D1E, 0x7D1F, 0x7D21, + 0x7D23, 0x7D24, 0x7D25, 0x7D26, 0x7D28, 0x7D29, 0x7D2A, 0x7D2C, + 0x7D2D, 0x7D2E, 0x7D30, 0x7D31, 0x7D32, 0x7D33, 0x7D34, 0x7D35, + 0x7D36, 0x808C, 0x9965, 0x8FF9, 0x6FC0, 0x8BA5, 0x9E21, 0x59EC, + 0x7EE9, 0x7F09, 0x5409, 0x6781, 0x68D8, 0x8F91, 0x7C4D, 0x96C6, + 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373, 0x5AC9, 0x7EA7, 0x6324, + 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280, 0x5180, 0x5B63, 0x4F0E, + 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4, 0x5BC2, 0x8BA1, 0x8BB0, + 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7, 0x7EAA, 0x5609, 0x67B7, + 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A, 0x988A, 0x8D3E, 0x7532, + 0x94BE, 0x5047, 0x7A3C, 0x4EF7, 0x67B6, 0x9A7E, 0x5AC1, 0x6B7C, + 0x76D1, 0x575A, 0x5C16, 0x7B3A, 0x95F4, 0x714E, 0x517C, 0x80A9, + 0x8270, 0x5978, 0x7F04, 0x8327, 0x68C0, 0x67EC, 0x78B1, 0x7877, + 0x62E3, 0x6361, 0x7B80, 0x4FED, 0x526A, 0x51CF, 0x8350, 0x69DB, + 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E, 0x7BAD, 0x4EF6, 0, +plane bd +at 0x40 + 0x7D37, 0x7D38, 0x7D39, 0x7D3A, 0x7D3B, 0x7D3C, 0x7D3D, 0x7D3E, + 0x7D3F, 0x7D40, 0x7D41, 0x7D42, 0x7D43, 0x7D44, 0x7D45, 0x7D46, + 0x7D47, 0x7D48, 0x7D49, 0x7D4A, 0x7D4B, 0x7D4C, 0x7D4D, 0x7D4E, + 0x7D4F, 0x7D50, 0x7D51, 0x7D52, 0x7D53, 0x7D54, 0x7D55, 0x7D56, + 0x7D57, 0x7D58, 0x7D59, 0x7D5A, 0x7D5B, 0x7D5C, 0x7D5D, 0x7D5E, + 0x7D5F, 0x7D60, 0x7D61, 0x7D62, 0x7D63, 0x7D64, 0x7D65, 0x7D66, + 0x7D67, 0x7D68, 0x7D69, 0x7D6A, 0x7D6B, 0x7D6C, 0x7D6D, 0x7D6F, + 0x7D70, 0x7D71, 0x7D72, 0x7D73, 0x7D74, 0x7D75, 0x7D76, 0, + 0x7D78, 0x7D79, 0x7D7A, 0x7D7B, 0x7D7C, 0x7D7D, 0x7D7E, 0x7D7F, + 0x7D80, 0x7D81, 0x7D82, 0x7D83, 0x7D84, 0x7D85, 0x7D86, 0x7D87, + 0x7D88, 0x7D89, 0x7D8A, 0x7D8B, 0x7D8C, 0x7D8D, 0x7D8E, 0x7D8F, + 0x7D90, 0x7D91, 0x7D92, 0x7D93, 0x7D94, 0x7D95, 0x7D96, 0x7D97, + 0x7D98, 0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85, 0x6DA7, + 0x5EFA, 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586, 0x848B, + 0x6868, 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549, 0x6912, + 0x7901, 0x7126, 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84, 0x5A07, + 0x56BC, 0x6405, 0x94F0, 0x77EB, 0x4FA5, 0x811A, 0x72E1, 0x89D2, + 0x997A, 0x7F34, 0x7EDE, 0x527F, 0x6559, 0x9175, 0x8F7F, 0x8F83, + 0x53EB, 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857, 0x9636, + 0x622A, 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, 0x776B, 0x7AED, + 0x6D01, 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5, 0x754C, + 0x501F, 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B, 0x65A4, + 0x91D1, 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5, 0x8C28, + 0x8FDB, 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78, 0, +plane be +at 0x40 + 0x7D99, 0x7D9A, 0x7D9B, 0x7D9C, 0x7D9D, 0x7D9E, 0x7D9F, 0x7DA0, + 0x7DA1, 0x7DA2, 0x7DA3, 0x7DA4, 0x7DA5, 0x7DA7, 0x7DA8, 0x7DA9, + 0x7DAA, 0x7DAB, 0x7DAC, 0x7DAD, 0x7DAF, 0x7DB0, 0x7DB1, 0x7DB2, + 0x7DB3, 0x7DB4, 0x7DB5, 0x7DB6, 0x7DB7, 0x7DB8, 0x7DB9, 0x7DBA, + 0x7DBB, 0x7DBC, 0x7DBD, 0x7DBE, 0x7DBF, 0x7DC0, 0x7DC1, 0x7DC2, + 0x7DC3, 0x7DC4, 0x7DC5, 0x7DC6, 0x7DC7, 0x7DC8, 0x7DC9, 0x7DCA, + 0x7DCB, 0x7DCC, 0x7DCD, 0x7DCE, 0x7DCF, 0x7DD0, 0x7DD1, 0x7DD2, + 0x7DD3, 0x7DD4, 0x7DD5, 0x7DD6, 0x7DD7, 0x7DD8, 0x7DD9, 0, + 0x7DDA, 0x7DDB, 0x7DDC, 0x7DDD, 0x7DDE, 0x7DDF, 0x7DE0, 0x7DE1, + 0x7DE2, 0x7DE3, 0x7DE4, 0x7DE5, 0x7DE6, 0x7DE7, 0x7DE8, 0x7DE9, + 0x7DEA, 0x7DEB, 0x7DEC, 0x7DED, 0x7DEE, 0x7DEF, 0x7DF0, 0x7DF1, + 0x7DF2, 0x7DF3, 0x7DF4, 0x7DF5, 0x7DF6, 0x7DF7, 0x7DF8, 0x7DF9, + 0x7DFA, 0x5C3D, 0x52B2, 0x8346, 0x5162, 0x830E, 0x775B, 0x6676, + 0x9CB8, 0x4EAC, 0x60CA, 0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, 0x8B66, + 0x666F, 0x9888, 0x9759, 0x5883, 0x656C, 0x955C, 0x5F84, 0x75C9, + 0x9756, 0x7ADF, 0x7ADE, 0x51C0, 0x70AF, 0x7A98, 0x63EA, 0x7A76, + 0x7EA0, 0x7396, 0x97ED, 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9, + 0x6551, 0x65E7, 0x81FC, 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0, + 0x62D8, 0x72D9, 0x75BD, 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480, + 0x77E9, 0x4E3E, 0x6CAE, 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177, + 0x8DDD, 0x8E1E, 0x952F, 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267, + 0x6350, 0x9E43, 0x5A1F, 0x5026, 0x7737, 0x5377, 0x7EE2, 0x6485, + 0x652B, 0x6289, 0x6398, 0x5014, 0x7235, 0x89C9, 0x51B3, 0x8BC0, + 0x7EDD, 0x5747, 0x83CC, 0x94A7, 0x519B, 0x541B, 0x5CFB, 0, +plane bf +at 0x40 + 0x7DFB, 0x7DFC, 0x7DFD, 0x7DFE, 0x7DFF, 0x7E00, 0x7E01, 0x7E02, + 0x7E03, 0x7E04, 0x7E05, 0x7E06, 0x7E07, 0x7E08, 0x7E09, 0x7E0A, + 0x7E0B, 0x7E0C, 0x7E0D, 0x7E0E, 0x7E0F, 0x7E10, 0x7E11, 0x7E12, + 0x7E13, 0x7E14, 0x7E15, 0x7E16, 0x7E17, 0x7E18, 0x7E19, 0x7E1A, + 0x7E1B, 0x7E1C, 0x7E1D, 0x7E1E, 0x7E1F, 0x7E20, 0x7E21, 0x7E22, + 0x7E23, 0x7E24, 0x7E25, 0x7E26, 0x7E27, 0x7E28, 0x7E29, 0x7E2A, + 0x7E2B, 0x7E2C, 0x7E2D, 0x7E2E, 0x7E2F, 0x7E30, 0x7E31, 0x7E32, + 0x7E33, 0x7E34, 0x7E35, 0x7E36, 0x7E37, 0x7E38, 0x7E39, 0, + 0x7E3A, 0x7E3C, 0x7E3D, 0x7E3E, 0x7E3F, 0x7E40, 0x7E42, 0x7E43, + 0x7E44, 0x7E45, 0x7E46, 0x7E48, 0x7E49, 0x7E4A, 0x7E4B, 0x7E4C, + 0x7E4D, 0x7E4E, 0x7E4F, 0x7E50, 0x7E51, 0x7E52, 0x7E53, 0x7E54, + 0x7E55, 0x7E56, 0x7E57, 0x7E58, 0x7E59, 0x7E5A, 0x7E5B, 0x7E5C, + 0x7E5D, 0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, 0x9A8F, 0x5580, 0x5496, + 0x5361, 0x54AF, 0x5F00, 0x63E9, 0x6977, 0x51EF, 0x6168, 0x520A, + 0x582A, 0x52D8, 0x574E, 0x780D, 0x770B, 0x5EB7, 0x6177, 0x7CE0, + 0x625B, 0x6297, 0x4EA2, 0x7095, 0x8003, 0x62F7, 0x70E4, 0x9760, + 0x5777, 0x82DB, 0x67EF, 0x68F5, 0x78D5, 0x9897, 0x79D1, 0x58F3, + 0x54B3, 0x53EF, 0x6E34, 0x514B, 0x523B, 0x5BA2, 0x8BFE, 0x80AF, + 0x5543, 0x57A6, 0x6073, 0x5751, 0x542D, 0x7A7A, 0x6050, 0x5B54, + 0x63A7, 0x62A0, 0x53E3, 0x6263, 0x5BC7, 0x67AF, 0x54ED, 0x7A9F, + 0x82E6, 0x9177, 0x5E93, 0x88E4, 0x5938, 0x57AE, 0x630E, 0x8DE8, + 0x80EF, 0x5757, 0x7B77, 0x4FA9, 0x5FEB, 0x5BBD, 0x6B3E, 0x5321, + 0x7B50, 0x72C2, 0x6846, 0x77FF, 0x7736, 0x65F7, 0x51B5, 0x4E8F, + 0x76D4, 0x5CBF, 0x7AA5, 0x8475, 0x594E, 0x9B41, 0x5080, 0, +plane c0 +at 0x40 + 0x7E5E, 0x7E5F, 0x7E60, 0x7E61, 0x7E62, 0x7E63, 0x7E64, 0x7E65, + 0x7E66, 0x7E67, 0x7E68, 0x7E69, 0x7E6A, 0x7E6B, 0x7E6C, 0x7E6D, + 0x7E6E, 0x7E6F, 0x7E70, 0x7E71, 0x7E72, 0x7E73, 0x7E74, 0x7E75, + 0x7E76, 0x7E77, 0x7E78, 0x7E79, 0x7E7A, 0x7E7B, 0x7E7C, 0x7E7D, + 0x7E7E, 0x7E7F, 0x7E80, 0x7E81, 0x7E83, 0x7E84, 0x7E85, 0x7E86, + 0x7E87, 0x7E88, 0x7E89, 0x7E8A, 0x7E8B, 0x7E8C, 0x7E8D, 0x7E8E, + 0x7E8F, 0x7E90, 0x7E91, 0x7E92, 0x7E93, 0x7E94, 0x7E95, 0x7E96, + 0x7E97, 0x7E98, 0x7E99, 0x7E9A, 0x7E9C, 0x7E9D, 0x7E9E, 0, + 0x7EAE, 0x7EB4, 0x7EBB, 0x7EBC, 0x7ED6, 0x7EE4, 0x7EEC, 0x7EF9, + 0x7F0A, 0x7F10, 0x7F1E, 0x7F37, 0x7F39, 0x7F3B, 0x7F3C, 0x7F3D, + 0x7F3E, 0x7F3F, 0x7F40, 0x7F41, 0x7F43, 0x7F46, 0x7F47, 0x7F48, + 0x7F49, 0x7F4A, 0x7F4B, 0x7F4C, 0x7F4D, 0x7F4E, 0x7F4F, 0x7F52, + 0x7F53, 0x9988, 0x6127, 0x6E83, 0x5764, 0x6606, 0x6346, 0x56F0, + 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783, 0x62C9, 0x5587, 0x8721, + 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765, 0x8D56, 0x84DD, 0x5A6A, + 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170, 0x6F9C, 0x8C30, 0x63FD, + 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5, 0x7405, 0x6994, 0x72FC, + 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x635E, 0x52B3, 0x7262, 0x8001, + 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6D9D, 0x52D2, 0x4E50, 0x96F7, + 0x956D, 0x857E, 0x78CA, 0x7D2F, 0x5121, 0x5792, 0x64C2, 0x808B, + 0x7C7B, 0x6CEA, 0x68F1, 0x695E, 0x51B7, 0x5398, 0x68A8, 0x7281, + 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13, 0x7406, 0x674E, 0x91CC, + 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F, 0x6817, 0x4E3D, 0x5389, + 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088, 0x4F8B, 0x4FD0, 0, +plane c1 +at 0x40 + 0x7F56, 0x7F59, 0x7F5B, 0x7F5C, 0x7F5D, 0x7F5E, 0x7F60, 0x7F63, + 0x7F64, 0x7F65, 0x7F66, 0x7F67, 0x7F6B, 0x7F6C, 0x7F6D, 0x7F6F, + 0x7F70, 0x7F73, 0x7F75, 0x7F76, 0x7F77, 0x7F78, 0x7F7A, 0x7F7B, + 0x7F7C, 0x7F7D, 0x7F7F, 0x7F80, 0x7F82, 0x7F83, 0x7F84, 0x7F85, + 0x7F86, 0x7F87, 0x7F88, 0x7F89, 0x7F8B, 0x7F8D, 0x7F8F, 0x7F90, + 0x7F91, 0x7F92, 0x7F93, 0x7F95, 0x7F96, 0x7F97, 0x7F98, 0x7F99, + 0x7F9B, 0x7F9C, 0x7FA0, 0x7FA2, 0x7FA3, 0x7FA5, 0x7FA6, 0x7FA8, + 0x7FA9, 0x7FAA, 0x7FAB, 0x7FAC, 0x7FAD, 0x7FAE, 0x7FB1, 0, + 0x7FB3, 0x7FB4, 0x7FB5, 0x7FB6, 0x7FB7, 0x7FBA, 0x7FBB, 0x7FBE, + 0x7FC0, 0x7FC2, 0x7FC3, 0x7FC4, 0x7FC6, 0x7FC7, 0x7FC8, 0x7FC9, + 0x7FCB, 0x7FCD, 0x7FCF, 0x7FD0, 0x7FD1, 0x7FD2, 0x7FD3, 0x7FD6, + 0x7FD7, 0x7FD9, 0x7FDA, 0x7FDB, 0x7FDC, 0x7FDD, 0x7FDE, 0x7FE2, + 0x7FE3, 0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B, 0x7483, + 0x54E9, 0x4FE9, 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9, 0x601C, + 0x6D9F, 0x5E18, 0x655B, 0x8138, 0x94FE, 0x604B, 0x70BC, 0x7EC3, + 0x7CAE, 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x4E24, 0x8F86, 0x91CF, + 0x667E, 0x4EAE, 0x8C05, 0x64A9, 0x804A, 0x50DA, 0x7597, 0x71CE, + 0x5BE5, 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, 0x5ED6, 0x6599, + 0x5217, 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797, 0x78F7, + 0x9716, 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41, 0x541D, + 0x62CE, 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36, 0x7F9A, + 0x51CC, 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4, 0x6E9C, + 0x7409, 0x69B4, 0x786B, 0x998F, 0x7559, 0x5218, 0x7624, 0x6D41, + 0x67F3, 0x516D, 0x9F99, 0x804B, 0x5499, 0x7B3C, 0x7ABF, 0, +plane c2 +at 0x40 + 0x7FE4, 0x7FE7, 0x7FE8, 0x7FEA, 0x7FEB, 0x7FEC, 0x7FED, 0x7FEF, + 0x7FF2, 0x7FF4, 0x7FF5, 0x7FF6, 0x7FF7, 0x7FF8, 0x7FF9, 0x7FFA, + 0x7FFD, 0x7FFE, 0x7FFF, 0x8002, 0x8007, 0x8008, 0x8009, 0x800A, + 0x800E, 0x800F, 0x8011, 0x8013, 0x801A, 0x801B, 0x801D, 0x801E, + 0x801F, 0x8021, 0x8023, 0x8024, 0x802B, 0x802C, 0x802D, 0x802E, + 0x802F, 0x8030, 0x8032, 0x8034, 0x8039, 0x803A, 0x803C, 0x803E, + 0x8040, 0x8041, 0x8044, 0x8045, 0x8047, 0x8048, 0x8049, 0x804E, + 0x804F, 0x8050, 0x8051, 0x8053, 0x8055, 0x8056, 0x8057, 0, + 0x8059, 0x805B, 0x805C, 0x805D, 0x805E, 0x805F, 0x8060, 0x8061, + 0x8062, 0x8063, 0x8064, 0x8065, 0x8066, 0x8067, 0x8068, 0x806B, + 0x806C, 0x806D, 0x806E, 0x806F, 0x8070, 0x8072, 0x8073, 0x8074, + 0x8075, 0x8076, 0x8077, 0x8078, 0x8079, 0x807A, 0x807B, 0x807C, + 0x807D, 0x9686, 0x5784, 0x62E2, 0x9647, 0x697C, 0x5A04, 0x6402, + 0x7BD3, 0x6F0F, 0x964B, 0x82A6, 0x5362, 0x9885, 0x5E90, 0x7089, + 0x63B3, 0x5364, 0x864F, 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF, + 0x8D42, 0x9E7F, 0x6F5E, 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74, + 0x5415, 0x94DD, 0x4FA3, 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651, + 0x6C2F, 0x5F8B, 0x7387, 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A, + 0x6EE6, 0x5375, 0x4E71, 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26, + 0x4ED1, 0x6CA6, 0x7EB6, 0x8BBA, 0x841D, 0x87BA, 0x7F57, 0x903B, + 0x9523, 0x7BA9, 0x9AA1, 0x88F8, 0x843D, 0x6D1B, 0x9A86, 0x7EDC, + 0x5988, 0x9EBB, 0x739B, 0x7801, 0x8682, 0x9A6C, 0x9A82, 0x561B, + 0x5417, 0x57CB, 0x4E70, 0x9EA6, 0x5356, 0x8FC8, 0x8109, 0x7792, + 0x9992, 0x86EE, 0x6EE1, 0x8513, 0x66FC, 0x6162, 0x6F2B, 0, +plane c3 +at 0x40 + 0x807E, 0x8081, 0x8082, 0x8085, 0x8088, 0x808A, 0x808D, 0x808E, + 0x808F, 0x8090, 0x8091, 0x8092, 0x8094, 0x8095, 0x8097, 0x8099, + 0x809E, 0x80A3, 0x80A6, 0x80A7, 0x80A8, 0x80AC, 0x80B0, 0x80B3, + 0x80B5, 0x80B6, 0x80B8, 0x80B9, 0x80BB, 0x80C5, 0x80C7, 0x80C8, + 0x80C9, 0x80CA, 0x80CB, 0x80CF, 0x80D0, 0x80D1, 0x80D2, 0x80D3, + 0x80D4, 0x80D5, 0x80D8, 0x80DF, 0x80E0, 0x80E2, 0x80E3, 0x80E6, + 0x80EE, 0x80F5, 0x80F7, 0x80F9, 0x80FB, 0x80FE, 0x80FF, 0x8100, + 0x8101, 0x8103, 0x8104, 0x8105, 0x8107, 0x8108, 0x810B, 0, + 0x810C, 0x8115, 0x8117, 0x8119, 0x811B, 0x811C, 0x811D, 0x811F, + 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126, 0x8127, + 0x8128, 0x8129, 0x812A, 0x812B, 0x812D, 0x812E, 0x8130, 0x8133, + 0x8134, 0x8135, 0x8137, 0x8139, 0x813A, 0x813B, 0x813C, 0x813D, + 0x813F, 0x8C29, 0x8292, 0x832B, 0x76F2, 0x6C13, 0x5FD9, 0x83BD, + 0x732B, 0x8305, 0x951A, 0x6BDB, 0x77DB, 0x94C6, 0x536F, 0x8302, + 0x5192, 0x5E3D, 0x8C8C, 0x8D38, 0x4E48, 0x73AB, 0x679A, 0x6885, + 0x9176, 0x9709, 0x7164, 0x6CA1, 0x7709, 0x5A92, 0x9541, 0x6BCF, + 0x7F8E, 0x6627, 0x5BD0, 0x59B9, 0x5A9A, 0x95E8, 0x95F7, 0x4EEC, + 0x840C, 0x8499, 0x6AAC, 0x76DF, 0x9530, 0x731B, 0x68A6, 0x5B5F, + 0x772F, 0x919A, 0x9761, 0x7CDC, 0x8FF7, 0x8C1C, 0x5F25, 0x7C73, + 0x79D8, 0x89C5, 0x6CCC, 0x871C, 0x5BC6, 0x5E42, 0x68C9, 0x7720, + 0x7EF5, 0x5195, 0x514D, 0x52C9, 0x5A29, 0x7F05, 0x9762, 0x82D7, + 0x63CF, 0x7784, 0x85D0, 0x79D2, 0x6E3A, 0x5E99, 0x5999, 0x8511, + 0x706D, 0x6C11, 0x62BF, 0x76BF, 0x654F, 0x60AF, 0x95FD, 0x660E, + 0x879F, 0x9E23, 0x94ED, 0x540D, 0x547D, 0x8C2C, 0x6478, 0, +plane c4 +at 0x40 + 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8147, 0x8149, + 0x814D, 0x814E, 0x814F, 0x8152, 0x8156, 0x8157, 0x8158, 0x815B, + 0x815C, 0x815D, 0x815E, 0x815F, 0x8161, 0x8162, 0x8163, 0x8164, + 0x8166, 0x8168, 0x816A, 0x816B, 0x816C, 0x816F, 0x8172, 0x8173, + 0x8175, 0x8176, 0x8177, 0x8178, 0x8181, 0x8183, 0x8184, 0x8185, + 0x8186, 0x8187, 0x8189, 0x818B, 0x818C, 0x818D, 0x818E, 0x8190, + 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8199, 0x819A, + 0x819E, 0x819F, 0x81A0, 0x81A1, 0x81A2, 0x81A4, 0x81A5, 0, + 0x81A7, 0x81A9, 0x81AB, 0x81AC, 0x81AD, 0x81AE, 0x81AF, 0x81B0, + 0x81B1, 0x81B2, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, + 0x81BC, 0x81BD, 0x81BE, 0x81BF, 0x81C4, 0x81C5, 0x81C7, 0x81C8, + 0x81C9, 0x81CB, 0x81CD, 0x81CE, 0x81CF, 0x81D0, 0x81D1, 0x81D2, + 0x81D3, 0x6479, 0x8611, 0x6A21, 0x819C, 0x78E8, 0x6469, 0x9B54, + 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8, 0x6CAB, 0x6F20, 0x5BDE, + 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7, 0x7261, 0x4EA9, 0x59C6, + 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF, 0x6155, 0x6728, 0x76EE, + 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA, 0x5450, 0x94A0, 0x90A3, + 0x5A1C, 0x7EB3, 0x6C16, 0x4E43, 0x5976, 0x8010, 0x5948, 0x5357, + 0x7537, 0x96BE, 0x56CA, 0x6320, 0x8111, 0x607C, 0x95F9, 0x6DD6, + 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD, 0x59AE, 0x9713, 0x502A, + 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F, 0x817B, 0x9006, 0x6EBA, + 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5, 0x637B, 0x5FF5, 0x5A18, + 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042, 0x5B7D, 0x556E, 0x954A, + 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE, 0x51DD, 0x5B81, 0, +plane c5 +at 0x40 + 0x81D4, 0x81D5, 0x81D6, 0x81D7, 0x81D8, 0x81D9, 0x81DA, 0x81DB, + 0x81DC, 0x81DD, 0x81DE, 0x81DF, 0x81E0, 0x81E1, 0x81E2, 0x81E4, + 0x81E5, 0x81E6, 0x81E8, 0x81E9, 0x81EB, 0x81EE, 0x81EF, 0x81F0, + 0x81F1, 0x81F2, 0x81F5, 0x81F6, 0x81F7, 0x81F8, 0x81F9, 0x81FA, + 0x81FD, 0x81FF, 0x8203, 0x8207, 0x8208, 0x8209, 0x820A, 0x820B, + 0x820E, 0x820F, 0x8211, 0x8213, 0x8215, 0x8216, 0x8217, 0x8218, + 0x8219, 0x821A, 0x821D, 0x8220, 0x8224, 0x8225, 0x8226, 0x8227, + 0x8229, 0x822E, 0x8232, 0x823A, 0x823C, 0x823D, 0x823F, 0, + 0x8240, 0x8241, 0x8242, 0x8243, 0x8245, 0x8246, 0x8248, 0x824A, + 0x824C, 0x824D, 0x824E, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, + 0x8255, 0x8256, 0x8257, 0x8259, 0x825B, 0x825C, 0x825D, 0x825E, + 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, + 0x8269, 0x62E7, 0x6CDE, 0x725B, 0x626D, 0x94AE, 0x7EBD, 0x8113, + 0x6D53, 0x519C, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973, 0x6696, + 0x8650, 0x759F, 0x632A, 0x61E6, 0x7CEF, 0x8BFA, 0x54E6, 0x6B27, + 0x9E25, 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, 0x556A, 0x8DB4, + 0x722C, 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C, 0x5F98, + 0x6E43, 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC, 0x7554, + 0x5224, 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6, 0x629B, + 0x5486, 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478, 0x80DA, + 0x57F9, 0x88F4, 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B, 0x55B7, + 0x76C6, 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC, 0x68DA, + 0x787C, 0x7BF7, 0x81A8, 0x670B, 0x9E4F, 0x6367, 0x78B0, 0x576F, + 0x7812, 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7, 0, +plane c6 +at 0x40 + 0x826A, 0x826B, 0x826C, 0x826D, 0x8271, 0x8275, 0x8276, 0x8277, + 0x8278, 0x827B, 0x827C, 0x8280, 0x8281, 0x8283, 0x8285, 0x8286, + 0x8287, 0x8289, 0x828C, 0x8290, 0x8293, 0x8294, 0x8295, 0x8296, + 0x829A, 0x829B, 0x829E, 0x82A0, 0x82A2, 0x82A3, 0x82A7, 0x82B2, + 0x82B5, 0x82B6, 0x82BA, 0x82BB, 0x82BC, 0x82BF, 0x82C0, 0x82C2, + 0x82C3, 0x82C5, 0x82C6, 0x82C9, 0x82D0, 0x82D6, 0x82D9, 0x82DA, + 0x82DD, 0x82E2, 0x82E7, 0x82E8, 0x82E9, 0x82EA, 0x82EC, 0x82ED, + 0x82EE, 0x82F0, 0x82F2, 0x82F3, 0x82F5, 0x82F6, 0x82F8, 0, + 0x82FA, 0x82FC, 0x82FD, 0x82FE, 0x82FF, 0x8300, 0x830A, 0x830B, + 0x830D, 0x8310, 0x8312, 0x8313, 0x8316, 0x8318, 0x8319, 0x831D, + 0x831E, 0x831F, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, + 0x8326, 0x8329, 0x832A, 0x832E, 0x8330, 0x8332, 0x8337, 0x833B, + 0x833D, 0x5564, 0x813E, 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB, + 0x5C41, 0x8B6C, 0x7BC7, 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02, + 0x74E2, 0x7968, 0x6487, 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1, + 0x8058, 0x4E52, 0x576A, 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6, + 0x8BC4, 0x5C4F, 0x5761, 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44, + 0x8FEB, 0x7C95, 0x5256, 0x6251, 0x94FA, 0x4EC6, 0x8386, 0x8461, + 0x83E9, 0x84B2, 0x57D4, 0x6734, 0x5703, 0x666E, 0x6D66, 0x8C31, + 0x66DD, 0x7011, 0x671F, 0x6B3A, 0x6816, 0x621A, 0x59BB, 0x4E03, + 0x51C4, 0x6F06, 0x67D2, 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67, + 0x7566, 0x5D0E, 0x8110, 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91, + 0x8D77, 0x5C82, 0x4E5E, 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668, + 0x6C14, 0x8FC4, 0x5F03, 0x6C7D, 0x6CE3, 0x8BAB, 0x6390, 0, +plane c7 +at 0x40 + 0x833E, 0x833F, 0x8341, 0x8342, 0x8344, 0x8345, 0x8348, 0x834A, + 0x834B, 0x834C, 0x834D, 0x834E, 0x8353, 0x8355, 0x8356, 0x8357, + 0x8358, 0x8359, 0x835D, 0x8362, 0x8370, 0x8371, 0x8372, 0x8373, + 0x8374, 0x8375, 0x8376, 0x8379, 0x837A, 0x837E, 0x837F, 0x8380, + 0x8381, 0x8382, 0x8383, 0x8384, 0x8387, 0x8388, 0x838A, 0x838B, + 0x838C, 0x838D, 0x838F, 0x8390, 0x8391, 0x8394, 0x8395, 0x8396, + 0x8397, 0x8399, 0x839A, 0x839D, 0x839F, 0x83A1, 0x83A2, 0x83A3, + 0x83A4, 0x83A5, 0x83A6, 0x83A7, 0x83AC, 0x83AD, 0x83AE, 0, + 0x83AF, 0x83B5, 0x83BB, 0x83BE, 0x83BF, 0x83C2, 0x83C3, 0x83C4, + 0x83C6, 0x83C8, 0x83C9, 0x83CB, 0x83CD, 0x83CE, 0x83D0, 0x83D1, + 0x83D2, 0x83D3, 0x83D5, 0x83D7, 0x83D9, 0x83DA, 0x83DB, 0x83DE, + 0x83E2, 0x83E3, 0x83E4, 0x83E6, 0x83E7, 0x83E8, 0x83EB, 0x83EC, + 0x83ED, 0x6070, 0x6D3D, 0x7275, 0x6266, 0x948E, 0x94C5, 0x5343, + 0x8FC1, 0x7B7E, 0x4EDF, 0x8C26, 0x4E7E, 0x9ED4, 0x94B1, 0x94B3, + 0x524D, 0x6F5C, 0x9063, 0x6D45, 0x8C34, 0x5811, 0x5D4C, 0x6B20, + 0x6B49, 0x67AA, 0x545B, 0x8154, 0x7F8C, 0x5899, 0x8537, 0x5F3A, + 0x62A2, 0x6A47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77A7, 0x4E54, + 0x4FA8, 0x5DE7, 0x9798, 0x64AC, 0x7FD8, 0x5CED, 0x4FCF, 0x7A8D, + 0x5207, 0x8304, 0x4E14, 0x602F, 0x7A83, 0x94A6, 0x4FB5, 0x4EB2, + 0x79E6, 0x7434, 0x52E4, 0x82B9, 0x64D2, 0x79BD, 0x5BDD, 0x6C81, + 0x9752, 0x8F7B, 0x6C22, 0x503E, 0x537F, 0x6E05, 0x64CE, 0x6674, + 0x6C30, 0x60C5, 0x9877, 0x8BF7, 0x5E86, 0x743C, 0x7A77, 0x79CB, + 0x4E18, 0x90B1, 0x7403, 0x6C42, 0x56DA, 0x914B, 0x6CC5, 0x8D8B, + 0x533A, 0x86C6, 0x66F2, 0x8EAF, 0x5C48, 0x9A71, 0x6E20, 0, +plane c8 +at 0x40 + 0x83EE, 0x83EF, 0x83F3, 0x83F4, 0x83F5, 0x83F6, 0x83F7, 0x83FA, + 0x83FB, 0x83FC, 0x83FE, 0x83FF, 0x8400, 0x8402, 0x8405, 0x8407, + 0x8408, 0x8409, 0x840A, 0x8410, 0x8412, 0x8413, 0x8414, 0x8415, + 0x8416, 0x8417, 0x8419, 0x841A, 0x841B, 0x841E, 0x841F, 0x8420, + 0x8421, 0x8422, 0x8423, 0x8429, 0x842A, 0x842B, 0x842C, 0x842D, + 0x842E, 0x842F, 0x8430, 0x8432, 0x8433, 0x8434, 0x8435, 0x8436, + 0x8437, 0x8439, 0x843A, 0x843B, 0x843E, 0x843F, 0x8440, 0x8441, + 0x8442, 0x8443, 0x8444, 0x8445, 0x8447, 0x8448, 0x8449, 0, + 0x844A, 0x844B, 0x844C, 0x844D, 0x844E, 0x844F, 0x8450, 0x8452, + 0x8453, 0x8454, 0x8455, 0x8456, 0x8458, 0x845D, 0x845E, 0x845F, + 0x8460, 0x8462, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, 0x846A, + 0x846E, 0x846F, 0x8470, 0x8472, 0x8474, 0x8477, 0x8479, 0x847B, + 0x847C, 0x53D6, 0x5A36, 0x9F8B, 0x8DA3, 0x53BB, 0x5708, 0x98A7, + 0x6743, 0x919B, 0x6CC9, 0x5168, 0x75CA, 0x62F3, 0x72AC, 0x5238, + 0x529D, 0x7F3A, 0x7094, 0x7638, 0x5374, 0x9E4A, 0x69B7, 0x786E, + 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3, 0x5189, 0x67D3, 0x74E4, + 0x58E4, 0x6518, 0x56B7, 0x8BA9, 0x9976, 0x6270, 0x7ED5, 0x60F9, + 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD, 0x97E7, 0x4EFB, 0x8BA4, + 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD, 0x65E5, 0x620E, 0x8338, + 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6, 0x5BB9, 0x7ED2, 0x5197, + 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5B7A, 0x5982, + 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925, 0x8F6F, 0x962E, 0x854A, + 0x745E, 0x9510, 0x95F0, 0x6DA6, 0x82E5, 0x5F31, 0x6492, 0x6D12, + 0x8428, 0x816E, 0x9CC3, 0x585E, 0x8D5B, 0x4E09, 0x53C1, 0, +plane c9 +at 0x40 + 0x847D, 0x847E, 0x847F, 0x8480, 0x8481, 0x8483, 0x8484, 0x8485, + 0x8486, 0x848A, 0x848D, 0x848F, 0x8490, 0x8491, 0x8492, 0x8493, + 0x8494, 0x8495, 0x8496, 0x8498, 0x849A, 0x849B, 0x849D, 0x849E, + 0x849F, 0x84A0, 0x84A2, 0x84A3, 0x84A4, 0x84A5, 0x84A6, 0x84A7, + 0x84A8, 0x84A9, 0x84AA, 0x84AB, 0x84AC, 0x84AD, 0x84AE, 0x84B0, + 0x84B1, 0x84B3, 0x84B5, 0x84B6, 0x84B7, 0x84BB, 0x84BC, 0x84BE, + 0x84C0, 0x84C2, 0x84C3, 0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x84CB, + 0x84CC, 0x84CE, 0x84CF, 0x84D2, 0x84D4, 0x84D5, 0x84D7, 0, + 0x84D8, 0x84D9, 0x84DA, 0x84DB, 0x84DC, 0x84DE, 0x84E1, 0x84E2, + 0x84E4, 0x84E7, 0x84E8, 0x84E9, 0x84EA, 0x84EB, 0x84ED, 0x84EE, + 0x84EF, 0x84F1, 0x84F2, 0x84F3, 0x84F4, 0x84F5, 0x84F6, 0x84F7, + 0x84F8, 0x84F9, 0x84FA, 0x84FB, 0x84FD, 0x84FE, 0x8500, 0x8501, + 0x8502, 0x4F1E, 0x6563, 0x6851, 0x55D3, 0x4E27, 0x6414, 0x9A9A, + 0x626B, 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, 0x50E7, 0x838E, + 0x7802, 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565, 0x715E, + 0x7B5B, 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220, 0x717D, + 0x886B, 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584, 0x6C55, + 0x6247, 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C, 0x4E0A, + 0x5C1A, 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D, 0x52FA, + 0x97F6, 0x5C11, 0x54E8, 0x90B5, 0x7ECD, 0x5962, 0x8D4A, 0x86C7, + 0x820C, 0x820D, 0x8D66, 0x6444, 0x5C04, 0x6151, 0x6D89, 0x793E, + 0x8BBE, 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1, 0x5A20, + 0x7EC5, 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, 0x80BE, 0x614E, + 0x6E17, 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3, 0, +plane ca +at 0x40 + 0x8503, 0x8504, 0x8505, 0x8506, 0x8507, 0x8508, 0x8509, 0x850A, + 0x850B, 0x850D, 0x850E, 0x850F, 0x8510, 0x8512, 0x8514, 0x8515, + 0x8516, 0x8518, 0x8519, 0x851B, 0x851C, 0x851D, 0x851E, 0x8520, + 0x8522, 0x8523, 0x8524, 0x8525, 0x8526, 0x8527, 0x8528, 0x8529, + 0x852A, 0x852D, 0x852E, 0x852F, 0x8530, 0x8531, 0x8532, 0x8533, + 0x8534, 0x8535, 0x8536, 0x853E, 0x853F, 0x8540, 0x8541, 0x8542, + 0x8544, 0x8545, 0x8546, 0x8547, 0x854B, 0x854C, 0x854D, 0x854E, + 0x854F, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0, + 0x8557, 0x8558, 0x855A, 0x855B, 0x855C, 0x855D, 0x855F, 0x8560, + 0x8561, 0x8562, 0x8563, 0x8565, 0x8566, 0x8567, 0x8569, 0x856A, + 0x856B, 0x856C, 0x856D, 0x856E, 0x856F, 0x8570, 0x8571, 0x8573, + 0x8575, 0x8576, 0x8577, 0x8578, 0x857C, 0x857D, 0x857F, 0x8580, + 0x8581, 0x7701, 0x76DB, 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931, + 0x72EE, 0x65BD, 0x6E7F, 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3, + 0x62FE, 0x65F6, 0x4EC0, 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2, + 0x77E2, 0x4F7F, 0x5C4E, 0x9A76, 0x59CB, 0x5F0F, 0x793A, 0x58EB, + 0x4E16, 0x67FF, 0x4E8B, 0x62ED, 0x8A93, 0x901D, 0x52BF, 0x662F, + 0x55DC, 0x566C, 0x9002, 0x4ED5, 0x4F8D, 0x91CA, 0x9970, 0x6C0F, + 0x5E02, 0x6043, 0x5BA4, 0x89C6, 0x8BD5, 0x6536, 0x624B, 0x9996, + 0x5B88, 0x5BFF, 0x6388, 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C, + 0x67A2, 0x68B3, 0x6B8A, 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1, + 0x758F, 0x4E66, 0x8D4E, 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9, + 0x7F72, 0x8700, 0x9ECD, 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811, + 0x675F, 0x620D, 0x7AD6, 0x5885, 0x5EB6, 0x6570, 0x6F31, 0, +plane cb +at 0x40 + 0x8582, 0x8583, 0x8586, 0x8588, 0x8589, 0x858A, 0x858B, 0x858C, + 0x858D, 0x858E, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595, + 0x8596, 0x8597, 0x8598, 0x8599, 0x859A, 0x859D, 0x859E, 0x859F, + 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A5, 0x85A6, 0x85A7, 0x85A9, + 0x85AB, 0x85AC, 0x85AD, 0x85B1, 0x85B2, 0x85B3, 0x85B4, 0x85B5, + 0x85B6, 0x85B8, 0x85BA, 0x85BB, 0x85BC, 0x85BD, 0x85BE, 0x85BF, + 0x85C0, 0x85C2, 0x85C3, 0x85C4, 0x85C5, 0x85C6, 0x85C7, 0x85C8, + 0x85CA, 0x85CB, 0x85CC, 0x85CD, 0x85CE, 0x85D1, 0x85D2, 0, + 0x85D4, 0x85D6, 0x85D7, 0x85D8, 0x85D9, 0x85DA, 0x85DB, 0x85DD, + 0x85DE, 0x85DF, 0x85E0, 0x85E1, 0x85E2, 0x85E3, 0x85E5, 0x85E6, + 0x85E7, 0x85E8, 0x85EA, 0x85EB, 0x85EC, 0x85ED, 0x85EE, 0x85EF, + 0x85F0, 0x85F1, 0x85F2, 0x85F3, 0x85F4, 0x85F5, 0x85F6, 0x85F7, + 0x85F8, 0x6055, 0x5237, 0x800D, 0x6454, 0x8870, 0x7529, 0x5E05, + 0x6813, 0x62F4, 0x971C, 0x53CC, 0x723D, 0x8C01, 0x6C34, 0x7761, + 0x7A0E, 0x542E, 0x77AC, 0x987A, 0x821C, 0x8BF4, 0x7855, 0x6714, + 0x70C1, 0x65AF, 0x6495, 0x5636, 0x601D, 0x79C1, 0x53F8, 0x4E1D, + 0x6B7B, 0x8086, 0x5BFA, 0x55E3, 0x56DB, 0x4F3A, 0x4F3C, 0x9972, + 0x5DF3, 0x677E, 0x8038, 0x6002, 0x9882, 0x9001, 0x5B8B, 0x8BBC, + 0x8BF5, 0x641C, 0x8258, 0x64DE, 0x55FD, 0x82CF, 0x9165, 0x4FD7, + 0x7D20, 0x901F, 0x7C9F, 0x50F3, 0x5851, 0x6EAF, 0x5BBF, 0x8BC9, + 0x8083, 0x9178, 0x849C, 0x7B97, 0x867D, 0x968B, 0x968F, 0x7EE5, + 0x9AD3, 0x788E, 0x5C81, 0x7A57, 0x9042, 0x96A7, 0x795F, 0x5B59, + 0x635F, 0x7B0B, 0x84D1, 0x68AD, 0x5506, 0x7F29, 0x7410, 0x7D22, + 0x9501, 0x6240, 0x584C, 0x4ED6, 0x5B83, 0x5979, 0x5854, 0, +plane cc +at 0x40 + 0x85F9, 0x85FA, 0x85FC, 0x85FD, 0x85FE, 0x8600, 0x8601, 0x8602, + 0x8603, 0x8604, 0x8606, 0x8607, 0x8608, 0x8609, 0x860A, 0x860B, + 0x860C, 0x860D, 0x860E, 0x860F, 0x8610, 0x8612, 0x8613, 0x8614, + 0x8615, 0x8617, 0x8618, 0x8619, 0x861A, 0x861B, 0x861C, 0x861D, + 0x861E, 0x861F, 0x8620, 0x8621, 0x8622, 0x8623, 0x8624, 0x8625, + 0x8626, 0x8628, 0x862A, 0x862B, 0x862C, 0x862D, 0x862E, 0x862F, + 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, + 0x8639, 0x863A, 0x863B, 0x863D, 0x863E, 0x863F, 0x8640, 0, + 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, + 0x8649, 0x864A, 0x864B, 0x864C, 0x8652, 0x8653, 0x8655, 0x8656, + 0x8657, 0x8658, 0x8659, 0x865B, 0x865C, 0x865D, 0x865F, 0x8660, + 0x8661, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, + 0x866A, 0x736D, 0x631E, 0x8E4B, 0x8E0F, 0x80CE, 0x82D4, 0x62AC, + 0x53F0, 0x6CF0, 0x915E, 0x592A, 0x6001, 0x6C70, 0x574D, 0x644A, + 0x8D2A, 0x762B, 0x6EE9, 0x575B, 0x6A80, 0x75F0, 0x6F6D, 0x8C2D, + 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3, 0x63A2, 0x53F9, 0x70AD, + 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0, 0x819B, 0x5510, 0x7CD6, + 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB, 0x638F, 0x6D9B, 0x6ED4, + 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8, 0x9676, 0x8BA8, 0x5957, + 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A, 0x68AF, 0x5254, 0x8E22, + 0x9511, 0x63D0, 0x9898, 0x8E44, 0x557C, 0x4F53, 0x66FF, 0x568F, + 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929, 0x6DFB, 0x586B, 0x7530, + 0x751C, 0x606C, 0x8214, 0x8146, 0x6311, 0x6761, 0x8FE2, 0x773A, + 0x8DF3, 0x8D34, 0x94C1, 0x5E16, 0x5385, 0x542C, 0x70C3, 0, +plane cd +at 0x40 + 0x866D, 0x866F, 0x8670, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, + 0x8677, 0x8678, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, + 0x8689, 0x868E, 0x868F, 0x8690, 0x8691, 0x8692, 0x8694, 0x8696, + 0x8697, 0x8698, 0x8699, 0x869A, 0x869B, 0x869E, 0x869F, 0x86A0, + 0x86A1, 0x86A2, 0x86A5, 0x86A6, 0x86AB, 0x86AD, 0x86AE, 0x86B2, + 0x86B3, 0x86B7, 0x86B8, 0x86B9, 0x86BB, 0x86BC, 0x86BD, 0x86BE, + 0x86BF, 0x86C1, 0x86C2, 0x86C3, 0x86C5, 0x86C8, 0x86CC, 0x86CD, + 0x86D2, 0x86D3, 0x86D5, 0x86D6, 0x86D7, 0x86DA, 0x86DC, 0, + 0x86DD, 0x86E0, 0x86E1, 0x86E2, 0x86E3, 0x86E5, 0x86E6, 0x86E7, + 0x86E8, 0x86EA, 0x86EB, 0x86EC, 0x86EF, 0x86F5, 0x86F6, 0x86F7, + 0x86FA, 0x86FB, 0x86FC, 0x86FD, 0x86FF, 0x8701, 0x8704, 0x8705, + 0x8706, 0x870B, 0x870C, 0x870E, 0x870F, 0x8710, 0x8711, 0x8714, + 0x8716, 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A, 0x8247, + 0x901A, 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64, 0x7AE5, + 0x6876, 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295, 0x5934, + 0x900F, 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014, 0x6D82, + 0x5C60, 0x571F, 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8, 0x9893, + 0x817F, 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0, 0x62D6, + 0x6258, 0x8131, 0x9E35, 0x9640, 0x9A6E, 0x9A7C, 0x692D, 0x59A5, + 0x62D3, 0x553E, 0x6316, 0x54C7, 0x86D9, 0x6D3C, 0x5A03, 0x74E6, + 0x889C, 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, 0x73A9, 0x987D, + 0x4E38, 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696, 0x60CB, + 0x5B9B, 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1, 0x6789, + 0x7F51, 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01, 0, +plane ce +at 0x40 + 0x8719, 0x871B, 0x871D, 0x871F, 0x8720, 0x8724, 0x8726, 0x8727, + 0x8728, 0x872A, 0x872B, 0x872C, 0x872D, 0x872F, 0x8730, 0x8732, + 0x8733, 0x8735, 0x8736, 0x8738, 0x8739, 0x873A, 0x873C, 0x873D, + 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x874A, + 0x874B, 0x874D, 0x874F, 0x8750, 0x8751, 0x8752, 0x8754, 0x8755, + 0x8756, 0x8758, 0x875A, 0x875B, 0x875C, 0x875D, 0x875E, 0x875F, + 0x8761, 0x8762, 0x8766, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B, + 0x876C, 0x876D, 0x876F, 0x8771, 0x8772, 0x8773, 0x8775, 0, + 0x8777, 0x8778, 0x8779, 0x877A, 0x877F, 0x8780, 0x8781, 0x8784, + 0x8786, 0x8787, 0x8789, 0x878A, 0x878C, 0x878E, 0x878F, 0x8790, + 0x8791, 0x8792, 0x8794, 0x8795, 0x8796, 0x8798, 0x8799, 0x879A, + 0x879B, 0x879C, 0x879D, 0x879E, 0x87A0, 0x87A1, 0x87A2, 0x87A3, + 0x87A4, 0x5DCD, 0x5FAE, 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4, + 0x552F, 0x60DF, 0x4E3A, 0x6F4D, 0x7EF4, 0x82C7, 0x840E, 0x59D4, + 0x4F1F, 0x4F2A, 0x5C3E, 0x7EAC, 0x672A, 0x851A, 0x5473, 0x754F, + 0x80C3, 0x5582, 0x9B4F, 0x4F4D, 0x6E2D, 0x8C13, 0x5C09, 0x6170, + 0x536B, 0x761F, 0x6E29, 0x868A, 0x6587, 0x95FB, 0x7EB9, 0x543B, + 0x7A33, 0x7D0A, 0x95EE, 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717, + 0x6DA1, 0x7A9D, 0x6211, 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB, + 0x545C, 0x94A8, 0x4E4C, 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C, + 0x68A7, 0x543E, 0x5434, 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348, + 0x821E, 0x4F0D, 0x4FAE, 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269, + 0x52FF, 0x52A1, 0x609F, 0x8BEF, 0x6614, 0x7199, 0x6790, 0x897F, + 0x7852, 0x77FD, 0x6670, 0x563B, 0x5438, 0x9521, 0x727A, 0, +plane cf +at 0x40 + 0x87A5, 0x87A6, 0x87A7, 0x87A9, 0x87AA, 0x87AE, 0x87B0, 0x87B1, + 0x87B2, 0x87B4, 0x87B6, 0x87B7, 0x87B8, 0x87B9, 0x87BB, 0x87BC, + 0x87BE, 0x87BF, 0x87C1, 0x87C2, 0x87C3, 0x87C4, 0x87C5, 0x87C7, + 0x87C8, 0x87C9, 0x87CC, 0x87CD, 0x87CE, 0x87CF, 0x87D0, 0x87D4, + 0x87D5, 0x87D6, 0x87D7, 0x87D8, 0x87D9, 0x87DA, 0x87DC, 0x87DD, + 0x87DE, 0x87DF, 0x87E1, 0x87E2, 0x87E3, 0x87E4, 0x87E6, 0x87E7, + 0x87E8, 0x87E9, 0x87EB, 0x87EC, 0x87ED, 0x87EF, 0x87F0, 0x87F1, + 0x87F2, 0x87F3, 0x87F4, 0x87F5, 0x87F6, 0x87F7, 0x87F8, 0, + 0x87FA, 0x87FB, 0x87FC, 0x87FD, 0x87FF, 0x8800, 0x8801, 0x8802, + 0x8804, 0x8805, 0x8806, 0x8807, 0x8808, 0x8809, 0x880B, 0x880C, + 0x880D, 0x880E, 0x880F, 0x8810, 0x8811, 0x8812, 0x8814, 0x8817, + 0x8818, 0x8819, 0x881A, 0x881C, 0x881D, 0x881E, 0x881F, 0x8820, + 0x8823, 0x7A00, 0x606F, 0x5E0C, 0x6089, 0x819D, 0x5915, 0x60DC, + 0x7184, 0x70EF, 0x6EAA, 0x6C50, 0x7280, 0x6A84, 0x88AD, 0x5E2D, + 0x4E60, 0x5AB3, 0x559C, 0x94E3, 0x6D17, 0x7CFB, 0x9699, 0x620F, + 0x7EC6, 0x778E, 0x867E, 0x5323, 0x971E, 0x8F96, 0x6687, 0x5CE1, + 0x4FA0, 0x72ED, 0x4E0B, 0x53A6, 0x590F, 0x5413, 0x6380, 0x9528, + 0x5148, 0x4ED9, 0x9C9C, 0x7EA4, 0x54B8, 0x8D24, 0x8854, 0x8237, + 0x95F2, 0x6D8E, 0x5F26, 0x5ACC, 0x663E, 0x9669, 0x73B0, 0x732E, + 0x53BF, 0x817A, 0x9985, 0x7FA1, 0x5BAA, 0x9677, 0x9650, 0x7EBF, + 0x76F8, 0x53A2, 0x9576, 0x9999, 0x7BB1, 0x8944, 0x6E58, 0x4E61, + 0x7FD4, 0x7965, 0x8BE6, 0x60F3, 0x54CD, 0x4EAB, 0x9879, 0x5DF7, + 0x6A61, 0x50CF, 0x5411, 0x8C61, 0x8427, 0x785D, 0x9704, 0x524A, + 0x54EE, 0x56A3, 0x9500, 0x6D88, 0x5BB5, 0x6DC6, 0x6653, 0, +plane d0 +at 0x40 + 0x8824, 0x8825, 0x8826, 0x8827, 0x8828, 0x8829, 0x882A, 0x882B, + 0x882C, 0x882D, 0x882E, 0x882F, 0x8830, 0x8831, 0x8833, 0x8834, + 0x8835, 0x8836, 0x8837, 0x8838, 0x883A, 0x883B, 0x883D, 0x883E, + 0x883F, 0x8841, 0x8842, 0x8843, 0x8846, 0x8847, 0x8848, 0x8849, + 0x884A, 0x884B, 0x884E, 0x884F, 0x8850, 0x8851, 0x8852, 0x8853, + 0x8855, 0x8856, 0x8858, 0x885A, 0x885B, 0x885C, 0x885D, 0x885E, + 0x885F, 0x8860, 0x8866, 0x8867, 0x886A, 0x886D, 0x886F, 0x8871, + 0x8873, 0x8874, 0x8875, 0x8876, 0x8878, 0x8879, 0x887A, 0, + 0x887B, 0x887C, 0x8880, 0x8883, 0x8886, 0x8887, 0x8889, 0x888A, + 0x888C, 0x888E, 0x888F, 0x8890, 0x8891, 0x8893, 0x8894, 0x8895, + 0x8897, 0x8898, 0x8899, 0x889A, 0x889B, 0x889D, 0x889E, 0x889F, + 0x88A0, 0x88A1, 0x88A3, 0x88A5, 0x88A6, 0x88A7, 0x88A8, 0x88A9, + 0x88AA, 0x5C0F, 0x5B5D, 0x6821, 0x8096, 0x5578, 0x7B11, 0x6548, + 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B, 0x534F, 0x631F, 0x643A, + 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199, 0x68B0, 0x5378, 0x87F9, + 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51, 0x85AA, 0x82AF, 0x950C, + 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3, 0x4FE1, 0x8845, 0x661F, + 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211, 0x578B, 0x5F62, 0x90A2, + 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027, 0x59D3, 0x5144, 0x51F6, + 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A, 0x4F11, 0x4FEE, 0x7F9E, + 0x673D, 0x55C5, 0x9508, 0x79C0, 0x8896, 0x7EE3, 0x589F, 0x620C, + 0x9700, 0x865A, 0x5618, 0x987B, 0x5F90, 0x8BB8, 0x84C4, 0x9157, + 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064, 0x7D6E, 0x5A7F, 0x7EEA, + 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC, 0x65CB, 0x7384, 0, +plane d1 +at 0x40 + 0x88AC, 0x88AE, 0x88AF, 0x88B0, 0x88B2, 0x88B3, 0x88B4, 0x88B5, + 0x88B6, 0x88B8, 0x88B9, 0x88BA, 0x88BB, 0x88BD, 0x88BE, 0x88BF, + 0x88C0, 0x88C3, 0x88C4, 0x88C7, 0x88C8, 0x88CA, 0x88CB, 0x88CC, + 0x88CD, 0x88CF, 0x88D0, 0x88D1, 0x88D3, 0x88D6, 0x88D7, 0x88DA, + 0x88DB, 0x88DC, 0x88DD, 0x88DE, 0x88E0, 0x88E1, 0x88E6, 0x88E7, + 0x88E9, 0x88EA, 0x88EB, 0x88EC, 0x88ED, 0x88EE, 0x88EF, 0x88F2, + 0x88F5, 0x88F6, 0x88F7, 0x88FA, 0x88FB, 0x88FD, 0x88FF, 0x8900, + 0x8901, 0x8903, 0x8904, 0x8905, 0x8906, 0x8907, 0x8908, 0, + 0x8909, 0x890B, 0x890C, 0x890D, 0x890E, 0x890F, 0x8911, 0x8914, + 0x8915, 0x8916, 0x8917, 0x8918, 0x891C, 0x891D, 0x891E, 0x891F, + 0x8920, 0x8922, 0x8923, 0x8924, 0x8926, 0x8927, 0x8928, 0x8929, + 0x892C, 0x892D, 0x892E, 0x892F, 0x8931, 0x8932, 0x8933, 0x8935, + 0x8937, 0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B, 0x5B66, + 0x7A74, 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC, 0x8BE2, + 0x5BFB, 0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF, 0x900A, + 0x8FC5, 0x538B, 0x62BC, 0x9E26, 0x9E2D, 0x5440, 0x4E2B, 0x82BD, + 0x7259, 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x54D1, 0x4E9A, + 0x8BB6, 0x7109, 0x54BD, 0x9609, 0x70DF, 0x6DF9, 0x76D0, 0x4E25, + 0x7814, 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, 0x960E, 0x708E, + 0x6CBF, 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273, 0x5830, + 0x71D5, 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130, 0x5BB4, + 0x8C1A, 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768, 0x626C, + 0x4F6F, 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0, 0x75D2, + 0x517B, 0x6837, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476, 0, +plane d2 +at 0x40 + 0x8938, 0x8939, 0x893A, 0x893B, 0x893C, 0x893D, 0x893E, 0x893F, + 0x8940, 0x8942, 0x8943, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949, + 0x894A, 0x894B, 0x894C, 0x894D, 0x894E, 0x894F, 0x8950, 0x8951, + 0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, + 0x895A, 0x895B, 0x895C, 0x895D, 0x8960, 0x8961, 0x8962, 0x8963, + 0x8964, 0x8965, 0x8967, 0x8968, 0x8969, 0x896A, 0x896B, 0x896C, + 0x896D, 0x896E, 0x896F, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, + 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, 0x897A, 0x897C, 0, + 0x897D, 0x897E, 0x8980, 0x8982, 0x8984, 0x8985, 0x8987, 0x8988, + 0x8989, 0x898A, 0x898B, 0x898C, 0x898D, 0x898E, 0x898F, 0x8990, + 0x8991, 0x8992, 0x8993, 0x8994, 0x8995, 0x8996, 0x8997, 0x8998, + 0x8999, 0x899A, 0x899B, 0x899C, 0x899D, 0x899E, 0x899F, 0x89A0, + 0x89A1, 0x6447, 0x5C27, 0x9065, 0x7A91, 0x8C23, 0x59DA, 0x54AC, + 0x8200, 0x836F, 0x8981, 0x8000, 0x6930, 0x564E, 0x8036, 0x7237, + 0x91CE, 0x51B6, 0x4E5F, 0x9875, 0x6396, 0x4E1A, 0x53F6, 0x66F3, + 0x814B, 0x591C, 0x6DB2, 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1, + 0x4F9D, 0x4F0A, 0x8863, 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA, + 0x80F0, 0x7591, 0x6C82, 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681, + 0x501A, 0x5DF2, 0x4E59, 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613, + 0x9091, 0x5C79, 0x4EBF, 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB, + 0x4EA6, 0x88D4, 0x610F, 0x6BC5, 0x5FC6, 0x4E49, 0x76CA, 0x6EA2, + 0x8BE3, 0x8BAE, 0x8C0A, 0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, 0x7ECE, + 0x8335, 0x836B, 0x56E0, 0x6BB7, 0x97F3, 0x9634, 0x59FB, 0x541F, + 0x94F6, 0x6DEB, 0x5BC5, 0x996E, 0x5C39, 0x5F15, 0x9690, 0, +plane d3 +at 0x40 + 0x89A2, 0x89A3, 0x89A4, 0x89A5, 0x89A6, 0x89A7, 0x89A8, 0x89A9, + 0x89AA, 0x89AB, 0x89AC, 0x89AD, 0x89AE, 0x89AF, 0x89B0, 0x89B1, + 0x89B2, 0x89B3, 0x89B4, 0x89B5, 0x89B6, 0x89B7, 0x89B8, 0x89B9, + 0x89BA, 0x89BB, 0x89BC, 0x89BD, 0x89BE, 0x89BF, 0x89C0, 0x89C3, + 0x89CD, 0x89D3, 0x89D4, 0x89D5, 0x89D7, 0x89D8, 0x89D9, 0x89DB, + 0x89DD, 0x89DF, 0x89E0, 0x89E1, 0x89E2, 0x89E4, 0x89E7, 0x89E8, + 0x89E9, 0x89EA, 0x89EC, 0x89ED, 0x89EE, 0x89F0, 0x89F1, 0x89F2, + 0x89F4, 0x89F5, 0x89F6, 0x89F7, 0x89F8, 0x89F9, 0x89FA, 0, + 0x89FB, 0x89FC, 0x89FD, 0x89FE, 0x89FF, 0x8A01, 0x8A02, 0x8A03, + 0x8A04, 0x8A05, 0x8A06, 0x8A08, 0x8A09, 0x8A0A, 0x8A0B, 0x8A0C, + 0x8A0D, 0x8A0E, 0x8A0F, 0x8A10, 0x8A11, 0x8A12, 0x8A13, 0x8A14, + 0x8A15, 0x8A16, 0x8A17, 0x8A18, 0x8A19, 0x8A1A, 0x8A1B, 0x8A1C, + 0x8A1D, 0x5370, 0x82F1, 0x6A31, 0x5A74, 0x9E70, 0x5E94, 0x7F28, + 0x83B9, 0x8424, 0x8425, 0x8367, 0x8747, 0x8FCE, 0x8D62, 0x76C8, + 0x5F71, 0x9896, 0x786C, 0x6620, 0x54DF, 0x62E5, 0x4F63, 0x81C3, + 0x75C8, 0x5EB8, 0x96CD, 0x8E0A, 0x86F9, 0x548F, 0x6CF3, 0x6D8C, + 0x6C38, 0x607F, 0x52C7, 0x7528, 0x5E7D, 0x4F18, 0x60A0, 0x5FE7, + 0x5C24, 0x7531, 0x90AE, 0x94C0, 0x72B9, 0x6CB9, 0x6E38, 0x9149, + 0x6709, 0x53CB, 0x53F3, 0x4F51, 0x91C9, 0x8BF1, 0x53C8, 0x5E7C, + 0x8FC2, 0x6DE4, 0x4E8E, 0x76C2, 0x6986, 0x865E, 0x611A, 0x8206, + 0x4F59, 0x4FDE, 0x903E, 0x9C7C, 0x6109, 0x6E1D, 0x6E14, 0x9685, + 0x4E88, 0x5A31, 0x96E8, 0x4E0E, 0x5C7F, 0x79B9, 0x5B87, 0x8BED, + 0x7FBD, 0x7389, 0x57DF, 0x828B, 0x90C1, 0x5401, 0x9047, 0x55BB, + 0x5CEA, 0x5FA1, 0x6108, 0x6B32, 0x72F1, 0x80B2, 0x8A89, 0, +plane d4 +at 0x40 + 0x8A1E, 0x8A1F, 0x8A20, 0x8A21, 0x8A22, 0x8A23, 0x8A24, 0x8A25, + 0x8A26, 0x8A27, 0x8A28, 0x8A29, 0x8A2A, 0x8A2B, 0x8A2C, 0x8A2D, + 0x8A2E, 0x8A2F, 0x8A30, 0x8A31, 0x8A32, 0x8A33, 0x8A34, 0x8A35, + 0x8A36, 0x8A37, 0x8A38, 0x8A39, 0x8A3A, 0x8A3B, 0x8A3C, 0x8A3D, + 0x8A3F, 0x8A40, 0x8A41, 0x8A42, 0x8A43, 0x8A44, 0x8A45, 0x8A46, + 0x8A47, 0x8A49, 0x8A4A, 0x8A4B, 0x8A4C, 0x8A4D, 0x8A4E, 0x8A4F, + 0x8A50, 0x8A51, 0x8A52, 0x8A53, 0x8A54, 0x8A55, 0x8A56, 0x8A57, + 0x8A58, 0x8A59, 0x8A5A, 0x8A5B, 0x8A5C, 0x8A5D, 0x8A5E, 0, + 0x8A5F, 0x8A60, 0x8A61, 0x8A62, 0x8A63, 0x8A64, 0x8A65, 0x8A66, + 0x8A67, 0x8A68, 0x8A69, 0x8A6A, 0x8A6B, 0x8A6C, 0x8A6D, 0x8A6E, + 0x8A6F, 0x8A70, 0x8A71, 0x8A72, 0x8A73, 0x8A74, 0x8A75, 0x8A76, + 0x8A77, 0x8A78, 0x8A7A, 0x8A7B, 0x8A7C, 0x8A7D, 0x8A7E, 0x8A7F, + 0x8A80, 0x6D74, 0x5BD3, 0x88D5, 0x9884, 0x8C6B, 0x9A6D, 0x9E33, + 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881, 0x539F, 0x63F4, 0x8F95, + 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90, 0x7F18, 0x8FDC, 0x82D1, + 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6, 0x8D8A, 0x8DC3, 0x94A5, + 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x9605, 0x8018, 0x4E91, 0x90E7, + 0x5300, 0x9668, 0x5141, 0x8FD0, 0x8574, 0x915D, 0x6655, 0x97F5, + 0x5B55, 0x531D, 0x7838, 0x6742, 0x683D, 0x54C9, 0x707E, 0x5BB0, + 0x8F7D, 0x518D, 0x5728, 0x54B1, 0x6512, 0x6682, 0x8D5E, 0x8D43, + 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF, 0x85FB, 0x67A3, 0x65E9, + 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020, 0x7682, 0x7076, 0x71E5, + 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C, 0x600E, 0x589E, 0x618E, + 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23, 0x672D, 0x8F67, 0, +plane d5 +at 0x40 + 0x8A81, 0x8A82, 0x8A83, 0x8A84, 0x8A85, 0x8A86, 0x8A87, 0x8A88, + 0x8A8B, 0x8A8C, 0x8A8D, 0x8A8E, 0x8A8F, 0x8A90, 0x8A91, 0x8A92, + 0x8A94, 0x8A95, 0x8A96, 0x8A97, 0x8A98, 0x8A99, 0x8A9A, 0x8A9B, + 0x8A9C, 0x8A9D, 0x8A9E, 0x8A9F, 0x8AA0, 0x8AA1, 0x8AA2, 0x8AA3, + 0x8AA4, 0x8AA5, 0x8AA6, 0x8AA7, 0x8AA8, 0x8AA9, 0x8AAA, 0x8AAB, + 0x8AAC, 0x8AAD, 0x8AAE, 0x8AAF, 0x8AB0, 0x8AB1, 0x8AB2, 0x8AB3, + 0x8AB4, 0x8AB5, 0x8AB6, 0x8AB7, 0x8AB8, 0x8AB9, 0x8ABA, 0x8ABB, + 0x8ABC, 0x8ABD, 0x8ABE, 0x8ABF, 0x8AC0, 0x8AC1, 0x8AC2, 0, + 0x8AC3, 0x8AC4, 0x8AC5, 0x8AC6, 0x8AC7, 0x8AC8, 0x8AC9, 0x8ACA, + 0x8ACB, 0x8ACC, 0x8ACD, 0x8ACE, 0x8ACF, 0x8AD0, 0x8AD1, 0x8AD2, + 0x8AD3, 0x8AD4, 0x8AD5, 0x8AD6, 0x8AD7, 0x8AD8, 0x8AD9, 0x8ADA, + 0x8ADB, 0x8ADC, 0x8ADD, 0x8ADE, 0x8ADF, 0x8AE0, 0x8AE1, 0x8AE2, + 0x8AE3, 0x94E1, 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B, 0x4E4D, + 0x70B8, 0x8BC8, 0x6458, 0x658B, 0x5B85, 0x7A84, 0x503A, 0x5BE8, + 0x77BB, 0x6BE1, 0x8A79, 0x7C98, 0x6CBE, 0x76CF, 0x65A9, 0x8F97, + 0x5D2D, 0x5C55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7AD9, 0x6E5B, + 0x7EFD, 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, 0x638C, 0x6DA8, + 0x6756, 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634, 0x969C, + 0x62DB, 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69, 0x5146, + 0x8087, 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99, 0x8005, + 0x9517, 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F, 0x7504, + 0x7827, 0x81FB, 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9, 0x8BCA, + 0x9707, 0x632F, 0x9547, 0x9635, 0x84B8, 0x6323, 0x7741, 0x5F81, + 0x72F0, 0x4E89, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F, 0, +plane d6 +at 0x40 + 0x8AE4, 0x8AE5, 0x8AE6, 0x8AE7, 0x8AE8, 0x8AE9, 0x8AEA, 0x8AEB, + 0x8AEC, 0x8AED, 0x8AEE, 0x8AEF, 0x8AF0, 0x8AF1, 0x8AF2, 0x8AF3, + 0x8AF4, 0x8AF5, 0x8AF6, 0x8AF7, 0x8AF8, 0x8AF9, 0x8AFA, 0x8AFB, + 0x8AFC, 0x8AFD, 0x8AFE, 0x8AFF, 0x8B00, 0x8B01, 0x8B02, 0x8B03, + 0x8B04, 0x8B05, 0x8B06, 0x8B08, 0x8B09, 0x8B0A, 0x8B0B, 0x8B0C, + 0x8B0D, 0x8B0E, 0x8B0F, 0x8B10, 0x8B11, 0x8B12, 0x8B13, 0x8B14, + 0x8B15, 0x8B16, 0x8B17, 0x8B18, 0x8B19, 0x8B1A, 0x8B1B, 0x8B1C, + 0x8B1D, 0x8B1E, 0x8B1F, 0x8B20, 0x8B21, 0x8B22, 0x8B23, 0, + 0x8B24, 0x8B25, 0x8B27, 0x8B28, 0x8B29, 0x8B2A, 0x8B2B, 0x8B2C, + 0x8B2D, 0x8B2E, 0x8B2F, 0x8B30, 0x8B31, 0x8B32, 0x8B33, 0x8B34, + 0x8B35, 0x8B36, 0x8B37, 0x8B38, 0x8B39, 0x8B3A, 0x8B3B, 0x8B3C, + 0x8B3D, 0x8B3E, 0x8B3F, 0x8B40, 0x8B41, 0x8B42, 0x8B43, 0x8B44, + 0x8B45, 0x5E27, 0x75C7, 0x90D1, 0x8BC1, 0x829D, 0x679D, 0x652F, + 0x5431, 0x8718, 0x77E5, 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7, + 0x804C, 0x76F4, 0x690D, 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740, + 0x6307, 0x6B62, 0x8DBE, 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A, + 0x63B7, 0x81F3, 0x81F4, 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A, + 0x79E9, 0x7A1A, 0x8D28, 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92, + 0x4E2D, 0x76C5, 0x5FE0, 0x949F, 0x8877, 0x7EC8, 0x79CD, 0x80BF, + 0x91CD, 0x4EF2, 0x4F17, 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8BCC, + 0x7CA5, 0x8F74, 0x8098, 0x5E1A, 0x5492, 0x76B1, 0x5B99, 0x663C, + 0x9AA4, 0x73E0, 0x682A, 0x86DB, 0x6731, 0x732A, 0x8BF8, 0x8BDB, + 0x9010, 0x7AF9, 0x70DB, 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B, + 0x8457, 0x67F1, 0x52A9, 0x86C0, 0x8D2E, 0x94F8, 0x7B51, 0, +plane d7 +at 0x40 + 0x8B46, 0x8B47, 0x8B48, 0x8B49, 0x8B4A, 0x8B4B, 0x8B4C, 0x8B4D, + 0x8B4E, 0x8B4F, 0x8B50, 0x8B51, 0x8B52, 0x8B53, 0x8B54, 0x8B55, + 0x8B56, 0x8B57, 0x8B58, 0x8B59, 0x8B5A, 0x8B5B, 0x8B5C, 0x8B5D, + 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, 0x8B62, 0x8B63, 0x8B64, 0x8B65, + 0x8B67, 0x8B68, 0x8B69, 0x8B6A, 0x8B6B, 0x8B6D, 0x8B6E, 0x8B6F, + 0x8B70, 0x8B71, 0x8B72, 0x8B73, 0x8B74, 0x8B75, 0x8B76, 0x8B77, + 0x8B78, 0x8B79, 0x8B7A, 0x8B7B, 0x8B7C, 0x8B7D, 0x8B7E, 0x8B7F, + 0x8B80, 0x8B81, 0x8B82, 0x8B83, 0x8B84, 0x8B85, 0x8B86, 0, + 0x8B87, 0x8B88, 0x8B89, 0x8B8A, 0x8B8B, 0x8B8C, 0x8B8D, 0x8B8E, + 0x8B8F, 0x8B90, 0x8B91, 0x8B92, 0x8B93, 0x8B94, 0x8B95, 0x8B96, + 0x8B97, 0x8B98, 0x8B99, 0x8B9A, 0x8B9B, 0x8B9C, 0x8B9D, 0x8B9E, + 0x8B9F, 0x8BAC, 0x8BB1, 0x8BBB, 0x8BC7, 0x8BD0, 0x8BEA, 0x8C09, + 0x8C1E, 0x4F4F, 0x6CE8, 0x795D, 0x9A7B, 0x6293, 0x722A, 0x62FD, + 0x4E13, 0x7816, 0x8F6C, 0x64B0, 0x8D5A, 0x7BC6, 0x6869, 0x5E84, + 0x88C5, 0x5986, 0x649E, 0x58EE, 0x72B6, 0x690E, 0x9525, 0x8FFD, + 0x8D58, 0x5760, 0x7F00, 0x8C06, 0x51C6, 0x6349, 0x62D9, 0x5353, + 0x684C, 0x7422, 0x8301, 0x914C, 0x5544, 0x7740, 0x707C, 0x6D4A, + 0x5179, 0x54A8, 0x8D44, 0x59FF, 0x6ECB, 0x6DC4, 0x5B5C, 0x7D2B, + 0x4ED4, 0x7C7D, 0x6ED3, 0x5B50, 0x81EA, 0x6E0D, 0x5B57, 0x9B03, + 0x68D5, 0x8E2A, 0x5B97, 0x7EFC, 0x603B, 0x7EB5, 0x90B9, 0x8D70, + 0x594F, 0x63CD, 0x79DF, 0x8DB3, 0x5352, 0x65CF, 0x7956, 0x8BC5, + 0x963B, 0x7EC4, 0x94BB, 0x7E82, 0x5634, 0x9189, 0x6700, 0x7F6A, + 0x5C0A, 0x9075, 0x6628, 0x5DE6, 0x4F50, 0x67DE, 0x505A, 0x4F5C, + 0x5750, 0x5EA7, 0, 0, 0, 0, 0, 0, +plane d8 +at 0x40 + 0x8C38, 0x8C39, 0x8C3A, 0x8C3B, 0x8C3C, 0x8C3D, 0x8C3E, 0x8C3F, + 0x8C40, 0x8C42, 0x8C43, 0x8C44, 0x8C45, 0x8C48, 0x8C4A, 0x8C4B, + 0x8C4D, 0x8C4E, 0x8C4F, 0x8C50, 0x8C51, 0x8C52, 0x8C53, 0x8C54, + 0x8C56, 0x8C57, 0x8C58, 0x8C59, 0x8C5B, 0x8C5C, 0x8C5D, 0x8C5E, + 0x8C5F, 0x8C60, 0x8C63, 0x8C64, 0x8C65, 0x8C66, 0x8C67, 0x8C68, + 0x8C69, 0x8C6C, 0x8C6D, 0x8C6E, 0x8C6F, 0x8C70, 0x8C71, 0x8C72, + 0x8C74, 0x8C75, 0x8C76, 0x8C77, 0x8C7B, 0x8C7C, 0x8C7D, 0x8C7E, + 0x8C7F, 0x8C80, 0x8C81, 0x8C83, 0x8C84, 0x8C86, 0x8C87, 0, + 0x8C88, 0x8C8B, 0x8C8D, 0x8C8E, 0x8C8F, 0x8C90, 0x8C91, 0x8C92, + 0x8C93, 0x8C95, 0x8C96, 0x8C97, 0x8C99, 0x8C9A, 0x8C9B, 0x8C9C, + 0x8C9D, 0x8C9E, 0x8C9F, 0x8CA0, 0x8CA1, 0x8CA2, 0x8CA3, 0x8CA4, + 0x8CA5, 0x8CA6, 0x8CA7, 0x8CA8, 0x8CA9, 0x8CAA, 0x8CAB, 0x8CAC, + 0x8CAD, 0x4E8D, 0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, 0x4E15, + 0x4E98, 0x4E1E, 0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, 0x4E3F, + 0x5315, 0x4E47, 0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, 0x80E4, + 0x9997, 0x6BD3, 0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, 0x4E5C, + 0x4E69, 0x4E93, 0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, 0x538D, + 0x539D, 0x53A3, 0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, 0x53F5, + 0x5326, 0x532E, 0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, 0x5208, + 0x520E, 0x522D, 0x5233, 0x523F, 0x5240, 0x524C, 0x525E, 0x5261, + 0x525C, 0x84AF, 0x527D, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, + 0x7F54, 0x4EBB, 0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, 0x4EEB, + 0x4EDE, 0x4F1B, 0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x4F25, 0x4F27, + 0x4F09, 0x4F2B, 0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D, 0, +plane d9 +at 0x40 + 0x8CAE, 0x8CAF, 0x8CB0, 0x8CB1, 0x8CB2, 0x8CB3, 0x8CB4, 0x8CB5, + 0x8CB6, 0x8CB7, 0x8CB8, 0x8CB9, 0x8CBA, 0x8CBB, 0x8CBC, 0x8CBD, + 0x8CBE, 0x8CBF, 0x8CC0, 0x8CC1, 0x8CC2, 0x8CC3, 0x8CC4, 0x8CC5, + 0x8CC6, 0x8CC7, 0x8CC8, 0x8CC9, 0x8CCA, 0x8CCB, 0x8CCC, 0x8CCD, + 0x8CCE, 0x8CCF, 0x8CD0, 0x8CD1, 0x8CD2, 0x8CD3, 0x8CD4, 0x8CD5, + 0x8CD6, 0x8CD7, 0x8CD8, 0x8CD9, 0x8CDA, 0x8CDB, 0x8CDC, 0x8CDD, + 0x8CDE, 0x8CDF, 0x8CE0, 0x8CE1, 0x8CE2, 0x8CE3, 0x8CE4, 0x8CE5, + 0x8CE6, 0x8CE7, 0x8CE8, 0x8CE9, 0x8CEA, 0x8CEB, 0x8CEC, 0, + 0x8CED, 0x8CEE, 0x8CEF, 0x8CF0, 0x8CF1, 0x8CF2, 0x8CF3, 0x8CF4, + 0x8CF5, 0x8CF6, 0x8CF7, 0x8CF8, 0x8CF9, 0x8CFA, 0x8CFB, 0x8CFC, + 0x8CFD, 0x8CFE, 0x8CFF, 0x8D00, 0x8D01, 0x8D02, 0x8D03, 0x8D04, + 0x8D05, 0x8D06, 0x8D07, 0x8D08, 0x8D09, 0x8D0A, 0x8D0B, 0x8D0C, + 0x8D0D, 0x4F5F, 0x4F57, 0x4F32, 0x4F3D, 0x4F76, 0x4F74, 0x4F91, + 0x4F89, 0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC, + 0x4F94, 0x4FE6, 0x4FE8, 0x4FEA, 0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC, + 0x4FD1, 0x4FDF, 0x4FF8, 0x5029, 0x504C, 0x4FF3, 0x502C, 0x500F, + 0x502E, 0x502D, 0x4FFE, 0x501C, 0x500C, 0x5025, 0x5028, 0x507E, + 0x5043, 0x5055, 0x5048, 0x504E, 0x506C, 0x507B, 0x50A5, 0x50A7, + 0x50A9, 0x50BA, 0x50D6, 0x5106, 0x50ED, 0x50EC, 0x50E6, 0x50EE, + 0x5107, 0x510B, 0x4EDD, 0x6C3D, 0x4F58, 0x4F65, 0x4FCE, 0x9FA0, + 0x6C46, 0x7C74, 0x516E, 0x5DFD, 0x9EC9, 0x9998, 0x5181, 0x5914, + 0x52F9, 0x530D, 0x8A07, 0x5310, 0x51EB, 0x5919, 0x5155, 0x4EA0, + 0x5156, 0x4EB3, 0x886E, 0x88A4, 0x4EB5, 0x8114, 0x88D2, 0x7980, + 0x5B34, 0x8803, 0x7FB8, 0x51AB, 0x51B1, 0x51BD, 0x51BC, 0, +plane da +at 0x40 + 0x8D0E, 0x8D0F, 0x8D10, 0x8D11, 0x8D12, 0x8D13, 0x8D14, 0x8D15, + 0x8D16, 0x8D17, 0x8D18, 0x8D19, 0x8D1A, 0x8D1B, 0x8D1C, 0x8D20, + 0x8D51, 0x8D52, 0x8D57, 0x8D5F, 0x8D65, 0x8D68, 0x8D69, 0x8D6A, + 0x8D6C, 0x8D6E, 0x8D6F, 0x8D71, 0x8D72, 0x8D78, 0x8D79, 0x8D7A, + 0x8D7B, 0x8D7C, 0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, 0x8D82, 0x8D83, + 0x8D86, 0x8D87, 0x8D88, 0x8D89, 0x8D8C, 0x8D8D, 0x8D8E, 0x8D8F, + 0x8D90, 0x8D92, 0x8D93, 0x8D95, 0x8D96, 0x8D97, 0x8D98, 0x8D99, + 0x8D9A, 0x8D9B, 0x8D9C, 0x8D9D, 0x8D9E, 0x8DA0, 0x8DA1, 0, + 0x8DA2, 0x8DA4, 0x8DA5, 0x8DA6, 0x8DA7, 0x8DA8, 0x8DA9, 0x8DAA, + 0x8DAB, 0x8DAC, 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0, 0x8DB2, 0x8DB6, + 0x8DB7, 0x8DB9, 0x8DBB, 0x8DBD, 0x8DC0, 0x8DC1, 0x8DC2, 0x8DC5, + 0x8DC7, 0x8DC8, 0x8DC9, 0x8DCA, 0x8DCD, 0x8DD0, 0x8DD2, 0x8DD3, + 0x8DD4, 0x51C7, 0x5196, 0x51A2, 0x51A5, 0x8BA0, 0x8BA6, 0x8BA7, + 0x8BAA, 0x8BB4, 0x8BB5, 0x8BB7, 0x8BC2, 0x8BC3, 0x8BCB, 0x8BCF, + 0x8BCE, 0x8BD2, 0x8BD3, 0x8BD4, 0x8BD6, 0x8BD8, 0x8BD9, 0x8BDC, + 0x8BDF, 0x8BE0, 0x8BE4, 0x8BE8, 0x8BE9, 0x8BEE, 0x8BF0, 0x8BF3, + 0x8BF6, 0x8BF9, 0x8BFC, 0x8BFF, 0x8C00, 0x8C02, 0x8C04, 0x8C07, + 0x8C0C, 0x8C0F, 0x8C11, 0x8C12, 0x8C14, 0x8C15, 0x8C16, 0x8C19, + 0x8C1B, 0x8C18, 0x8C1D, 0x8C1F, 0x8C20, 0x8C21, 0x8C25, 0x8C27, + 0x8C2A, 0x8C2B, 0x8C2E, 0x8C2F, 0x8C32, 0x8C33, 0x8C35, 0x8C36, + 0x5369, 0x537A, 0x961D, 0x9622, 0x9621, 0x9631, 0x962A, 0x963D, + 0x963C, 0x9642, 0x9649, 0x9654, 0x965F, 0x9667, 0x966C, 0x9672, + 0x9674, 0x9688, 0x968D, 0x9697, 0x96B0, 0x9097, 0x909B, 0x909D, + 0x9099, 0x90AC, 0x90A1, 0x90B4, 0x90B3, 0x90B6, 0x90BA, 0, +plane db +at 0x40 + 0x8DD5, 0x8DD8, 0x8DD9, 0x8DDC, 0x8DE0, 0x8DE1, 0x8DE2, 0x8DE5, + 0x8DE6, 0x8DE7, 0x8DE9, 0x8DED, 0x8DEE, 0x8DF0, 0x8DF1, 0x8DF2, + 0x8DF4, 0x8DF6, 0x8DFC, 0x8DFE, 0x8DFF, 0x8E00, 0x8E01, 0x8E02, + 0x8E03, 0x8E04, 0x8E06, 0x8E07, 0x8E08, 0x8E0B, 0x8E0D, 0x8E0E, + 0x8E10, 0x8E11, 0x8E12, 0x8E13, 0x8E15, 0x8E16, 0x8E17, 0x8E18, + 0x8E19, 0x8E1A, 0x8E1B, 0x8E1C, 0x8E20, 0x8E21, 0x8E24, 0x8E25, + 0x8E26, 0x8E27, 0x8E28, 0x8E2B, 0x8E2D, 0x8E30, 0x8E32, 0x8E33, + 0x8E34, 0x8E36, 0x8E37, 0x8E38, 0x8E3B, 0x8E3C, 0x8E3E, 0, + 0x8E3F, 0x8E43, 0x8E45, 0x8E46, 0x8E4C, 0x8E4D, 0x8E4E, 0x8E4F, + 0x8E50, 0x8E53, 0x8E54, 0x8E55, 0x8E56, 0x8E57, 0x8E58, 0x8E5A, + 0x8E5B, 0x8E5C, 0x8E5D, 0x8E5E, 0x8E5F, 0x8E60, 0x8E61, 0x8E62, + 0x8E63, 0x8E64, 0x8E65, 0x8E67, 0x8E68, 0x8E6A, 0x8E6B, 0x8E6E, + 0x8E71, 0x90B8, 0x90B0, 0x90CF, 0x90C5, 0x90BE, 0x90D0, 0x90C4, + 0x90C7, 0x90D3, 0x90E6, 0x90E2, 0x90DC, 0x90D7, 0x90DB, 0x90EB, + 0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, 0x9123, 0x9131, 0x912F, + 0x9139, 0x9143, 0x9146, 0x520D, 0x5942, 0x52A2, 0x52AC, 0x52AD, + 0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, 0x53DF, 0x71EE, 0x77CD, + 0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, 0x5F01, 0x755A, 0x5DEF, + 0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, 0x58C5, 0x58D1, 0x5729, + 0x572C, 0x572A, 0x5733, 0x5739, 0x572E, 0x572F, 0x575C, 0x573B, + 0x5742, 0x5769, 0x5785, 0x576B, 0x5786, 0x577C, 0x577B, 0x5768, + 0x576D, 0x5776, 0x5773, 0x57AD, 0x57A4, 0x578C, 0x57B2, 0x57CF, + 0x57A7, 0x57B4, 0x5793, 0x57A0, 0x57D5, 0x57D8, 0x57DA, 0x57D9, + 0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, 0x57E4, 0x57DD, 0, +plane dc +at 0x40 + 0x8E73, 0x8E75, 0x8E77, 0x8E78, 0x8E79, 0x8E7A, 0x8E7B, 0x8E7D, + 0x8E7E, 0x8E80, 0x8E82, 0x8E83, 0x8E84, 0x8E86, 0x8E88, 0x8E89, + 0x8E8A, 0x8E8B, 0x8E8C, 0x8E8D, 0x8E8E, 0x8E91, 0x8E92, 0x8E93, + 0x8E95, 0x8E96, 0x8E97, 0x8E98, 0x8E99, 0x8E9A, 0x8E9B, 0x8E9D, + 0x8E9F, 0x8EA0, 0x8EA1, 0x8EA2, 0x8EA3, 0x8EA4, 0x8EA5, 0x8EA6, + 0x8EA7, 0x8EA8, 0x8EA9, 0x8EAA, 0x8EAD, 0x8EAE, 0x8EB0, 0x8EB1, + 0x8EB3, 0x8EB4, 0x8EB5, 0x8EB6, 0x8EB7, 0x8EB8, 0x8EB9, 0x8EBB, + 0x8EBC, 0x8EBD, 0x8EBE, 0x8EBF, 0x8EC0, 0x8EC1, 0x8EC2, 0, + 0x8EC3, 0x8EC4, 0x8EC5, 0x8EC6, 0x8EC7, 0x8EC8, 0x8EC9, 0x8ECA, + 0x8ECB, 0x8ECC, 0x8ECD, 0x8ECF, 0x8ED0, 0x8ED1, 0x8ED2, 0x8ED3, + 0x8ED4, 0x8ED5, 0x8ED6, 0x8ED7, 0x8ED8, 0x8ED9, 0x8EDA, 0x8EDB, + 0x8EDC, 0x8EDD, 0x8EDE, 0x8EDF, 0x8EE0, 0x8EE1, 0x8EE2, 0x8EE3, + 0x8EE4, 0x580B, 0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, 0x5819, + 0x5844, 0x5820, 0x5865, 0x586C, 0x5881, 0x5889, 0x589A, 0x5880, + 0x99A8, 0x9F19, 0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, 0x828A, + 0x82A8, 0x8284, 0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, 0x82B8, + 0x82BE, 0x82B0, 0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, 0x82AE, + 0x82CB, 0x82CC, 0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, 0x829F, + 0x82C4, 0x82CE, 0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, 0x830F, + 0x8307, 0x82DC, 0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, 0x82D3, + 0x8311, 0x831A, 0x8306, 0x8314, 0x8315, 0x82E0, 0x82D5, 0x831C, + 0x8351, 0x835B, 0x835C, 0x8308, 0x8392, 0x833C, 0x8334, 0x8331, + 0x839B, 0x835E, 0x832F, 0x834F, 0x8347, 0x8343, 0x835F, 0x8340, + 0x8317, 0x8360, 0x832D, 0x833A, 0x8333, 0x8366, 0x8365, 0, +plane dd +at 0x40 + 0x8EE5, 0x8EE6, 0x8EE7, 0x8EE8, 0x8EE9, 0x8EEA, 0x8EEB, 0x8EEC, + 0x8EED, 0x8EEE, 0x8EEF, 0x8EF0, 0x8EF1, 0x8EF2, 0x8EF3, 0x8EF4, + 0x8EF5, 0x8EF6, 0x8EF7, 0x8EF8, 0x8EF9, 0x8EFA, 0x8EFB, 0x8EFC, + 0x8EFD, 0x8EFE, 0x8EFF, 0x8F00, 0x8F01, 0x8F02, 0x8F03, 0x8F04, + 0x8F05, 0x8F06, 0x8F07, 0x8F08, 0x8F09, 0x8F0A, 0x8F0B, 0x8F0C, + 0x8F0D, 0x8F0E, 0x8F0F, 0x8F10, 0x8F11, 0x8F12, 0x8F13, 0x8F14, + 0x8F15, 0x8F16, 0x8F17, 0x8F18, 0x8F19, 0x8F1A, 0x8F1B, 0x8F1C, + 0x8F1D, 0x8F1E, 0x8F1F, 0x8F20, 0x8F21, 0x8F22, 0x8F23, 0, + 0x8F24, 0x8F25, 0x8F26, 0x8F27, 0x8F28, 0x8F29, 0x8F2A, 0x8F2B, + 0x8F2C, 0x8F2D, 0x8F2E, 0x8F2F, 0x8F30, 0x8F31, 0x8F32, 0x8F33, + 0x8F34, 0x8F35, 0x8F36, 0x8F37, 0x8F38, 0x8F39, 0x8F3A, 0x8F3B, + 0x8F3C, 0x8F3D, 0x8F3E, 0x8F3F, 0x8F40, 0x8F41, 0x8F42, 0x8F43, + 0x8F44, 0x8368, 0x831B, 0x8369, 0x836C, 0x836A, 0x836D, 0x836E, + 0x83B0, 0x8378, 0x83B3, 0x83B4, 0x83A0, 0x83AA, 0x8393, 0x839C, + 0x8385, 0x837C, 0x83B6, 0x83A9, 0x837D, 0x83B8, 0x837B, 0x8398, + 0x839E, 0x83A8, 0x83BA, 0x83BC, 0x83C1, 0x8401, 0x83E5, 0x83D8, + 0x5807, 0x8418, 0x840B, 0x83DD, 0x83FD, 0x83D6, 0x841C, 0x8438, + 0x8411, 0x8406, 0x83D4, 0x83DF, 0x840F, 0x8403, 0x83F8, 0x83F9, + 0x83EA, 0x83C5, 0x83C0, 0x8426, 0x83F0, 0x83E1, 0x845C, 0x8451, + 0x845A, 0x8459, 0x8473, 0x8487, 0x8488, 0x847A, 0x8489, 0x8478, + 0x843C, 0x8446, 0x8469, 0x8476, 0x848C, 0x848E, 0x8431, 0x846D, + 0x84C1, 0x84CD, 0x84D0, 0x84E6, 0x84BD, 0x84D3, 0x84CA, 0x84BF, + 0x84BA, 0x84E0, 0x84A1, 0x84B9, 0x84B4, 0x8497, 0x84E5, 0x84E3, + 0x850C, 0x750D, 0x8538, 0x84F0, 0x8539, 0x851F, 0x853A, 0, +plane de +at 0x40 + 0x8F45, 0x8F46, 0x8F47, 0x8F48, 0x8F49, 0x8F4A, 0x8F4B, 0x8F4C, + 0x8F4D, 0x8F4E, 0x8F4F, 0x8F50, 0x8F51, 0x8F52, 0x8F53, 0x8F54, + 0x8F55, 0x8F56, 0x8F57, 0x8F58, 0x8F59, 0x8F5A, 0x8F5B, 0x8F5C, + 0x8F5D, 0x8F5E, 0x8F5F, 0x8F60, 0x8F61, 0x8F62, 0x8F63, 0x8F64, + 0x8F65, 0x8F6A, 0x8F80, 0x8F8C, 0x8F92, 0x8F9D, 0x8FA0, 0x8FA1, + 0x8FA2, 0x8FA4, 0x8FA5, 0x8FA6, 0x8FA7, 0x8FAA, 0x8FAC, 0x8FAD, + 0x8FAE, 0x8FAF, 0x8FB2, 0x8FB3, 0x8FB4, 0x8FB5, 0x8FB7, 0x8FB8, + 0x8FBA, 0x8FBB, 0x8FBC, 0x8FBF, 0x8FC0, 0x8FC3, 0x8FC6, 0, + 0x8FC9, 0x8FCA, 0x8FCB, 0x8FCC, 0x8FCD, 0x8FCF, 0x8FD2, 0x8FD6, + 0x8FD7, 0x8FDA, 0x8FE0, 0x8FE1, 0x8FE3, 0x8FE7, 0x8FEC, 0x8FEF, + 0x8FF1, 0x8FF2, 0x8FF4, 0x8FF5, 0x8FF6, 0x8FFA, 0x8FFB, 0x8FFC, + 0x8FFE, 0x8FFF, 0x9007, 0x9008, 0x900C, 0x900E, 0x9013, 0x9015, + 0x9018, 0x8556, 0x853B, 0x84FF, 0x84FC, 0x8559, 0x8548, 0x8568, + 0x8564, 0x855E, 0x857A, 0x77A2, 0x8543, 0x8572, 0x857B, 0x85A4, + 0x85A8, 0x8587, 0x858F, 0x8579, 0x85AE, 0x859C, 0x8585, 0x85B9, + 0x85B7, 0x85B0, 0x85D3, 0x85C1, 0x85DC, 0x85FF, 0x8627, 0x8605, + 0x8629, 0x8616, 0x863C, 0x5EFE, 0x5F08, 0x593C, 0x5941, 0x8037, + 0x5955, 0x595A, 0x5958, 0x530F, 0x5C22, 0x5C25, 0x5C2C, 0x5C34, + 0x624C, 0x626A, 0x629F, 0x62BB, 0x62CA, 0x62DA, 0x62D7, 0x62EE, + 0x6322, 0x62F6, 0x6339, 0x634B, 0x6343, 0x63AD, 0x63F6, 0x6371, + 0x637A, 0x638E, 0x63B4, 0x636D, 0x63AC, 0x638A, 0x6369, 0x63AE, + 0x63BC, 0x63F2, 0x63F8, 0x63E0, 0x63FF, 0x63C4, 0x63DE, 0x63CE, + 0x6452, 0x63C6, 0x63BE, 0x6445, 0x6441, 0x640B, 0x641B, 0x6420, + 0x640C, 0x6426, 0x6421, 0x645E, 0x6484, 0x646D, 0x6496, 0, +plane df +at 0x40 + 0x9019, 0x901C, 0x9023, 0x9024, 0x9025, 0x9027, 0x9028, 0x9029, + 0x902A, 0x902B, 0x902C, 0x9030, 0x9031, 0x9032, 0x9033, 0x9034, + 0x9037, 0x9039, 0x903A, 0x903D, 0x903F, 0x9040, 0x9043, 0x9045, + 0x9046, 0x9048, 0x9049, 0x904A, 0x904B, 0x904C, 0x904E, 0x9054, + 0x9055, 0x9056, 0x9059, 0x905A, 0x905C, 0x905D, 0x905E, 0x905F, + 0x9060, 0x9061, 0x9064, 0x9066, 0x9067, 0x9069, 0x906A, 0x906B, + 0x906C, 0x906F, 0x9070, 0x9071, 0x9072, 0x9073, 0x9076, 0x9077, + 0x9078, 0x9079, 0x907A, 0x907B, 0x907C, 0x907E, 0x9081, 0, + 0x9084, 0x9085, 0x9086, 0x9087, 0x9089, 0x908A, 0x908C, 0x908D, + 0x908E, 0x908F, 0x9090, 0x9092, 0x9094, 0x9096, 0x9098, 0x909A, + 0x909C, 0x909E, 0x909F, 0x90A0, 0x90A4, 0x90A5, 0x90A7, 0x90A8, + 0x90A9, 0x90AB, 0x90AD, 0x90B2, 0x90B7, 0x90BC, 0x90BD, 0x90BF, + 0x90C0, 0x647A, 0x64B7, 0x64B8, 0x6499, 0x64BA, 0x64C0, 0x64D0, + 0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, 0x652E, 0x5F0B, 0x5FD2, + 0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, 0x53E9, 0x53E8, 0x53FB, + 0x5412, 0x5416, 0x5406, 0x544B, 0x5452, 0x5453, 0x5454, 0x5456, + 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494, + 0x5477, 0x5471, 0x5464, 0x549A, 0x549B, 0x5484, 0x5476, 0x5466, + 0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, 0x54D2, 0x54A7, 0x54A6, + 0x54D3, 0x54D4, 0x5472, 0x54A3, 0x54D5, 0x54BB, 0x54BF, 0x54CC, + 0x54D9, 0x54DA, 0x54DC, 0x54A9, 0x54AA, 0x54A4, 0x54DD, 0x54CF, + 0x54DE, 0x551B, 0x54E7, 0x5520, 0x54FD, 0x5514, 0x54F3, 0x5522, + 0x5523, 0x550F, 0x5511, 0x5527, 0x552A, 0x5567, 0x558F, 0x55B5, + 0x5549, 0x556D, 0x5541, 0x5555, 0x553F, 0x5550, 0x553C, 0, +plane e0 +at 0x40 + 0x90C2, 0x90C3, 0x90C6, 0x90C8, 0x90C9, 0x90CB, 0x90CC, 0x90CD, + 0x90D2, 0x90D4, 0x90D5, 0x90D6, 0x90D8, 0x90D9, 0x90DA, 0x90DE, + 0x90DF, 0x90E0, 0x90E3, 0x90E4, 0x90E5, 0x90E9, 0x90EA, 0x90EC, + 0x90EE, 0x90F0, 0x90F1, 0x90F2, 0x90F3, 0x90F5, 0x90F6, 0x90F7, + 0x90F9, 0x90FA, 0x90FB, 0x90FC, 0x90FF, 0x9100, 0x9101, 0x9103, + 0x9105, 0x9106, 0x9107, 0x9108, 0x9109, 0x910A, 0x910B, 0x910C, + 0x910D, 0x910E, 0x910F, 0x9110, 0x9111, 0x9112, 0x9113, 0x9114, + 0x9115, 0x9116, 0x9117, 0x9118, 0x911A, 0x911B, 0x911C, 0, + 0x911D, 0x911F, 0x9120, 0x9121, 0x9124, 0x9125, 0x9126, 0x9127, + 0x9128, 0x9129, 0x912A, 0x912B, 0x912C, 0x912D, 0x912E, 0x9130, + 0x9132, 0x9133, 0x9134, 0x9135, 0x9136, 0x9137, 0x9138, 0x913A, + 0x913B, 0x913C, 0x913D, 0x913E, 0x913F, 0x9140, 0x9141, 0x9142, + 0x9144, 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, + 0x555C, 0x558B, 0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, 0x5581, + 0x559F, 0x557E, 0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, 0x55BE, + 0x5594, 0x5599, 0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, 0x55EB, + 0x55EC, 0x55D4, 0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, 0x55F2, + 0x55F3, 0x55CC, 0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F94, 0x561E, + 0x5608, 0x560C, 0x5601, 0x5624, 0x5623, 0x55FE, 0x5600, 0x5627, + 0x562D, 0x5658, 0x5639, 0x5657, 0x562C, 0x564D, 0x5662, 0x5659, + 0x565C, 0x564C, 0x5654, 0x5686, 0x5664, 0x5671, 0x566B, 0x567B, + 0x567C, 0x5685, 0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, 0x56E1, + 0x56F5, 0x56EB, 0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, 0x571C, + 0x5E0F, 0x5E19, 0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C, 0, +plane e1 +at 0x40 + 0x9145, 0x9147, 0x9148, 0x9151, 0x9153, 0x9154, 0x9155, 0x9156, + 0x9158, 0x9159, 0x915B, 0x915C, 0x915F, 0x9160, 0x9166, 0x9167, + 0x9168, 0x916B, 0x916D, 0x9173, 0x917A, 0x917B, 0x917C, 0x9180, + 0x9181, 0x9182, 0x9183, 0x9184, 0x9186, 0x9188, 0x918A, 0x918E, + 0x918F, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, + 0x919C, 0x919D, 0x919E, 0x919F, 0x91A0, 0x91A1, 0x91A4, 0x91A5, + 0x91A6, 0x91A7, 0x91A8, 0x91A9, 0x91AB, 0x91AC, 0x91B0, 0x91B1, + 0x91B2, 0x91B3, 0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BB, 0, + 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C0, 0x91C1, 0x91C2, 0x91C3, + 0x91C4, 0x91C5, 0x91C6, 0x91C8, 0x91CB, 0x91D0, 0x91D2, 0x91D3, + 0x91D4, 0x91D5, 0x91D6, 0x91D7, 0x91D8, 0x91D9, 0x91DA, 0x91DB, + 0x91DD, 0x91DE, 0x91DF, 0x91E0, 0x91E1, 0x91E2, 0x91E3, 0x91E4, + 0x91E5, 0x5E37, 0x5E44, 0x5E54, 0x5E5B, 0x5E5E, 0x5E61, 0x5C8C, + 0x5C7A, 0x5C8D, 0x5C90, 0x5C96, 0x5C88, 0x5C98, 0x5C99, 0x5C91, + 0x5C9A, 0x5C9C, 0x5CB5, 0x5CA2, 0x5CBD, 0x5CAC, 0x5CAB, 0x5CB1, + 0x5CA3, 0x5CC1, 0x5CB7, 0x5CC4, 0x5CD2, 0x5CE4, 0x5CCB, 0x5CE5, + 0x5D02, 0x5D03, 0x5D27, 0x5D26, 0x5D2E, 0x5D24, 0x5D1E, 0x5D06, + 0x5D1B, 0x5D58, 0x5D3E, 0x5D34, 0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F, + 0x5D5D, 0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, 0x5D74, 0x5D82, 0x5D99, + 0x5D9D, 0x8C73, 0x5DB7, 0x5DC5, 0x5F73, 0x5F77, 0x5F82, 0x5F87, + 0x5F89, 0x5F8C, 0x5F95, 0x5F99, 0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5, + 0x5FBC, 0x8862, 0x5F61, 0x72AD, 0x72B0, 0x72B4, 0x72B7, 0x72B8, + 0x72C3, 0x72C1, 0x72CE, 0x72CD, 0x72D2, 0x72E8, 0x72EF, 0x72E9, + 0x72F2, 0x72F4, 0x72F7, 0x7301, 0x72F3, 0x7303, 0x72FA, 0, +plane e2 +at 0x40 + 0x91E6, 0x91E7, 0x91E8, 0x91E9, 0x91EA, 0x91EB, 0x91EC, 0x91ED, + 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F2, 0x91F3, 0x91F4, 0x91F5, + 0x91F6, 0x91F7, 0x91F8, 0x91F9, 0x91FA, 0x91FB, 0x91FC, 0x91FD, + 0x91FE, 0x91FF, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205, + 0x9206, 0x9207, 0x9208, 0x9209, 0x920A, 0x920B, 0x920C, 0x920D, + 0x920E, 0x920F, 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215, + 0x9216, 0x9217, 0x9218, 0x9219, 0x921A, 0x921B, 0x921C, 0x921D, + 0x921E, 0x921F, 0x9220, 0x9221, 0x9222, 0x9223, 0x9224, 0, + 0x9225, 0x9226, 0x9227, 0x9228, 0x9229, 0x922A, 0x922B, 0x922C, + 0x922D, 0x922E, 0x922F, 0x9230, 0x9231, 0x9232, 0x9233, 0x9234, + 0x9235, 0x9236, 0x9237, 0x9238, 0x9239, 0x923A, 0x923B, 0x923C, + 0x923D, 0x923E, 0x923F, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, + 0x9245, 0x72FB, 0x7317, 0x7313, 0x7321, 0x730A, 0x731E, 0x731D, + 0x7315, 0x7322, 0x7339, 0x7325, 0x732C, 0x7338, 0x7331, 0x7350, + 0x734D, 0x7357, 0x7360, 0x736C, 0x736F, 0x737E, 0x821B, 0x5925, + 0x98E7, 0x5924, 0x5902, 0x9963, 0x9967, 0x9968, 0x9969, 0x996A, + 0x996B, 0x996C, 0x9974, 0x9977, 0x997D, 0x9980, 0x9984, 0x9987, + 0x998A, 0x998D, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, 0x5E80, + 0x5E91, 0x5E8B, 0x5E96, 0x5EA5, 0x5EA0, 0x5EB9, 0x5EB5, 0x5EBE, + 0x5EB3, 0x8D53, 0x5ED2, 0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, 0x81BA, + 0x5FC4, 0x5FC9, 0x5FD6, 0x5FCF, 0x6003, 0x5FEE, 0x6004, 0x5FE1, + 0x5FE4, 0x5FFE, 0x6005, 0x6006, 0x5FEA, 0x5FED, 0x5FF8, 0x6019, + 0x6035, 0x6026, 0x601B, 0x600F, 0x600D, 0x6029, 0x602B, 0x600A, + 0x603F, 0x6021, 0x6078, 0x6079, 0x607B, 0x607A, 0x6042, 0, +plane e3 +at 0x40 + 0x9246, 0x9247, 0x9248, 0x9249, 0x924A, 0x924B, 0x924C, 0x924D, + 0x924E, 0x924F, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, + 0x9256, 0x9257, 0x9258, 0x9259, 0x925A, 0x925B, 0x925C, 0x925D, + 0x925E, 0x925F, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, + 0x9266, 0x9267, 0x9268, 0x9269, 0x926A, 0x926B, 0x926C, 0x926D, + 0x926E, 0x926F, 0x9270, 0x9271, 0x9272, 0x9273, 0x9275, 0x9276, + 0x9277, 0x9278, 0x9279, 0x927A, 0x927B, 0x927C, 0x927D, 0x927E, + 0x927F, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285, 0, + 0x9286, 0x9287, 0x9288, 0x9289, 0x928A, 0x928B, 0x928C, 0x928D, + 0x928F, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294, 0x9295, 0x9296, + 0x9297, 0x9298, 0x9299, 0x929A, 0x929B, 0x929C, 0x929D, 0x929E, + 0x929F, 0x92A0, 0x92A1, 0x92A2, 0x92A3, 0x92A4, 0x92A5, 0x92A6, + 0x92A7, 0x606A, 0x607D, 0x6096, 0x609A, 0x60AD, 0x609D, 0x6083, + 0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, 0x60B1, 0x60DD, 0x60D8, + 0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60F4, + 0x6100, 0x610E, 0x612B, 0x614A, 0x6175, 0x61AC, 0x6194, 0x61A7, + 0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, 0x95E9, 0x95EB, 0x95F1, + 0x95F3, 0x95F5, 0x95F6, 0x95FC, 0x95FE, 0x9603, 0x9604, 0x9606, + 0x9608, 0x960A, 0x960B, 0x960C, 0x960D, 0x960F, 0x9612, 0x9615, + 0x9616, 0x9617, 0x9619, 0x961A, 0x4E2C, 0x723F, 0x6215, 0x6C35, + 0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, 0x6C90, 0x6C94, 0x6C8C, + 0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, 0x6CA9, 0x6CD0, 0x6CD4, + 0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, 0x6CB2, 0x6CE0, 0x6CD6, + 0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, 0x6CEF, 0x6CFE, 0, +plane e4 +at 0x40 + 0x92A8, 0x92A9, 0x92AA, 0x92AB, 0x92AC, 0x92AD, 0x92AF, 0x92B0, + 0x92B1, 0x92B2, 0x92B3, 0x92B4, 0x92B5, 0x92B6, 0x92B7, 0x92B8, + 0x92B9, 0x92BA, 0x92BB, 0x92BC, 0x92BD, 0x92BE, 0x92BF, 0x92C0, + 0x92C1, 0x92C2, 0x92C3, 0x92C4, 0x92C5, 0x92C6, 0x92C7, 0x92C9, + 0x92CA, 0x92CB, 0x92CC, 0x92CD, 0x92CE, 0x92CF, 0x92D0, 0x92D1, + 0x92D2, 0x92D3, 0x92D4, 0x92D5, 0x92D6, 0x92D7, 0x92D8, 0x92D9, + 0x92DA, 0x92DB, 0x92DC, 0x92DD, 0x92DE, 0x92DF, 0x92E0, 0x92E1, + 0x92E2, 0x92E3, 0x92E4, 0x92E5, 0x92E6, 0x92E7, 0x92E8, 0, + 0x92E9, 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, 0x92F0, + 0x92F1, 0x92F2, 0x92F3, 0x92F4, 0x92F5, 0x92F6, 0x92F7, 0x92F8, + 0x92F9, 0x92FA, 0x92FB, 0x92FC, 0x92FD, 0x92FE, 0x92FF, 0x9300, + 0x9301, 0x9302, 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, 0x9308, + 0x9309, 0x6D39, 0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, 0x6D04, + 0x6D19, 0x6D0E, 0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, 0x6D4F, + 0x6D52, 0x6D54, 0x6D33, 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, 0x6D5E, + 0x6D93, 0x6D94, 0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, 0x6DC7, + 0x6DC5, 0x6DDE, 0x6E0E, 0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, 0x6DDD, + 0x6DD9, 0x6E16, 0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, 0x6E4E, + 0x6E6B, 0x6EB2, 0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, 0x6E25, + 0x6E44, 0x6EDF, 0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, 0x6EA5, + 0x6EA7, 0x6EBD, 0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, 0x6E8F, + 0x6EC2, 0x6E9F, 0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, 0x6EF9, + 0x6F2F, 0x6F36, 0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, 0x6F89, + 0x6F8D, 0x6F8C, 0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1, 0, +plane e5 +at 0x40 + 0x930A, 0x930B, 0x930C, 0x930D, 0x930E, 0x930F, 0x9310, 0x9311, + 0x9312, 0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319, + 0x931A, 0x931B, 0x931C, 0x931D, 0x931E, 0x931F, 0x9320, 0x9321, + 0x9322, 0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329, + 0x932A, 0x932B, 0x932C, 0x932D, 0x932E, 0x932F, 0x9330, 0x9331, + 0x9332, 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339, + 0x933A, 0x933B, 0x933C, 0x933D, 0x933F, 0x9340, 0x9341, 0x9342, + 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0, + 0x934A, 0x934B, 0x934C, 0x934D, 0x934E, 0x934F, 0x9350, 0x9351, + 0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, + 0x935A, 0x935B, 0x935C, 0x935D, 0x935E, 0x935F, 0x9360, 0x9361, + 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, + 0x936B, 0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE, + 0x6FDE, 0x6FE0, 0x6FEF, 0x701A, 0x7023, 0x701B, 0x7039, 0x7035, + 0x704F, 0x705E, 0x5B80, 0x5B84, 0x5B95, 0x5B93, 0x5BA5, 0x5BB8, + 0x752F, 0x9A9E, 0x6434, 0x5BE4, 0x5BEE, 0x8930, 0x5BF0, 0x8E47, + 0x8B07, 0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9, + 0x8FE6, 0x8FF3, 0x8FE8, 0x9005, 0x9004, 0x900B, 0x9026, 0x9011, + 0x900D, 0x9016, 0x9021, 0x9035, 0x9036, 0x902D, 0x902F, 0x9044, + 0x9051, 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905B, 0x66B9, + 0x9074, 0x907D, 0x9082, 0x9088, 0x9083, 0x908B, 0x5F50, 0x5F57, + 0x5F56, 0x5F58, 0x5C3B, 0x54AB, 0x5C50, 0x5C59, 0x5B71, 0x5C63, + 0x5C66, 0x7FBC, 0x5F2A, 0x5F29, 0x5F2D, 0x8274, 0x5F3C, 0x9B3B, + 0x5C6E, 0x5981, 0x5983, 0x598D, 0x59A9, 0x59AA, 0x59A3, 0, +plane e6 +at 0x40 + 0x936C, 0x936D, 0x936E, 0x936F, 0x9370, 0x9371, 0x9372, 0x9373, + 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379, 0x937A, 0x937B, + 0x937C, 0x937D, 0x937E, 0x937F, 0x9380, 0x9381, 0x9382, 0x9383, + 0x9384, 0x9385, 0x9386, 0x9387, 0x9388, 0x9389, 0x938A, 0x938B, + 0x938C, 0x938D, 0x938E, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, + 0x9395, 0x9396, 0x9397, 0x9398, 0x9399, 0x939A, 0x939B, 0x939C, + 0x939D, 0x939E, 0x939F, 0x93A0, 0x93A1, 0x93A2, 0x93A3, 0x93A4, + 0x93A5, 0x93A6, 0x93A7, 0x93A8, 0x93A9, 0x93AA, 0x93AB, 0, + 0x93AC, 0x93AD, 0x93AE, 0x93AF, 0x93B0, 0x93B1, 0x93B2, 0x93B3, + 0x93B4, 0x93B5, 0x93B6, 0x93B7, 0x93B8, 0x93B9, 0x93BA, 0x93BB, + 0x93BC, 0x93BD, 0x93BE, 0x93BF, 0x93C0, 0x93C1, 0x93C2, 0x93C3, + 0x93C4, 0x93C5, 0x93C6, 0x93C7, 0x93C8, 0x93C9, 0x93CB, 0x93CC, + 0x93CD, 0x5997, 0x59CA, 0x59AB, 0x599E, 0x59A4, 0x59D2, 0x59B2, + 0x59AF, 0x59D7, 0x59BE, 0x5A05, 0x5A06, 0x59DD, 0x5A08, 0x59E3, + 0x59D8, 0x59F9, 0x5A0C, 0x5A09, 0x5A32, 0x5A34, 0x5A11, 0x5A23, + 0x5A13, 0x5A40, 0x5A67, 0x5A4A, 0x5A55, 0x5A3C, 0x5A62, 0x5A75, + 0x80EC, 0x5AAA, 0x5A9B, 0x5A77, 0x5A7A, 0x5ABE, 0x5AEB, 0x5AB2, + 0x5AD2, 0x5AD4, 0x5AB8, 0x5AE0, 0x5AE3, 0x5AF1, 0x5AD6, 0x5AE6, + 0x5AD8, 0x5ADC, 0x5B09, 0x5B17, 0x5B16, 0x5B32, 0x5B37, 0x5B40, + 0x5C15, 0x5C1C, 0x5B5A, 0x5B65, 0x5B73, 0x5B51, 0x5B53, 0x5B62, + 0x9A75, 0x9A77, 0x9A78, 0x9A7A, 0x9A7F, 0x9A7D, 0x9A80, 0x9A81, + 0x9A85, 0x9A88, 0x9A8A, 0x9A90, 0x9A92, 0x9A93, 0x9A96, 0x9A98, + 0x9A9B, 0x9A9C, 0x9A9D, 0x9A9F, 0x9AA0, 0x9AA2, 0x9AA3, 0x9AA5, + 0x9AA7, 0x7E9F, 0x7EA1, 0x7EA3, 0x7EA5, 0x7EA8, 0x7EA9, 0, +plane e7 +at 0x40 + 0x93CE, 0x93CF, 0x93D0, 0x93D1, 0x93D2, 0x93D3, 0x93D4, 0x93D5, + 0x93D7, 0x93D8, 0x93D9, 0x93DA, 0x93DB, 0x93DC, 0x93DD, 0x93DE, + 0x93DF, 0x93E0, 0x93E1, 0x93E2, 0x93E3, 0x93E4, 0x93E5, 0x93E6, + 0x93E7, 0x93E8, 0x93E9, 0x93EA, 0x93EB, 0x93EC, 0x93ED, 0x93EE, + 0x93EF, 0x93F0, 0x93F1, 0x93F2, 0x93F3, 0x93F4, 0x93F5, 0x93F6, + 0x93F7, 0x93F8, 0x93F9, 0x93FA, 0x93FB, 0x93FC, 0x93FD, 0x93FE, + 0x93FF, 0x9400, 0x9401, 0x9402, 0x9403, 0x9404, 0x9405, 0x9406, + 0x9407, 0x9408, 0x9409, 0x940A, 0x940B, 0x940C, 0x940D, 0, + 0x940E, 0x940F, 0x9410, 0x9411, 0x9412, 0x9413, 0x9414, 0x9415, + 0x9416, 0x9417, 0x9418, 0x9419, 0x941A, 0x941B, 0x941C, 0x941D, + 0x941E, 0x941F, 0x9420, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, + 0x9426, 0x9427, 0x9428, 0x9429, 0x942A, 0x942B, 0x942C, 0x942D, + 0x942E, 0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, 0x7EC1, 0x7EC2, 0x7EC9, + 0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, 0x7EDB, 0x7EE0, 0x7EE1, + 0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, 0x7EF2, 0x7F0D, 0x7EF6, + 0x7EFA, 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, 0x7F03, 0x7F07, 0x7F08, + 0x7F0B, 0x7F0C, 0x7F0F, 0x7F11, 0x7F12, 0x7F17, 0x7F19, 0x7F1C, + 0x7F1B, 0x7F1F, 0x7F21, 0x7F22, 0x7F23, 0x7F24, 0x7F25, 0x7F26, + 0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, 0x7F2F, 0x7F30, 0x7F31, + 0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, 0x5DDB, 0x753E, 0x9095, + 0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, 0x73CF, 0x73C2, 0x73D1, + 0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, 0x73E5, 0x73D9, 0x987C, + 0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, 0x73F2, 0x740F, 0x742A, + 0x745B, 0x7426, 0x7425, 0x7428, 0x7430, 0x742E, 0x742C, 0, +plane e8 +at 0x40 + 0x942F, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, 0x9435, 0x9436, + 0x9437, 0x9438, 0x9439, 0x943A, 0x943B, 0x943C, 0x943D, 0x943F, + 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, + 0x9448, 0x9449, 0x944A, 0x944B, 0x944C, 0x944D, 0x944E, 0x944F, + 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, + 0x9458, 0x9459, 0x945A, 0x945B, 0x945C, 0x945D, 0x945E, 0x945F, + 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, + 0x9468, 0x9469, 0x946A, 0x946C, 0x946D, 0x946E, 0x946F, 0, + 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, + 0x9478, 0x9479, 0x947A, 0x947B, 0x947C, 0x947D, 0x947E, 0x947F, + 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9491, 0x9496, 0x9498, + 0x94C7, 0x94CF, 0x94D3, 0x94D4, 0x94DA, 0x94E6, 0x94FB, 0x951C, + 0x9520, 0x741B, 0x741A, 0x7441, 0x745C, 0x7457, 0x7455, 0x7459, + 0x7477, 0x746D, 0x747E, 0x749C, 0x748E, 0x7480, 0x7481, 0x7487, + 0x748B, 0x749E, 0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74D2, 0x74BA, + 0x97EA, 0x97EB, 0x97EC, 0x674C, 0x6753, 0x675E, 0x6748, 0x6769, + 0x67A5, 0x6787, 0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, 0x67A8, + 0x679E, 0x67AD, 0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, 0x67D8, + 0x680A, 0x67E9, 0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, 0x67B3, + 0x67DD, 0x6800, 0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, 0x67FD, + 0x6832, 0x6833, 0x6860, 0x6861, 0x684E, 0x6862, 0x6844, 0x6864, + 0x6883, 0x681D, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683E, + 0x684A, 0x6849, 0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, 0x6893, + 0x686B, 0x68C2, 0x696E, 0x68FC, 0x691F, 0x6920, 0x68F9, 0, +plane e9 +at 0x40 + 0x9527, 0x9533, 0x953D, 0x9543, 0x9548, 0x954B, 0x9555, 0x955A, + 0x9560, 0x956E, 0x9574, 0x9575, 0x9577, 0x9578, 0x9579, 0x957A, + 0x957B, 0x957C, 0x957D, 0x957E, 0x9580, 0x9581, 0x9582, 0x9583, + 0x9584, 0x9585, 0x9586, 0x9587, 0x9588, 0x9589, 0x958A, 0x958B, + 0x958C, 0x958D, 0x958E, 0x958F, 0x9590, 0x9591, 0x9592, 0x9593, + 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959A, 0x959B, + 0x959C, 0x959D, 0x959E, 0x959F, 0x95A0, 0x95A1, 0x95A2, 0x95A3, + 0x95A4, 0x95A5, 0x95A6, 0x95A7, 0x95A8, 0x95A9, 0x95AA, 0, + 0x95AB, 0x95AC, 0x95AD, 0x95AE, 0x95AF, 0x95B0, 0x95B1, 0x95B2, + 0x95B3, 0x95B4, 0x95B5, 0x95B6, 0x95B7, 0x95B8, 0x95B9, 0x95BA, + 0x95BB, 0x95BC, 0x95BD, 0x95BE, 0x95BF, 0x95C0, 0x95C1, 0x95C2, + 0x95C3, 0x95C4, 0x95C5, 0x95C6, 0x95C7, 0x95C8, 0x95C9, 0x95CA, + 0x95CB, 0x6924, 0x68F0, 0x690B, 0x6901, 0x6957, 0x68E3, 0x6910, + 0x6971, 0x6939, 0x6960, 0x6942, 0x695D, 0x6984, 0x696B, 0x6980, + 0x6998, 0x6978, 0x6934, 0x69CC, 0x6987, 0x6988, 0x69CE, 0x6989, + 0x6966, 0x6963, 0x6979, 0x699B, 0x69A7, 0x69BB, 0x69AB, 0x69AD, + 0x69D4, 0x69B1, 0x69C1, 0x69CA, 0x69DF, 0x6995, 0x69E0, 0x698D, + 0x69FF, 0x6A2F, 0x69ED, 0x6A17, 0x6A18, 0x6A65, 0x69F2, 0x6A44, + 0x6A3E, 0x6AA0, 0x6A50, 0x6A5B, 0x6A35, 0x6A8E, 0x6A79, 0x6A3D, + 0x6A28, 0x6A58, 0x6A7C, 0x6A91, 0x6A90, 0x6AA9, 0x6A97, 0x6AAB, + 0x7337, 0x7352, 0x6B81, 0x6B82, 0x6B87, 0x6B84, 0x6B92, 0x6B93, + 0x6B8D, 0x6B9A, 0x6B9B, 0x6BA1, 0x6BAA, 0x8F6B, 0x8F6D, 0x8F71, + 0x8F72, 0x8F73, 0x8F75, 0x8F76, 0x8F78, 0x8F77, 0x8F79, 0x8F7A, + 0x8F7C, 0x8F7E, 0x8F81, 0x8F82, 0x8F84, 0x8F87, 0x8F8B, 0, +plane ea +at 0x40 + 0x95CC, 0x95CD, 0x95CE, 0x95CF, 0x95D0, 0x95D1, 0x95D2, 0x95D3, + 0x95D4, 0x95D5, 0x95D6, 0x95D7, 0x95D8, 0x95D9, 0x95DA, 0x95DB, + 0x95DC, 0x95DD, 0x95DE, 0x95DF, 0x95E0, 0x95E1, 0x95E2, 0x95E3, + 0x95E4, 0x95E5, 0x95E6, 0x95E7, 0x95EC, 0x95FF, 0x9607, 0x9613, + 0x9618, 0x961B, 0x961E, 0x9620, 0x9623, 0x9624, 0x9625, 0x9626, + 0x9627, 0x9628, 0x9629, 0x962B, 0x962C, 0x962D, 0x962F, 0x9630, + 0x9637, 0x9638, 0x9639, 0x963A, 0x963E, 0x9641, 0x9643, 0x964A, + 0x964E, 0x964F, 0x9651, 0x9652, 0x9653, 0x9656, 0x9657, 0, + 0x9658, 0x9659, 0x965A, 0x965C, 0x965D, 0x965E, 0x9660, 0x9663, + 0x9665, 0x9666, 0x966B, 0x966D, 0x966E, 0x966F, 0x9670, 0x9671, + 0x9673, 0x9678, 0x9679, 0x967A, 0x967B, 0x967C, 0x967D, 0x967E, + 0x967F, 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9687, 0x9689, + 0x968A, 0x8F8D, 0x8F8E, 0x8F8F, 0x8F98, 0x8F9A, 0x8ECE, 0x620B, + 0x6217, 0x621B, 0x621F, 0x6222, 0x6221, 0x6225, 0x6224, 0x622C, + 0x81E7, 0x74EF, 0x74F4, 0x74FF, 0x750F, 0x7511, 0x7513, 0x6534, + 0x65EE, 0x65EF, 0x65F0, 0x660A, 0x6619, 0x6772, 0x6603, 0x6615, + 0x6600, 0x7085, 0x66F7, 0x661D, 0x6634, 0x6631, 0x6636, 0x6635, + 0x8006, 0x665F, 0x6654, 0x6641, 0x664F, 0x6656, 0x6661, 0x6657, + 0x6677, 0x6684, 0x668C, 0x66A7, 0x669D, 0x66BE, 0x66DB, 0x66DC, + 0x66E6, 0x66E9, 0x8D32, 0x8D33, 0x8D36, 0x8D3B, 0x8D3D, 0x8D40, + 0x8D45, 0x8D46, 0x8D48, 0x8D49, 0x8D47, 0x8D4D, 0x8D55, 0x8D59, + 0x89C7, 0x89CA, 0x89CB, 0x89CC, 0x89CE, 0x89CF, 0x89D0, 0x89D1, + 0x726E, 0x729F, 0x725D, 0x7266, 0x726F, 0x727E, 0x727F, 0x7284, + 0x728B, 0x728D, 0x728F, 0x7292, 0x6308, 0x6332, 0x63B0, 0, +plane eb +at 0x40 + 0x968C, 0x968E, 0x9691, 0x9692, 0x9693, 0x9695, 0x9696, 0x969A, + 0x969B, 0x969D, 0x969E, 0x969F, 0x96A0, 0x96A1, 0x96A2, 0x96A3, + 0x96A4, 0x96A5, 0x96A6, 0x96A8, 0x96A9, 0x96AA, 0x96AB, 0x96AC, + 0x96AD, 0x96AE, 0x96AF, 0x96B1, 0x96B2, 0x96B4, 0x96B5, 0x96B7, + 0x96B8, 0x96BA, 0x96BB, 0x96BF, 0x96C2, 0x96C3, 0x96C8, 0x96CA, + 0x96CB, 0x96D0, 0x96D1, 0x96D3, 0x96D4, 0x96D6, 0x96D7, 0x96D8, + 0x96D9, 0x96DA, 0x96DB, 0x96DC, 0x96DD, 0x96DE, 0x96DF, 0x96E1, + 0x96E2, 0x96E3, 0x96E4, 0x96E5, 0x96E6, 0x96E7, 0x96EB, 0, + 0x96EC, 0x96ED, 0x96EE, 0x96F0, 0x96F1, 0x96F2, 0x96F4, 0x96F5, + 0x96F8, 0x96FA, 0x96FB, 0x96FC, 0x96FD, 0x96FF, 0x9702, 0x9703, + 0x9705, 0x970A, 0x970B, 0x970C, 0x9710, 0x9711, 0x9712, 0x9714, + 0x9715, 0x9717, 0x9718, 0x9719, 0x971A, 0x971B, 0x971D, 0x971F, + 0x9720, 0x643F, 0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5, + 0x6BF9, 0x6C05, 0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x6C18, 0x6C19, + 0x6C1A, 0x6C21, 0x6C29, 0x6C24, 0x6C2A, 0x6C32, 0x6535, 0x6555, + 0x656B, 0x724D, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809F, + 0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, 0x80B1, 0x80AB, 0x80AD, + 0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, 0x80EA, 0x80DB, 0x80C2, + 0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, 0x80DD, 0x80EB, 0x80F1, + 0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, 0x80FC, 0x6715, 0x8112, + 0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, 0x8132, 0x8148, 0x814C, + 0x8153, 0x8174, 0x8159, 0x815A, 0x8171, 0x8160, 0x8169, 0x817C, + 0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, 0x8188, 0x8182, 0x8191, + 0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, 0x81CA, 0x81BB, 0, +plane ec +at 0x40 + 0x9721, 0x9722, 0x9723, 0x9724, 0x9725, 0x9726, 0x9727, 0x9728, + 0x9729, 0x972B, 0x972C, 0x972E, 0x972F, 0x9731, 0x9733, 0x9734, + 0x9735, 0x9736, 0x9737, 0x973A, 0x973B, 0x973C, 0x973D, 0x973F, + 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747, + 0x9748, 0x9749, 0x974A, 0x974B, 0x974C, 0x974D, 0x974E, 0x974F, + 0x9750, 0x9751, 0x9754, 0x9755, 0x9757, 0x9758, 0x975A, 0x975C, + 0x975D, 0x975F, 0x9763, 0x9764, 0x9766, 0x9767, 0x9768, 0x976A, + 0x976B, 0x976C, 0x976D, 0x976E, 0x976F, 0x9770, 0x9771, 0, + 0x9772, 0x9775, 0x9777, 0x9778, 0x9779, 0x977A, 0x977B, 0x977D, + 0x977E, 0x977F, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9786, + 0x9787, 0x9788, 0x9789, 0x978A, 0x978C, 0x978E, 0x978F, 0x9790, + 0x9793, 0x9795, 0x9796, 0x9797, 0x9799, 0x979A, 0x979B, 0x979C, + 0x979D, 0x81C1, 0x81A6, 0x6B24, 0x6B37, 0x6B39, 0x6B43, 0x6B46, + 0x6B59, 0x98D1, 0x98D2, 0x98D3, 0x98D5, 0x98D9, 0x98DA, 0x6BB3, + 0x5F40, 0x6BC2, 0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, 0x65C6, + 0x65C4, 0x65C3, 0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, 0x709C, + 0x7096, 0x709D, 0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, 0x70E8, + 0x70CA, 0x7110, 0x7113, 0x7116, 0x712F, 0x7131, 0x7173, 0x715C, + 0x7168, 0x7145, 0x7172, 0x714A, 0x7178, 0x717A, 0x7198, 0x71B3, + 0x71B5, 0x71A8, 0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, 0x721D, + 0x7228, 0x706C, 0x7118, 0x7166, 0x71B9, 0x623E, 0x623D, 0x6243, + 0x6248, 0x6249, 0x793B, 0x7940, 0x7946, 0x7949, 0x795B, 0x795C, + 0x7953, 0x795A, 0x7962, 0x7957, 0x7960, 0x796F, 0x7967, 0x797A, + 0x7985, 0x798A, 0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0, 0, +plane ed +at 0x40 + 0x979E, 0x979F, 0x97A1, 0x97A2, 0x97A4, 0x97A5, 0x97A6, 0x97A7, + 0x97A8, 0x97A9, 0x97AA, 0x97AC, 0x97AE, 0x97B0, 0x97B1, 0x97B3, + 0x97B5, 0x97B6, 0x97B7, 0x97B8, 0x97B9, 0x97BA, 0x97BB, 0x97BC, + 0x97BD, 0x97BE, 0x97BF, 0x97C0, 0x97C1, 0x97C2, 0x97C3, 0x97C4, + 0x97C5, 0x97C6, 0x97C7, 0x97C8, 0x97C9, 0x97CA, 0x97CB, 0x97CC, + 0x97CD, 0x97CE, 0x97CF, 0x97D0, 0x97D1, 0x97D2, 0x97D3, 0x97D4, + 0x97D5, 0x97D6, 0x97D7, 0x97D8, 0x97D9, 0x97DA, 0x97DB, 0x97DC, + 0x97DD, 0x97DE, 0x97DF, 0x97E0, 0x97E1, 0x97E2, 0x97E3, 0, + 0x97E4, 0x97E5, 0x97E8, 0x97EE, 0x97EF, 0x97F0, 0x97F1, 0x97F2, + 0x97F4, 0x97F7, 0x97F8, 0x97F9, 0x97FA, 0x97FB, 0x97FC, 0x97FD, + 0x97FE, 0x97FF, 0x9800, 0x9801, 0x9802, 0x9803, 0x9804, 0x9805, + 0x9806, 0x9807, 0x9808, 0x9809, 0x980A, 0x980B, 0x980C, 0x980D, + 0x980E, 0x603C, 0x605D, 0x605A, 0x6067, 0x6041, 0x6059, 0x6063, + 0x60AB, 0x6106, 0x610D, 0x615D, 0x61A9, 0x619D, 0x61CB, 0x61D1, + 0x6206, 0x8080, 0x807F, 0x6C93, 0x6CF6, 0x6DFC, 0x77F6, 0x77F8, + 0x7800, 0x7809, 0x7817, 0x7818, 0x7811, 0x65AB, 0x782D, 0x781C, + 0x781D, 0x7839, 0x783A, 0x783B, 0x781F, 0x783C, 0x7825, 0x782C, + 0x7823, 0x7829, 0x784E, 0x786D, 0x7856, 0x7857, 0x7826, 0x7850, + 0x7847, 0x784C, 0x786A, 0x789B, 0x7893, 0x789A, 0x7887, 0x789C, + 0x78A1, 0x78A3, 0x78B2, 0x78B9, 0x78A5, 0x78D4, 0x78D9, 0x78C9, + 0x78EC, 0x78F2, 0x7905, 0x78F4, 0x7913, 0x7924, 0x791E, 0x7934, + 0x9F9B, 0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, 0x7704, 0x770D, 0x76F9, + 0x7707, 0x7708, 0x771A, 0x7722, 0x7719, 0x772D, 0x7726, 0x7735, + 0x7738, 0x7750, 0x7751, 0x7747, 0x7743, 0x775A, 0x7768, 0, +plane ee +at 0x40 + 0x980F, 0x9810, 0x9811, 0x9812, 0x9813, 0x9814, 0x9815, 0x9816, + 0x9817, 0x9818, 0x9819, 0x981A, 0x981B, 0x981C, 0x981D, 0x981E, + 0x981F, 0x9820, 0x9821, 0x9822, 0x9823, 0x9824, 0x9825, 0x9826, + 0x9827, 0x9828, 0x9829, 0x982A, 0x982B, 0x982C, 0x982D, 0x982E, + 0x982F, 0x9830, 0x9831, 0x9832, 0x9833, 0x9834, 0x9835, 0x9836, + 0x9837, 0x9838, 0x9839, 0x983A, 0x983B, 0x983C, 0x983D, 0x983E, + 0x983F, 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, + 0x9847, 0x9848, 0x9849, 0x984A, 0x984B, 0x984C, 0x984D, 0, + 0x984E, 0x984F, 0x9850, 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, + 0x9856, 0x9857, 0x9858, 0x9859, 0x985A, 0x985B, 0x985C, 0x985D, + 0x985E, 0x985F, 0x9860, 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, + 0x9866, 0x9867, 0x9868, 0x9869, 0x986A, 0x986B, 0x986C, 0x986D, + 0x986E, 0x7762, 0x7765, 0x777F, 0x778D, 0x777D, 0x7780, 0x778C, + 0x7791, 0x779F, 0x77A0, 0x77B0, 0x77B5, 0x77BD, 0x753A, 0x7540, + 0x754E, 0x754B, 0x7548, 0x755B, 0x7572, 0x7579, 0x7583, 0x7F58, + 0x7F61, 0x7F5F, 0x8A48, 0x7F68, 0x7F74, 0x7F71, 0x7F79, 0x7F81, + 0x7F7E, 0x76CD, 0x76E5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948B, + 0x948A, 0x948C, 0x948D, 0x948F, 0x9490, 0x9494, 0x9497, 0x9495, + 0x949A, 0x949B, 0x949C, 0x94A3, 0x94A4, 0x94AB, 0x94AA, 0x94AD, + 0x94AC, 0x94AF, 0x94B0, 0x94B2, 0x94B4, 0x94B6, 0x94B7, 0x94B8, + 0x94B9, 0x94BA, 0x94BC, 0x94BD, 0x94BF, 0x94C4, 0x94C8, 0x94C9, + 0x94CA, 0x94CB, 0x94CC, 0x94CD, 0x94CE, 0x94D0, 0x94D1, 0x94D2, + 0x94D5, 0x94D6, 0x94D7, 0x94D9, 0x94D8, 0x94DB, 0x94DE, 0x94DF, + 0x94E0, 0x94E2, 0x94E4, 0x94E5, 0x94E7, 0x94E8, 0x94EA, 0, +plane ef +at 0x40 + 0x986F, 0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x988B, 0x988E, + 0x9892, 0x9895, 0x9899, 0x98A3, 0x98A8, 0x98A9, 0x98AA, 0x98AB, + 0x98AC, 0x98AD, 0x98AE, 0x98AF, 0x98B0, 0x98B1, 0x98B2, 0x98B3, + 0x98B4, 0x98B5, 0x98B6, 0x98B7, 0x98B8, 0x98B9, 0x98BA, 0x98BB, + 0x98BC, 0x98BD, 0x98BE, 0x98BF, 0x98C0, 0x98C1, 0x98C2, 0x98C3, + 0x98C4, 0x98C5, 0x98C6, 0x98C7, 0x98C8, 0x98C9, 0x98CA, 0x98CB, + 0x98CC, 0x98CD, 0x98CF, 0x98D0, 0x98D4, 0x98D6, 0x98D7, 0x98DB, + 0x98DC, 0x98DD, 0x98E0, 0x98E1, 0x98E2, 0x98E3, 0x98E4, 0, + 0x98E5, 0x98E6, 0x98E9, 0x98EA, 0x98EB, 0x98EC, 0x98ED, 0x98EE, + 0x98EF, 0x98F0, 0x98F1, 0x98F2, 0x98F3, 0x98F4, 0x98F5, 0x98F6, + 0x98F7, 0x98F8, 0x98F9, 0x98FA, 0x98FB, 0x98FC, 0x98FD, 0x98FE, + 0x98FF, 0x9900, 0x9901, 0x9902, 0x9903, 0x9904, 0x9905, 0x9906, + 0x9907, 0x94E9, 0x94EB, 0x94EE, 0x94EF, 0x94F3, 0x94F4, 0x94F5, + 0x94F7, 0x94F9, 0x94FC, 0x94FD, 0x94FF, 0x9503, 0x9502, 0x9506, + 0x9507, 0x9509, 0x950A, 0x950D, 0x950E, 0x950F, 0x9512, 0x9513, + 0x9514, 0x9515, 0x9516, 0x9518, 0x951B, 0x951D, 0x951E, 0x951F, + 0x9522, 0x952A, 0x952B, 0x9529, 0x952C, 0x9531, 0x9532, 0x9534, + 0x9536, 0x9537, 0x9538, 0x953C, 0x953E, 0x953F, 0x9542, 0x9535, + 0x9544, 0x9545, 0x9546, 0x9549, 0x954C, 0x954E, 0x954F, 0x9552, + 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955B, 0x955E, + 0x955F, 0x955D, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567, + 0x9568, 0x9569, 0x956A, 0x956B, 0x956C, 0x956F, 0x9571, 0x9572, + 0x9573, 0x953A, 0x77E7, 0x77EC, 0x96C9, 0x79D5, 0x79ED, 0x79E3, + 0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, 0x7A1E, 0x7A14, 0, +plane f0 +at 0x40 + 0x9908, 0x9909, 0x990A, 0x990B, 0x990C, 0x990E, 0x990F, 0x9911, + 0x9912, 0x9913, 0x9914, 0x9915, 0x9916, 0x9917, 0x9918, 0x9919, + 0x991A, 0x991B, 0x991C, 0x991D, 0x991E, 0x991F, 0x9920, 0x9921, + 0x9922, 0x9923, 0x9924, 0x9925, 0x9926, 0x9927, 0x9928, 0x9929, + 0x992A, 0x992B, 0x992C, 0x992D, 0x992F, 0x9930, 0x9931, 0x9932, + 0x9933, 0x9934, 0x9935, 0x9936, 0x9937, 0x9938, 0x9939, 0x993A, + 0x993B, 0x993C, 0x993D, 0x993E, 0x993F, 0x9940, 0x9941, 0x9942, + 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, 0x9949, 0, + 0x994A, 0x994B, 0x994C, 0x994D, 0x994E, 0x994F, 0x9950, 0x9951, + 0x9952, 0x9953, 0x9956, 0x9957, 0x9958, 0x9959, 0x995A, 0x995B, + 0x995C, 0x995D, 0x995E, 0x995F, 0x9960, 0x9961, 0x9962, 0x9964, + 0x9966, 0x9973, 0x9978, 0x9979, 0x997B, 0x997E, 0x9982, 0x9983, + 0x9989, 0x7A39, 0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, 0x7688, + 0x768E, 0x7693, 0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, 0x9E20, + 0x9E22, 0x9E28, 0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, 0x9E31, + 0x9E36, 0x9E38, 0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, 0x9E42, + 0x9E44, 0x9E46, 0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, 0x9E4E, + 0x9E51, 0x9E55, 0x9E57, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, 0x9E63, + 0x9E66, 0x9E67, 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, 0x9E71, + 0x9E6D, 0x9E73, 0x7592, 0x7594, 0x7596, 0x75A0, 0x759D, 0x75AC, + 0x75A3, 0x75B3, 0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, 0x75C3, + 0x75C2, 0x75D6, 0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, 0x75EB, + 0x75E7, 0x7603, 0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, 0x7605, + 0x760C, 0x7617, 0x760A, 0x7625, 0x7618, 0x7615, 0x7619, 0, +plane f1 +at 0x40 + 0x998C, 0x998E, 0x999A, 0x999B, 0x999C, 0x999D, 0x999E, 0x999F, + 0x99A0, 0x99A1, 0x99A2, 0x99A3, 0x99A4, 0x99A6, 0x99A7, 0x99A9, + 0x99AA, 0x99AB, 0x99AC, 0x99AD, 0x99AE, 0x99AF, 0x99B0, 0x99B1, + 0x99B2, 0x99B3, 0x99B4, 0x99B5, 0x99B6, 0x99B7, 0x99B8, 0x99B9, + 0x99BA, 0x99BB, 0x99BC, 0x99BD, 0x99BE, 0x99BF, 0x99C0, 0x99C1, + 0x99C2, 0x99C3, 0x99C4, 0x99C5, 0x99C6, 0x99C7, 0x99C8, 0x99C9, + 0x99CA, 0x99CB, 0x99CC, 0x99CD, 0x99CE, 0x99CF, 0x99D0, 0x99D1, + 0x99D2, 0x99D3, 0x99D4, 0x99D5, 0x99D6, 0x99D7, 0x99D8, 0, + 0x99D9, 0x99DA, 0x99DB, 0x99DC, 0x99DD, 0x99DE, 0x99DF, 0x99E0, + 0x99E1, 0x99E2, 0x99E3, 0x99E4, 0x99E5, 0x99E6, 0x99E7, 0x99E8, + 0x99E9, 0x99EA, 0x99EB, 0x99EC, 0x99ED, 0x99EE, 0x99EF, 0x99F0, + 0x99F1, 0x99F2, 0x99F3, 0x99F4, 0x99F5, 0x99F6, 0x99F7, 0x99F8, + 0x99F9, 0x761B, 0x763C, 0x7622, 0x7620, 0x7640, 0x762D, 0x7630, + 0x763F, 0x7635, 0x7643, 0x763E, 0x7633, 0x764D, 0x765E, 0x7654, + 0x765C, 0x7656, 0x766B, 0x766F, 0x7FCA, 0x7AE6, 0x7A78, 0x7A79, + 0x7A80, 0x7A86, 0x7A88, 0x7A95, 0x7AA6, 0x7AA0, 0x7AAC, 0x7AA8, + 0x7AAD, 0x7AB3, 0x8864, 0x8869, 0x8872, 0x887D, 0x887F, 0x8882, + 0x88A2, 0x88C6, 0x88B7, 0x88BC, 0x88C9, 0x88E2, 0x88CE, 0x88E3, + 0x88E5, 0x88F1, 0x891A, 0x88FC, 0x88E8, 0x88FE, 0x88F0, 0x8921, + 0x8919, 0x8913, 0x891B, 0x890A, 0x8934, 0x892B, 0x8936, 0x8941, + 0x8966, 0x897B, 0x758B, 0x80E5, 0x76B2, 0x76B4, 0x77DC, 0x8012, + 0x8014, 0x8016, 0x801C, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, + 0x8029, 0x8028, 0x8031, 0x800B, 0x8035, 0x8043, 0x8046, 0x804D, + 0x8052, 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883, 0, +plane f2 +at 0x40 + 0x99FA, 0x99FB, 0x99FC, 0x99FD, 0x99FE, 0x99FF, 0x9A00, 0x9A01, + 0x9A02, 0x9A03, 0x9A04, 0x9A05, 0x9A06, 0x9A07, 0x9A08, 0x9A09, + 0x9A0A, 0x9A0B, 0x9A0C, 0x9A0D, 0x9A0E, 0x9A0F, 0x9A10, 0x9A11, + 0x9A12, 0x9A13, 0x9A14, 0x9A15, 0x9A16, 0x9A17, 0x9A18, 0x9A19, + 0x9A1A, 0x9A1B, 0x9A1C, 0x9A1D, 0x9A1E, 0x9A1F, 0x9A20, 0x9A21, + 0x9A22, 0x9A23, 0x9A24, 0x9A25, 0x9A26, 0x9A27, 0x9A28, 0x9A29, + 0x9A2A, 0x9A2B, 0x9A2C, 0x9A2D, 0x9A2E, 0x9A2F, 0x9A30, 0x9A31, + 0x9A32, 0x9A33, 0x9A34, 0x9A35, 0x9A36, 0x9A37, 0x9A38, 0, + 0x9A39, 0x9A3A, 0x9A3B, 0x9A3C, 0x9A3D, 0x9A3E, 0x9A3F, 0x9A40, + 0x9A41, 0x9A42, 0x9A43, 0x9A44, 0x9A45, 0x9A46, 0x9A47, 0x9A48, + 0x9A49, 0x9A4A, 0x9A4B, 0x9A4C, 0x9A4D, 0x9A4E, 0x9A4F, 0x9A50, + 0x9A51, 0x9A52, 0x9A53, 0x9A54, 0x9A55, 0x9A56, 0x9A57, 0x9A58, + 0x9A59, 0x9889, 0x988C, 0x988D, 0x988F, 0x9894, 0x989A, 0x989B, + 0x989E, 0x989F, 0x98A1, 0x98A2, 0x98A5, 0x98A6, 0x864D, 0x8654, + 0x866C, 0x866E, 0x867F, 0x867A, 0x867C, 0x867B, 0x86A8, 0x868D, + 0x868B, 0x86AC, 0x869D, 0x86A7, 0x86A3, 0x86AA, 0x8693, 0x86A9, + 0x86B6, 0x86C4, 0x86B5, 0x86CE, 0x86B0, 0x86BA, 0x86B1, 0x86AF, + 0x86C9, 0x86CF, 0x86B4, 0x86E9, 0x86F1, 0x86F2, 0x86ED, 0x86F3, + 0x86D0, 0x8713, 0x86DE, 0x86F4, 0x86DF, 0x86D8, 0x86D1, 0x8703, + 0x8707, 0x86F8, 0x8708, 0x870A, 0x870D, 0x8709, 0x8723, 0x873B, + 0x871E, 0x8725, 0x872E, 0x871A, 0x873E, 0x8748, 0x8734, 0x8731, + 0x8729, 0x8737, 0x873F, 0x8782, 0x8722, 0x877D, 0x877E, 0x877B, + 0x8760, 0x8770, 0x874C, 0x876E, 0x878B, 0x8753, 0x8763, 0x877C, + 0x8764, 0x8759, 0x8765, 0x8793, 0x87AF, 0x87A8, 0x87D2, 0, +plane f3 +at 0x40 + 0x9A5A, 0x9A5B, 0x9A5C, 0x9A5D, 0x9A5E, 0x9A5F, 0x9A60, 0x9A61, + 0x9A62, 0x9A63, 0x9A64, 0x9A65, 0x9A66, 0x9A67, 0x9A68, 0x9A69, + 0x9A6A, 0x9A6B, 0x9A72, 0x9A83, 0x9A89, 0x9A8D, 0x9A8E, 0x9A94, + 0x9A95, 0x9A99, 0x9AA6, 0x9AA9, 0x9AAA, 0x9AAB, 0x9AAC, 0x9AAD, + 0x9AAE, 0x9AAF, 0x9AB2, 0x9AB3, 0x9AB4, 0x9AB5, 0x9AB9, 0x9ABB, + 0x9ABD, 0x9ABE, 0x9ABF, 0x9AC3, 0x9AC4, 0x9AC6, 0x9AC7, 0x9AC8, + 0x9AC9, 0x9ACA, 0x9ACD, 0x9ACE, 0x9ACF, 0x9AD0, 0x9AD2, 0x9AD4, + 0x9AD5, 0x9AD6, 0x9AD7, 0x9AD9, 0x9ADA, 0x9ADB, 0x9ADC, 0, + 0x9ADD, 0x9ADE, 0x9AE0, 0x9AE2, 0x9AE3, 0x9AE4, 0x9AE5, 0x9AE7, + 0x9AE8, 0x9AE9, 0x9AEA, 0x9AEC, 0x9AEE, 0x9AF0, 0x9AF1, 0x9AF2, + 0x9AF3, 0x9AF4, 0x9AF5, 0x9AF6, 0x9AF7, 0x9AF8, 0x9AFA, 0x9AFC, + 0x9AFD, 0x9AFE, 0x9AFF, 0x9B00, 0x9B01, 0x9B02, 0x9B04, 0x9B05, + 0x9B06, 0x87C6, 0x8788, 0x8785, 0x87AD, 0x8797, 0x8783, 0x87AB, + 0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, 0x87D3, 0x87BD, 0x87D1, + 0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, 0x87EE, 0x8816, 0x8813, + 0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, 0x883C, 0x7F36, 0x7F42, + 0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, 0x7B08, 0x7B03, 0x7B04, + 0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, 0x7B38, 0x7B2A, 0x7B19, + 0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, 0x7B33, 0x7B3E, 0x7B1E, + 0x7B58, 0x7B5A, 0x7B45, 0x7B75, 0x7B4C, 0x7B5D, 0x7B60, 0x7B6E, + 0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, 0x7BA6, 0x7BA7, 0x7BB8, + 0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, 0x7B9C, 0x7BA2, 0x7BAB, + 0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, 0x7BDA, 0x7BE5, 0x7BE6, + 0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, 0x7C16, 0x7C0B, 0, +plane f4 +at 0x40 + 0x9B07, 0x9B09, 0x9B0A, 0x9B0B, 0x9B0C, 0x9B0D, 0x9B0E, 0x9B10, + 0x9B11, 0x9B12, 0x9B14, 0x9B15, 0x9B16, 0x9B17, 0x9B18, 0x9B19, + 0x9B1A, 0x9B1B, 0x9B1C, 0x9B1D, 0x9B1E, 0x9B20, 0x9B21, 0x9B22, + 0x9B24, 0x9B25, 0x9B26, 0x9B27, 0x9B28, 0x9B29, 0x9B2A, 0x9B2B, + 0x9B2C, 0x9B2D, 0x9B2E, 0x9B30, 0x9B31, 0x9B33, 0x9B34, 0x9B35, + 0x9B36, 0x9B37, 0x9B38, 0x9B39, 0x9B3A, 0x9B3D, 0x9B3E, 0x9B3F, + 0x9B40, 0x9B46, 0x9B4A, 0x9B4B, 0x9B4C, 0x9B4E, 0x9B50, 0x9B52, + 0x9B53, 0x9B55, 0x9B56, 0x9B57, 0x9B58, 0x9B59, 0x9B5A, 0, + 0x9B5B, 0x9B5C, 0x9B5D, 0x9B5E, 0x9B5F, 0x9B60, 0x9B61, 0x9B62, + 0x9B63, 0x9B64, 0x9B65, 0x9B66, 0x9B67, 0x9B68, 0x9B69, 0x9B6A, + 0x9B6B, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B6F, 0x9B70, 0x9B71, 0x9B72, + 0x9B73, 0x9B74, 0x9B75, 0x9B76, 0x9B77, 0x9B78, 0x9B79, 0x9B7A, + 0x9B7B, 0x7C1F, 0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, 0x81FE, + 0x8201, 0x8202, 0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, 0x8223, + 0x822D, 0x822F, 0x8228, 0x822B, 0x8238, 0x823B, 0x8233, 0x8234, + 0x823E, 0x8244, 0x8249, 0x824B, 0x824F, 0x825A, 0x825F, 0x8268, + 0x887E, 0x8885, 0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, 0x7F9F, + 0x7FA7, 0x7FAF, 0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, 0x7C9D, + 0x7C9C, 0x7C9E, 0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, 0x7CC7, + 0x7CCC, 0x7CCD, 0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, 0x66A8, + 0x7FBF, 0x7FCE, 0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FEE, + 0x7FF3, 0x7CF8, 0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, 0x9EB8, + 0x9EB4, 0x8D73, 0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, 0x8D6D, + 0x8C47, 0x8C49, 0x914A, 0x9150, 0x914E, 0x914F, 0x9164, 0, +plane f5 +at 0x40 + 0x9B7C, 0x9B7D, 0x9B7E, 0x9B7F, 0x9B80, 0x9B81, 0x9B82, 0x9B83, + 0x9B84, 0x9B85, 0x9B86, 0x9B87, 0x9B88, 0x9B89, 0x9B8A, 0x9B8B, + 0x9B8C, 0x9B8D, 0x9B8E, 0x9B8F, 0x9B90, 0x9B91, 0x9B92, 0x9B93, + 0x9B94, 0x9B95, 0x9B96, 0x9B97, 0x9B98, 0x9B99, 0x9B9A, 0x9B9B, + 0x9B9C, 0x9B9D, 0x9B9E, 0x9B9F, 0x9BA0, 0x9BA1, 0x9BA2, 0x9BA3, + 0x9BA4, 0x9BA5, 0x9BA6, 0x9BA7, 0x9BA8, 0x9BA9, 0x9BAA, 0x9BAB, + 0x9BAC, 0x9BAD, 0x9BAE, 0x9BAF, 0x9BB0, 0x9BB1, 0x9BB2, 0x9BB3, + 0x9BB4, 0x9BB5, 0x9BB6, 0x9BB7, 0x9BB8, 0x9BB9, 0x9BBA, 0, + 0x9BBB, 0x9BBC, 0x9BBD, 0x9BBE, 0x9BBF, 0x9BC0, 0x9BC1, 0x9BC2, + 0x9BC3, 0x9BC4, 0x9BC5, 0x9BC6, 0x9BC7, 0x9BC8, 0x9BC9, 0x9BCA, + 0x9BCB, 0x9BCC, 0x9BCD, 0x9BCE, 0x9BCF, 0x9BD0, 0x9BD1, 0x9BD2, + 0x9BD3, 0x9BD4, 0x9BD5, 0x9BD6, 0x9BD7, 0x9BD8, 0x9BD9, 0x9BDA, + 0x9BDB, 0x9162, 0x9161, 0x9170, 0x9169, 0x916F, 0x917D, 0x917E, + 0x9172, 0x9174, 0x9179, 0x918C, 0x9185, 0x9190, 0x918D, 0x9191, + 0x91A2, 0x91A3, 0x91AA, 0x91AD, 0x91AE, 0x91AF, 0x91B5, 0x91B4, + 0x91BA, 0x8C55, 0x9E7E, 0x8DB8, 0x8DEB, 0x8E05, 0x8E59, 0x8E69, + 0x8DB5, 0x8DBF, 0x8DBC, 0x8DBA, 0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA, + 0x8DDE, 0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8, + 0x8DE3, 0x8DF9, 0x8DFB, 0x8DE4, 0x8E09, 0x8DFD, 0x8E14, 0x8E1D, + 0x8E1F, 0x8E2C, 0x8E2E, 0x8E23, 0x8E2F, 0x8E3A, 0x8E40, 0x8E39, + 0x8E35, 0x8E3D, 0x8E31, 0x8E49, 0x8E41, 0x8E42, 0x8E51, 0x8E52, + 0x8E4A, 0x8E70, 0x8E76, 0x8E7C, 0x8E6F, 0x8E74, 0x8E85, 0x8E8F, + 0x8E94, 0x8E90, 0x8E9C, 0x8E9E, 0x8C78, 0x8C82, 0x8C8A, 0x8C85, + 0x8C98, 0x8C94, 0x659B, 0x89D6, 0x89DE, 0x89DA, 0x89DC, 0, +plane f6 +at 0x40 + 0x9BDC, 0x9BDD, 0x9BDE, 0x9BDF, 0x9BE0, 0x9BE1, 0x9BE2, 0x9BE3, + 0x9BE4, 0x9BE5, 0x9BE6, 0x9BE7, 0x9BE8, 0x9BE9, 0x9BEA, 0x9BEB, + 0x9BEC, 0x9BED, 0x9BEE, 0x9BEF, 0x9BF0, 0x9BF1, 0x9BF2, 0x9BF3, + 0x9BF4, 0x9BF5, 0x9BF6, 0x9BF7, 0x9BF8, 0x9BF9, 0x9BFA, 0x9BFB, + 0x9BFC, 0x9BFD, 0x9BFE, 0x9BFF, 0x9C00, 0x9C01, 0x9C02, 0x9C03, + 0x9C04, 0x9C05, 0x9C06, 0x9C07, 0x9C08, 0x9C09, 0x9C0A, 0x9C0B, + 0x9C0C, 0x9C0D, 0x9C0E, 0x9C0F, 0x9C10, 0x9C11, 0x9C12, 0x9C13, + 0x9C14, 0x9C15, 0x9C16, 0x9C17, 0x9C18, 0x9C19, 0x9C1A, 0, + 0x9C1B, 0x9C1C, 0x9C1D, 0x9C1E, 0x9C1F, 0x9C20, 0x9C21, 0x9C22, + 0x9C23, 0x9C24, 0x9C25, 0x9C26, 0x9C27, 0x9C28, 0x9C29, 0x9C2A, + 0x9C2B, 0x9C2C, 0x9C2D, 0x9C2E, 0x9C2F, 0x9C30, 0x9C31, 0x9C32, + 0x9C33, 0x9C34, 0x9C35, 0x9C36, 0x9C37, 0x9C38, 0x9C39, 0x9C3A, + 0x9C3B, 0x89E5, 0x89EB, 0x89EF, 0x8A3E, 0x8B26, 0x9753, 0x96E9, + 0x96F3, 0x96EF, 0x9706, 0x9701, 0x9708, 0x970F, 0x970E, 0x972A, + 0x972D, 0x9730, 0x973E, 0x9F80, 0x9F83, 0x9F85, 0x9F86, 0x9F87, + 0x9F88, 0x9F89, 0x9F8A, 0x9F8C, 0x9EFE, 0x9F0B, 0x9F0D, 0x96B9, + 0x96BC, 0x96BD, 0x96CE, 0x96D2, 0x77BF, 0x96E0, 0x928E, 0x92AE, + 0x92C8, 0x933E, 0x936A, 0x93CA, 0x938F, 0x943E, 0x946B, 0x9C7F, + 0x9C82, 0x9C85, 0x9C86, 0x9C87, 0x9C88, 0x7A23, 0x9C8B, 0x9C8E, + 0x9C90, 0x9C91, 0x9C92, 0x9C94, 0x9C95, 0x9C9A, 0x9C9B, 0x9C9E, + 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA5, 0x9CA6, 0x9CA7, + 0x9CA8, 0x9CA9, 0x9CAB, 0x9CAD, 0x9CAE, 0x9CB0, 0x9CB1, 0x9CB2, + 0x9CB3, 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CBA, 0x9CBB, 0x9CBC, + 0x9CBD, 0x9CC4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CCA, 0x9CCB, 0, +plane f7 +at 0x40 + 0x9C3C, 0x9C3D, 0x9C3E, 0x9C3F, 0x9C40, 0x9C41, 0x9C42, 0x9C43, + 0x9C44, 0x9C45, 0x9C46, 0x9C47, 0x9C48, 0x9C49, 0x9C4A, 0x9C4B, + 0x9C4C, 0x9C4D, 0x9C4E, 0x9C4F, 0x9C50, 0x9C51, 0x9C52, 0x9C53, + 0x9C54, 0x9C55, 0x9C56, 0x9C57, 0x9C58, 0x9C59, 0x9C5A, 0x9C5B, + 0x9C5C, 0x9C5D, 0x9C5E, 0x9C5F, 0x9C60, 0x9C61, 0x9C62, 0x9C63, + 0x9C64, 0x9C65, 0x9C66, 0x9C67, 0x9C68, 0x9C69, 0x9C6A, 0x9C6B, + 0x9C6C, 0x9C6D, 0x9C6E, 0x9C6F, 0x9C70, 0x9C71, 0x9C72, 0x9C73, + 0x9C74, 0x9C75, 0x9C76, 0x9C77, 0x9C78, 0x9C79, 0x9C7A, 0, + 0x9C7B, 0x9C7D, 0x9C7E, 0x9C80, 0x9C83, 0x9C84, 0x9C89, 0x9C8A, + 0x9C8C, 0x9C8F, 0x9C93, 0x9C96, 0x9C97, 0x9C98, 0x9C99, 0x9C9D, + 0x9CAA, 0x9CAC, 0x9CAF, 0x9CB9, 0x9CBE, 0x9CBF, 0x9CC0, 0x9CC1, + 0x9CC2, 0x9CC8, 0x9CC9, 0x9CD1, 0x9CD2, 0x9CDA, 0x9CDB, 0x9CE0, + 0x9CE1, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x9CD4, + 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x9CE2, + 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x97A3, + 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x9ABA, + 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x9AD1, + 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x98E8, + 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x9AE1, 0x9AE6, 0x9AEF, + 0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, 0x9B0F, 0x9B13, 0x9B1F, + 0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, 0x9E87, 0x9E88, 0x9E8B, + 0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EE0, + 0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, 0x9EEA, 0x9EEF, 0x9F22, + 0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, 0x9F3E, 0x9F44, 0, +plane f8 +at 0x40 + 0x9CE3, 0x9CE4, 0x9CE5, 0x9CE6, 0x9CE7, 0x9CE8, 0x9CE9, 0x9CEA, + 0x9CEB, 0x9CEC, 0x9CED, 0x9CEE, 0x9CEF, 0x9CF0, 0x9CF1, 0x9CF2, + 0x9CF3, 0x9CF4, 0x9CF5, 0x9CF6, 0x9CF7, 0x9CF8, 0x9CF9, 0x9CFA, + 0x9CFB, 0x9CFC, 0x9CFD, 0x9CFE, 0x9CFF, 0x9D00, 0x9D01, 0x9D02, + 0x9D03, 0x9D04, 0x9D05, 0x9D06, 0x9D07, 0x9D08, 0x9D09, 0x9D0A, + 0x9D0B, 0x9D0C, 0x9D0D, 0x9D0E, 0x9D0F, 0x9D10, 0x9D11, 0x9D12, + 0x9D13, 0x9D14, 0x9D15, 0x9D16, 0x9D17, 0x9D18, 0x9D19, 0x9D1A, + 0x9D1B, 0x9D1C, 0x9D1D, 0x9D1E, 0x9D1F, 0x9D20, 0x9D21, 0, + 0x9D22, 0x9D23, 0x9D24, 0x9D25, 0x9D26, 0x9D27, 0x9D28, 0x9D29, + 0x9D2A, 0x9D2B, 0x9D2C, 0x9D2D, 0x9D2E, 0x9D2F, 0x9D30, 0x9D31, + 0x9D32, 0x9D33, 0x9D34, 0x9D35, 0x9D36, 0x9D37, 0x9D38, 0x9D39, + 0x9D3A, 0x9D3B, 0x9D3C, 0x9D3D, 0x9D3E, 0x9D3F, 0x9D40, 0x9D41, + 0x9D42, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane f9 +at 0x40 + 0x9D43, 0x9D44, 0x9D45, 0x9D46, 0x9D47, 0x9D48, 0x9D49, 0x9D4A, + 0x9D4B, 0x9D4C, 0x9D4D, 0x9D4E, 0x9D4F, 0x9D50, 0x9D51, 0x9D52, + 0x9D53, 0x9D54, 0x9D55, 0x9D56, 0x9D57, 0x9D58, 0x9D59, 0x9D5A, + 0x9D5B, 0x9D5C, 0x9D5D, 0x9D5E, 0x9D5F, 0x9D60, 0x9D61, 0x9D62, + 0x9D63, 0x9D64, 0x9D65, 0x9D66, 0x9D67, 0x9D68, 0x9D69, 0x9D6A, + 0x9D6B, 0x9D6C, 0x9D6D, 0x9D6E, 0x9D6F, 0x9D70, 0x9D71, 0x9D72, + 0x9D73, 0x9D74, 0x9D75, 0x9D76, 0x9D77, 0x9D78, 0x9D79, 0x9D7A, + 0x9D7B, 0x9D7C, 0x9D7D, 0x9D7E, 0x9D7F, 0x9D80, 0x9D81, 0, + 0x9D82, 0x9D83, 0x9D84, 0x9D85, 0x9D86, 0x9D87, 0x9D88, 0x9D89, + 0x9D8A, 0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, 0x9D8F, 0x9D90, 0x9D91, + 0x9D92, 0x9D93, 0x9D94, 0x9D95, 0x9D96, 0x9D97, 0x9D98, 0x9D99, + 0x9D9A, 0x9D9B, 0x9D9C, 0x9D9D, 0x9D9E, 0x9D9F, 0x9DA0, 0x9DA1, + 0x9DA2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fa +at 0x40 + 0x9DA3, 0x9DA4, 0x9DA5, 0x9DA6, 0x9DA7, 0x9DA8, 0x9DA9, 0x9DAA, + 0x9DAB, 0x9DAC, 0x9DAD, 0x9DAE, 0x9DAF, 0x9DB0, 0x9DB1, 0x9DB2, + 0x9DB3, 0x9DB4, 0x9DB5, 0x9DB6, 0x9DB7, 0x9DB8, 0x9DB9, 0x9DBA, + 0x9DBB, 0x9DBC, 0x9DBD, 0x9DBE, 0x9DBF, 0x9DC0, 0x9DC1, 0x9DC2, + 0x9DC3, 0x9DC4, 0x9DC5, 0x9DC6, 0x9DC7, 0x9DC8, 0x9DC9, 0x9DCA, + 0x9DCB, 0x9DCC, 0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, 0x9DD1, 0x9DD2, + 0x9DD3, 0x9DD4, 0x9DD5, 0x9DD6, 0x9DD7, 0x9DD8, 0x9DD9, 0x9DDA, + 0x9DDB, 0x9DDC, 0x9DDD, 0x9DDE, 0x9DDF, 0x9DE0, 0x9DE1, 0, + 0x9DE2, 0x9DE3, 0x9DE4, 0x9DE5, 0x9DE6, 0x9DE7, 0x9DE8, 0x9DE9, + 0x9DEA, 0x9DEB, 0x9DEC, 0x9DED, 0x9DEE, 0x9DEF, 0x9DF0, 0x9DF1, + 0x9DF2, 0x9DF3, 0x9DF4, 0x9DF5, 0x9DF6, 0x9DF7, 0x9DF8, 0x9DF9, + 0x9DFA, 0x9DFB, 0x9DFC, 0x9DFD, 0x9DFE, 0x9DFF, 0x9E00, 0x9E01, + 0x9E02, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fb +at 0x40 + 0x9E03, 0x9E04, 0x9E05, 0x9E06, 0x9E07, 0x9E08, 0x9E09, 0x9E0A, + 0x9E0B, 0x9E0C, 0x9E0D, 0x9E0E, 0x9E0F, 0x9E10, 0x9E11, 0x9E12, + 0x9E13, 0x9E14, 0x9E15, 0x9E16, 0x9E17, 0x9E18, 0x9E19, 0x9E1A, + 0x9E1B, 0x9E1C, 0x9E1D, 0x9E1E, 0x9E24, 0x9E27, 0x9E2E, 0x9E30, + 0x9E34, 0x9E3B, 0x9E3C, 0x9E40, 0x9E4D, 0x9E50, 0x9E52, 0x9E53, + 0x9E54, 0x9E56, 0x9E59, 0x9E5D, 0x9E5F, 0x9E60, 0x9E61, 0x9E62, + 0x9E65, 0x9E6E, 0x9E6F, 0x9E72, 0x9E74, 0x9E75, 0x9E76, 0x9E77, + 0x9E78, 0x9E79, 0x9E7A, 0x9E7B, 0x9E7C, 0x9E7D, 0x9E80, 0, + 0x9E81, 0x9E83, 0x9E84, 0x9E85, 0x9E86, 0x9E89, 0x9E8A, 0x9E8C, + 0x9E8D, 0x9E8E, 0x9E8F, 0x9E90, 0x9E91, 0x9E94, 0x9E95, 0x9E96, + 0x9E97, 0x9E98, 0x9E99, 0x9E9A, 0x9E9B, 0x9E9C, 0x9E9E, 0x9EA0, + 0x9EA1, 0x9EA2, 0x9EA3, 0x9EA4, 0x9EA5, 0x9EA7, 0x9EA8, 0x9EA9, + 0x9EAA, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fc +at 0x40 + 0x9EAB, 0x9EAC, 0x9EAD, 0x9EAE, 0x9EAF, 0x9EB0, 0x9EB1, 0x9EB2, + 0x9EB3, 0x9EB5, 0x9EB6, 0x9EB7, 0x9EB9, 0x9EBA, 0x9EBC, 0x9EBF, + 0x9EC0, 0x9EC1, 0x9EC2, 0x9EC3, 0x9EC5, 0x9EC6, 0x9EC7, 0x9EC8, + 0x9ECA, 0x9ECB, 0x9ECC, 0x9ED0, 0x9ED2, 0x9ED3, 0x9ED5, 0x9ED6, + 0x9ED7, 0x9ED9, 0x9EDA, 0x9EDE, 0x9EE1, 0x9EE3, 0x9EE4, 0x9EE6, + 0x9EE8, 0x9EEB, 0x9EEC, 0x9EED, 0x9EEE, 0x9EF0, 0x9EF1, 0x9EF2, + 0x9EF3, 0x9EF4, 0x9EF5, 0x9EF6, 0x9EF7, 0x9EF8, 0x9EFA, 0x9EFD, + 0x9EFF, 0x9F00, 0x9F01, 0x9F02, 0x9F03, 0x9F04, 0x9F05, 0, + 0x9F06, 0x9F07, 0x9F08, 0x9F09, 0x9F0A, 0x9F0C, 0x9F0F, 0x9F11, + 0x9F12, 0x9F14, 0x9F15, 0x9F16, 0x9F18, 0x9F1A, 0x9F1B, 0x9F1C, + 0x9F1D, 0x9F1E, 0x9F1F, 0x9F21, 0x9F23, 0x9F24, 0x9F25, 0x9F26, + 0x9F27, 0x9F28, 0x9F29, 0x9F2A, 0x9F2B, 0x9F2D, 0x9F2E, 0x9F30, + 0x9F31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fd +at 0x40 + 0x9F32, 0x9F33, 0x9F34, 0x9F35, 0x9F36, 0x9F38, 0x9F3A, 0x9F3C, + 0x9F3F, 0x9F40, 0x9F41, 0x9F42, 0x9F43, 0x9F45, 0x9F46, 0x9F47, + 0x9F48, 0x9F49, 0x9F4A, 0x9F4B, 0x9F4C, 0x9F4D, 0x9F4E, 0x9F4F, + 0x9F52, 0x9F53, 0x9F54, 0x9F55, 0x9F56, 0x9F57, 0x9F58, 0x9F59, + 0x9F5A, 0x9F5B, 0x9F5C, 0x9F5D, 0x9F5E, 0x9F5F, 0x9F60, 0x9F61, + 0x9F62, 0x9F63, 0x9F64, 0x9F65, 0x9F66, 0x9F67, 0x9F68, 0x9F69, + 0x9F6A, 0x9F6B, 0x9F6C, 0x9F6D, 0x9F6E, 0x9F6F, 0x9F70, 0x9F71, + 0x9F72, 0x9F73, 0x9F74, 0x9F75, 0x9F76, 0x9F77, 0x9F78, 0, + 0x9F79, 0x9F7A, 0x9F7B, 0x9F7C, 0x9F7D, 0x9F7E, 0x9F81, 0x9F82, + 0x9F8D, 0x9F8E, 0x9F8F, 0x9F90, 0x9F91, 0x9F92, 0x9F93, 0x9F94, + 0x9F95, 0x9F96, 0x9F97, 0x9F98, 0x9F9C, 0x9F9D, 0x9F9E, 0x9FA1, + 0x9FA2, 0x9FA3, 0x9FA4, 0x9FA5, 0xF92C, 0xF979, 0xF995, 0xF9E7, + 0xF9F1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +plane fe +at 0x40 + 0xFA0C, 0xFA0D, 0xFA0E, 0xFA0F, 0xFA11, 0xFA13, 0xFA14, 0xFA18, + 0xFA1F, 0xFA20, 0xFA21, 0xFA23, 0xFA24, 0xFA27, 0xFA28, 0xFA29, + 0xE815, 0xE816, 0xE817, 0xE818, 0xE819, 0xE81A, 0xE81B, 0xE81C, + 0xE81D, 0xE81E, 0xE81F, 0xE820, 0xE821, 0xE822, 0xE823, 0xE824, + 0xE825, 0xE826, 0xE827, 0xE828, 0xE829, 0xE82A, 0xE82B, 0xE82C, + 0xE82D, 0xE82E, 0xE82F, 0xE830, 0xE831, 0xE832, 0xE833, 0xE834, + 0xE835, 0xE836, 0xE837, 0xE838, 0xE839, 0xE83A, 0xE83B, 0xE83C, + 0xE83D, 0xE83E, 0xE83F, 0xE840, 0xE841, 0xE842, 0xE843, 0, + 0xE844, 0xE845, 0xE846, 0xE847, 0xE848, 0xE849, 0xE84A, 0xE84B, + 0xE84C, 0xE84D, 0xE84E, 0xE84F, 0xE850, 0xE851, 0xE852, 0xE853, + 0xE854, 0xE855, 0xE856, 0xE857, 0xE858, 0xE859, 0xE85A, 0xE85B, + 0xE85C, 0xE85D, 0xE85E, 0xE85F, 0xE860, 0xE861, 0xE862, 0xE863, + 0xE864, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/maps/unicode-sample.map b/application/third_party/dompdf/lib/ttf2ufm/src/maps/unicode-sample.map new file mode 100755 index 00000000..0e57967c --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/maps/unicode-sample.map @@ -0,0 +1,158 @@ +# this file is a sample Unicode map description. +# It describes which glyphs are to be included in the font +# and at which character position they are to be put. + +# If the character position is greater than 255, the glyph is included, but +# does not appear in the encoding table (you must then use font reencoding +# to use this glyph). +# That makes it possible to have more than 256 glyphs in a font. +# Currently the maximum supported number of glyphs is 1024. + +# Use this file as the argument to ttf2pt1's -L option. + +# 1999-11-24 Thomas.Henlich@mailbox.tu-dresden.de +# 2000-03-01 Sergey Babkin: added 3rd format + +# comment lines start with '#' or '%' or '//' + +# The default source encoding table in the TTF file is Unicode (pid=3,eid=1). +# However a map may specify another source encoding with the "id " +# directive. If this directive is used at the beginning of the map file, +# it applies to the whole file. If it is used after a "plane" directive, +# then it sets the source encoding for this particular destination plane +# (possibly overriding the file-wide id directive). The user can also +# specify the source encoding explicitly at the comman line in the +# argument to the option -L. This used-specified source encoding overrides +# any id directives in the map file. + +# examples: + +# same as Unicode (default) +id 3 1 + +# One file may contain multiple actual translation tables. Each particular +# table within a file is named a plane. The primary use of planes is +# for multi-plane Eastern fonts with over 256 glyphs: for them one TTF +# file gets converted into multiple Type1 files, with each resulting file +# containing one plane of the original font. But they may also be used +# in other creative ways. Each plane may be specified in different format +# although this is not recommended for aesthetical reasons. If a map file +# contains any specifications of planes then the plane argument MUST +# be specified to the converter with that map file. If a map file +# contains no specifications of planes then the plane argument MUST NOT +# be specified to the converter with that map file. +# +# The plane maps start from the plane directive and continue to the next +# plane directive or end of file. The plane directive must be located +# at the very beginning of a separate string and contain the word "plane" +# followed by whitespace and the plane name. The whitespace characters +# are not allowed in the plane names. Non-alphanumeric characters are +# discouraged in the plane names as well. + +# examples: + +plane 81 +=27 U+0027 APOSTROPHE + +plane otherplane + 0, 1, 2 + + +% There is one code assignment per line. +// Three formats are recognized: +# 1. optional whitespace, followed by '=', followed by a hex number +# (character position), followed by optional whitespace, followed by +# 'U+', followed by a four-digit hex number (the Unicode of the glyph we want +# here), followed by any number of characters. + +// example: + +=20 U+0020 SPACE +=48 U+0021 EXCLAMATION MARK +=22 U+0022 QUOTATION MARK +=23 U+0023 NUMBER SIGN +=24 U+0024 DOLLAR SIGN +=25 U+0025 PERCENT SIGN +=26 U+0026 AMPERSAND +=27 U+0027 APOSTROPHE + +=E0 U+042E CYRILLIC CAPITAL LETTER YU +=E1 U+0410 CYRILLIC CAPITAL LETTER A +=E2 U+0411 CYRILLIC CAPITAL LETTER BE +=E3 U+0426 CYRILLIC CAPITAL LETTER TSE +=E4 U+0414 CYRILLIC CAPITAL LETTER DE +=E5 U+0415 CYRILLIC CAPITAL LETTER IE +=E6 U+0424 CYRILLIC CAPITAL LETTER EF +=E7 U+0413 CYRILLIC CAPITAL LETTER GHE + +% 2. optional whitespace, followed by '<', followed by one or more +% non-whitespace characters, +% followed by optional whitespace, followed by '/x', followed by +% a hex number (character position), followed by optional +% whitespace, followed by '' and any number +% of characters. + +# example: + + /x40 LATIN CAPITAL LETTER I + /x41 LATIN SMALL LETTER T + /x43 LATIN SMALL LETTER R + /x44 LATIN SMALL LETTER O + /x45 LATIN SMALL LETTER C + /x46 LATIN SMALL LETTER K + /x47 LATIN SMALL LETTER S + + /xA4 EURO SIGN + +# 3. optional whitespace, followed by '!', followed by a hex number +# (character position), followed by optional whitespace, followed by +# 'U+', followed by a four-digit hex number (the Unicode of the glyph we want +# here), followed by the name of the glyph that will be used in the +# output file. + +# example: + +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent + +# 4. compact format: just list of unicodes separated by commas or ranges +# denoted by a dash between unicodes. These unicodes are mapped to +# the output codes starting from 0 and continuously increasing. +# It is possible to reset the current code by using the "at" directive +# which must start at beginning of the line and give the new current +# output code (which will be assigned to the next occuring unicode) +# as decimal, hexadecimal or octal in C notation. The "at directive must +# take a separate line. The spaces around unicodes don't matter. + +# example: +# map unicodes 0x40, 0x400, 0x4000 to the output codes 0, 1, 2 and unicodes +# 0xf010 - 0xf020, 0xf030 to the output codes 0x11-0x22 + + 0, 1, 2 +at 0x11 + 0xf010- 0xf020, 0xf030 + + +# the first format is used by Roman Czyborra on his fine WWW pages: +# http://czyborra.com/charsets/iso8859.html + +# the second format is used in the Linux locale charmaps files: +# /usr/share/i18n/charmaps/* + +# we don't need those glyphs in the encoding table +=100 U+0030 DIGIT ZERO +=101 U+0031 DIGIT ONE +=102 U+0032 DIGIT TWO +=103 U+0033 DIGIT THREE +=104 U+0034 DIGIT FOUR +=105 U+0035 DIGIT FIVE +=106 U+0036 DIGIT SIX +=107 U+0037 DIGIT SEVEN +=108 U+0039 DIGIT NINE +=109 U+0038 DIGIT EIGHT + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/Makefile b/application/third_party/dompdf/lib/ttf2ufm/src/other/Makefile new file mode 100755 index 00000000..87d17a90 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/Makefile @@ -0,0 +1,20 @@ + +PROGS= bz cmpf dmpf + +BZOBJS= bz.o bzscreen.o + +CFLAGS= -g + +all: $(PROGS) + +clean: + rm -f $(PROGS) *.o *.core core.* core + +bz: $(BZOBJS) + $(CC) $(CFLAGS) -o bz $(BZOBJS) + +cmpf: cmpf.c bmpfont.h + $(CC) $(CFLAGS) -o cmpf -I/usr/local/include -L/usr/local/lib cmpf.c -lt1 -lm + +dmpf: dmpf.c bmpfont.h + $(CC) $(CFLAGS) -o dmpf -I/usr/local/include -L/usr/local/lib dmpf.c -lt1 -lm diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/README b/application/third_party/dompdf/lib/ttf2ufm/src/other/README new file mode 100755 index 00000000..5e5ee756 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/README @@ -0,0 +1,127 @@ +Supplements for True Type to PostScript Type 1 Converter + +(Do not edit this file, it is generated from README.html!!!) + +bz +-- + +A small program to draw the Bezier curves on an alphanumeric display. +The recommended way of uing it is to run it from xterm with "Tiny" +(if you want higher magnification) or "Unreadable" (if you want +higher resolution) font and as big window size as possible. The size +of the window can be obtained by running "stty -a". For everything else +just "Use the source, Luke!" + +cmpf +---- + +A small program to compare the rendering of two supposedly +nearly-identical fonts at low resolutions. It requires the +T1LIB library. This program may be used to compare the +effect of various options of the converter on the resulting +fonts. Create two .pfa files, one with one set of options, +another with another set of options, then use this program +to compare them. + +dmpf +---- + +A small program to dump the bitmaps of all glyphs of the font +at low pixel sizes, up to 20 pixels. It requires the +T1LIB library. This program may be used to compare the +effect of changes in the T1LIB rasterizer and just for visual +search for rendering anomalies. + +lst.pl +------ + +A simple PERL script that generates an HTML file +with the full list of all characters in all +possible styles of the Variable-width and Fixed-width +fonts. This file is quite convenient to look +at the converted fonts in Netscape (or other +graphical browser). + +cntstems.pl +------ + +A simple PERL script that counts the required hint stack in the +interpreter to rasterize the glyphs of the font. May be quite +useful in search for missing glyphs which may be aborted due to +insufficient stack depth. + +showg +----- + +A PERL script that draws the glyphs and their interesting +metrics (such as coordinates of the dots, hints and blue zones) +in PostScript. It works only with un-encoded font files generated +by ttf2pt1. The intended use is like: + + showg [-c ]... ... >file.ps + gv file.ps # start the Ghostscript viewer + +As you can see, multiple glyphs may be specified. The glyphs may be +specified in one of three ways: + - as a decimal code (for example, 43 ) + - as a glyph name preceded by a slash (for example, /plus ) + - as a literal character preceded by a dot (for example, .+ ) + +So for example the following command would draw the same glyph "left +parenthesis" three times: + + showg file.t1a 40 /parenleft .\( >/file.ps + +Don't forget that some characters have to be protected from the shell +by backslash as shown above, or else the shell would try to interpret +them before passing to the program. + +One file (given as the first argument) is considered the main file +but multiple files can be specified with option -c for visual comparison +of the outlines. The glyphs from the main file are drawn in black +and supplemented with coordinate grid and sidebars for hints. The +glyphs from the comparison files are drawn in slightly lighter colors +(red, cyan, brown) and no supplemental information is provided for them. +Each use of option -c adds one comparison file, this option may be used +multiple times. If there are more than 3 comparison files the colors +repeat cyclically. + +So for example the following command would draw the same glyph "left +parenthesis" from three files on the same page: + + showg -c fileA.t1a -c fileB.t1a file.t1a .\( >/file.ps + +This program is quite valuable it you want to take a close-up view at +the font. + +The outlines are drawn in black, the ends of the curves and +lines are marked as dots, the first dots of the outlines +are fatter. The Blue Zones are drawn in light blue. The +substituted hints are marked in red, the global hints are +marked in blue. The coordinate grid is drawn in green. +The stems and the values of coordinates are for convenience +marked twice, on each size of the picture. + +showdf +------ + +A Perl script to find a list of differing glyphs in two versions of a font +file (for example, converted with different versions of ttf2pt1 or +with different options given to ttf2pt1) and feed this list into the showg +program for display. The intended use is like: + + showdf >file.ps + gv file.ps # start the Ghostscript viewer + +If both showdf and showg scripts are located in the +same directory, the command would look like: + + ./showdf ./showg font1.t1a font2.t1a >file.ps + +For decent results both font files should be converted from the same original +font and contain the same glyphs with the same names in the same order. +Otherwise most probably all the glyphs will be included, or a failure may +happen if some glyph is not found in one of the files. It is also a good +idea to convert the fonts for comparison with hinting disabled, otherwise +the differences in hinting may trigger the otherwise equal glyphs to be shown. + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/README.html b/application/third_party/dompdf/lib/ttf2ufm/src/other/README.html new file mode 100755 index 00000000..794a947d --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/README.html @@ -0,0 +1,176 @@ + + + +Supplements for True Type to PostScript Type 1 Converter + + + +

+Supplements for True Type to PostScript Type 1 Converter +

+ + + +

bz

+ + +A small program to draw the Bezier curves on an alphanumeric display. +The recommended way of uing it is to run it from xterm with "Tiny" +(if you want higher magnification) or "Unreadable" (if you want +higher resolution) font and as big window size as possible. The size +of the window can be obtained by running "stty -a". For everything else +just "Use the source, Luke!" +

+ +

cmpf

+ + +A small program to compare the rendering of two supposedly +nearly-identical fonts at low resolutions. It requires the +T1LIB library. This program may be used to compare the +effect of various options of the converter on the resulting +fonts. Create two .pfa files, one with one set of options, +another with another set of options, then use this program +to compare them. +

+ +

dmpf

+ + +A small program to dump the bitmaps of all glyphs of the font +at low pixel sizes, up to 20 pixels. It requires the +T1LIB library. This program may be used to compare the +effect of changes in the T1LIB rasterizer and just for visual +search for rendering anomalies. +

+ +

lst.pl

+ + +A simple PERL script that generates an HTML file +with the full list of all characters in all +possible styles of the Variable-width and Fixed-width +fonts. This file is quite convenient to look +at the converted fonts in Netscape (or other +graphical browser). + +

cntstems.pl

+ + +A simple PERL script that counts the required hint stack in the +interpreter to rasterize the glyphs of the font. May be quite +useful in search for missing glyphs which may be aborted due to +insufficient stack depth. + +

showg

+ + +A PERL script that draws the glyphs and their interesting +metrics (such as coordinates of the dots, hints and blue zones) +in PostScript. It works only with un-encoded font files generated +by ttf2pt1. The intended use is like: +

+ +  showg [-c <fontfile.t1a>]... <fontfile.t1a> <glyph-to-draw>... >file.ps
+  gv file.ps # start the Ghostscript viewer +

+ +As you can see, multiple glyphs may be specified. The glyphs may be +specified in one of three ways: +
+  - as a decimal code (for example, 43 ) +
+  - as a glyph name preceded by a slash (for example, /plus ) +
+  - as a literal character preceded by a dot (for example, .+ ) +

+ +So for example the following command would draw the same glyph "left +parenthesis" three times: +

+ +  showg file.t1a 40 /parenleft .\( >/file.ps +

+ +Don't forget that some characters have to be protected from the shell +by backslash as shown above, or else the shell would try to interpret +them before passing to the program. +

+ +One file (given as the first argument) is considered the main file +but multiple files can be specified with option -c for visual comparison +of the outlines. The glyphs from the main file are drawn in black +and supplemented with coordinate grid and sidebars for hints. The +glyphs from the comparison files are drawn in slightly lighter colors +(red, cyan, brown) and no supplemental information is provided for them. +Each use of option -c adds one comparison file, this option may be used +multiple times. If there are more than 3 comparison files the colors +repeat cyclically. +

+ +So for example the following command would draw the same glyph "left +parenthesis" from three files on the same page: +

+ +  showg -c fileA.t1a -c fileB.t1a file.t1a .\( >/file.ps +

+ +This program is quite valuable it you want to take a close-up view at +the font. +

+ +The outlines are drawn in black, the ends of the curves and +lines are marked as dots, the first dots of the outlines +are fatter. The Blue Zones are drawn in light blue. The +substituted hints are marked in red, the global hints are +marked in blue. The coordinate grid is drawn in green. +The stems and the values of coordinates are for convenience +marked twice, on each size of the picture. +

+ +

showdf

+ + +A Perl script to find a list of differing glyphs in two versions of a font +file (for example, converted with different versions of ttf2pt1 or +with different options given to ttf2pt1) and feed this list into the showg +program for display. The intended use is like: +

+ +  showdf <showg-location> <fontfile1.t1a> <fontfile2.t1a> >file.ps
+  gv file.ps # start the Ghostscript viewer +

+ +If both showdf and showg scripts are located in the +same directory, the command would look like: +

+ +  ./showdf ./showg font1.t1a font2.t1a >file.ps
+

+ +For decent results both font files should be converted from the same original +font and contain the same glyphs with the same names in the same order. +Otherwise most probably all the glyphs will be included, or a failure may +happen if some glyph is not found in one of the files. It is also a good +idea to convert the fonts for comparison with hinting disabled, otherwise +the differences in hinting may trigger the otherwise equal glyphs to be shown. +

+ + + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/bmpfont.h b/application/third_party/dompdf/lib/ttf2ufm/src/other/bmpfont.h new file mode 100755 index 00000000..59c27372 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/bmpfont.h @@ -0,0 +1,338 @@ +/* + * see COPYRIGHT + */ + + +fchkneg(file, line, rc, cmd) + char *file; + int line; + int rc; + char *cmd; +{ + if(rc<0) { + fprintf(stderr,"%s: fatal error on line %d of %s: %d\n", + PROGNAME, line, file, rc); + fprintf(stderr,"%s\n", cmd); + exit(1); + } +} + +fchknull(file, line, rc, cmd) + char *file; + int line; + void *rc; + char *cmd; +{ + if(rc==NULL) { + fprintf(stderr,"%s: fatal error on line %d of %s: NULL\n", + PROGNAME, line, file); + fprintf(stderr,"%s\n", cmd); + exit(1); + } +} + +#define chkneg(f) fchkneg(__FILE__,__LINE__,(f),#f) +#define chknull(f) fchknull(__FILE__,__LINE__,(f),#f) + +#define MYPAD 8 + +#define CHRNONE ' ' +#define CHRBOTH '.' +#define CHRONE '1' +#define CHRTWO '2' + +#define MINSIZE 8 +#define MAXSIZE 20 + +#define LINEWIDTH 80 /* screen line width in chars */ +#define MAXLINES (MAXSIZE*(MAXSIZE-MINSIZE+1)) + +static char map[MAXLINES][LINEWIDTH+1]; +static char mbase, mx, mend; + +/* returns 0 if the same, -1 if different */ + +int +cmpglyphs(g1, g2) + GLYPH *g1, *g2; +{ + int wd1, wd2; + int ht1, ht2; + int i, j; + char *p1, *p2; + + wd1=g1->metrics.rightSideBearing - g1->metrics.leftSideBearing; + ht1=g1->metrics.ascent - g1->metrics.descent; + wd2=g2->metrics.rightSideBearing - g2->metrics.leftSideBearing; + ht2=g2->metrics.ascent - g2->metrics.descent; + + if(g1->bits==NULL && g2->bits!=NULL + || g1->bits!=NULL && g2->bits==NULL) + return -1; + + if(g1->metrics.ascent != g2->metrics.ascent) + return -1; + + if(g1->metrics.descent != g2->metrics.descent) + return -1; + + if( wd1 != wd2 ) + return -1; + + if( (p1=g1->bits) !=NULL && (p2=g2->bits) !=NULL ) + for(i=0; i mend) + mend=row; + } +} + +void +drawdotg1(row, col, val) + unsigned row, col, val; +{ + if(row < MAXLINES && col < LINEWIDTH-1) { + if(val) + map[row][col]=CHRONE; + else + map[row][col]=CHRNONE; + if(row > mend) + mend=row; + } +} + +void +drawdotg2(row, col, val) + unsigned row, col, val; +{ + if(row < MAXLINES && col < LINEWIDTH-1) { + if(val) + if(map[row][col]==CHRONE) + map[row][col]=CHRBOTH; + else + map[row][col]=CHRTWO; + else if(map[row][col]!=CHRONE) + map[row][col]=CHRNONE; + if(row > mend) + mend=row; + } +} + +void +drawglyf(size, g1) + int size; + GLYPH *g1; +{ + int wd1, wd2, wdm; + int ht1, ht2, ascm, desm; + int i, j, k, val; + char *p; + int off1, off2; + + wd1=g1->metrics.rightSideBearing - g1->metrics.leftSideBearing; + ht1=g1->metrics.ascent - g1->metrics.descent; + + wdm=wd1; + + ascm=g1->metrics.ascent; + desm= -g1->metrics.descent; + + if(mbase==0) + mbase=ascm+1; + else if(LINEWIDTH-mx <= wdm+1) { + mx=0; mbase=mend+ascm+2; + } + + drawdot(mbase-ascm-1, mx, (size/10)%10+'0'); + drawdot(mbase-ascm-1, mx+1, size%10+'0'); + + if( (p=g1->bits) !=NULL) + for(i=0; i>=1) + drawdot(i+mbase-g1->metrics.ascent, mx+j+k, (val&1)?CHRBOTH:CHRNONE); + } + } + + wdm++; + if(wdm<3) + wdm=3; + mx+=wdm; + drawdot(mbase, mx-1, '-'); +} + +void +drawdiff(size, g1, g2) + int size; + GLYPH *g1, *g2; +{ + int wd1, wd2, wdm; + int ht1, ht2, ascm, desm; + int i, j, k, val; + char *p; + int off1, off2; + + wd1=g1->metrics.rightSideBearing - g1->metrics.leftSideBearing; + ht1=g1->metrics.ascent - g1->metrics.descent; + wd2=g2->metrics.rightSideBearing - g2->metrics.leftSideBearing; + ht2=g2->metrics.ascent - g2->metrics.descent; + + if(wd1>wd2) { + wdm=wd1; + off1=0; off2=wd1-wd2; + } else { + wdm=wd2; + off2=0; off1=wd2-wd1; + } + + if(g1->metrics.ascent > g2->metrics.ascent) + ascm=g1->metrics.ascent; + else + ascm=g2->metrics.ascent; + + if(g1->metrics.descent < g2->metrics.descent) + desm= -g1->metrics.descent; + else + desm= -g2->metrics.descent; + + if(mbase==0) + mbase=ascm+1; + else if(LINEWIDTH-mx <= wdm+1) { + mx=0; mbase=mend+ascm+2; + } + + drawdot(mbase-ascm-1, mx, (size/10)%10+'0'); + drawdot(mbase-ascm-1, mx+1, size%10+'0'); + + /* check which alignment is better */ + if(off1!=0 || off2!=0) { + int cntl,cntr; + int a1, a2, d1, d2; + int val1, val2; + int rstep1, rstep2; + + cntl=cntr=0; + rstep1=(wd1+7)/8; + rstep2=(wd2+7)/8; + a1=g1->metrics.ascent; + d1=g1->metrics.descent; + a2=g2->metrics.ascent; + d2=g2->metrics.descent; + +#ifdef dbgoff + printf("size: %d\n", size); +#endif + for(i=ascm; i>= -desm; i--) { + for(j=0; ja1 || i=wd1) + val1=0; + else + val1=( g1->bits[ (a1-i)*rstep1+j/8 ] >> (j%8) ) & 1; + if(i>a2 || i=wd2) + val2=0; + else + val2=( g2->bits[ (a2-i)*rstep2+j/8 ] >> (j%8) ) & 1; + + cntl += (val1 ^ val2); + +#ifdef dbgoff + putchar(val1?'1':' '); + putchar(val2?'2':' '); + putchar('.'); +#endif + + /* now the right alignment */ + if(i>a1 || i=wd1 || jbits[ (a1-i)*rstep1+(j-off1)/8 ] >> ((j-off1)%8) ) & 1; + if(i>a2 || i=wd2) + val2=0; + else + val2=( g2->bits[ (a2-i)*rstep2+(j-off2)/8 ] >> ((j-off2)%8) ) & 1; + + cntr += (val1 ^ val2); + +#ifdef dbgoff + putchar(val1?'1':' '); + putchar(val2?'2':' '); + putchar('|'); +#endif + } +#ifdef dbgoff + putchar('\n'); +#endif + } + +#ifdef dbgoff + printf("size %d: left %d right %d\n",size, cntl, cntr); +#endif + if(cntl <= cntr) /* left is better or the same */ + off1=off2=0; + } + + if( (p=g1->bits) !=NULL) + for(i=0; i>=1) + drawdotg1(i+mbase-g1->metrics.ascent, mx+j+k+off1, val&1); + } + } + if( (p=g2->bits) !=NULL) + for(i=0; i>=1) + drawdotg2(i+mbase-g2->metrics.ascent, mx+j+k+off2, val&1); + } + } + + wdm++; + if(wdm<3) + wdm=3; + mx+=wdm; + drawdot(mbase, mx-1, '-'); +} + +void +printmap(f) + FILE *f; +{ + int i, j; + + for(i=0; i<=mend; i++) { + for(j=LINEWIDTH-1; j>=0 && map[i][j]==' '; j--) + {} + map[i][j+1]='\n'; + map[i][j+2]=0; + fputs(map[i], f); + } +} + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/bz.c b/application/third_party/dompdf/lib/ttf2ufm/src/other/bz.c new file mode 100755 index 00000000..475d13fa --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/bz.c @@ -0,0 +1,78 @@ +/* + * see COPYRIGHT + */ + +#include +#include +#include "bzscreen.h" + +/* size of the screen in "physical pixels" */ +#define PHYSX 980 +#define PHYSY 310 + +/* the bounding box of the drawing in "logical pixels" */ +/* the base point - set to 0, 0 for absolute coordinates */ +#define BASEX 19 +#define BASEY 122 +/* the maximal point */ +#define MAXX 450 +#define MAXY 481 + +main(argc,argv) + int argc; + char **argv; +{ + initscreen(PHYSX, PHYSY, PHYSX, PHYSY, 0, 0, BASEX, BASEY, MAXX, MAXY); + + /* + drawcurve('#', 0,0, 51,0, 1,49, 45,98); + drawcurve('1', 5,28, 8,37, 16,65, 45,98); + + drawcurve('3', 0,0, 0,24, 30,68, 80,72); + + drawcurve('1', 0,0, 0,5, 1,10, 2,15); + drawcurve('2', 2,15, 8,42, 30,68, 80,72); + + drawcurve('4', 0,0, 0,37, 22,67, 80,72); + */ + + /* final */ + /* + drawcurve('#', 324, 481, 390, 481, 448, 475, 448, 404 ); + drawcurve('#', 448, 404, 448, 404, 448, 324, 448, 324 ); + drawcurve('#', 448, 324, 402, 245, 19, 338, 19, 122 ); + */ + + /* 3 */ + /* + */ + drawcurve('*', 450, 404, 450, 397, 450, 390, 448, 384 ); + + drawcurve('*', 448, 384, 446, 378, 444, 370, 443, 360 ); + drawcurve('.', 443, 360, 309, 356, 206, 341, 132, 304 ); + drawcurve('.', 132, 304, 57, 266, 19, 208, 19, 122 ); + + /* 4 */ + drawcurve('#', 324, 481, 390, 481, 450, 475, 450, 404 ); + drawcurve('#', 450, 404, 450, 397, 450, 390, 448, 384 ); + + drawcurve('#', 448, 384, 402, 245, 19, 338, 19, 122 ); + + /* + drawcurve('.', 324, 481, 361, 481, 391, 478, 414, 466 ); + drawcurve('.', 414, 466, 436, 454, 450, 436, 450, 404 ); + + drawcurve('.', 450, 404, 450, 390, 447, 378, 443, 360 ); + drawcurve('.', 443, 360, 309, 356, 206, 341, 132, 304 ); + + drawcurve('.', 132, 304, 57, 266, 19, 208, 19, 122 ); + */ + + printscreen(stdout); +} + +sumcurves(dx11, dy11, dx12, dy12, dx13, dy13, + dx21, dy21, dx22, dy22, dx23, dy23) +{ +} + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/bzscreen.c b/application/third_party/dompdf/lib/ttf2ufm/src/other/bzscreen.c new file mode 100755 index 00000000..0bb5ab6a --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/bzscreen.c @@ -0,0 +1,220 @@ +/* + * see COPYRIGHT + */ + +#include +#include +#include "bzscreen.h" + +/* + * functions to draw the bezier curves in text mode + */ + +double +fmin(a,b) + double a, b; +{ + if(a cols || physy+yoff > rows) { + fprintf(stderr, "*** drawable area out of screen\n"); + exit(1); + } + + if(minx>maxx || miny>maxy) { + fprintf(stderr, "*** empty drawable area\n"); + exit(1); + } + + screen.physx = physx; + screen.physy = physy; + screen.rows = rows; + screen.cols = cols+2; /* for '\n\0' */ + screen.xoff = xoff; + screen.yoff = yoff; + screen.minx = minx; + screen.miny = miny; + + if(( screen.dots=malloc(screen.rows*screen.cols) )==NULL) { + perror("*** no memory for screen: "); + exit(1); + } + + j=screen.rows*screen.cols; + for(i=0; i abs(bx-ax) ) { + if(by>ay) + markb='^'; + else + markb='v'; + } else { + if(bx>ax) + markb='>'; + else + markb='<'; + } + + if(dx==cx && dy==cy) { + marke=mark; + } else if( abs(dy-cy) > abs(dx-cx) ) { + if(dy>cy) + marke='^'; + else + marke='v'; + } else { + if(dx>cx) + marke='>'; + else + marke='<'; + } + + for(i=1; i=screen.physy || x<0 || x>=screen.physx) + return; + screendot(x,y)=mark; +} + +void +setabsdot(mark, x, y) + int x, y, mark; +{ + if(y<0 || y>=screen.rows || x<0 || x>=screen.cols-2) + return; + screenabsdot(x,y)=mark; +} + +void +setfdot(mark, fx, fy) + int mark; + double fx, fy; +{ + int x, y; + + x=(int)(fx*screen.xscale+0.5); + y=(int)(fy*screen.yscale+0.5); + + if(y<0 || y>=screen.physy || x<0 || x>=screen.physx) + return; + screendot(x,y)=mark; +} + +/* destructive */ +void +printscreen(f) + FILE *f; +{ + int r; + char *pi, *pc; + + for(r=screen.rows-1; r>=0; r--) { + pc=&screenabsdot(0,r); + for(pi=&screenabsdot(-2,r+1); pi>=pc && *pi == ' '; pi--) + {} + pi[1]='\n'; + pi[2]=0; + fputs(pc, f); + } +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/bzscreen.h b/application/third_party/dompdf/lib/ttf2ufm/src/other/bzscreen.h new file mode 100755 index 00000000..290d5195 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/bzscreen.h @@ -0,0 +1,40 @@ +/* + * see COPYRIGHT + */ + + +/* + * Screen for drawing the Bezier curves in text mode + */ + +struct screen { + unsigned physx; + unsigned physy; + unsigned cols; + unsigned rows; + unsigned xoff; + unsigned yoff; + unsigned minx; + unsigned miny; + char *dots; + double xscale; + double yscale; +} screen; + +#define screenabsdot(x,y) (screen.dots[(y)*screen.cols+(x)]) +#define screendot(x,y) screenabsdot((x)+screen.xoff, (y)+screen.yoff) + +/* prototypes */ +double fmin(double a, double b); +int abs(int x); +void initscreen(unsigned physx, unsigned physy, + unsigned cols, unsigned rows, unsigned xoff, unsigned yoff, + unsigned minx, unsigned miny, unsigned maxx, unsigned maxy); +void drawcurve(int mark, int ax,int ay, + int bx,int by, int cx,int cy, int dx,int dy); +void drawcurvedir(int mark, int ax,int ay, + int bx,int by, int cx,int cy, int dx,int dy); +void drawdot(int mark, int x, int y); +void setabsdot(int mark, int x, int y); +void setfdot(int mark, double x, double y); +void printscreen(FILE *f); diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/cmpf.c b/application/third_party/dompdf/lib/ttf2ufm/src/other/cmpf.c new file mode 100755 index 00000000..37e6e98f --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/cmpf.c @@ -0,0 +1,67 @@ +/* + * see COPYRIGHT + */ + +#include +#include +#include "t1lib.h" + +/* + * compare two [ almost the same ] fonts + */ + +#define PROGNAME "cmpf" + +#include "bmpfont.h" + + +main(ac, av) + int ac; + char **av; +{ + int fontid1, fontid2; + GLYPH *g1, *g2; + int chr, size, diff, offset; + + if(ac!=3) { + fprintf(stderr,"Use: %s font1 font2\n", PROGNAME); + exit(1); + } + + chkneg(T1_SetBitmapPad(MYPAD)); + chkneg(T1_InitLib(NO_LOGFILE|IGNORE_CONFIGFILE|IGNORE_FONTDATABASE)); + chkneg(fontid1=T1_AddFont(av[1])); + chkneg(fontid2=T1_AddFont(av[2])); + + + resetmap(); + for(chr=0; chr<256; chr++) { + diff=0; + for(size=MAXSIZE; size>=MINSIZE; size--) { + chknull( g1=T1_CopyGlyph(T1_SetChar( fontid1, chr, (float)size, NULL)) ); + chknull( g2=T1_CopyGlyph(T1_SetChar( fontid2, chr, (float)size, NULL)) ); + + if( cmpglyphs(g1, g2) ) { + /* printf("%d %d - diff\n", chr, size); */ + diff=1; + drawdiff(size, g1, g2); + } + /* + else + fprintf(stderr, "%d %d - same\n", chr, size); + */ + + chkneg(T1_FreeGlyph(g1)); + chkneg(T1_FreeGlyph(g2)); + } + if(diff) { + printf("*** Difference for %d==0x%x %c\n", chr, chr, + isprint(chr) ? chr : ' '); + printmap(stdout); + diff=0; + resetmap(); + } + } + + printf("All done!\n"); +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/cntstems.pl b/application/third_party/dompdf/lib/ttf2ufm/src/other/cntstems.pl new file mode 100755 index 00000000..185c06c4 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/cntstems.pl @@ -0,0 +1,50 @@ +#!/usr/bin/perl +# +# Copyright (c) 2000 by Sergey Babkin +# (see COPYRIGHT for full copyright notice) +# +# script to calculate the total number of stems used by the +# glyphs in case if stems are always pushed to the stack and +# never popped (as X11 does) + +$insubrs = 0; +$inchars = 0; + +while(<>) +{ + if(/\/Subrs/) { + $insubrs = 1; + } elsif(/\/CharStrings/) { + $insubrs = 0; + $inchars = 1; + } + if($insubrs && /^dup (\d+)/) { + $cursubr = $1; + $substems[$cursubr] = 0; + } elsif (/^dup (\d+) \/(\S+) put/) { + $codeof{$2} = $1; + } + if($inchars) { + if(/^\/(\S+)\s+\{/) { + $curchar = $1; + $charstems = 0; + } elsif( /endchar/ ) { + printf("%d:%s\t%d\n", $codeof{$curchar}, $curchar, $charstems); + } elsif( /(\d+)\s+4\s+callsubr/) { + $charstems += $substems[$1+0]; + } + } + if(/[hv]stem3/) { + if($insubrs) { + $substems[$cursubr] += 3; + } elsif($inchars) { + $charstems += 3; + } + } elsif( /[hv]stem/ ) { + if($insubrs) { + $substems[$cursubr]++; + } elsif($inchars) { + $charstems++; + } + } +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/dmpf.c b/application/third_party/dompdf/lib/ttf2ufm/src/other/dmpf.c new file mode 100755 index 00000000..1052a448 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/dmpf.c @@ -0,0 +1,53 @@ +/* + * see COPYRIGHT + */ + +#include +#include +#include "t1lib.h" + +/* + * Dump a rasterizarion of the font at small size + */ + +#define PROGNAME "dmpf" + +#include "bmpfont.h" + + +main(ac, av) + int ac; + char **av; +{ + int fontid1, fontid2; + GLYPH *g1, *g2; + int chr, size, diff, offset; + + if(ac!=2) { + fprintf(stderr,"Use: %s font\n", PROGNAME); + exit(1); + } + + chkneg(T1_SetBitmapPad(MYPAD)); + chkneg(T1_InitLib(NO_LOGFILE|IGNORE_CONFIGFILE|IGNORE_FONTDATABASE)); + chkneg(fontid1=T1_AddFont(av[1])); + + + resetmap(); + for(chr=0; chr<256; chr++) { + for(size=MAXSIZE; size>=MINSIZE; size--) { + chknull( g1=T1_CopyGlyph(T1_SetChar( fontid1, chr, (float)size, NULL)) ); + + drawglyf(size, g1); + + chkneg(T1_FreeGlyph(g1)); + } + + printf("*** Glyph %d==0x%x %c\n", chr, chr, + isprint(chr) ? chr : ' '); + printmap(stdout); + resetmap(); + } + + printf("All done!\n"); +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/lst.pl b/application/third_party/dompdf/lib/ttf2ufm/src/other/lst.pl new file mode 100755 index 00000000..b5840b27 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/lst.pl @@ -0,0 +1,65 @@ +#!/usr/bin/perl +# +# script to create HTML file with character table +# in plain, italic, bold, bold-italic +# +# see COPYRIGHT +# + +# width of tables +$step=16; + +# commands to enable and disable the font modes +# (the fastest changing is first) +@matrix = ( + [ "Roman", "Italic", "", "" ], + [ "Medium", "Bold", "", "" ], + [ "Variable", "Fixed", "", "" ], +); + +sub printall +{ + local $i, $j; + + printf("\n"); + for($j=32; $j<256; $j+=$step) { + printf("\n"); + for $i ($j..$j+$step-1) { + $c=chr($i); + if($c eq "<") { + $c="<"; + } elsif($c eq ">") { + $c=">"; + } + printf("\n"); + } + printf("\n"); + } + printf("
%03d\n", $i); + printf("%s%s%s\n", $enmode, $c, $dismode); + printf("

\n"); +} + +printf("\n

\n"); + +for $mask (0.. (1<<@matrix)-1) { + #printf(""); + $mode = $enmode = $dismode = ""; + for $bit (0.. $#matrix) { + $val = ($mask >> $bit) & 1; + $mode = $matrix[$bit]->[$val] . "
" . $mode; + if( $val ) { + $enmode = $matrix[$bit]->[3] . $enmode; + $dismode = $dismode . $matrix[$bit]->[2]; + } + #printf("=== %d %s %s %s\n", $val, $mode, $enmode, $dismode); + } + #printf("%x %s %s %s\n", $mask, $mode, $enmode, $dismode); + printf("
\n"); + &printall(); + printf("\n"); + printf("%s\n", $mode); + printf("
\n"); +} + +printf("
\n"); diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/showdf b/application/third_party/dompdf/lib/ttf2ufm/src/other/showdf new file mode 100755 index 00000000..1706a814 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/showdf @@ -0,0 +1,58 @@ +#!/usr/bin/perl + +if (@ARGV != 3) { + print STDERR "Use:\n"; + print STDERR " showdf \n"; + print STDERR "to create a showg diagram of glyphs differing in two files\n"; + exit 1; +} + +$cmd = shift @ARGV; +$oldf = shift @ARGV; +$newf = shift @ARGV; + +open(O, "<$oldf") or die "Unable to open '$oldf'\n"; +open(N, "<$newf") or die "Unable to open '$newf'\n"; + +while() { + last if(/CharStrings/); +} +while() { + last if(/CharStrings/); +} + +undef @symlist; +$sym = ''; +$inlist = 0; +$nstop = 0; + +while($so = ) { + if($so =~ m|^(/\S+)\s+\{|) { + $sym = $1; + $inlist = 0; + #printf STDERR "found sym $sym\n"; + if (!$nstop || $sn !~ m|^$sym\s+\{|) { + while($sn = ) { + #print STDERR "+$sn"; + last if($sn =~ m|^${sym}\s+\{|); + } + } + $nstop = 0; + } elsif(!$nstop) { + $sn = ; + #print STDERR "<$so>$sn\n"; + if($so ne $sn) { + if(!$inlist) { + $inlist = 1; + push(@symlist, $sym); + } + if($sn =~ m|^(/\S+)\s+\{|) { + $nstop = 1; + #printf STDERR "stop at $1\n"; + } + } + } +} +unshift(@symlist, $cmd, '-c', $oldf, $newf); +#printf("%s\n", join(' ', @symlist)); +exec @symlist; diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/other/showg b/application/third_party/dompdf/lib/ttf2ufm/src/other/showg new file mode 100755 index 00000000..437860d4 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/other/showg @@ -0,0 +1,633 @@ +#!/usr/bin/perl + +my @cmpfiles; + +while($ARGV[0] eq "-c") { + shift(@ARGV); + push(@cmpfiles, shift(@ARGV)); +} + +if( $#ARGV < 1) { + die("Usage: $0 [-c file]... file glyph-code...\n"); +} + +$fname=shift @ARGV; + +# storage for files +my %fontname; +my %fbbox; +my %fblues; +my %fenc; +my %frevenc; +my %fsubrs; +my %fchars; +my @cmnbbox; # common bounding box covering all files + +@cmnbbox = (100, 100, 100, 100); + +# read all files into memory +for $f (@cmpfiles, $fname) { + open(FILE, "<$f") or die("no such file $f"); + while() { + if(/FontBBox\s+\{\s*(.*)\s*}/) { + @bbox=split(/\s+/, $1); + push(@{$fbbox{$f}}, @bbox); + if($bbox[0] < $cmnbbox[0]) { + $cmnbbox[0] = $bbox[0]; + } + if($bbox[1] < $cmnbbox[1]) { + $cmnbbox[1] = $bbox[1]; + } + if($bbox[2] > $cmnbbox[2]) { + $cmnbbox[2] = $bbox[2]; + } + if($bbox[3] > $cmnbbox[3]) { + $cmnbbox[3] = $bbox[3]; + } + } elsif( /BlueValues\s+\[\s*(.*)\s*\]/ || /OtherBlues\s+\[\s*(.*)\s*\]/ ) { + @blues=split(/\s+/, $1); + push(@{$fblues{$f}}, @blues); + } elsif( /^dup\s+(\d+)\s+\/(\S+)\s+put/ ) { + $fenc{$f}{$1} = $2; + if( ! defined $frevenc{$f}{$2} ) { + $frevenc{$f}{$2} = $1; + } + } elsif( /^dup\s+(\d+)\s+\{\s*$/ ) { + $key = $1; + $bf = $_; + while() { + $bf .= $_; + if( /\}\s+NP/ ) { + last; + } + } + $fsubrs{$f}{$key} = $bf; + } elsif( /^\/(\S+)\s+\{\s*$/ ) { + $key = $1; + $bf = $_; + while() { + $bf .= $_; + if( /endchar/ ) { + last; + } + } + $fchars{$f}{$key} = $bf; + } elsif( /^\/FontName\s+(\S+)/ ) { + $fontname{$f} = $1; + } + } + close(FILE); +} + +######################## Prolog ################################### + +print("%%!PS-Adobe-1.0 +%%DocumentNeededResources: font Courier +%%Pages: (atend) +%%EndComments +%%BeginProlog +/cmpfcolorarray [ + [ 1 0.2 0.2 ] % slightly lighter red + [ 0 0.7 0.7 ] % cyan + [ 0.7 0.7 0 ] % brown-yellow +] def +/cmpfcolor { % number -> . + cmpfcolorarray length mod % get the subarray number + cmpfcolorarray exch get aload pop setrgbcolor +} bind def +/contourcolor { 0 0 0 setrgbcolor } bind def % black +/bluezonecolor { 0.95 0.95 1 setrgbcolor } bind def % very light blue +/coordcolor { 0 1 0 setrgbcolor } bind def % green +/textcolor { 0 0 0 setrgbcolor } bind def % black +/stemcolor { 1 0 0 setrgbcolor } bind def % red +/mainstemcolor { 0 0 1 setrgbcolor } bind def % blue + +% /fnt2pt { 72 5 mul 1000 div } bind def + +/linehor { % . font_y -> . + gsave + 0 72 translate + 72 fnt2pt scale + newpath + 0 exch moveto + 7 0 rlineto + stroke + grestore +} bind def + +/linevert { % . font_x -> . + gsave + 72 0 translate + fnt2pt 72 scale + newpath + 0 moveto + 0 7 rlineto + stroke + grestore +} bind def + +/bluezone { % . font_y_1 font_y_2 -> . + gsave + bluezonecolor + 0 72 translate + 72 fnt2pt scale + newpath + 0 exch moveto + 7 0 rlineto + 7 exch lineto + -7 0 rlineto + closepath + fill + grestore +} bind def + +/drawstem { % . xwidth ywidth x0 y0 -> . + gsave + 72 72 translate fnt2pt fnt2pt scale xorg yorg translate + newpath + moveto + dup 0 exch rlineto + exch 0 rlineto + neg 0 exch rlineto + closepath fill + grestore +} bind def + +/getlen { + dup stringwidth pop +} bind def + +/compressfont 0.8 def + +/label { % . string stringwd y -> . + dup lasty lt { + dup lasty fontsz sub le + } { + dup lasty fontsz add ge + } ifelse { + /curx 0 store + } if + dup /lasty exch store + 0 exch moveto + compressfont mul dup curx add maxx gt { + /curx 0 store + } if + curx 0 rmoveto + dup 0 rlineto + stroke + gsave + curx lasty moveto + curx add /curx exch store + compressfont 1 scale + show + grestore +} bind def +"); + +@bbox=@cmnbbox; + +$nx=$bbox[2]-$bbox[0]; +$ny=$bbox[3]-$bbox[1]; +$maxsz= ($nx>$ny) ? $nx : $ny; +$fnt2pt= 72*5/$maxsz; +printf("/fnt2pt 72 5 mul %d div def\n", $maxsz); +$xorg= -($bbox[0]-($maxsz-$nx)/2); +$yorg= -($bbox[1]-($maxsz-$ny)/2); +printf("/xorg %d def /yorg %d def\n", $xorg, $yorg); + +print(" +%%EndProlog +"); + +######################## Subroutines ############################## + +sub bluezone # from to +{ + my ($a, $b)=@_; + printf("%d %d bluezone\n",$a+$yorg, $b+$yorg); + $ycoord{$a+0}=1; + $ycoord{$b+0}=1; +} + +sub linehor # x +{ + my $a=$_[0]; + printf("%d linehor\n",$a+$yorg); + $ycoord{$a+0}=1; +} + +sub linevert # x +{ + my $a=$_[0]; + printf("%d linevert\n",$a+$xorg); + $xcoord{$a+0}=1; +} + +sub hstem # from width +{ + my ($from, $width)=@_; + $stemhused=1; + printf("%d %d %d %d drawstem %% %d %d h \n", -$stemwd, $width, + $bbox[0]-2-$stemhgrp*$stemwd, $from, + $from, $width); + printf("%d %d %d %d drawstem %% %d %d h \n", $stemwd, $width, + $bbox[2]+2+$stemhgrp*$stemwd, $from, + $from, $width); +} + +sub vstem # from width +{ + my ($from, $width)=@_; + $stemvused=1; + printf("%d %d %d %d drawstem %% %d %d v \n", $width, -$stemwd, + $from, $bbox[1]-2-$stemhgrp*$stemwd, + $from, $width); + printf("%d %d %d %d drawstem %% %d %d v \n", $width, $stemwd, + $from, $bbox[3]+2+$stemhgrp*$stemwd, + $from, $width); +} + +sub nextstemgrp +{ + if($stemhused || $stemvused) { + $stemhgrp++; + $stemhused=0; + $stemvgrp++; + $stemvused=0; + } +} + +sub substems # fname subrlist +{ + my $fname = shift; + my $i, $cmd, @vals; + + print("\nstemcolor\n"); + + for $i (@_) { + &nextstemgrp(); + for $_ (split(/\n/, $fsubrs{$fname}{$i})) { + s/^\s+//; + @vals=split(/\s+/, $_); + $cmd=$vals[$#vals]; + if($cmd eq "hstem") { + &hstem($vals[0], $vals[1]); + } elsif($cmd eq "vstem") { + &vstem($vals[0], $vals[1]); + } + } + } + print("\n"); +} + +sub drawcharwstems # charstring +{ + my($x,$y)=(0,0); + my @vals, $cmd, $i; + + print("\nmainstemcolor\n"); + &nextstemgrp(); + for $_ (split(/\n/, $_[0])) { + s/^\s+//; + @vals=split(/\s+/, $_); + $cmd=$vals[$#vals]; + + if($cmd eq "hsbw") { + $x=$vals[0]+0; + } elsif($cmd eq "hstem") { + &hstem($vals[0], $vals[1]); + } elsif($cmd eq "hstem3") { + &hstem($vals[0], $vals[1]); + &hstem($vals[2], $vals[3]); + &hstem($vals[4], $vals[5]); + } elsif($cmd eq "vstem") { + &vstem($vals[0], $vals[1]); + } elsif($cmd eq "vstem3") { + &vstem($vals[0], $vals[1]); + &vstem($vals[2], $vals[3]); + &vstem($vals[4], $vals[5]); + } elsif($cmd eq "rmoveto") { + # a shortcut + last; + } + } + &drawchar("drawchar", 1, "contourcolor", $_[0]); +} + +sub drawchar #procname wantgrid color charstring +{ + my($procname, $wantgrid, $color, $charstring) = @_; + my($x,$y)=(0,0); + my @vals, $cmd, $i; + my %xv=(); + my %yv=(); + + printf("\n/%s {\n",$procname); + printf("\ngsave 72 72 translate fnt2pt fnt2pt scale %d %d translate\n", $xorg, $yorg); + printf("%s 1 setlinewidth newpath\n", $color); + for $_ (split(/\n/, $charstring)) { + s/^\s+//; + @vals=split(/\s+/, $_); + $cmd=$vals[$#vals]; + + if($cmd eq "callsubr" && $vals[1] == 4) { + push(@subrlist, $vals[0]); + } elsif($cmd eq "amoveto") { + $x=$vals[0]+0; + $y=$vals[1]+0; + $xv{$x+0}=1; $yv{$y+0}=1; + printf("%d %d moveto\n", $x, $y); + printf("%d %d 5 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "rmoveto") { + $x+=$vals[0]; + $y+=$vals[1]; + $xv{$x+0}=1; $yv{$y+0}=1; + printf("%d %d moveto\n", $x, $y); + printf("%d %d 5 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "hmoveto") { + $x+=$vals[0]; + $xv{$x+0}=1; $yv{$y+0}=1; + printf("%d %d moveto\n", $x, $y); + printf("%d %d 5 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "vmoveto") { + $y+=$vals[0]; + $xv{$x+0}=1; $yv{$y+0}=1; + printf("%d %d moveto\n", $x, $y); + printf("%d %d 5 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "alineto") { + $x=$vals[0]+0; + $y=$vals[1]+0; + $xv{$x+0}=1; $yv{$y+0}=1; + printf("%d %d lineto\n", $x, $y); + printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "rlineto") { + $x+=$vals[0]; + $y+=$vals[1]; + $xv{$x+0}=1; $yv{$y+0}=1; + printf("%d %d lineto\n", $x, $y); + printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "hlineto") { + $x+=$vals[0]; + $xv{$x+0}=1; $yv{$y+0}=1; + printf("%d %d lineto\n", $x, $y); + printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "vlineto") { + $y+=$vals[0]; + $xv{$x+0}=1; $yv{$y+0}=1; + printf("%d %d lineto\n", $x, $y); + printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "arcurveto") { + for $i (0,2,4) { + $x=$vals[$i]+0; + $y=$vals[$i+1]+0; + printf("%d %d ", $x, $y); + } + $xv{$x+0}=1; $yv{$y+0}=1; + printf("curveto\n"); + printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "rrcurveto") { + for $i (0,2,4) { + $x+=$vals[$i]; + $y+=$vals[$i+1]; + printf("%d %d \n", $x, $y); + } + $xv{$x+0}=1; $yv{$y+0}=1; + printf("curveto\n"); + printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "hvcurveto") { + $x+=$vals[0]; + printf("%d %d \n", $x, $y); + $x+=$vals[1]; + $y+=$vals[2]; + printf("%d %d \n", $x, $y); + $y+=$vals[3]; + printf("%d %d \n", $x, $y); + $xv{$x+0}=1; $yv{$y+0}=1; + printf("curveto\n"); + printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "vhcurveto") { + $y+=$vals[0]; + printf("%d %d \n", $x, $y); + $x+=$vals[1]; + $y+=$vals[2]; + printf("%d %d \n", $x, $y); + $x+=$vals[3]; + printf("%d %d \n", $x, $y); + $xv{$x+0}=1; $yv{$y+0}=1; + printf("curveto\n"); + printf("%d %d 3 0 360 arc %d %d moveto\n", $x, $y, $x, $y); + } elsif($cmd eq "closepath") { + printf("closepath stroke newpath\n"); + } + } + + printf("grestore } bind def\n"); + if($wantgrid) { + printf("coordcolor\n"); + for $x (keys %xv) { + &linevert($x); + } + for $y (keys %yv) { + &linehor($y); + } + } +} + +$pages=0; + +for $arg (@ARGV) { + undef $name, $code; + + if( $arg =~ /^\/(.*)/ ) { + $name=$1; + } elsif( $arg =~ /^\.(.)/ ) { + $code=ord($1); + } else { + $code=$arg; + } + + $pages++; + + $stemhgrp=0; + $stemhused=0; + $stemvgrp=0; + $stemvused=0; + $stemwd=10; + undef %xcoord; + undef %ycoord; + + if( defined $name ) { + $xname = $name; + $xcode = $frevenc{$fname}{$name}; + if( $xcode eq "" ) { + $xcode = "**UNKNOWN**"; + } + } else { + $xname = $fenc{$fname}{$code}; + if( $xname eq "" ) { + $xname = "**UNKNOWN**"; + } + $xcode = $code; + } + + printf("%%%%Page: %d %d\n", $pages, $pages); + printf("gsave + +0 setlinewidth +36 72 translate + +gsave +contourcolor +72 72 scale +newpath +0 0 moveto +7 0 rlineto +0 7 rlineto +-7 0 rlineto +closepath +stroke +1 1 translate +newpath +0 0 moveto +5 0 rlineto +0 5 rlineto +-5 0 rlineto +closepath +stroke +grestore + +"); + + undef @subrlist; + + + @bbox=@{$fbbox{$fname}}; + + print("coordcolor\n"); + printf("0 linehor %d linehor %d linehor\n", $bbox[1]+$yorg, $bbox[3]+$yorg); + printf("%d linevert %d linevert\n", $bbox[0]+$xorg, $bbox[2]+$xorg); + + %vals=@{$fblues{$fname}}; + for $i (keys %vals) { + &bluezone($i, $vals{$i}); + } + + $havechar = 1; + if( defined $fchars{$fname}{$xname} ) { + &drawcharwstems($fchars{$fname}{$xname}); + } else { + $havechar = 0; + if(defined $name) { + printf(STDERR "WARNING: %s nas no character with name \"%s\"\n", $fname, $name); + } else { + printf(STDERR "WARNING: %s nas no character with code \"%s\"\n", $fname, $code); + } + } + + &substems($fname, @subrlist); + + printf(STDERR "glyph name:%s code:%s (%d substituted stem groups)\n", $xname, $xcode, scalar @subrlist); + + $cmpfidx = 0; + for $cmpf(@cmpfiles) { + undef $cname, $ccode; + + if( defined $name ) { + if ( ! defined $fchars{$cmpf}{$name} && defined $fenc{$cmpf}{$xcode}) { + printf(STDERR " NOTE: %s nas no glyph with name \"%s\", guessed by code\n", $cmpf, $name); + $cname = $fenc{$cmpf}{$xcode}; + if( $cname eq "" ) { + $cname = "**UNKNOWN**"; + } + $ccode = $xcode; + } else { + $cname = $name; + $ccode = $frevenc{$cmpf}{$name}; + if( $ccode eq "" ) { + $ccode = "**UNKNOWN**"; + } + } + } else { + $cname = $fenc{$cmpf}{$code}; + if( $cname eq "" ) { + $cname = "**UNKNOWN**"; + } + $ccode = $code; + } + + if( defined $fchars{$cmpf}{$cname} ) { + &drawchar("drawcmpchar", 0, sprintf("%d cmpfcolor", $cmpfidx), + $fchars{$cmpf}{$cname}); + printf("drawcmpchar\n\n"); + printf(STDERR " in %s glyph name:%s code:%s\n", $cmpf, $cname, $ccode); + } else { + if(defined $name) { + printf(STDERR " WARNING: %s nas no character with name \"%s\"\n", $cmpf, $name); + } else { + printf(STDERR " WARNING: %s nas no character with code \"%s\"\n", $cmpf, $code); + } + } + $cmpfidx++; + } + + if($havechar) { + printf("drawchar\n\n"); + } + + # flush the last group + &nextstemgrp(); + + # the values of coordinates + printf("/fontsz 8 fnt2pt div def\n"); + printf("/Myfont /Courier findfont fontsz scalefont def\n\n"); + printf("contourcolor Myfont setfont\n"); + + for $org (0, $xorg+$bbox[2]+$stemwd*$stemhgrp+72/$fnt2pt) { + printf("gsave\n"); + printf("/maxx 72 fnt2pt div %d sub def /curx 0 def /lasty -10000 def\n", + 2+$stemhgrp*$stemwd-$xorg-$bbox[0]); + printf("0 72 translate fnt2pt fnt2pt scale %f yorg translate 1 setlinewidth\n", $org); + for $y (sort {$a <=> $b} keys %ycoord) { + printf("(%d) getlen %d label\n", $y, $y); + } + printf("grestore\n"); + } + + for $org (0, $yorg+$bbox[3]+$stemwd*$stemvgrp+72/$fnt2pt) { + printf("gsave\n"); + printf("/maxx 72 fnt2pt div %d sub def /curx 0 def /lasty -10000 def\n", + 2+$stemvgrp*$stemwd-$yorg-$bbox[1]); + printf("72 0 translate fnt2pt fnt2pt scale xorg %f translate 90 rotate 1 setlinewidth\n", $org); + for $x (sort {$a <=> $b} keys %xcoord) { + printf("(%d) getlen %d label\n", $x, -$x); + } + printf("grestore\n"); + } + + printf("gsave 0 %d translate\n", 7.5*72 ); + printf("contourcolor /Courier findfont 12 scalefont setfont\n"); + $line = 0; + + $cmpfidx = $#cmpfiles; + if( $cmpfidx > (2.5*72/15)-4 ) { + $cmpfidx = (2.5*72/15)-4; + } + for(; $cmpfidx>=0; $cmpfidx--) { + $cmpf = $cmpfiles[$cmpfidx]; + printf("%d cmpfcolor\n", $cmpfidx); + printf("newpath 20 %d moveto 0 10 rlineto 10 0 rlineto 0 -10 rlineto closepath fill\n", + 15*$line, $cmpf); + printf("contourcolor 40 %d moveto (%s %s) show\n", 15*$line, $cmpf, $fontname{$cmpf}); + $line++; + } + if( $#cmpfiles >=0 ) { + printf("0 %d moveto (Comparison files:) show\n", 15*$line++); + } + printf("0 %d moveto (code: %d name: %s) show\n", 15*$line++, $xcode, $xname); + printf("0 %d moveto (%s) show\n", 15*$line++, $fname); + printf("0 %d moveto (%s) show\n", 15*$line++, $fontname{$fname}); + printf("grestore\n\n"); + + printf("showpage grestore\n\n"); +} +printf("%%%%Pages: %d\n", $pages); diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/pt1.c b/application/third_party/dompdf/lib/ttf2ufm/src/pt1.c new file mode 100755 index 00000000..875608b5 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/pt1.c @@ -0,0 +1,7390 @@ +/* + * see COPYRIGHT + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef WINDOWS +# include +# include +#else +# include "windows.h" +#endif + +#include "ttf.h" +#include "pt1.h" +#include "global.h" + +/* big and small values for comparisons */ +#define FBIGVAL (1e20) +#define FEPS (100000./FBIGVAL) + +/* names of the axes */ +#define X 0 +#define Y 1 + +/* the GENTRY extension structure used in fforceconcise() */ + +struct gex_con { + double d[2 /*X, Y*/]; /* sizes of curve */ + double sin2; /* squared sinus of the angle to the next gentry */ + double len2; /* squared distance between the endpoints */ + +/* number of reference dots taken from each curve */ +#define NREFDOTS 3 + + double dots[NREFDOTS][2]; /* reference dots */ + + int flags; /* flags for gentry and tits joint to the next gentry */ +/* a vertical or horizontal line may be in 2 quadrants at once */ +#define GEXF_QUL 0x00000001 /* in up-left quadrant */ +#define GEXF_QUR 0x00000002 /* in up-right quadrant */ +#define GEXF_QDR 0x00000004 /* in down-right quadrant */ +#define GEXF_QDL 0x00000008 /* in down-left quadrant */ +#define GEXF_QMASK 0x0000000F /* quadrant mask */ + +/* if a line is nearly vertical or horizontal, we remember that idealized quartant too */ +#define GEXF_QTO_IDEAL(f) (((f)&0xF)<<4) +#define GEXF_QFROM_IDEAL(f) (((f)&0xF0)>>4) +#define GEXF_IDQ_L 0x00000090 /* left */ +#define GEXF_IDQ_R 0x00000060 /* right */ +#define GEXF_IDQ_U 0x00000030 /* up */ +#define GEXF_IDQ_D 0x000000C0 /* down */ + +/* possibly can be joined with conditions: + * (in order of increasing preference, the numeric order is important) + */ +#define GEXF_JLINE 0x00000100 /* into one line */ +#define GEXF_JIGN 0x00000200 /* if one entry's tangent angle is ignored */ +#define GEXF_JID 0x00000400 /* if one entry is idealized to hor/vert */ +#define GEXF_JFLAT 0x00000800 /* if one entry is flattened */ +#define GEXF_JGOOD 0x00001000 /* perfectly, no additional maodifications */ + +#define GEXF_JMASK 0x00001F00 /* the mask of all above */ +#define GEXF_JCVMASK 0x00001E00 /* the mask of all above except JLINE */ + +/* which entry needs to be modified for conditional joining */ +#define GEXF_JIGN1 0x00002000 +#define GEXF_JIGN2 0x00004000 +#define GEXF_JIGNDIR(dir) (GEXF_JIGN1<<(dir)) +#define GEXF_JID1 0x00008000 +#define GEXF_JID2 0x00010000 +#define GEXF_JIDDIR(dir) (GEXF_JID1<<(dir)) +#define GEXF_JFLAT1 0x00020000 +#define GEXF_JFLAT2 0x00040000 +#define GEXF_JFLATDIR(dir) (GEXF_JFLAT1<<(dir)) + +#define GEXF_VERT 0x00100000 /* is nearly vertical */ +#define GEXF_HOR 0x00200000 /* is nearly horizontal */ +#define GEXF_FLAT 0x00400000 /* is nearly flat */ + +#define GEXF_VDOTS 0x01000000 /* the dots are valid */ + + signed char isd[2 /*X,Y*/]; /* signs of the sizes */ +}; +typedef struct gex_con GEX_CON; + +/* convenience macros */ +#define X_CON(ge) ((GEX_CON *)((ge)->ext)) +#define X_CON_D(ge) (X_CON(ge)->d) +#define X_CON_DX(ge) (X_CON(ge)->d[0]) +#define X_CON_DY(ge) (X_CON(ge)->d[1]) +#define X_CON_ISD(ge) (X_CON(ge)->isd) +#define X_CON_ISDX(ge) (X_CON(ge)->isd[0]) +#define X_CON_ISDY(ge) (X_CON(ge)->isd[1]) +#define X_CON_SIN2(ge) (X_CON(ge)->sin2) +#define X_CON_LEN2(ge) (X_CON(ge)->len2) +#define X_CON_F(ge) (X_CON(ge)->flags) + +/* performance statistics about guessing the concise curves */ +static int ggoodcv=0, ggoodcvdots=0, gbadcv=0, gbadcvdots=0; + +int stdhw, stdvw; /* dominant stems widths */ +int stemsnaph[12], stemsnapv[12]; /* most typical stem width */ + +int bluevalues[14]; +int nblues; +int otherblues[10]; +int notherb; +int bbox[4]; /* the FontBBox array */ +double italic_angle; + +GLYPH *glyph_list; +int encoding[ENCTABSZ]; /* inverse of glyph[].char_no */ +int kerning_pairs = 0; + +/* prototypes */ +static void fixcvdir( GENTRY * ge, int dir); +static void fixcvends( GENTRY * ge); +static int fgetcvdir( GENTRY * ge); +static int igetcvdir( GENTRY * ge); +static int fiszigzag( GENTRY *ge); +static int iiszigzag( GENTRY *ge); +static GENTRY * freethisge( GENTRY *ge); +static void addgeafter( GENTRY *oge, GENTRY *nge ); +static GENTRY * newgentry( int flags); +static void debugstems( char *name, STEM * hstems, int nhs, STEM * vstems, int nvs); +static int addbluestems( STEM *s, int n); +static void sortstems( STEM * s, int n); +static int stemoverlap( STEM * s1, STEM * s2); +static int steminblue( STEM *s); +static void markbluestems( STEM *s, int nold); +static int joinmainstems( STEM * s, int nold, int useblues); +static void joinsubstems( STEM * s, short *pairs, int nold, int useblues); +static void fixendpath( GENTRY *ge); +static void fdelsmall( GLYPH *g, double minlen); +static void alloc_gex_con( GENTRY *ge); +static double fjointsin2( GENTRY *ge1, GENTRY *ge2); +static double fcvarea( GENTRY *ge); +static double fcvval( GENTRY *ge, int axis, double t); +static void fsampledots( GENTRY *ge, double dots[][2], int ndots); +static void fnormalizege( GENTRY *ge); +static void fanalyzege( GENTRY *ge); +static void fanalyzejoint( GENTRY *ge); +static void fconcisecontour( GLYPH *g, GENTRY *ge); +static double fclosegap( GENTRY *from, GENTRY *to, int axis, + double gap, double *ret); + +int +isign( + int x +) +{ + if (x > 0) + return 1; + else if (x < 0) + return -1; + else + return 0; +} + +int +fsign( + double x +) +{ + if (x > 0.0) + return 1; + else if (x < 0.0) + return -1; + else + return 0; +} + +static GENTRY * +newgentry( + int flags +) +{ + GENTRY *ge; + + ge = calloc(1, sizeof(GENTRY)); + + if (ge == 0) { + fprintf(stderr, "***** Memory allocation error *****\n"); + exit(255); + } + ge->stemid = -1; + ge->flags = flags; + /* the rest is set to 0 by calloc() */ + return ge; +} + +/* + * Routines to print out Postscript functions with optimization + */ + +void +rmoveto( + int dx, + int dy +) +{ + if (optimize && dx == 0) + fprintf(pfa_file, "%d vmoveto\n", dy); + else if (optimize && dy == 0) + fprintf(pfa_file, "%d hmoveto\n", dx); + else + fprintf(pfa_file, "%d %d rmoveto\n", dx, dy); +} + +void +rlineto( + int dx, + int dy +) +{ + if (optimize && dx == 0 && dy == 0) /* for special pathologic + * case */ + return; + else if (optimize && dx == 0) + fprintf(pfa_file, "%d vlineto\n", dy); + else if (optimize && dy == 0) + fprintf(pfa_file, "%d hlineto\n", dx); + else + fprintf(pfa_file, "%d %d rlineto\n", dx, dy); +} + +void +rrcurveto( + int dx1, + int dy1, + int dx2, + int dy2, + int dx3, + int dy3 +) +{ + /* first two ifs are for crazy cases that occur surprisingly often */ + if (optimize && dx1 == 0 && dx2 == 0 && dx3 == 0) + rlineto(0, dy1 + dy2 + dy3); + else if (optimize && dy1 == 0 && dy2 == 0 && dy3 == 0) + rlineto(dx1 + dx2 + dx3, 0); + else if (optimize && dy1 == 0 && dx3 == 0) + fprintf(pfa_file, "%d %d %d %d hvcurveto\n", + dx1, dx2, dy2, dy3); + else if (optimize && dx1 == 0 && dy3 == 0) + fprintf(pfa_file, "%d %d %d %d vhcurveto\n", + dy1, dx2, dy2, dx3); + else + fprintf(pfa_file, "%d %d %d %d %d %d rrcurveto\n", + dx1, dy1, dx2, dy2, dx3, dy3); +} + +void +closepath(void) +{ + fprintf(pfa_file, "closepath\n"); +} + +/* + * Many of the path processing routines exist (or will exist) in + * both floating-point and integer version. Fimally most of the + * processing will go in floating point and the integer processing + * will become legacy. + * The names of floating routines start with f, names of integer + * routines start with i, and those old routines existing in one + * version only have no such prefix at all. + */ + +/* +** Routine that checks integrity of the path, for debugging +*/ + +void +assertpath( + GENTRY * from, + char *file, + int line, + char *name +) +{ + GENTRY *first, *pe, *ge; + int isfloat; + + if(from==0) + return; + isfloat = (from->flags & GEF_FLOAT); + pe = from->prev; + for (ge = from; ge != 0; pe = ge, ge = ge->next) { + if( (ge->flags & GEF_FLOAT) ^ isfloat ) { + fprintf(stderr, "**! assertpath: called from %s line %d (%s) ****\n", file, line, name); + fprintf(stderr, "float flag changes from %s to %s at 0x%p (type %c, prev type %c)\n", + (isfloat ? "TRUE" : "FALSE"), (isfloat ? "FALSE" : "TRUE"), ge, ge->type, pe->type); + abort(); + } + if (pe != ge->prev) { + fprintf(stderr, "**! assertpath: called from %s line %d (%s) ****\n", file, line, name); + fprintf(stderr, "unidirectional chain 0x%x -next-> 0x%x -prev-> 0x%x \n", + pe, ge, ge->prev); + abort(); + } + + switch(ge->type) { + case GE_MOVE: + break; + case GE_PATH: + if (ge->prev == 0) { + fprintf(stderr, "**! assertpath: called from %s line %d (%s) ****\n", file, line, name); + fprintf(stderr, "empty path at 0x%x \n", ge); + abort(); + } + break; + case GE_LINE: + case GE_CURVE: + if(ge->frwd->bkwd != ge) { + fprintf(stderr, "**! assertpath: called from %s line %d (%s) ****\n", file, line, name); + fprintf(stderr, "unidirectional chain 0x%x -frwd-> 0x%x -bkwd-> 0x%x \n", + ge, ge->frwd, ge->frwd->bkwd); + abort(); + } + if(ge->prev->type == GE_MOVE) { + first = ge; + if(ge->bkwd->next->type != GE_PATH) { + fprintf(stderr, "**! assertpath: called from %s line %d (%s) ****\n", file, line, name); + fprintf(stderr, "broken first backlink 0x%x -bkwd-> 0x%x -next-> 0x%x \n", + ge, ge->bkwd, ge->bkwd->next); + abort(); + } + } + if(ge->next->type == GE_PATH) { + if(ge->frwd != first) { + fprintf(stderr, "**! assertpath: called from %s line %d (%s) ****\n", file, line, name); + fprintf(stderr, "broken loop 0x%x -...-> 0x%x -frwd-> 0x%x \n", + first, ge, ge->frwd); + abort(); + } + } + break; + } + + } +} + +void +assertisfloat( + GLYPH *g, + char *msg +) +{ + if( !(g->flags & GF_FLOAT) ) { + fprintf(stderr, "**! Glyph %s is not float: %s\n", g->name, msg); + abort(); + } + if(g->lastentry) { + if( !(g->lastentry->flags & GEF_FLOAT) ) { + fprintf(stderr, "**! Glyphs %s last entry is int: %s\n", g->name, msg); + abort(); + } + } +} + +void +assertisint( + GLYPH *g, + char *msg +) +{ + if( (g->flags & GF_FLOAT) ) { + fprintf(stderr, "**! Glyph %s is not int: %s\n", g->name, msg); + abort(); + } + if(g->lastentry) { + if( (g->lastentry->flags & GEF_FLOAT) ) { + fprintf(stderr, "**! Glyphs %s last entry is float: %s\n", g->name, msg); + abort(); + } + } +} + + +/* + * Routines to save the generated data about glyph + */ + +void +fg_rmoveto( + GLYPH * g, + double x, + double y) +{ + GENTRY *oge; + + if (ISDBG(BUILDG)) + fprintf(stderr, "%s: f rmoveto(%g, %g)\n", g->name, x, y); + + assertisfloat(g, "adding float MOVE"); + + if ((oge = g->lastentry) != 0) { + if (oge->type == GE_MOVE) { /* just eat up the first move */ + oge->fx3 = x; + oge->fy3 = y; + } else if (oge->type == GE_LINE || oge->type == GE_CURVE) { + fprintf(stderr, "Glyph %s: MOVE in middle of path\n", g->name); + } else { + GENTRY *nge; + + nge = newgentry(GEF_FLOAT); + nge->type = GE_MOVE; + nge->fx3 = x; + nge->fy3 = y; + + oge->next = nge; + nge->prev = oge; + g->lastentry = nge; + } + } else { + GENTRY *nge; + + nge = newgentry(GEF_FLOAT); + nge->type = GE_MOVE; + nge->fx3 = x; + nge->fy3 = y; + nge->bkwd = (GENTRY*)&g->entries; + g->entries = g->lastentry = nge; + } + + if (0 && ISDBG(BUILDG)) + dumppaths(g, NULL, NULL); +} + +void +ig_rmoveto( + GLYPH * g, + int x, + int y) +{ + GENTRY *oge; + + if (ISDBG(BUILDG)) + fprintf(stderr, "%s: i rmoveto(%d, %d)\n", g->name, x, y); + + assertisint(g, "adding int MOVE"); + + if ((oge = g->lastentry) != 0) { + if (oge->type == GE_MOVE) { /* just eat up the first move */ + oge->ix3 = x; + oge->iy3 = y; + } else if (oge->type == GE_LINE || oge->type == GE_CURVE) { + fprintf(stderr, "Glyph %s: MOVE in middle of path, ignored\n", g->name); + } else { + GENTRY *nge; + + nge = newgentry(0); + nge->type = GE_MOVE; + nge->ix3 = x; + nge->iy3 = y; + + oge->next = nge; + nge->prev = oge; + g->lastentry = nge; + } + } else { + GENTRY *nge; + + nge = newgentry(0); + nge->type = GE_MOVE; + nge->ix3 = x; + nge->iy3 = y; + nge->bkwd = (GENTRY*)&g->entries; + g->entries = g->lastentry = nge; + } + +} + +void +fg_rlineto( + GLYPH * g, + double x, + double y) +{ + GENTRY *oge, *nge; + + if (ISDBG(BUILDG)) + fprintf(stderr, "%s: f rlineto(%g, %g)\n", g->name, x, y); + + assertisfloat(g, "adding float LINE"); + + nge = newgentry(GEF_FLOAT); + nge->type = GE_LINE; + nge->fx3 = x; + nge->fy3 = y; + + if ((oge = g->lastentry) != 0) { + if (x == oge->fx3 && y == oge->fy3) { /* empty line */ + /* ignore it or we will get in troubles later */ + free(nge); + return; + } + if (g->path == 0) { + g->path = nge; + nge->bkwd = nge->frwd = nge; + } else { + oge->frwd = nge; + nge->bkwd = oge; + g->path->bkwd = nge; + nge->frwd = g->path; + } + + oge->next = nge; + nge->prev = oge; + g->lastentry = nge; + } else { + WARNING_1 fprintf(stderr, "Glyph %s: LINE outside of path\n", g->name); + free(nge); + } + + if (0 && ISDBG(BUILDG)) + dumppaths(g, NULL, NULL); +} + +void +ig_rlineto( + GLYPH * g, + int x, + int y) +{ + GENTRY *oge, *nge; + + if (ISDBG(BUILDG)) + fprintf(stderr, "%s: i rlineto(%d, %d)\n", g->name, x, y); + + assertisint(g, "adding int LINE"); + + nge = newgentry(0); + nge->type = GE_LINE; + nge->ix3 = x; + nge->iy3 = y; + + if ((oge = g->lastentry) != 0) { + if (x == oge->ix3 && y == oge->iy3) { /* empty line */ + /* ignore it or we will get in troubles later */ + free(nge); + return; + } + if (g->path == 0) { + g->path = nge; + nge->bkwd = nge->frwd = nge; + } else { + oge->frwd = nge; + nge->bkwd = oge; + g->path->bkwd = nge; + nge->frwd = g->path; + } + + oge->next = nge; + nge->prev = oge; + g->lastentry = nge; + } else { + WARNING_1 fprintf(stderr, "Glyph %s: LINE outside of path\n", g->name); + free(nge); + } + +} + +void +fg_rrcurveto( + GLYPH * g, + double x1, + double y1, + double x2, + double y2, + double x3, + double y3) +{ + GENTRY *oge, *nge; + + oge = g->lastentry; + + if (ISDBG(BUILDG)) + fprintf(stderr, "%s: f rrcurveto(%g, %g, %g, %g, %g, %g)\n" + ,g->name, x1, y1, x2, y2, x3, y3); + + assertisfloat(g, "adding float CURVE"); + + if (oge && oge->fx3 == x1 && x1 == x2 && x2 == x3) /* check if it's + * actually a line */ + fg_rlineto(g, x1, y3); + else if (oge && oge->fy3 == y1 && y1 == y2 && y2 == y3) + fg_rlineto(g, x3, y1); + else { + nge = newgentry(GEF_FLOAT); + nge->type = GE_CURVE; + nge->fx1 = x1; + nge->fy1 = y1; + nge->fx2 = x2; + nge->fy2 = y2; + nge->fx3 = x3; + nge->fy3 = y3; + + if (oge != 0) { + if (x3 == oge->fx3 && y3 == oge->fy3) { + free(nge); /* consider this curve empty */ + /* ignore it or we will get in troubles later */ + return; + } + if (g->path == 0) { + g->path = nge; + nge->bkwd = nge->frwd = nge; + } else { + oge->frwd = nge; + nge->bkwd = oge; + g->path->bkwd = nge; + nge->frwd = g->path; + } + + oge->next = nge; + nge->prev = oge; + g->lastentry = nge; + } else { + WARNING_1 fprintf(stderr, "Glyph %s: CURVE outside of path\n", g->name); + free(nge); + } + } + + if (0 && ISDBG(BUILDG)) + dumppaths(g, NULL, NULL); +} + +void +ig_rrcurveto( + GLYPH * g, + int x1, + int y1, + int x2, + int y2, + int x3, + int y3) +{ + GENTRY *oge, *nge; + + oge = g->lastentry; + + if (ISDBG(BUILDG)) + fprintf(stderr, "%s: i rrcurveto(%d, %d, %d, %d, %d, %d)\n" + ,g->name, x1, y1, x2, y2, x3, y3); + + assertisint(g, "adding int CURVE"); + + if (oge && oge->ix3 == x1 && x1 == x2 && x2 == x3) /* check if it's + * actually a line */ + ig_rlineto(g, x1, y3); + else if (oge && oge->iy3 == y1 && y1 == y2 && y2 == y3) + ig_rlineto(g, x3, y1); + else { + nge = newgentry(0); + nge->type = GE_CURVE; + nge->ix1 = x1; + nge->iy1 = y1; + nge->ix2 = x2; + nge->iy2 = y2; + nge->ix3 = x3; + nge->iy3 = y3; + + if (oge != 0) { + if (x3 == oge->ix3 && y3 == oge->iy3) { + free(nge); /* consider this curve empty */ + /* ignore it or we will get in troubles later */ + return; + } + if (g->path == 0) { + g->path = nge; + nge->bkwd = nge->frwd = nge; + } else { + oge->frwd = nge; + nge->bkwd = oge; + g->path->bkwd = nge; + nge->frwd = g->path; + } + + oge->next = nge; + nge->prev = oge; + g->lastentry = nge; + } else { + WARNING_1 fprintf(stderr, "Glyph %s: CURVE outside of path\n", g->name); + free(nge); + } + } +} + +void +g_closepath( + GLYPH * g +) +{ + GENTRY *oge, *nge; + + if (ISDBG(BUILDG)) + fprintf(stderr, "%s: closepath\n", g->name); + + oge = g->lastentry; + + if (g->path == 0) { + WARNING_1 fprintf(stderr, "Warning: **** closepath on empty path in glyph \"%s\" ****\n", + g->name); + if (oge == 0) { + WARNING_1 fprintf(stderr, "No previois entry\n"); + } else { + WARNING_1 fprintf(stderr, "Previous entry type: %c\n", oge->type); + if (oge->type == GE_MOVE) { + g->lastentry = oge->prev; + if (oge->prev == 0) + g->entries = 0; + else + g->lastentry->next = 0; + free(oge); + } + } + return; + } + + nge = newgentry(oge->flags & GEF_FLOAT); /* keep the same type */ + nge->type = GE_PATH; + + g->path = 0; + + oge->next = nge; + nge->prev = oge; + g->lastentry = nge; + + if (0 && ISDBG(BUILDG)) + dumppaths(g, NULL, NULL); +} + +/* + * * SB * Routines to smooth and fix the glyphs + */ + +/* +** we don't want to see the curves with coinciding middle and +** outer points +*/ + +static void +fixcvends( + GENTRY * ge +) +{ + int dx, dy; + int x0, y0, x1, y1, x2, y2, x3, y3; + + if (ge->type != GE_CURVE) + return; + + if(ge->flags & GEF_FLOAT) { + fprintf(stderr, "**! fixcvends(0x%x) on floating entry, ABORT\n", ge); + abort(); /* dump core */ + } + + x0 = ge->prev->ix3; + y0 = ge->prev->iy3; + x1 = ge->ix1; + y1 = ge->iy1; + x2 = ge->ix2; + y2 = ge->iy2; + x3 = ge->ix3; + y3 = ge->iy3; + + + /* look at the start of the curve */ + if (x1 == x0 && y1 == y0) { + dx = x2 - x1; + dy = y2 - y1; + + if (dx == 0 && dy == 0 + || x2 == x3 && y2 == y3) { + /* Oops, we actually have a straight line */ + /* + * if it's small, we hope that it will get optimized + * later + */ + if (abs(x3 - x0) <= 2 || abs(y3 - y0) <= 2) { + ge->ix1 = x3; + ge->iy1 = y3; + ge->ix2 = x0; + ge->iy2 = y0; + } else {/* just make it a line */ + ge->type = GE_LINE; + } + } else { + if (abs(dx) < 4 && abs(dy) < 4) { /* consider it very + * small */ + ge->ix1 = x2; + ge->iy1 = y2; + } else if (abs(dx) < 8 && abs(dy) < 8) { /* consider it small */ + ge->ix1 += dx / 2; + ge->iy1 += dy / 2; + } else { + ge->ix1 += dx / 4; + ge->iy1 += dy / 4; + } + /* make sure that it's still on the same side */ + if (abs(x3 - x0) * abs(dy) < abs(y3 - y0) * abs(dx)) { + if (abs(x3 - x0) * abs(ge->iy1 - y0) > abs(y3 - y0) * abs(ge->ix1 - x0)) + ge->ix1 += isign(dx); + } else { + if (abs(x3 - x0) * abs(ge->iy1 - y0) < abs(y3 - y0) * abs(ge->ix1 - x0)) + ge->iy1 += isign(dy); + } + + ge->ix2 += (x3 - x2) / 8; + ge->iy2 += (y3 - y2) / 8; + /* make sure that it's still on the same side */ + if (abs(x3 - x0) * abs(y3 - y2) < abs(y3 - y0) * abs(x3 - x2)) { + if (abs(x3 - x0) * abs(y3 - ge->iy2) > abs(y3 - y0) * abs(x3 - ge->ix2)) + ge->iy1 -= isign(y3 - y2); + } else { + if (abs(x3 - x0) * abs(y3 - ge->iy2) < abs(y3 - y0) * abs(x3 - ge->ix2)) + ge->ix1 -= isign(x3 - x2); + } + + } + } else if (x2 == x3 && y2 == y3) { + dx = x1 - x2; + dy = y1 - y2; + + if (dx == 0 && dy == 0) { + /* Oops, we actually have a straight line */ + /* + * if it's small, we hope that it will get optimized + * later + */ + if (abs(x3 - x0) <= 2 || abs(y3 - y0) <= 2) { + ge->ix1 = x3; + ge->iy1 = y3; + ge->ix2 = x0; + ge->iy2 = y0; + } else {/* just make it a line */ + ge->type = GE_LINE; + } + } else { + if (abs(dx) < 4 && abs(dy) < 4) { /* consider it very + * small */ + ge->ix2 = x1; + ge->iy2 = y1; + } else if (abs(dx) < 8 && abs(dy) < 8) { /* consider it small */ + ge->ix2 += dx / 2; + ge->iy2 += dy / 2; + } else { + ge->ix2 += dx / 4; + ge->iy2 += dy / 4; + } + /* make sure that it's still on the same side */ + if (abs(x3 - x0) * abs(dy) < abs(y3 - y0) * abs(dx)) { + if (abs(x3 - x0) * abs(ge->iy2 - y3) > abs(y3 - y0) * abs(ge->ix2 - x3)) + ge->ix2 += isign(dx); + } else { + if (abs(x3 - x0) * abs(ge->iy2 - y3) < abs(y3 - y0) * abs(ge->ix2 - x3)) + ge->iy2 += isign(dy); + } + + ge->ix1 += (x0 - x1) / 8; + ge->iy1 += (y0 - y1) / 8; + /* make sure that it's still on the same side */ + if (abs(x3 - x0) * abs(y0 - y1) < abs(y3 - y0) * abs(x0 - x1)) { + if (abs(x3 - x0) * abs(y0 - ge->iy1) > abs(y3 - y0) * abs(x0 - ge->ix1)) + ge->iy1 -= isign(y0 - y1); + } else { + if (abs(x3 - x0) * abs(y0 - ge->iy1) < abs(y3 - y0) * abs(x0 - ge->ix1)) + ge->ix1 -= isign(x0 - x1); + } + + } + } +} + +/* +** After transformations we want to make sure that the resulting +** curve is going in the same quadrant as the original one, +** because rounding errors introduced during transformations +** may make the result completeley wrong. +** +** `dir' argument describes the direction of the original curve, +** it is the superposition of two values for the front and +** rear ends of curve: +** +** >EQUAL - goes over the line connecting the ends +** =EQUAL - coincides with the line connecting the ends +** flags & GEF_FLOAT) { + fprintf(stderr, "**! fixcvdir(0x%x) on floating entry, ABORT\n", ge); + abort(); /* dump core */ + } + + fdir = (dir & CVDIR_FRONT) - CVDIR_FEQUAL; + if ((dir & CVDIR_REAR) == CVDIR_RSAME) + rdir = fdir; /* we need only isign, exact value doesn't matter */ + else + rdir = (dir & CVDIR_REAR) - CVDIR_REQUAL; + + fixcvends(ge); + + c = isign(ge->ix3 - ge->prev->ix3); /* note the direction of + * curve */ + d = isign(ge->iy3 - ge->prev->iy3); + + a = ge->iy3 - ge->prev->iy3; + b = ge->ix3 - ge->prev->ix3; + kk = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + a = ge->iy1 - ge->prev->iy3; + b = ge->ix1 - ge->prev->ix3; + kk1 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + a = ge->iy3 - ge->iy2; + b = ge->ix3 - ge->ix2; + kk2 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + + changed = 1; + while (changed) { + if (ISDBG(FIXCVDIR)) { + /* for debugging */ + fprintf(stderr, "fixcvdir %d %d (%d %d %d %d %d %d) %f %f %f\n", + fdir, rdir, + ge->ix1 - ge->prev->ix3, + ge->iy1 - ge->prev->iy3, + ge->ix2 - ge->ix1, + ge->iy2 - ge->iy1, + ge->ix3 - ge->ix2, + ge->iy3 - ge->iy2, + kk1, kk, kk2); + } + changed = 0; + + if (fdir > 0) { + if (kk1 > kk) { /* the front end has problems */ + if (c * (ge->ix1 - ge->prev->ix3) > 0) { + ge->ix1 -= c; + changed = 1; + } if (d * (ge->iy2 - ge->iy1) > 0) { + ge->iy1 += d; + changed = 1; + } + /* recalculate the coefficients */ + a = ge->iy3 - ge->prev->iy3; + b = ge->ix3 - ge->prev->ix3; + kk = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + a = ge->iy1 - ge->prev->iy3; + b = ge->ix1 - ge->prev->ix3; + kk1 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + } + } else if (fdir < 0) { + if (kk1 < kk) { /* the front end has problems */ + if (c * (ge->ix2 - ge->ix1) > 0) { + ge->ix1 += c; + changed = 1; + } if (d * (ge->iy1 - ge->prev->iy3) > 0) { + ge->iy1 -= d; + changed = 1; + } + /* recalculate the coefficients */ + a = ge->iy1 - ge->prev->iy3; + b = ge->ix1 - ge->prev->ix3; + kk1 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + a = ge->iy3 - ge->prev->iy3; + b = ge->ix3 - ge->prev->ix3; + kk = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + } + } + if (rdir > 0) { + if (kk2 < kk) { /* the rear end has problems */ + if (c * (ge->ix2 - ge->ix1) > 0) { + ge->ix2 -= c; + changed = 1; + } if (d * (ge->iy3 - ge->iy2) > 0) { + ge->iy2 += d; + changed = 1; + } + /* recalculate the coefficients */ + a = ge->iy3 - ge->prev->iy3; + b = ge->ix3 - ge->prev->ix3; + kk = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + a = ge->iy3 - ge->iy2; + b = ge->ix3 - ge->ix2; + kk2 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + } + } else if (rdir < 0) { + if (kk2 > kk) { /* the rear end has problems */ + if (c * (ge->ix3 - ge->ix2) > 0) { + ge->ix2 += c; + changed = 1; + } if (d * (ge->iy2 - ge->iy1) > 0) { + ge->iy2 -= d; + changed = 1; + } + /* recalculate the coefficients */ + a = ge->iy3 - ge->prev->iy3; + b = ge->ix3 - ge->prev->ix3; + kk = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + a = ge->iy3 - ge->iy2; + b = ge->ix3 - ge->ix2; + kk2 = fabs(a == 0 ? (b == 0 ? 1. : 100000.) : ((double) b / (double) a)); + } + } + } + fixcvends(ge); +} + +/* Get the directions of ends of curve for further usage */ + +/* expects that the previous element is also float */ + +static int +fgetcvdir( + GENTRY * ge +) +{ + double a, b; + double k, k1, k2; + int dir = 0; + + if( !(ge->flags & GEF_FLOAT) ) { + fprintf(stderr, "**! fgetcvdir(0x%x) on int entry, ABORT\n", ge); + abort(); /* dump core */ + } + + a = fabs(ge->fy3 - ge->prev->fy3); + b = fabs(ge->fx3 - ge->prev->fx3); + k = a < FEPS ? (b < FEPS ? 1. : 100000.) : ( b / a); + + a = fabs(ge->fy1 - ge->prev->fy3); + b = fabs(ge->fx1 - ge->prev->fx3); + if(a < FEPS) { + if(b < FEPS) { + a = fabs(ge->fy2 - ge->prev->fy3); + b = fabs(ge->fx2 - ge->prev->fx3); + k1 = a < FEPS ? (b < FEPS ? k : 100000.) : ( b / a); + } else + k1 = FBIGVAL; + } else + k1 = b / a; + + a = fabs(ge->fy3 - ge->fy2); + b = fabs(ge->fx3 - ge->fx2); + if(a < FEPS) { + if(b < FEPS) { + a = fabs(ge->fy3 - ge->fy1); + b = fabs(ge->fx3 - ge->fx1); + k2 = a < FEPS ? (b < FEPS ? k : 100000.) : ( b / a); + } else + k2 = FBIGVAL; + } else + k2 = b / a; + + if(fabs(k1-k) < 0.0001) + dir |= CVDIR_FEQUAL; + else if (k1 < k) + dir |= CVDIR_FUP; + else + dir |= CVDIR_FDOWN; + + if(fabs(k2-k) < 0.0001) + dir |= CVDIR_REQUAL; + else if (k2 > k) + dir |= CVDIR_RUP; + else + dir |= CVDIR_RDOWN; + + return dir; +} + + +/* expects that the previous element is also int */ + +static int +igetcvdir( + GENTRY * ge +) +{ + int a, b; + double k, k1, k2; + int dir = 0; + + if(ge->flags & GEF_FLOAT) { + fprintf(stderr, "**! igetcvdir(0x%x) on floating entry, ABORT\n", ge); + abort(); /* dump core */ + } + + a = ge->iy3 - ge->prev->iy3; + b = ge->ix3 - ge->prev->ix3; + k = (a == 0) ? (b == 0 ? 1. : 100000.) : fabs((double) b / (double) a); + + a = ge->iy1 - ge->prev->iy3; + b = ge->ix1 - ge->prev->ix3; + if(a == 0) { + if(b == 0) { + a = ge->iy2 - ge->prev->iy3; + b = ge->ix2 - ge->prev->ix3; + k1 = (a == 0) ? (b == 0 ? k : 100000.) : fabs((double) b / (double) a); + } else + k1 = FBIGVAL; + } else + k1 = fabs((double) b / (double) a); + + a = ge->iy3 - ge->iy2; + b = ge->ix3 - ge->ix2; + if(a == 0) { + if(b == 0) { + a = ge->iy3 - ge->iy1; + b = ge->ix3 - ge->ix1; + k2 = (a == 0) ? (b == 0 ? k : 100000.) : fabs((double) b / (double) a); + } else + k2 = FBIGVAL; + } else + k2 = fabs((double) b / (double) a); + + if(fabs(k1-k) < 0.0001) + dir |= CVDIR_FEQUAL; + else if (k1 < k) + dir |= CVDIR_FUP; + else + dir |= CVDIR_FDOWN; + + if(fabs(k2-k) < 0.0001) + dir |= CVDIR_REQUAL; + else if (k2 > k) + dir |= CVDIR_RUP; + else + dir |= CVDIR_RDOWN; + + return dir; +} + +#if 0 +/* a function just to test the work of fixcvdir() */ +static void +testfixcvdir( + GLYPH * g +) +{ + GENTRY *ge; + int dir; + + for (ge = g->entries; ge != 0; ge = ge->next) { + if (ge->type == GE_CURVE) { + dir = igetcvdir(ge); + fixcvdir(ge, dir); + } + } +} +#endif + +static int +iround( + double val +) +{ + return (int) (val > 0 ? val + 0.5 : val - 0.5); +} + +/* for debugging - dump the glyph + * mark with a star the entries from start to end inclusive + * (start == NULL means don't mark any, end == NULL means to the last) + */ + +void +dumppaths( + GLYPH *g, + GENTRY *start, + GENTRY *end +) +{ + GENTRY *ge; + int i; + char mark=' '; + + fprintf(stderr, "Glyph %s:\n", g->name); + + /* now do the conversion */ + for(ge = g->entries; ge != 0; ge = ge->next) { + if(ge == start) + mark = '*'; + fprintf(stderr, " %c %8x", mark, ge); + switch(ge->type) { + case GE_MOVE: + case GE_LINE: + if(ge->flags & GEF_FLOAT) + fprintf(stderr," %c float (%g, %g)\n", ge->type, ge->fx3, ge->fy3); + else + fprintf(stderr," %c int (%d, %d)\n", ge->type, ge->ix3, ge->iy3); + break; + case GE_CURVE: + if(ge->flags & GEF_FLOAT) { + fprintf(stderr," C float "); + for(i=0; i<3; i++) + fprintf(stderr,"(%g, %g) ", ge->fxn[i], ge->fyn[i]); + fprintf(stderr,"\n"); + } else { + fprintf(stderr," C int "); + for(i=0; i<3; i++) + fprintf(stderr,"(%d, %d) ", ge->ixn[i], ge->iyn[i]); + fprintf(stderr,"\n"); + } + break; + default: + fprintf(stderr, " %c\n", ge->type); + break; + } + if(ge == end) + mark = ' '; + } +} + +/* + * Routine that converts all entries in the path from float to int + */ + +void +pathtoint( + GLYPH *g +) +{ + GENTRY *ge; + int x[3], y[3]; + int i; + + + if(ISDBG(TOINT)) + fprintf(stderr, "TOINT: glyph %s\n", g->name); + assertisfloat(g, "converting path to int\n"); + + fdelsmall(g, 1.0); /* get rid of sub-pixel contours */ + assertpath(g->entries, __FILE__, __LINE__, g->name); + + /* 1st pass, collect the directions of the curves: have + * to do that in advance, while everyting is float + */ + for(ge = g->entries; ge != 0; ge = ge->next) { + if( !(ge->flags & GEF_FLOAT) ) { + fprintf(stderr, "**! glyphs %s has int entry, found in conversion to int\n", + g->name); + exit(1); + } + if(ge->type == GE_CURVE) { + ge->dir = fgetcvdir(ge); + } + } + + /* now do the conversion */ + for(ge = g->entries; ge != 0; ge = ge->next) { + switch(ge->type) { + case GE_MOVE: + case GE_LINE: + if(ISDBG(TOINT)) + fprintf(stderr," %c float x=%g y=%g\n", ge->type, ge->fx3, ge->fy3); + x[0] = iround(ge->fx3); + y[0] = iround(ge->fy3); + for(i=0; i<3; i++) { /* put some valid values everywhere, for convenience */ + ge->ixn[i] = x[0]; + ge->iyn[i] = y[0]; + } + if(ISDBG(TOINT)) + fprintf(stderr," int x=%d y=%d\n", ge->ix3, ge->iy3); + break; + case GE_CURVE: + if(ISDBG(TOINT)) + fprintf(stderr," %c float ", ge->type); + + for(i=0; i<3; i++) { + if(ISDBG(TOINT)) + fprintf(stderr,"(%g, %g) ", ge->fxn[i], ge->fyn[i]); + x[i] = iround(ge->fxn[i]); + y[i] = iround(ge->fyn[i]); + } + + if(ISDBG(TOINT)) + fprintf(stderr,"\n int "); + + for(i=0; i<3; i++) { + ge->ixn[i] = x[i]; + ge->iyn[i] = y[i]; + if(ISDBG(TOINT)) + fprintf(stderr,"(%d, %d) ", ge->ixn[i], ge->iyn[i]); + } + ge->flags &= ~GEF_FLOAT; /* for fixcvdir */ + fixcvdir(ge, ge->dir); + + if(ISDBG(TOINT)) { + fprintf(stderr,"\n fixed "); + for(i=0; i<3; i++) + fprintf(stderr,"(%d, %d) ", ge->ixn[i], ge->iyn[i]); + fprintf(stderr,"\n"); + } + + break; + } + ge->flags &= ~GEF_FLOAT; + } + g->flags &= ~GF_FLOAT; +} + + +/* check whether we can fix up the curve to change its size by (dx,dy) */ +/* 0 means NO, 1 means YES */ + +/* for float: if scaling would be under 10% */ + +int +fcheckcv( + GENTRY * ge, + double dx, + double dy +) +{ + if( !(ge->flags & GEF_FLOAT) ) { + fprintf(stderr, "**! fcheckcv(0x%x) on int entry, ABORT\n", ge); + abort(); /* dump core */ + } + + if (ge->type != GE_CURVE) + return 0; + + if( fabs(ge->fx3 - ge->prev->fx3) < fabs(dx) * 10 ) + return 0; + + if( fabs(ge->fy3 - ge->prev->fy3) < fabs(dy) * 10 ) + return 0; + + return 1; +} + +/* for int: if won't create new zigzags at the ends */ + +int +icheckcv( + GENTRY * ge, + int dx, + int dy +) +{ + int xdep, ydep; + + if(ge->flags & GEF_FLOAT) { + fprintf(stderr, "**! icheckcv(0x%x) on floating entry, ABORT\n", ge); + abort(); /* dump core */ + } + + if (ge->type != GE_CURVE) + return 0; + + xdep = ge->ix3 - ge->prev->ix3; + ydep = ge->iy3 - ge->prev->iy3; + + if (ge->type == GE_CURVE + && (xdep * (xdep + dx)) > 0 + && (ydep * (ydep + dy)) > 0) { + return 1; + } else + return 0; +} + +/* float connect the ends of open contours */ + +void +fclosepaths( + GLYPH * g +) +{ + GENTRY *ge, *fge, *xge, *nge; + int i; + + assertisfloat(g, "fclosepaths float\n"); + + for (xge = g->entries; xge != 0; xge = xge->next) { + if( xge->type != GE_PATH ) + continue; + + ge = xge->prev; + if(ge == 0 || ge->type != GE_LINE && ge->type!= GE_CURVE) { + fprintf(stderr, "**! Glyph %s got empty path\n", + g->name); + exit(1); + } + + fge = ge->frwd; + if (fge->prev == 0 || fge->prev->type != GE_MOVE) { + fprintf(stderr, "**! Glyph %s got strange beginning of path\n", + g->name); + exit(1); + } + fge = fge->prev; + if (fge->fx3 != ge->fx3 || fge->fy3 != ge->fy3) { + /* we have to fix this open path */ + + WARNING_4 fprintf(stderr, "Glyph %s got path open by dx=%g dy=%g\n", + g->name, fge->fx3 - ge->fx3, fge->fy3 - ge->fy3); + + + /* add a new line */ + nge = newgentry(GEF_FLOAT); + (*nge) = (*ge); + nge->fx3 = fge->fx3; + nge->fy3 = fge->fy3; + nge->type = GE_LINE; + + addgeafter(ge, nge); + + if (fabs(ge->fx3 - fge->fx3) <= 2 && fabs(ge->fy3 - fge->fy3) <= 2) { + /* + * small change, try to get rid of the new entry + */ + + double df[2]; + + for(i=0; i<2; i++) { + df[i] = ge->fpoints[i][2] - fge->fpoints[i][2]; + df[i] = fclosegap(nge, nge, i, df[i], NULL); + } + + if(df[0] == 0. && df[1] == 0.) { + /* closed gap successfully, remove the added entry */ + freethisge(nge); + } + } + } + } +} + +void +smoothjoints( + GLYPH * g +) +{ + GENTRY *ge, *ne; + int dx1, dy1, dx2, dy2, k; + int dir; + + return; /* this stuff seems to create problems */ + + assertisint(g, "smoothjoints int"); + + if (g->entries == 0) /* nothing to do */ + return; + + for (ge = g->entries->next; ge != 0; ge = ge->next) { + ne = ge->frwd; + + /* + * although there should be no one-line path * and any path + * must end with CLOSEPATH, * nobody can say for sure + */ + + if (ge == ne || ne == 0) + continue; + + /* now handle various joints */ + + if (ge->type == GE_LINE && ne->type == GE_LINE) { + dx1 = ge->ix3 - ge->prev->ix3; + dy1 = ge->iy3 - ge->prev->iy3; + dx2 = ne->ix3 - ge->ix3; + dy2 = ne->iy3 - ge->iy3; + + /* check whether they have the same direction */ + /* and the same slope */ + /* then we can join them into one line */ + + if (dx1 * dx2 >= 0 && dy1 * dy2 >= 0 && dx1 * dy2 == dy1 * dx2) { + /* extend the previous line */ + ge->ix3 = ne->ix3; + ge->iy3 = ne->iy3; + + /* and get rid of the next line */ + freethisge(ne); + } + } else if (ge->type == GE_LINE && ne->type == GE_CURVE) { + fixcvends(ne); + + dx1 = ge->ix3 - ge->prev->ix3; + dy1 = ge->iy3 - ge->prev->iy3; + dx2 = ne->ix1 - ge->ix3; + dy2 = ne->iy1 - ge->iy3; + + /* if the line is nearly horizontal and we can fix it */ + if (dx1 != 0 && 5 * abs(dy1) / abs(dx1) == 0 + && icheckcv(ne, 0, -dy1) + && abs(dy1) <= 4) { + dir = igetcvdir(ne); + ge->iy3 -= dy1; + ne->iy1 -= dy1; + fixcvdir(ne, dir); + if (ge->next != ne) + ne->prev->iy3 -= dy1; + dy1 = 0; + } else if (dy1 != 0 && 5 * abs(dx1) / abs(dy1) == 0 + && icheckcv(ne, -dx1, 0) + && abs(dx1) <= 4) { + /* the same but vertical */ + dir = igetcvdir(ne); + ge->ix3 -= dx1; + ne->ix1 -= dx1; + fixcvdir(ne, dir); + if (ge->next != ne) + ne->prev->ix3 -= dx1; + dx1 = 0; + } + /* + * if line is horizontal and curve begins nearly + * horizontally + */ + if (dy1 == 0 && dx2 != 0 && 5 * abs(dy2) / abs(dx2) == 0) { + dir = igetcvdir(ne); + ne->iy1 -= dy2; + fixcvdir(ne, dir); + dy2 = 0; + } else if (dx1 == 0 && dy2 != 0 && 5 * abs(dx2) / abs(dy2) == 0) { + /* the same but vertical */ + dir = igetcvdir(ne); + ne->ix1 -= dx2; + fixcvdir(ne, dir); + dx2 = 0; + } + } else if (ge->type == GE_CURVE && ne->type == GE_LINE) { + fixcvends(ge); + + dx1 = ge->ix3 - ge->ix2; + dy1 = ge->iy3 - ge->iy2; + dx2 = ne->ix3 - ge->ix3; + dy2 = ne->iy3 - ge->iy3; + + /* if the line is nearly horizontal and we can fix it */ + if (dx2 != 0 && 5 * abs(dy2) / abs(dx2) == 0 + && icheckcv(ge, 0, dy2) + && abs(dy2) <= 4) { + dir = igetcvdir(ge); + ge->iy3 += dy2; + ge->iy2 += dy2; + fixcvdir(ge, dir); + if (ge->next != ne) + ne->prev->iy3 += dy2; + dy2 = 0; + } else if (dy2 != 0 && 5 * abs(dx2) / abs(dy2) == 0 + && icheckcv(ge, dx2, 0) + && abs(dx2) <= 4) { + /* the same but vertical */ + dir = igetcvdir(ge); + ge->ix3 += dx2; + ge->ix2 += dx2; + fixcvdir(ge, dir); + if (ge->next != ne) + ne->prev->ix3 += dx2; + dx2 = 0; + } + /* + * if line is horizontal and curve ends nearly + * horizontally + */ + if (dy2 == 0 && dx1 != 0 && 5 * abs(dy1) / abs(dx1) == 0) { + dir = igetcvdir(ge); + ge->iy2 += dy1; + fixcvdir(ge, dir); + dy1 = 0; + } else if (dx2 == 0 && dy1 != 0 && 5 * abs(dx1) / abs(dy1) == 0) { + /* the same but vertical */ + dir = igetcvdir(ge); + ge->ix2 += dx1; + fixcvdir(ge, dir); + dx1 = 0; + } + } else if (ge->type == GE_CURVE && ne->type == GE_CURVE) { + fixcvends(ge); + fixcvends(ne); + + dx1 = ge->ix3 - ge->ix2; + dy1 = ge->iy3 - ge->iy2; + dx2 = ne->ix1 - ge->ix3; + dy2 = ne->iy1 - ge->iy3; + + /* + * check if we have a rather smooth joint at extremal + * point + */ + /* left or right extremal point */ + if (abs(dx1) <= 4 && abs(dx2) <= 4 + && dy1 != 0 && 5 * abs(dx1) / abs(dy1) == 0 + && dy2 != 0 && 5 * abs(dx2) / abs(dy2) == 0 + && (ge->iy3 < ge->prev->iy3 && ne->iy3 < ge->iy3 + || ge->iy3 > ge->prev->iy3 && ne->iy3 > ge->iy3) + && (ge->ix3 - ge->prev->ix3) * (ne->ix3 - ge->ix3) < 0 + ) { + dir = igetcvdir(ge); + ge->ix2 += dx1; + dx1 = 0; + fixcvdir(ge, dir); + dir = igetcvdir(ne); + ne->ix1 -= dx2; + dx2 = 0; + fixcvdir(ne, dir); + } + /* top or down extremal point */ + else if (abs(dy1) <= 4 && abs(dy2) <= 4 + && dx1 != 0 && 5 * abs(dy1) / abs(dx1) == 0 + && dx2 != 0 && 5 * abs(dy2) / abs(dx2) == 0 + && (ge->ix3 < ge->prev->ix3 && ne->ix3 < ge->ix3 + || ge->ix3 > ge->prev->ix3 && ne->ix3 > ge->ix3) + && (ge->iy3 - ge->prev->iy3) * (ne->iy3 - ge->iy3) < 0 + ) { + dir = igetcvdir(ge); + ge->iy2 += dy1; + dy1 = 0; + fixcvdir(ge, dir); + dir = igetcvdir(ne); + ne->iy1 -= dy2; + dy2 = 0; + fixcvdir(ne, dir); + } + /* or may be we just have a smooth junction */ + else if (dx1 * dx2 >= 0 && dy1 * dy2 >= 0 + && 10 * abs(k = abs(dx1 * dy2) - abs(dy1 * dx2)) < (abs(dx1 * dy2) + abs(dy1 * dx2))) { + int tries[6][4]; + int results[6]; + int i, b; + + /* build array of changes we are going to try */ + /* uninitalized entries are 0 */ + if (k > 0) { + static int t1[6][4] = { + {0, 0, 0, 0}, + {-1, 0, 1, 0}, + {-1, 0, 0, 1}, + {0, -1, 1, 0}, + {0, -1, 0, 1}, + {-1, -1, 1, 1}}; + memcpy(tries, t1, sizeof tries); + } else { + static int t1[6][4] = { + {0, 0, 0, 0}, + {1, 0, -1, 0}, + {1, 0, 0, -1}, + {0, 1, -1, 0}, + {0, 1, 0, -1}, + {1, 1, -1, -1}}; + memcpy(tries, t1, sizeof tries); + } + + /* now try the changes */ + results[0] = abs(k); + for (i = 1; i < 6; i++) { + results[i] = abs((abs(dx1) + tries[i][0]) * (abs(dy2) + tries[i][1]) - + (abs(dy1) + tries[i][2]) * (abs(dx2) + tries[i][3])); + } + + /* and find the best try */ + k = abs(k); + b = 0; + for (i = 1; i < 6; i++) + if (results[i] < k) { + k = results[i]; + b = i; + } + /* and finally apply it */ + if (dx1 < 0) + tries[b][0] = -tries[b][0]; + if (dy2 < 0) + tries[b][1] = -tries[b][1]; + if (dy1 < 0) + tries[b][2] = -tries[b][2]; + if (dx2 < 0) + tries[b][3] = -tries[b][3]; + + dir = igetcvdir(ge); + ge->ix2 -= tries[b][0]; + ge->iy2 -= tries[b][2]; + fixcvdir(ge, dir); + dir = igetcvdir(ne); + ne->ix1 += tries[b][3]; + ne->iy1 += tries[b][1]; + fixcvdir(ne, dir); + } + } + } +} + +/* debugging: print out stems of a glyph */ +static void +debugstems( + char *name, + STEM * hstems, + int nhs, + STEM * vstems, + int nvs +) +{ + int i; + + fprintf(pfa_file, "%% %s\n", name); + fprintf(pfa_file, "%% %d horizontal stems:\n", nhs); + for (i = 0; i < nhs; i++) + fprintf(pfa_file, "%% %3d %d (%d...%d) %c %c%c%c%c\n", i, hstems[i].value, + hstems[i].from, hstems[i].to, + ((hstems[i].flags & ST_UP) ? 'U' : 'D'), + ((hstems[i].flags & ST_END) ? 'E' : '-'), + ((hstems[i].flags & ST_FLAT) ? 'F' : '-'), + ((hstems[i].flags & ST_ZONE) ? 'Z' : ' '), + ((hstems[i].flags & ST_TOPZONE) ? 'T' : ' ')); + fprintf(pfa_file, "%% %d vertical stems:\n", nvs); + for (i = 0; i < nvs; i++) + fprintf(pfa_file, "%% %3d %d (%d...%d) %c %c%c\n", i, vstems[i].value, + vstems[i].from, vstems[i].to, + ((vstems[i].flags & ST_UP) ? 'U' : 'D'), + ((vstems[i].flags & ST_END) ? 'E' : '-'), + ((vstems[i].flags & ST_FLAT) ? 'F' : '-')); +} + +/* add pseudo-stems for the limits of the Blue zones to the stem array */ +static int +addbluestems( + STEM *s, + int n +) +{ + int i; + + for(i=0; i + (s[j].flags & (ST_ZONE|ST_FLAT|ST_END) ^ ST_FLAT) + ) + continue; + } else { + if( + (s[i].flags & (ST_ZONE|ST_FLAT|ST_END) ^ ST_FLAT) + < + (s[j].flags & (ST_ZONE|ST_FLAT|ST_END) ^ ST_FLAT) + ) + continue; + } + } + } + x = s[j]; + s[j] = s[i]; + s[i] = x; + } +} + +/* check whether two stem borders overlap */ + +static int +stemoverlap( + STEM * s1, + STEM * s2 +) +{ + int result; + + if (s1->from <= s2->from && s1->to >= s2->from + || s2->from <= s1->from && s2->to >= s1->from) + result = 1; + else + result = 0; + + if (ISDBG(STEMOVERLAP)) + fprintf(pfa_file, "%% overlap %d(%d..%d)x%d(%d..%d)=%d\n", + s1->value, s1->from, s1->to, s2->value, s2->from, s2->to, result); + return result; +} + +/* + * check if the stem [border] is in an appropriate blue zone + * (currently not used) + */ + +static int +steminblue( + STEM *s +) +{ + int i, val; + + val=s->value; + if(s->flags & ST_UP) { + /* painted size up, look at lower zones */ + if(nblues>=2 && val>=bluevalues[0] && val<=bluevalues[1] ) + return 1; + for(i=0; i=otherblues[i] && val<=otherblues[i+1] ) + return 1; + } + } else { + /* painted side down, look at upper zones */ + for(i=2; i=bluevalues[i] && val<=bluevalues[i+1] ) + return 1; + } + } + + return 0; +} + +/* mark the outermost stem [borders] in the blue zones */ + +static void +markbluestems( + STEM *s, + int nold +) +{ + int i, j, a, b, c; + /* + * traverse the list of Blue Values, mark the lowest upper + * stem in each bottom zone and the topmost lower stem in + * each top zone with ST_BLUE + */ + + /* top zones */ + for(i=2; i=0; j--) { + if( s[j].flags & (ST_ZONE|ST_UP|ST_END) ) + continue; + c=s[j].value; + if(c=0 && s[j].value==c + && (s[j].flags & (ST_UP|ST_ZONE))==0 ; j--) + s[j].flags |= ST_BLUE; + break; + } + } + } + /* baseline */ + if(nblues>=2) { + a=bluevalues[0]; b=bluevalues[1]; + for(j=0; jb) /* too high */ + break; + if(c>=a) { /* found the lowest stem border */ + /* mark all the stems with the same value */ + if(ISDBG(BLUESTEMS)) + fprintf(pfa_file, "%% found U BLUE at %d\n", s[j].value); + /* include ST_END values */ + while( s[j-1].value==c && (s[j-1].flags & ST_ZONE)==0 ) + j--; + s[j].flags |= ST_BLUE; + for(j++; jb) /* too high */ + break; + if(c>=a) { /* found the lowest stem border */ + /* mark all the stems with the same value */ + if(ISDBG(BLUESTEMS)) + fprintf(pfa_file, "%% found U BLUE at %d\n", s[j].value); + /* include ST_END values */ + while( s[j-1].value==c && (s[j-1].flags & ST_ZONE)==0 ) + j--; + s[j].flags |= ST_BLUE; + for(j++; j=b) { /* have no free space */ + for(j=nold; j>=b; j--) /* make free space */ + s[j]=s[j-1]; + b++; + nold++; + } + s[nnew]=s[a]; + s[nnew].flags &= ~(ST_UP|ST_BLUE); + nnew++; + i=b-1; + } else { + s[nnew++]=s[c]; + i=c; /* skip up to this point */ + } + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% +stem %d...%d U BLUE\n", + s[nnew-2].value, s[nnew-1].value); + } else { + if (nstack >= MAX_STACK) { + WARNING_1 fprintf(stderr, "Warning: **** converter's stem stack overflow ****\n"); + nstack = 0; + } + stack[nstack++] = s[i]; + } + } else if(s[i].flags & ST_BLUE) { + /* again, we just HAVE to use this value */ + if (readystem) + nnew += 2; + readystem=0; + + /* remember the list of Blue zone stems with the same value */ + for(a=i, i++; i= 0; i--) { + if( (stack[i].flags & ST_UP)==0 ) { + if( (stack[i].flags & (ST_ZONE|ST_TOPZONE))==ST_ZONE ) + break; + else + continue; + } + for(j=a; j=0; j-=2) { + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% ?stem %d...%d -- %d\n", + s[j].value, s[j+1].value, stack[c].value); + if(s[j+1].value < stack[c].value) /* no conflict */ + break; + if(s[j].flags & ST_BLUE) { + /* oops, we don't want to spoil other blue zones */ + stack[c].value=s[j+1].value+1; + break; + } + if( (s[j].flags|s[j+1].flags) & ST_END ) { + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% -stem %d...%d p=1\n", + s[j].value, s[j+1].value); + continue; /* pri==1, silently discard it */ + } + /* we want to discard no nore than 2 stems of pri>=2 */ + if( ++readystem > 2 ) { + /* change our stem to not conflict */ + stack[c].value=s[j+1].value+1; + break; + } else { + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% -stem %d...%d p>=2\n", + s[j].value, s[j+1].value); + continue; + } + } + nnew=j+2; + /* add this stem */ + if(nnew>=b-1) { /* have no free space */ + for(j=nold; j>=b-1; j--) /* make free space */ + s[j]=s[j-1]; + b++; + nold++; + } + s[nnew++]=stack[c]; + s[nnew++]=s[b-1]; + /* clean up the stack */ + nstack=sbottom=0; + readystem=0; + /* set the next position to search */ + i=b-1; + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% +stem %d...%d D BLUE\n", + s[nnew-2].value, s[nnew-1].value); + } else if (nstack > 0) { + + /* + * check whether our stem overlaps with anything in + * stack + */ + for (j = nstack - 1; j >= sbottom; j--) { + if (s[i].value <= stack[j].value) + break; + if (stack[j].flags & ST_ZONE) + continue; + + if ((s[i].flags & ST_END) + || (stack[j].flags & ST_END)) + pri = 1; + else if ((s[i].flags & ST_FLAT) + || (stack[j].flags & ST_FLAT)) + pri = 3; + else + pri = 2; + + if (pri < readystem && s[nnew + 1].value >= stack[j].value + || !stemoverlap(&stack[j], &s[i])) + continue; + + if (readystem > 1 && s[nnew + 1].value < stack[j].value) { + nnew += 2; + readystem = 0; + nlps = 0; + } + /* + * width of the previous stem (if it's + * present) + */ + w1 = s[nnew + 1].value - s[nnew].value; + + /* width of this stem */ + w2 = s[i].value - stack[j].value; + + if (readystem == 0) { + /* nothing yet, just add a new stem */ + s[nnew] = stack[j]; + s[nnew + 1] = s[i]; + readystem = pri; + if (pri == 1) + nlps = 1; + else if (pri == 2) + sbottom = j; + else { + sbottom = j + 1; + while (sbottom < nstack + && stack[sbottom].value <= stack[j].value) + sbottom++; + } + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% +stem %d...%d p=%d n=%d\n", + stack[j].value, s[i].value, pri, nlps); + } else if (pri == 1) { + if (stack[j].value > s[nnew + 1].value) { + /* + * doesn't overlap with the + * previous one + */ + nnew += 2; + nlps++; + s[nnew] = stack[j]; + s[nnew + 1] = s[i]; + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% +stem %d...%d p=%d n=%d\n", + stack[j].value, s[i].value, pri, nlps); + } else if (w2 < w1) { + /* is narrower */ + s[nnew] = stack[j]; + s[nnew + 1] = s[i]; + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% /stem %d...%d p=%d n=%d %d->%d\n", + stack[j].value, s[i].value, pri, nlps, w1, w2); + } + } else if (pri == 2) { + if (readystem == 2) { + /* choose the narrower stem */ + if (w1 > w2) { + s[nnew] = stack[j]; + s[nnew + 1] = s[i]; + sbottom = j; + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% /stem %d...%d p=%d n=%d\n", + stack[j].value, s[i].value, pri, nlps); + } + /* else readystem==1 */ + } else if (stack[j].value > s[nnew + 1].value) { + /* + * value doesn't overlap with + * the previous one + */ + nnew += 2; + nlps = 0; + s[nnew] = stack[j]; + s[nnew + 1] = s[i]; + sbottom = j; + readystem = pri; + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% +stem %d...%d p=%d n=%d\n", + stack[j].value, s[i].value, pri, nlps); + } else if (nlps == 1 + || stack[j].value > s[nnew - 1].value) { + /* + * we can replace the top + * stem + */ + nlps = 0; + s[nnew] = stack[j]; + s[nnew + 1] = s[i]; + readystem = pri; + sbottom = j; + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% /stem %d...%d p=%d n=%d\n", + stack[j].value, s[i].value, pri, nlps); + } + } else if (readystem == 3) { /* that means also + * pri==3 */ + /* choose the narrower stem */ + if (w1 > w2) { + s[nnew] = stack[j]; + s[nnew + 1] = s[i]; + sbottom = j + 1; + while (sbottom < nstack + && stack[sbottom].value <= stack[j].value) + sbottom++; + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% /stem %d...%d p=%d n=%d\n", + stack[j].value, s[i].value, pri, nlps); + } + } else if (pri == 3) { + /* + * we can replace as many stems as + * neccessary + */ + nnew += 2; + while (nnew > 0 && s[nnew - 1].value >= stack[j].value) { + nnew -= 2; + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% -stem %d..%d\n", + s[nnew].value, s[nnew + 1].value); + } + nlps = 0; + s[nnew] = stack[j]; + s[nnew + 1] = s[i]; + readystem = pri; + sbottom = j + 1; + while (sbottom < nstack + && stack[sbottom].value <= stack[j].value) + sbottom++; + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% +stem %d...%d p=%d n=%d\n", + stack[j].value, s[i].value, pri, nlps); + } + } + } + } + if (readystem) + nnew += 2; + + /* change the 1-pixel-wide stems to 20-pixel-wide stems if possible + * the constant 20 is recommended in the Type1 manual + */ + if(useblues) { + for(i=0; ii+2 && s[i+2].value0 && s[i-1].value>s[i].value-22) + s[i].value=s[i-1].value+2; /* compensate for fuzziness */ + else + s[i].value-=20; + } + } + } + /* make sure that no stem it stretched between + * a top zone and a bottom zone + */ + if(useblues) { + for(i=0; i=s[i].value && c<=s[i+1].value && c=2) { + c=bluevalues[1]; + if( c>=s[i].value && c<=s[i+1].value && c>b ) + b=c; + } + for(j=1; j=s[i].value && c<=s[i+1].value && c>b ) + b=c; + } + if( a!=10000 && b!= -10000 ) { /* it is stretched */ + /* split the stem into 2 ghost stems */ + for(j=nnew+1; j>i+1; j--) /* make free space */ + s[j]=s[j-2]; + nnew+=2; + + if(s[i].value+22 >= a) + s[i+1].value=a-2; /* leave space for fuzziness */ + else + s[i+1].value=s[i].value+20; + + if(s[i+3].value-22 <= b) + s[i+2].value=b+2; /* leave space for fuzziness */ + else + s[i+2].value=s[i+3].value-20; + + i+=2; + } + } + } + /* look for triple stems */ + for (i = 0; i < nnew; i += 2) { + if (nnew - i >= 6) { + a = s[i].value + s[i + 1].value; + b = s[i + 2].value + s[i + 3].value; + c = s[i + 4].value + s[i + 5].value; + + w1 = s[i + 1].value - s[i].value; + w2 = s[i + 3].value - s[i + 2].value; + w3 = s[i + 5].value - s[i + 4].value; + + fw = w3 - w1; /* fuzz in width */ + fd = ((c - b) - (b - a)); /* fuzz in distance + * (doubled) */ + + /* we are able to handle some fuzz */ + /* + * it doesn't hurt if the declared stem is a bit + * narrower than actual unless it's an edge in + * a blue zone + */ + if (abs(abs(fd) - abs(fw)) * 5 < w2 + && abs(fw) * 20 < (w1 + w3)) { /* width dirrerence <10% */ + + if(useblues) { /* check that we don't disturb any blue stems */ + j=c; k=a; + if (fw > 0) { + if (fd > 0) { + if( s[i+5].flags & ST_BLUE ) + continue; + j -= fw; + } else { + if( s[i+4].flags & ST_BLUE ) + continue; + j += fw; + } + } else if(fw < 0) { + if (fd > 0) { + if( s[i+1].flags & ST_BLUE ) + continue; + k -= fw; + } else { + if( s[i].flags & ST_BLUE ) + continue; + k += fw; + } + } + pri = ((j - b) - (b - k)); + + if (pri > 0) { + if( s[i+2].flags & ST_BLUE ) + continue; + } else if(pri < 0) { + if( s[i+3].flags & ST_BLUE ) + continue; + } + } + + /* + * first fix up the width of 1st and 3rd + * stems + */ + if (fw > 0) { + if (fd > 0) { + s[i + 5].value -= fw; + c -= fw; + } else { + s[i + 4].value += fw; + c += fw; + } + } else { + if (fd > 0) { + s[i + 1].value -= fw; + a -= fw; + } else { + s[i].value += fw; + a += fw; + } + } + fd = ((c - b) - (b - a)); + + if (fd > 0) { + s[i + 2].value += abs(fd) / 2; + } else { + s[i + 3].value -= abs(fd) / 2; + } + + s[i].flags |= ST_3; + i += 4; + } + } + } + + return (nnew & ~1); /* number of lines must be always even */ +} + +/* + * these macros and function allow to set the base stem, + * check that it's not empty and subtract another stem + * from the base stem (possibly dividing it into multiple parts) + */ + +/* pairs for pieces of the base stem */ +static short xbstem[MAX_STEMS*2]; +/* index of the last point */ +static int xblast= -1; + +#define setbasestem(from, to) \ + (xbstem[0]=from, xbstem[1]=to, xblast=1) +#define isbaseempty() (xblast<=0) + +/* returns 1 if was overlapping, 0 otherwise */ +static int +subfrombase( + int from, + int to +) +{ + int a, b; + int i, j; + + if(isbaseempty()) + return 0; + + /* handle the simple case simply */ + if(from > xbstem[xblast] || to < xbstem[0]) + return 0; + + /* the binary search may be more efficient */ + /* but for now the linear search is OK */ + for(b=1; from > xbstem[b]; b+=2) {} /* result: from <= xbstem[b] */ + for(a=xblast-1; to < xbstem[a]; a-=2) {} /* result: to >= xbstem[a] */ + + /* now the interesting examples are: + * (it was hard for me to understand, so I looked at the examples) + * 1 + * a|-----| |-----|b |-----| |-----| + * f|-----|t + * 2 + * a|-----|b |-----| |-----| |-----| + * f|--|t + * 3 + * a|-----|b |-----| |-----| |-----| + * f|-----|t + * 4 + * |-----|b a|-----| |-----| |-----| + * f|------------|t + * 5 + * |-----| |-----|b |-----| a|-----| + * f|-----------------------------|t + * 6 + * |-----|b |-----| |-----| a|-----| + * f|--------------------------------------------------|t + * 7 + * |-----|b |-----| a|-----| |-----| + * f|--------------------------|t + */ + + if(a < b-1) /* hits a gap - example 1 */ + return 0; + + /* now the subtraction itself */ + + if(a==b-1 && from > xbstem[a] && to < xbstem[b]) { + /* overlaps with only one subrange and splits it - example 2 */ + j=xblast; i=(xblast+=2); + while(j>=b) + xbstem[i--]=xbstem[j--]; + xbstem[b]=from-1; + xbstem[b+1]=to+1; + return 1; + /* becomes + * 2a + * a|b || |-----| |-----| |-----| + * f|--|t + */ + } + + if(xbstem[b-1] < from) { + /* cuts the back of this subrange - examples 3, 4, 7 */ + xbstem[b] = from-1; + b+=2; + /* becomes + * 3a + * a|----| |-----|b |-----| |-----| + * f|-----|t + * 4a + * |---| a|-----|b |-----| |-----| + * f|------------|t + * 7a + * |---| |-----|b a|-----| |-----| + * f|--------------------------|t + */ + } + + if(xbstem[a+1] > to) { + /* cuts the front of this subrange - examples 4a, 5, 7a */ + xbstem[a] = to+1; + a-=2; + /* becomes + * 4b + * a|---| |---|b |-----| |-----| + * f|------------|t + * 5b + * |-----| |-----|b a|-----| || + * f|-----------------------------|t + * 7b + * |---| a|-----|b || |-----| + * f|--------------------------|t + */ + } + + if(a < b-1) /* now after modification it hits a gap - examples 3a, 4b */ + return 1; /* because we have removed something */ + + /* now remove the subranges completely covered by the new stem */ + /* examples 5b, 6, 7b */ + i=b-1; j=a+2; + /* positioned as: + * 5b i j + * |-----| |-----|b a|-----| || + * f|-----------------------------|t + * 6 i xblast j + * |-----|b |-----| |-----| a|-----| + * f|--------------------------------------------------|t + * 7b i j + * |---| a|-----|b || |-----| + * f|--------------------------|t + */ + while(j <= xblast) + xbstem[i++]=xbstem[j++]; + xblast=i-1; + return 1; +} + +/* for debugging */ +static void +printbasestem(void) +{ + int i; + + printf("( "); + for(i=0; i lastpri + && ( lastpri==1 || s[j].value-v<20 || (s[x].value-v)*2 >= s[j].value-v ) ) { + lastpri=pri; + x=j; + } + } + } else { + for(j=i-1; j>=0; j--) { + if(mx[i][j]==0) + continue; + + if( (f | s[j].flags) & ST_END ) + pri=1; + else if( (f | s[j].flags) & ST_FLAT ) + pri=3; + else + pri=2; + + if(lastpri==0 + || pri > lastpri + && ( lastpri==1 || v-s[j].value<20 || (v-s[x].value)*2 >= v-s[j].value ) ) { + lastpri=pri; + x=j; + } + } + } + if(x== -1 && mx[i][i]) + pairs[i]=i; /* a special case */ + else + pairs[i]=x; + } + + if(ISDBG(SUBSTEMS)) { + for(i=0; i0) + fprintf(pfa_file, "%% %d...%d (%d x %d)\n", s[i].value, s[j].value, i, j); + } + } +} + +/* + * Make all the stems originating at the same value get the + * same width. Without this the rasterizer may move the dots + * randomly up or down by one pixel, and that looks bad. + * The prioritisation is the same as in findstemat(). + */ +static void +uniformstems( + STEM * s, + short *pairs, + int ns +) +{ + int i, j, from, to, val, dir; + int pri, prevpri[2], wd, prevwd[2], prevbest[2]; + + for(from=0; from prevpri[dir] || wd= 0) { + if(ISDBG(SUBSTEMS)) { + fprintf(stderr, "at %d (%s %d) pair %d->%d(%d)\n", i, + (dir ? "UP":"DOWN"), s[i].value, pairs[i], prevbest[dir], + s[prevbest[dir]].value); + } + pairs[i] = prevbest[dir]; + } + } + } +} + +/* + * Find the best stem in the array at the specified (value, origin), + * related to the entry ge. + * Returns its index in the array sp, -1 means "none". + * prevbest is the result for the other end of the line, we must + * find something better than it or leave it as it is. + */ +static int +findstemat( + int value, + int origin, + GENTRY *ge, + STEM *sp, + short *pairs, + int ns, + int prevbest /* -1 means "none" */ +) +{ + int i, min, max; + int v, si; + int pri, prevpri; /* priority, 0 = has ST_END, 1 = no ST_END */ + int wd, prevwd; /* stem width */ + + si= -1; /* nothing yet */ + + /* stems are ordered by value, binary search */ + min=0; max=ns; /* min <= i < max */ + while( min < max ) { + i=(min+max)/2; + v=sp[i].value; + if(vvalue) + max=i; + else { + si=i; /* temporary value */ + break; + } + } + + if( si < 0 ) /* found nothing this time */ + return prevbest; + + /* find the priority of the prevbest */ + /* we expect that prevbest has a pair */ + if(prevbest>=0) { + i=pairs[prevbest]; + prevpri=1; + if( (sp[prevbest].flags | sp[i].flags) & ST_END ) + prevpri=0; + prevwd=abs(sp[i].value-value); + } + + /* stems are not ordered by origin, so now do the linear search */ + + while( si>0 && sp[si-1].value==value ) /* find the first one */ + si--; + + for(; siprevpri + || pri==prevpri && prevwd==0 || wd!=0 && wdprev->ix3; + y=ge->prev->iy3; + + if(*nextvsi == -2) + si[SI_VP]=findstemat(x, y, ge, vs, vpairs, nvs, -1); + else { + si[SI_VP]= *nextvsi; *nextvsi= -2; + } + if(*nexthsi == -2) + si[SI_HP]=findstemat(y, x, ge, hs, hpairs, nhs, -1); + else { + si[SI_HP]= *nexthsi; *nexthsi= -2; + } + + /* + * For the horizontal lines we make sure that both + * ends of the line have the same horizontal stem, + * and the same thing for vertical lines and stems. + * In both cases we enforce the stem for the next entry. + * Otherwise unpleasant effects may arise. + */ + + if(ge->type==GE_LINE) { + if(ge->ix3==x) { /* vertical line */ + *nextvsi=si[SI_VP]=findstemat(x, ge->iy3, ge->frwd, vs, vpairs, nvs, si[SI_VP]); + } else if(ge->iy3==y) { /* horizontal line */ + *nexthsi=si[SI_HP]=findstemat(y, ge->ix3, ge->frwd, hs, hpairs, nhs, si[SI_HP]); + } + } + + if(si[SI_VP]+si[SI_HP] == -2) /* no stems, leave it alone */ + return 0; + + /* build the array of relevant bounds */ + nr=0; + for(i=0; i< sizeof(si) / sizeof(si[0]); i++) { + STEM *sp; + short *pairs; + int step; + int f; + int nzones, firstzone, binzone, einzone; + int btype, etype; + + if(si[i] < 0) + continue; + + if(i r[nr].high) { + j=r[nr].low; r[nr].low=r[nr].high; r[nr].high=j; + step= -1; + } else { + step=1; + } + + /* handle the interaction with Blue Zones */ + + if(i>=SI_HP) { /* only for horizontal stems */ + if(si[i]==pairs[si[i]]) { + /* special case, the outermost stem in the + * Blue Zone without a pair, simulate it to 20-pixel + */ + if(sp[ si[i] ].flags & ST_UP) { + r[nr].high+=20; + for(j=si[i]+1; j sp[j].value-2) + r[nr].high=sp[j].value-2; + break; + } + } else { + r[nr].low-=20; + for(j=si[i]-1; j>=0; j--) + if( (sp[j].flags & (ST_ZONE|ST_TOPZONE)) + == (ST_ZONE) ) { + if(r[nr].low < sp[j].value+2) + r[nr].low=sp[j].value+2; + break; + } + } + } + + /* check that the stem borders don't end up in + * different Blue Zones */ + f=sp[ si[i] ].flags; + nzones=0; einzone=binzone=0; + for(j=si[i]; j!=pairs[ si[i] ]; j+=step) { + if( (sp[j].flags & ST_ZONE)==0 ) + continue; + /* if see a zone border going in the same direction */ + if( ((f ^ sp[j].flags) & ST_UP)==0 ) { + if( ++nzones == 1 ) { + firstzone=sp[j].value; /* remember the first one */ + etype=sp[j].flags & ST_TOPZONE; + } + einzone=1; + + } else { /* the opposite direction */ + if(nzones==0) { /* beginning is in a blue zone */ + binzone=1; + btype=sp[j].flags & ST_TOPZONE; + } + einzone=0; + } + } + + /* beginning and end are in Blue Zones of different types */ + if( binzone && einzone && (btype ^ etype)!=0 ) { + if( sp[si[i]].flags & ST_UP ) { + if(firstzone > r[nr].low+22) + r[nr].high=r[nr].low+20; + else + r[nr].high=firstzone-2; + } else { + if(firstzone < r[nr].high-22) + r[nr].low=r[nr].high-20; + else + r[nr].low=firstzone+2; + } + } + } + + if(ISDBG(SUBSTEMS)) + fprintf(pfa_file, "%% at(%d,%d)[%d,%d] %d..%d %c (%d x %d)\n", x, y, i, nr, + r[nr].low, r[nr].high, r[nr].isvert ? 'v' : 'h', + si[i], pairs[si[i]]); + + nr++; + } + + /* now try to find a group */ + conflict=0; /* no conflicts found yet */ + for(j=0; j= lb ) { + if( r[j].low == lb && r[j].high == hb ) /* coincides */ + r[j].already=1; + else + conflict=1; + } + + if(conflict) + break; + } + + if(conflict) { /* nope, check all the groups */ + for(j=0; j= lb ) { + if( r[j].low == lb && r[j].high == hb ) /* coincides */ + r[j].already=1; + else + conflict=1; + } + + if(conflict) + i=egp[grp]-1; /* fast forward to the next group */ + } + } + + /* do we have any empty group ? */ + if(conflict && grp < NSTEMGRP-1) { + grp++; conflict=0; + for(j=0; j 0) { + for(i=egp[NSTEMGRP-1]-1; i>=egp[grp]; i--) + s[i+rexpand]=s[i]; + for(i=0; istemid = gssentry_lastgrp = grp; + return 0; +} + +/* + * Create the groups of substituted stems from the list. + * Each group will be represented by a subroutine in the Subs + * array. + */ + +static void +groupsubstems( + GLYPH *g, + STEM *hs, /* horizontal stems, sorted by value */ + short *hpairs, + int nhs, + STEM *vs, /* vertical stems, sorted by value */ + short *vpairs, + int nvs +) +{ + GENTRY *ge; + int i, j; + + /* temporary storage */ + STEMBOUNDS s[MAX_STEMS*2]; + /* indexes in there, pointing past the end each stem group */ + short egp[NSTEMGRP]; + + int nextvsi, nexthsi; /* -2 means "check by yourself" */ + + for(i=0; ientries; ge != 0; ge = ge->next) { + if(ge->type!=GE_LINE && ge->type!=GE_CURVE) { + nextvsi=nexthsi= -2; /* next path is independent */ + continue; + } + + if( gssentry(ge, hs, hpairs, nhs, vs, vpairs, nvs, s, egp, &nextvsi, &nexthsi) ) { + WARNING_2 fprintf(stderr, "*** glyph %s requires over %d hint subroutines, ignored them\n", + g->name, NSTEMGRP); + /* it's better to have no substituted hints at all than have only part */ + for (ge = g->entries; ge != 0; ge = ge->next) + ge->stemid= -1; + g->nsg=0; /* just to be safe, already is 0 by initialization */ + return; + } + + /* + * handle the last vert/horiz line of the path specially, + * correct the hint for the first entry of the path + */ + if(ge->frwd != ge->next && (nextvsi != -2 || nexthsi != -2) ) { + if( gssentry(ge->frwd, hs, hpairs, nhs, vs, vpairs, nvs, s, egp, &nextvsi, &nexthsi) ) { + WARNING_2 fprintf(stderr, "*** glyph %s requires over %d hint subroutines, ignored them\n", + g->name, NSTEMGRP); + /* it's better to have no substituted hints at all than have only part */ + for (ge = g->entries; ge != 0; ge = ge->next) + ge->stemid= -1; + g->nsg=0; /* just to be safe, already is 0 by initialization */ + return; + } + } + + } + + /* find the index of the first empty group - same as the number of groups */ + if(egp[0]>0) { + for(i=1; insg=i; + } else + g->nsg=0; + + if(ISDBG(SUBSTEMS)) { + fprintf(pfa_file, "%% %d substem groups (%d %d %d)\n", g->nsg, + g->nsg>1 ? egp[g->nsg-2] : -1, + g->nsg>0 ? egp[g->nsg-1] : -1, + g->nsgnsg] : -1 ); + j=0; + for(i=0; insg; i++) { + fprintf(pfa_file, "%% grp %3d: ", i); + for(; jnsg==1) { /* it would be the same as the main stems */ + /* so erase it */ + for (ge = g->entries; ge != 0; ge = ge->next) + ge->stemid= -1; + g->nsg=0; + } + + if(g->nsg>0) { + if( (g->nsbs=malloc(g->nsg * sizeof (egp[0]))) == 0 ) { + fprintf(stderr, "**** not enough memory for substituted hints ****\n"); + exit(255); + } + memmove(g->nsbs, egp, g->nsg * sizeof(short)); + if( (g->sbstems=malloc(egp[g->nsg-1] * sizeof (s[0]))) == 0 ) { + fprintf(stderr, "**** not enough memory for substituted hints ****\n"); + exit(255); + } + memmove(g->sbstems, s, egp[g->nsg-1] * sizeof(s[0])); + } +} + +void +buildstems( + GLYPH * g +) +{ + STEM hs[MAX_STEMS], vs[MAX_STEMS]; /* temporary working + * storage */ + short hs_pairs[MAX_STEMS], vs_pairs[MAX_STEMS]; /* best pairs for these stems */ + STEM *sp; + GENTRY *ge, *nge, *pge; + int nx, ny; + int ovalue; + int totals, grp, lastgrp; + + assertisint(g, "buildstems int"); + + g->nhs = g->nvs = 0; + memset(hs, 0, sizeof hs); + memset(vs, 0, sizeof vs); + + /* first search the whole character for possible stem points */ + + for (ge = g->entries; ge != 0; ge = ge->next) { + if (ge->type == GE_CURVE) { + + /* + * SURPRISE! + * We consider the stems bound by the + * H/V ends of the curves as flat ones. + * + * But we don't include the point on the + * other end into the range. + */ + + /* first check the beginning of curve */ + /* if it is horizontal, add a hstem */ + if (ge->iy1 == ge->prev->iy3) { + hs[g->nhs].value = ge->iy1; + + if (ge->ix1 < ge->prev->ix3) + hs[g->nhs].flags = ST_FLAT | ST_UP; + else + hs[g->nhs].flags = ST_FLAT; + + hs[g->nhs].origin = ge->prev->ix3; + hs[g->nhs].ge = ge; + + if (ge->ix1 < ge->prev->ix3) { + hs[g->nhs].from = ge->ix1+1; + hs[g->nhs].to = ge->prev->ix3; + if(hs[g->nhs].from > hs[g->nhs].to) + hs[g->nhs].from--; + } else { + hs[g->nhs].from = ge->prev->ix3; + hs[g->nhs].to = ge->ix1-1; + if(hs[g->nhs].from > hs[g->nhs].to) + hs[g->nhs].to++; + } + if (ge->ix1 != ge->prev->ix3) + g->nhs++; + } + /* if it is vertical, add a vstem */ + else if (ge->ix1 == ge->prev->ix3) { + vs[g->nvs].value = ge->ix1; + + if (ge->iy1 > ge->prev->iy3) + vs[g->nvs].flags = ST_FLAT | ST_UP; + else + vs[g->nvs].flags = ST_FLAT; + + vs[g->nvs].origin = ge->prev->iy3; + vs[g->nvs].ge = ge; + + if (ge->iy1 < ge->prev->iy3) { + vs[g->nvs].from = ge->iy1+1; + vs[g->nvs].to = ge->prev->iy3; + if(vs[g->nvs].from > vs[g->nvs].to) + vs[g->nvs].from--; + } else { + vs[g->nvs].from = ge->prev->iy3; + vs[g->nvs].to = ge->iy1-1; + if(vs[g->nvs].from > vs[g->nvs].to) + vs[g->nvs].to++; + } + + if (ge->iy1 != ge->prev->iy3) + g->nvs++; + } + /* then check the end of curve */ + /* if it is horizontal, add a hstem */ + if (ge->iy3 == ge->iy2) { + hs[g->nhs].value = ge->iy3; + + if (ge->ix3 < ge->ix2) + hs[g->nhs].flags = ST_FLAT | ST_UP; + else + hs[g->nhs].flags = ST_FLAT; + + hs[g->nhs].origin = ge->ix3; + hs[g->nhs].ge = ge->frwd; + + if (ge->ix3 < ge->ix2) { + hs[g->nhs].from = ge->ix3; + hs[g->nhs].to = ge->ix2-1; + if( hs[g->nhs].from > hs[g->nhs].to ) + hs[g->nhs].to++; + } else { + hs[g->nhs].from = ge->ix2+1; + hs[g->nhs].to = ge->ix3; + if( hs[g->nhs].from > hs[g->nhs].to ) + hs[g->nhs].from--; + } + + if (ge->ix3 != ge->ix2) + g->nhs++; + } + /* if it is vertical, add a vstem */ + else if (ge->ix3 == ge->ix2) { + vs[g->nvs].value = ge->ix3; + + if (ge->iy3 > ge->iy2) + vs[g->nvs].flags = ST_FLAT | ST_UP; + else + vs[g->nvs].flags = ST_FLAT; + + vs[g->nvs].origin = ge->iy3; + vs[g->nvs].ge = ge->frwd; + + if (ge->iy3 < ge->iy2) { + vs[g->nvs].from = ge->iy3; + vs[g->nvs].to = ge->iy2-1; + if( vs[g->nvs].from > vs[g->nvs].to ) + vs[g->nvs].to++; + } else { + vs[g->nvs].from = ge->iy2+1; + vs[g->nvs].to = ge->iy3; + if( vs[g->nvs].from > vs[g->nvs].to ) + vs[g->nvs].from--; + } + + if (ge->iy3 != ge->iy2) + g->nvs++; + } else { + + /* + * check the end of curve for a not smooth + * local extremum + */ + nge = ge->frwd; + + if (nge == 0) + continue; + else if (nge->type == GE_LINE) { + nx = nge->ix3; + ny = nge->iy3; + } else if (nge->type == GE_CURVE) { + nx = nge->ix1; + ny = nge->iy1; + } else + continue; + + /* check for vertical extremums */ + if (ge->iy3 > ge->iy2 && ge->iy3 > ny + || ge->iy3 < ge->iy2 && ge->iy3 < ny) { + hs[g->nhs].value = ge->iy3; + hs[g->nhs].from + = hs[g->nhs].to + = hs[g->nhs].origin = ge->ix3; + hs[g->nhs].ge = ge->frwd; + + if (ge->ix3 < ge->ix2 + || nx < ge->ix3) + hs[g->nhs].flags = ST_UP; + else + hs[g->nhs].flags = 0; + + if (ge->ix3 != ge->ix2 || nx != ge->ix3) + g->nhs++; + } + /* + * the same point may be both horizontal and + * vertical extremum + */ + /* check for horizontal extremums */ + if (ge->ix3 > ge->ix2 && ge->ix3 > nx + || ge->ix3 < ge->ix2 && ge->ix3 < nx) { + vs[g->nvs].value = ge->ix3; + vs[g->nvs].from + = vs[g->nvs].to + = vs[g->nvs].origin = ge->iy3; + vs[g->nvs].ge = ge->frwd; + + if (ge->iy3 > ge->iy2 + || ny > ge->iy3) + vs[g->nvs].flags = ST_UP; + else + vs[g->nvs].flags = 0; + + if (ge->iy3 != ge->iy2 || ny != ge->iy3) + g->nvs++; + } + } + + } else if (ge->type == GE_LINE) { + nge = ge->frwd; + + /* if it is horizontal, add a hstem */ + /* and the ends as vstems if they brace the line */ + if (ge->iy3 == ge->prev->iy3 + && ge->ix3 != ge->prev->ix3) { + hs[g->nhs].value = ge->iy3; + if (ge->ix3 < ge->prev->ix3) { + hs[g->nhs].flags = ST_FLAT | ST_UP; + hs[g->nhs].from = ge->ix3; + hs[g->nhs].to = ge->prev->ix3; + } else { + hs[g->nhs].flags = ST_FLAT; + hs[g->nhs].from = ge->prev->ix3; + hs[g->nhs].to = ge->ix3; + } + hs[g->nhs].origin = ge->ix3; + hs[g->nhs].ge = ge->frwd; + + pge = ge->bkwd; + + /* add beginning as vstem */ + vs[g->nvs].value = pge->ix3; + vs[g->nvs].origin + = vs[g->nvs].from + = vs[g->nvs].to = pge->iy3; + vs[g->nvs].ge = ge; + + if(pge->type==GE_CURVE) + ovalue=pge->iy2; + else + ovalue=pge->prev->iy3; + + if (pge->iy3 > ovalue) + vs[g->nvs].flags = ST_UP | ST_END; + else if (pge->iy3 < ovalue) + vs[g->nvs].flags = ST_END; + else + vs[g->nvs].flags = 0; + + if( vs[g->nvs].flags != 0 ) + g->nvs++; + + /* add end as vstem */ + vs[g->nvs].value = ge->ix3; + vs[g->nvs].origin + = vs[g->nvs].from + = vs[g->nvs].to = ge->iy3; + vs[g->nvs].ge = ge->frwd; + + if(nge->type==GE_CURVE) + ovalue=nge->iy1; + else + ovalue=nge->iy3; + + if (ovalue > ge->iy3) + vs[g->nvs].flags = ST_UP | ST_END; + else if (ovalue < ge->iy3) + vs[g->nvs].flags = ST_END; + else + vs[g->nvs].flags = 0; + + if( vs[g->nvs].flags != 0 ) + g->nvs++; + + g->nhs++; + } + /* if it is vertical, add a vstem */ + /* and the ends as hstems if they brace the line */ + else if (ge->ix3 == ge->prev->ix3 + && ge->iy3 != ge->prev->iy3) { + vs[g->nvs].value = ge->ix3; + if (ge->iy3 > ge->prev->iy3) { + vs[g->nvs].flags = ST_FLAT | ST_UP; + vs[g->nvs].from = ge->prev->iy3; + vs[g->nvs].to = ge->iy3; + } else { + vs[g->nvs].flags = ST_FLAT; + vs[g->nvs].from = ge->iy3; + vs[g->nvs].to = ge->prev->iy3; + } + vs[g->nvs].origin = ge->iy3; + vs[g->nvs].ge = ge->frwd; + + pge = ge->bkwd; + + /* add beginning as hstem */ + hs[g->nhs].value = pge->iy3; + hs[g->nhs].origin + = hs[g->nhs].from + = hs[g->nhs].to = pge->ix3; + hs[g->nhs].ge = ge; + + if(pge->type==GE_CURVE) + ovalue=pge->ix2; + else + ovalue=pge->prev->ix3; + + if (pge->ix3 < ovalue) + hs[g->nhs].flags = ST_UP | ST_END; + else if (pge->ix3 > ovalue) + hs[g->nhs].flags = ST_END; + else + hs[g->nhs].flags = 0; + + if( hs[g->nhs].flags != 0 ) + g->nhs++; + + /* add end as hstem */ + hs[g->nhs].value = ge->iy3; + hs[g->nhs].origin + = hs[g->nhs].from + = hs[g->nhs].to = ge->ix3; + hs[g->nhs].ge = ge->frwd; + + if(nge->type==GE_CURVE) + ovalue=nge->ix1; + else + ovalue=nge->ix3; + + if (ovalue < ge->ix3) + hs[g->nhs].flags = ST_UP | ST_END; + else if (ovalue > ge->ix3) + hs[g->nhs].flags = ST_END; + else + hs[g->nhs].flags = 0; + + if( hs[g->nhs].flags != 0 ) + g->nhs++; + + g->nvs++; + } + /* + * check the end of line for a not smooth local + * extremum + */ + nge = ge->frwd; + + if (nge == 0) + continue; + else if (nge->type == GE_LINE) { + nx = nge->ix3; + ny = nge->iy3; + } else if (nge->type == GE_CURVE) { + nx = nge->ix1; + ny = nge->iy1; + } else + continue; + + /* check for vertical extremums */ + if (ge->iy3 > ge->prev->iy3 && ge->iy3 > ny + || ge->iy3 < ge->prev->iy3 && ge->iy3 < ny) { + hs[g->nhs].value = ge->iy3; + hs[g->nhs].from + = hs[g->nhs].to + = hs[g->nhs].origin = ge->ix3; + hs[g->nhs].ge = ge->frwd; + + if (ge->ix3 < ge->prev->ix3 + || nx < ge->ix3) + hs[g->nhs].flags = ST_UP; + else + hs[g->nhs].flags = 0; + + if (ge->ix3 != ge->prev->ix3 || nx != ge->ix3) + g->nhs++; + } + /* + * the same point may be both horizontal and vertical + * extremum + */ + /* check for horizontal extremums */ + if (ge->ix3 > ge->prev->ix3 && ge->ix3 > nx + || ge->ix3 < ge->prev->ix3 && ge->ix3 < nx) { + vs[g->nvs].value = ge->ix3; + vs[g->nvs].from + = vs[g->nvs].to + = vs[g->nvs].origin = ge->iy3; + vs[g->nvs].ge = ge->frwd; + + if (ge->iy3 > ge->prev->iy3 + || ny > ge->iy3) + vs[g->nvs].flags = ST_UP; + else + vs[g->nvs].flags = 0; + + if (ge->iy3 != ge->prev->iy3 || ny != ge->iy3) + g->nvs++; + } + } + } + + g->nhs=addbluestems(hs, g->nhs); + sortstems(hs, g->nhs); + sortstems(vs, g->nvs); + + if (ISDBG(STEMS)) + debugstems(g->name, hs, g->nhs, vs, g->nvs); + + /* find the stems interacting with the Blue Zones */ + markbluestems(hs, g->nhs); + + if(subhints) { + if (ISDBG(SUBSTEMS)) + fprintf(pfa_file, "%% %s: joining subst horizontal stems\n", g->name); + joinsubstems(hs, hs_pairs, g->nhs, 1); + uniformstems(hs, hs_pairs, g->nhs); + + if (ISDBG(SUBSTEMS)) + fprintf(pfa_file, "%% %s: joining subst vertical stems\n", g->name); + joinsubstems(vs, vs_pairs, g->nvs, 0); + + groupsubstems(g, hs, hs_pairs, g->nhs, vs, vs_pairs, g->nvs); + } + + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% %s: joining main horizontal stems\n", g->name); + g->nhs = joinmainstems(hs, g->nhs, 1); + if (ISDBG(MAINSTEMS)) + fprintf(pfa_file, "%% %s: joining main vertical stems\n", g->name); + g->nvs = joinmainstems(vs, g->nvs, 0); + + if (ISDBG(MAINSTEMS)) + debugstems(g->name, hs, g->nhs, vs, g->nvs); + + if(g->nhs > 0) { + if ((sp = malloc(sizeof(STEM) * g->nhs)) == 0) { + fprintf(stderr, "**** not enough memory for hints ****\n"); + exit(255); + } + g->hstems = sp; + memcpy(sp, hs, sizeof(STEM) * g->nhs); + } else + g->hstems = 0; + + if(g->nvs > 0) { + if ((sp = malloc(sizeof(STEM) * g->nvs)) == 0) { + fprintf(stderr, "**** not enough memory for hints ****\n"); + exit(255); + } + g->vstems = sp; + memcpy(sp, vs, sizeof(STEM) * g->nvs); + } else + g->vstems = 0; + + /* now check that the stems won't overflow the interpreter's stem stack: + * some interpreters (like X11) push the stems on each change into + * stack and pop them only after the whole glyphs is completed. + */ + + totals = (g->nhs+g->nvs) / 2; /* we count whole stems, not halves */ + lastgrp = -1; + + for (ge = g->entries; ge != 0; ge = ge->next) { + grp=ge->stemid; + if(grp >= 0 && grp != lastgrp) { + if(grp==0) + totals += g->nsbs[0]; + else + totals += g->nsbs[grp] - g->nsbs[grp-1]; + + lastgrp = grp; + } + } + + /* be on the safe side, check for >= , not > */ + if(totals >= max_stemdepth) { /* oops, too deep */ + WARNING_2 { + fprintf(stderr, "Warning: glyph %s needs hint stack depth %d\n", g->name, totals); + fprintf(stderr, " (limit %d): removed the substituted hints from it\n", max_stemdepth); + } + if(g->nsg > 0) { + for (ge = g->entries; ge != 0; ge = ge->next) + ge->stemid = -1; + free(g->sbstems); g->sbstems = 0; + free(g->nsbs); g->nsbs = 0; + g->nsg = 0; + } + } + + /* now check if there are too many main stems */ + totals = (g->nhs+g->nvs) / 2; /* we count whole stems, not halves */ + if(totals >= max_stemdepth) { + /* even worse, too much of non-substituted stems */ + WARNING_2 { + fprintf(stderr, "Warning: glyph %s has %d main hints\n", g->name, totals); + fprintf(stderr, " (limit %d): removed the hints from it\n", max_stemdepth); + } + if(g->vstems) { + free(g->vstems); g->vstems = 0; g->nvs = 0; + } + if(g->hstems) { + free(g->hstems); g->hstems = 0; g->nhs = 0; + } + } +} + +/* convert weird curves that are close to lines into lines. +*/ + +void +fstraighten( + GLYPH * g +) +{ + GENTRY *ge, *pge, *nge, *ige; + double df; + int dir; + double iln, oln; + int svdir, i, o; + + for (ige = g->entries; ige != 0; ige = ige->next) { + if (ige->type != GE_CURVE) + continue; + + ge = ige; + pge = ge->bkwd; + nge = ge->frwd; + + df = 0.; + + /* look for vertical then horizontal */ + for(i=0; i<2; i++) { + o = !i; /* other axis */ + + iln = fabs(ge->fpoints[i][2] - pge->fpoints[i][2]); + oln = fabs(ge->fpoints[o][2] - pge->fpoints[o][2]); + /* + * if current curve is almost a vertical line, and it + * doesn't begin or end horizontally (and the prev/next + * line doesn't join smoothly ?) + */ + if( oln < 1. + || ge->fpoints[o][2] == ge->fpoints[o][1] + || ge->fpoints[o][0] == pge->fpoints[o][2] + || iln > 2. + || iln > 1. && iln/oln > 0.1 ) + continue; + + + if(ISDBG(STRAIGHTEN)) + fprintf(stderr,"** straighten almost %s\n", (i? "horizontal":"vertical")); + + df = ge->fpoints[i][2] - pge->fpoints[i][2]; + dir = fsign(ge->fpoints[o][2] - pge->fpoints[o][2]); + ge->type = GE_LINE; + + /* + * suck in all the sequence of such almost lines + * going in the same direction but not deviating + * too far from vertical + */ + iln = fabs(nge->fpoints[i][2] - ge->fpoints[i][2]); + oln = nge->fpoints[o][2] - ge->fpoints[o][2]; + + while (fabs(df) <= 5 && nge->type == GE_CURVE + && dir == fsign(oln) /* that also gives oln != 0 */ + && iln <= 2. + && ( iln <= 1. || iln/fabs(oln) <= 0.1 ) ) { + ge->fx3 = nge->fx3; + ge->fy3 = nge->fy3; + + if(ISDBG(STRAIGHTEN)) + fprintf(stderr,"** straighten collapsing %s\n", (i? "horizontal":"vertical")); + freethisge(nge); + fixendpath(ge); + pge = ge->bkwd; + nge = ge->frwd; + + df = ge->fpoints[i][2] - pge->fpoints[i][2]; + + iln = fabs(nge->fpoints[i][2] - ge->fpoints[i][2]); + oln = nge->fpoints[o][2] - ge->fpoints[o][2]; + } + + /* now check what do we have as previous/next line */ + + if(ge != pge) { + if( pge->type == GE_LINE && pge->fpoints[i][2] == pge->prev->fpoints[i][2] + && fabs(pge->fpoints[o][2] != pge->prev->fpoints[o][2]) ) { + if(ISDBG(STRAIGHTEN)) fprintf(stderr,"** straighten join with previous 0x%x 0x%x\n", pge, ge); + /* join the previous line with current */ + pge->fx3 = ge->fx3; + pge->fy3 = ge->fy3; + + ige = freethisge(ge)->prev; /* keep the iterator valid */ + ge = pge; + fixendpath(ge); + pge = ge->bkwd; + } + } + + if(ge != nge) { + if (nge->type == GE_LINE && nge->fpoints[i][2] == ge->fpoints[i][2] + && fabs(nge->fpoints[o][2] != ge->fpoints[o][2]) ) { + if(ISDBG(STRAIGHTEN)) fprintf(stderr,"** straighten join with next 0x%x 0x%x\n", ge, nge); + /* join the next line with current */ + ge->fx3 = nge->fx3; + ge->fy3 = nge->fy3; + + freethisge(nge); + fixendpath(ge); + pge = ge->bkwd; + nge = ge->frwd; + + } + } + + if(ge != pge) { + /* try to align the lines if neccessary */ + if(df != 0.) + fclosegap(ge, ge, i, df, NULL); + } else { + /* contour consists of only one line, get rid of it */ + ige = freethisge(ge); /* keep the iterator valid */ + if(ige == 0) /* this was the last contour */ + return; + ige = ige->prev; + } + + break; /* don't bother looking at the other axis */ + } + } +} + +/* solve a square equation, + * returns the number of solutions found, the solutions + * are stored in res which should point to array of two doubles. + * min and max limit the area for solutions + */ + +static int +fsqequation( + double a, + double b, + double c, + double *res, + double min, + double max +) +{ + double D; + int n; + + if(ISDBG(SQEQ)) fprintf(stderr, "sqeq(%g,%g,%g) [%g;%g]\n", a, b, c, min, max); + + if(fabs(a) < 0.000001) { /* if a linear equation */ + n=0; + if(fabs(b) < 0.000001) /* not an equation at all */ + return 0; + res[0] = -c/b; + if(ISDBG(SQEQ)) fprintf(stderr, "sqeq: linear t=%g\n", res[0]); + if(res[0] >= min && res[0] <= max) + n++; + return n; + } + + D = b*b - 4.0*a*c; + if(ISDBG(SQEQ)) fprintf(stderr, "sqeq: D=%g\n", D); + if(D<0) + return 0; + + D = sqrt(D); + + n=0; + res[0] = (-b+D) / (2*a); + if(ISDBG(SQEQ)) fprintf(stderr, "sqeq: t1=%g\n", res[0]); + if(res[0] >= min && res[0] <= max) + n++; + + res[n] = (-b-D) / (2*a); + if(ISDBG(SQEQ)) fprintf(stderr, "sqeq: t2=%g\n", res[n]); + if(res[n] >= min && res[n] <= max) + n++; + + /* return 2nd solution only if it's different enough */ + if(n==2 && fabs(res[0]-res[1])<0.000001) + n=1; + + return n; +} + +/* check that the curves don't cross quadrant boundary */ +/* (float) */ + +/* + Here we make sure that the curve does not continue past + horizontal or vertical extremums. The horizontal points are + explained, vertical points are by analogy. + + The horizontal points are where the derivative + dy/dx is equal to 0. But the Bezier curves are defined by + parametric formulas + x=fx(t) + y=fy(t) + so finding this derivative is complicated. + Also even if we find some point (x,y) splitting at this point + is far not obvious. Fortunately we can use dy/dt = 0 instead, + this gets to a rather simple square equation and splitting + at a known value of t is simple. + + The formulas are: + + y = A*(1-t)^3 + 3*B*(1-t)^2*t + 3*C*(1-t)*t^2 + D*t^3 + y = (-A+3*B-3*C+D)*t^3 + (3*A-6*B+3*C)*t^2 + (-3*A+3*B)*t + A + dy/dt = 3*(-A+3*B-3*C+D)*t^2 + 2*(3*A-6*B+3*C)*t + (-3*A+3*B) + */ + +void +ffixquadrants( + GLYPH *g +) +{ + GENTRY *ge, *nge; + int i, j, np, oldnp; + double sp[5]; /* split points, last one empty */ + char dir[5]; /* for debugging, direction by which split happened */ + double a, b, *pts; /* points of a curve */ + + for (ge = g->entries; ge != 0; ge = ge->next) { + if (ge->type != GE_CURVE) + continue; + + doagain: + np = 0; /* no split points yet */ + if(ISDBG(QUAD)) { + fprintf(stderr, "%s: trying 0x%x (%g %g) (%g %g) (%g %g) (%g %g)\n ", g->name, + ge, ge->prev->fx3, ge->prev->fy3, ge->fx1, ge->fy1, ge->fx2, ge->fy2, + ge->fx3, ge->fy3); + } + for(i=0; i<2; i++) { /* first for x then for y */ + /* find the cooridnates of control points */ + a = ge->prev->fpoints[i][2]; + pts = &ge->fpoints[i][0]; + + oldnp = np; + np += fsqequation( + 3.0*(-a + 3.0*pts[0] - 3.0*pts[1] + pts[2]), + 6.0*(a - 2.0*pts[0] + pts[1]), + 3.0*(-a + pts[0]), + &sp[np], + 0.0, 1.0); /* XXX range is [0;1] */ + + if(np == oldnp) + continue; + + if(ISDBG(QUAD)) + fprintf(stderr, "%s: 0x%x: %d pts(%c): ", + g->name, ge, np-oldnp, i? 'y':'x'); + + /* remove points that are too close to the ends + * because hor/vert ends are permitted, also + * if the split point is VERY close to the ends + * but not exactly then just flatten it and check again. + */ + for(j = oldnp; jfpoints[i][0] != ge->prev->fpoints[i][2]) { + ge->fpoints[i][0] = ge->prev->fpoints[i][2]; + if(ISDBG(QUAD)) fprintf(stderr, "flattened at front\n"); + goto doagain; + } + if( ge->fpoints[i][1] != ge->fpoints[i][0] + && fsign(ge->fpoints[i][2] - ge->fpoints[i][1]) + != fsign(ge->fpoints[i][1] - ge->fpoints[i][0]) ) { + ge->fpoints[i][1] = ge->fpoints[i][0]; + if(ISDBG(QUAD)) fprintf(stderr, "flattened zigzag at front\n"); + goto doagain; + } + sp[j] = sp[j+1]; np--; j--; + if(ISDBG(QUAD)) fprintf(stderr, "(front flat) "); + } else if(sp[j] > 0.97) { /* rear end of curve */ + if(ge->fpoints[i][1] != ge->fpoints[i][2]) { + ge->fpoints[i][1] = ge->fpoints[i][2]; + if(ISDBG(QUAD)) fprintf(stderr, "flattened at rear\n"); + goto doagain; + } + if( ge->fpoints[i][0] != ge->fpoints[i][1] + && fsign(ge->prev->fpoints[i][2] - ge->fpoints[i][0]) + != fsign(ge->fpoints[i][0] - ge->fpoints[i][1]) ) { + ge->fpoints[i][0] = ge->fpoints[i][1]; + if(ISDBG(QUAD)) fprintf(stderr, "flattened zigzag at rear\n"); + goto doagain; + } + sp[j] = sp[j+1]; np--; j--; + if(ISDBG(QUAD)) fprintf(stderr, "(rear flat) "); + } + } + if(ISDBG(QUAD)) fprintf(stderr, "\n"); + } + + if(np==0) /* no split points, leave it alone */ + continue; + + if(ISDBG(QUAD)) { + fprintf(stderr, "%s: splitting 0x%x (%g %g) (%g %g) (%g %g) (%g %g) at %d points\n ", g->name, + ge, ge->prev->fx3, ge->prev->fy3, ge->fx1, ge->fy1, ge->fx2, ge->fy2, + ge->fx3, ge->fy3, np); + for(i=0; i sp[j]) { + a = sp[i]; sp[i] = sp[j]; sp[j] = a; + } + + /* now finally do the split on each point */ + for(j=0; jfpoints[i][0]; /* get the middle points */ + b = ge->fpoints[i][1]; + + /* calculate new internal points */ + c = SPLIT(a, b); + + ge->fpoints[i][0] = SPLIT(ge->prev->fpoints[i][2], a); + ge->fpoints[i][1] = SPLIT(ge->fpoints[i][0], c); + + nge->fpoints[i][1] = SPLIT(b, nge->fpoints[i][2]); + nge->fpoints[i][0] = SPLIT(c, nge->fpoints[i][1]); + + ge->fpoints[i][2] = SPLIT(ge->fpoints[i][1], + + nge->fpoints[i][0]); + } +#undef SPLIT + + addgeafter(ge, nge); + + /* go to the next part, adjust remaining points */ + ge = nge; + for(i=j+1; itype != GE_CURVE) + return 0; + + a = ge->iy2 - ge->iy1; + b = ge->ix2 - ge->ix1; + if(a == 0) { + if(b == 0) { + return 0; + } else + k = FBIGVAL; + } else + k = fabs((double) b / (double) a); + + a = ge->iy1 - ge->prev->iy3; + b = ge->ix1 - ge->prev->ix3; + if(a == 0) { + if(b == 0) { + return 0; + } else + k1 = FBIGVAL; + } else + k1 = fabs((double) b / (double) a); + + a = ge->iy3 - ge->iy2; + b = ge->ix3 - ge->ix2; + if(a == 0) { + if(b == 0) { + return 0; + } else + k2 = FBIGVAL; + } else + k2 = fabs((double) b / (double) a); + + /* if the curve is not a zigzag */ + if (k1+0.0001 >= k && k2 <= k+0.0001 || k1 <= k+0.0001 && k2+0.0001 >= k) + return 0; + else + return 1; +} + +/* check if a curve is a zigzag - floating */ + +static int +fiszigzag( + GENTRY *ge +) +{ + double k, k1, k2; + double a, b; + + if (ge->type != GE_CURVE) + return 0; + + a = fabs(ge->fy2 - ge->fy1); + b = fabs(ge->fx2 - ge->fx1); + if(a < FEPS) { + if(b < FEPS) { + return 0; + } else + k = FBIGVAL; + } else + k = b / a; + + a = fabs(ge->fy1 - ge->prev->fy3); + b = fabs(ge->fx1 - ge->prev->fx3); + if(a < FEPS) { + if(b < FEPS) { + return 0; + } else + k1 = FBIGVAL; + } else + k1 = b / a; + + a = fabs(ge->fy3 - ge->fy2); + b = fabs(ge->fx3 - ge->fx2); + if(a < FEPS) { + if(b < FEPS) { + return 0; + } else + k2 = FBIGVAL; + } else + k2 = b / a; + + /* if the curve is not a zigzag */ + if (k1+0.0001 >= k && k2 <= k+0.0001 || k1 <= k+0.0001 && k2+0.0001 >= k) + return 0; + else + return 1; +} + +/* split the zigzag-like curves into two parts */ + +void +fsplitzigzags( + GLYPH * g +) +{ + GENTRY *ge, *nge; + double a, b, c, d; + + assertisfloat(g, "splitting zigzags"); + for (ge = g->entries; ge != 0; ge = ge->next) { + if (ge->type != GE_CURVE) + continue; + + /* if the curve is not a zigzag */ + if ( !fiszigzag(ge) ) { + continue; + } + + if(ISDBG(FCONCISE)) { + double maxsc1, maxsc2; + fprintf(stderr, "split a zigzag "); + fnormalizege(ge); + if( fcrossraysge(ge, ge, &maxsc1, &maxsc2, NULL) ) { + fprintf(stderr, "sc1=%g sc2=%g\n", maxsc1, maxsc2); + } else { + fprintf(stderr, "(rays don't cross)\n"); + } + } + /* split the curve by t=0.5 */ + nge = newgentry(GEF_FLOAT); + (*nge) = (*ge); + nge->type = GE_CURVE; + + a = ge->prev->fx3; + b = ge->fx1; + c = ge->fx2; + d = ge->fx3; + nge->fx3 = d; + nge->fx2 = (c + d) / 2.; + nge->fx1 = (b + 2. * c + d) / 4.; + ge->fx3 = (a + b * 3. + c * 3. + d) / 8.; + ge->fx2 = (a + 2. * b + c) / 4.; + ge->fx1 = (a + b) / 2.; + + a = ge->prev->fy3; + b = ge->fy1; + c = ge->fy2; + d = ge->fy3; + nge->fy3 = d; + nge->fy2 = (c + d) / 2.; + nge->fy1 = (b + 2. * c + d) / 4.; + ge->fy3 = (a + b * 3. + c * 3. + d) / 8.; + ge->fy2 = (a + 2. * b + c) / 4.; + ge->fy1 = (a + b) / 2.; + + addgeafter(ge, nge); + + if(ISDBG(FCONCISE)) { + dumppaths(g, ge, nge); + } + } +} + +/* free this GENTRY, returns what was ge->next + * (ge must be of type GE_LINE or GE_CURVE) + * works on both float and int entries + */ + +static GENTRY * +freethisge( + GENTRY *ge +) +{ + GENTRY *xge; + + if (ge->bkwd != ge->prev) { + /* at beginning of the contour */ + + xge = ge->bkwd; + if(xge == ge) { /* was the only line in contour */ + /* remove the contour completely */ + /* prev is GE_MOVE, next is GE_PATH, remove them all */ + + /* may be the first contour, then ->bkwd points to ge->entries */ + if(ge->prev->prev == 0) + *(GENTRY **)(ge->prev->bkwd) = ge->next->next; + else + ge->prev->prev->next = ge->next->next; + + if(ge->next->next) { + ge->next->next->prev = ge->prev->prev; + ge->next->next->bkwd = ge->prev->bkwd; + } + + xge = ge->next->next; + free(ge->prev); free(ge->next); free(ge); + return xge; + } + + /* move the start point of the contour */ + if(ge->flags & GEF_FLOAT) { + ge->prev->fx3 = xge->fx3; + ge->prev->fy3 = xge->fy3; + } else { + ge->prev->ix3 = xge->ix3; + ge->prev->iy3 = xge->iy3; + } + } else if(ge->frwd != ge->next) { + /* at end of the contour */ + + xge = ge->frwd->prev; + /* move the start point of the contour */ + if(ge->flags & GEF_FLOAT) { + xge->fx3 = ge->bkwd->fx3; + xge->fy3 = ge->bkwd->fy3; + } else { + xge->ix3 = ge->bkwd->ix3; + xge->iy3 = ge->bkwd->iy3; + } + } + + ge->prev->next = ge->next; + ge->next->prev = ge->prev; + ge->bkwd->frwd = ge->frwd; + ge->frwd->bkwd = ge->bkwd; + + xge = ge->next; + free(ge); + return xge; +} + +/* inserts a new gentry (LINE or CURVE) after another (MOVE + * or LINE or CURVE) + * corrects the first GE_MOVE if neccessary + */ + +static void +addgeafter( + GENTRY *oge, /* after this */ + GENTRY *nge /* insert this */ +) +{ + if(oge->type == GE_MOVE) { + /* insert before next */ + if(oge->next->type == GE_PATH) { + /* first and only GENTRY in path */ + nge->frwd = nge->bkwd = nge; + } else { + nge->frwd = oge->next; + nge->bkwd = oge->next->bkwd; + oge->next->bkwd->frwd = nge; + oge->next->bkwd = nge; + } + } else { + nge->frwd = oge->frwd; + nge->bkwd = oge; + oge->frwd->bkwd = nge; + oge->frwd = nge; + } + + nge->next = oge->next; + nge->prev = oge; + oge->next->prev = nge; + oge->next = nge; + + if(nge->frwd->prev->type == GE_MOVE) { + /* fix up the GE_MOVE entry */ + if(nge->flags & GEF_FLOAT) { + nge->frwd->prev->fx3 = nge->fx3; + nge->frwd->prev->fy3 = nge->fy3; + } else { + nge->frwd->prev->ix3 = nge->ix3; + nge->frwd->prev->iy3 = nge->iy3; + } + } +} + +/* + * Check if this GENTRY happens to be at the end of path + * and fix the first MOVETO accordingly + * handles both int and float + */ + +static void +fixendpath( + GENTRY *ge +) +{ + GENTRY *mge; + + mge = ge->frwd->prev; + if(mge->type == GE_MOVE) { + if(ge->flags & GEF_FLOAT) { + mge->fx3 = ge->fx3; + mge->fy3 = ge->fy3; + } else { + mge->ix3 = ge->ix3; + mge->iy3 = ge->iy3; + } + } +} + +/* + * This function adjusts the rest of path (the part from...to is NOT changed) + * to cover the specified gap by the specified axis (0 - X, 1 - Y). + * Gap is counted in direction (end_of_to - beginning_of_from). + * Returns by how much the gap was not closed (0.0 if it was fully closed). + * Ret contains by how much the first and last points of [from...to] + * were moved to bring them in consistence to the rest of the path. + * If ret==NULL then this info is not returned. + */ + +static double +fclosegap( + GENTRY *from, + GENTRY *to, + int axis, + double gap, + double *ret +) +{ +#define TIMESLARGER 10. /* how many times larger must be a curve to not change too much */ + double rm[2]; + double oldpos[2]; + double times, limit, df, dx; + int j, k; + GENTRY *xge, *pge, *nge, *bge[2]; + + /* remember the old points to calculate ret */ + oldpos[0] = from->prev->fpoints[axis][2]; + oldpos[1] = to->fpoints[axis][2]; + + rm[0] = rm[1] = gap / 2. ; + + bge[0] = from; /* this is convenient for iterations */ + bge[1] = to; + + /* first try to modify large curves but if have none then settle for small */ + for(times = (TIMESLARGER-1); times > 0.1; times /= 2. ) { + + if(rm[0]+rm[1] == 0.) + break; + + /* iterate in both directions, backwards then forwards */ + for(j = 0; j<2; j++) { + + if(rm[j] == 0.) /* if this direction is exhausted */ + continue; + + limit = fabs(rm[j]) * (1.+times); + + for(xge = bge[j]->cntr[j]; xge != bge[!j]; xge = xge->cntr[j]) { + dx = xge->fpoints[axis][2] - xge->prev->fpoints[axis][2]; + df = fabs(dx) - limit; + if( df <= FEPS ) /* curve is too small to change */ + continue; + + if( df >= fabs(rm[j]) ) + df = rm[j]; + else + df *= fsign(rm[j]); /* we may cover this part of rm */ + + rm[j] -= df; + limit = fabs(rm[j]) * (1.+times); + + if(xge->type == GE_CURVE) { /* correct internal points */ + double scale = ((dx+df) / dx) - 1.; + double base; + + if(j) + base = xge->fpoints[axis][2]; + else + base = xge->prev->fpoints[axis][2]; + + for(k = 0; k<2; k++) + xge->fpoints[axis][k] += scale * + (xge->fpoints[axis][k] - base); + } + + /* move all the intermediate lines */ + if(j) { + df = -df; /* absolute direction */ + pge = bge[1]->bkwd; + nge = xge->bkwd; + } else { + xge->fpoints[axis][2] += df; + pge = bge[0]; + nge = xge->frwd; + } + while(nge != pge) { + if(nge->type == GE_CURVE) { + nge->fpoints[axis][0] +=df; + nge->fpoints[axis][1] +=df; + } + nge->fpoints[axis][2] += df; + if(nge->next != nge->frwd) { /* last entry of contour */ + nge->frwd->prev->fpoints[axis][2] += df; + } + nge = nge->cntr[!j]; + } + + if(rm[j] == 0.) + break; + } + } + } + + /* find the difference */ + oldpos[0] -= from->prev->fpoints[axis][2]; + oldpos[1] -= to->fpoints[axis][2]; + + if(ret) { + ret[0] = oldpos[0] - from->prev->fpoints[axis][2]; + ret[1] = oldpos[1] - to->fpoints[axis][2]; + } + +#if 0 + if( rm[0]+rm[1] != gap - oldpos[1] + oldpos[0]) { + fprintf(stderr, "** gap=%g rm[0]=%g rm[1]=%g o[0]=%g o[1]=%g rg=%g og=%g\n", + gap, rm[0], rm[1], oldpos[0], oldpos[1], rm[0]+rm[1], + gap - oldpos[1] + oldpos[0]); + } +#endif + + return rm[0]+rm[1]; +#undef TIMESLARGER +} + +/* remove the lines or curves smaller or equal to the size limit */ + +static void +fdelsmall( + GLYPH *g, + double minlen +) +{ + GENTRY *ge, *nge, *pge, *xge, *next; + int i, k; + double dx, dy, d2, d2m; + double minlen2; +#define TIMESLARGER 10. /* how much larger must be a curve to not change too much */ + + minlen2 = minlen*minlen; + + for (ge = g->entries; ge != 0; ge = next) { + next = ge->next; + + if (ge->type != GE_CURVE && ge->type != GE_LINE) + continue; + + d2m = 0; + for(i= (ge->type==GE_CURVE? 0: 2); i<3; i++) { + dx = ge->fxn[i] - ge->prev->fx3; + dy = ge->fyn[i] - ge->prev->fy3; + d2 = dx*dx + dy*dy; + if(d2m < d2) + d2m = d2; + } + + if( d2m > minlen2 ) { /* line is not too small */ + /* XXX add more normalization here */ + continue; + } + + /* if the line is too small */ + + /* check forwards if we have a whole sequence of them */ + nge = ge; + for(xge = ge->frwd; xge != ge; xge = xge->frwd) { + d2m = 0; + for(i= (xge->type==GE_CURVE? 0: 2); i<3; i++) { + dx = xge->fxn[i] - xge->prev->fx3; + dy = xge->fyn[i] - xge->prev->fy3; + d2 = dx*dx + dy*dy; + if(d2m < d2) + d2m = d2; + } + if( d2m > minlen2 ) /* line is not too small */ + break; + nge = xge; + if(next == nge) /* move the next step past this sequence */ + next = next->next; + } + + /* check backwards if we have a whole sequence of them */ + pge = ge; + for(xge = ge->bkwd; xge != ge; xge = xge->bkwd) { + d2m = 0; + for(i= (xge->type==GE_CURVE? 0: 2); i<3; i++) { + dx = xge->fxn[i] - xge->prev->fx3; + dy = xge->fyn[i] - xge->prev->fy3; + d2 = dx*dx + dy*dy; + if(d2m < d2) + d2m = d2; + } + if( d2m > minlen2 ) /* line is not too small */ + break; + pge = xge; + } + + /* now we have a sequence of small fragments in pge...nge (inclusive) */ + + if(ISDBG(FCONCISE)) { + fprintf(stderr, "glyph %s has very small fragments(%x..%x..%x)\n", + g->name, pge, ge, nge); + dumppaths(g, pge, nge); + } + + /* reduce whole sequence to one part and remember the middle point */ + if(pge != nge) { + while(1) { + xge = pge->frwd; + if(xge == nge) { + pge->fx1 = pge->fx2 = pge->fx3; + pge->fx3 = nge->fx3; + pge->fy1 = pge->fy2 = pge->fy3; + pge->fy3 = nge->fy3; + pge->type = GE_CURVE; + freethisge(nge); + break; + } + if(xge == nge->bkwd) { + pge->fx1 = pge->fx2 = (pge->fx3+xge->fx3)/2.; + pge->fx3 = nge->fx3; + pge->fy1 = pge->fy2 = (pge->fy3+xge->fy3)/2.; + pge->fy3 = nge->fy3; + pge->type = GE_CURVE; + freethisge(nge); + freethisge(xge); + break; + } + freethisge(pge); pge = xge; + xge = nge->bkwd; freethisge(nge); nge = xge; + } + } + ge = pge; + + /* check if the whole sequence is small */ + dx = ge->fx3 - ge->prev->fx3; + dy = ge->fy3 - ge->prev->fy3; + d2 = dx*dx + dy*dy; + + if( d2 > minlen2 ) { /* no, it is not */ + double b, d; + + WARNING_3 fprintf(stderr, "glyph %s had a sequence of fragments < %g points each, reduced to one curve\n", + g->name, minlen); + + /* check that we did not create a monstrosity spanning quadrants */ + if(fsign(ge->fx1 - ge->prev->fx1) * fsign(ge->fx3 - ge->fx1) < 0 + || fsign(ge->fy1 - ge->prev->fy1) * fsign(ge->fy3 - ge->fy1) < 0 ) { + /* yes, we did; are both parts of this thing big enough ? */ + dx = ge->fx1 - ge->prev->fx3; + dy = ge->fy1 - ge->prev->fy3; + d2 = dx*dx + dy*dy; + + dx = ge->fx3 - ge->fx1; + dy = ge->fy3 - ge->fy1; + d2m = dx*dx + dy*dy; + + if(d2 > minlen2 && d2m > minlen2) { /* make two straights */ + nge = newgentry(GEF_FLOAT); + *nge = *ge; + + for(i=0; i<2; i++) { + ge->fpoints[i][2] = ge->fpoints[i][0]; + b = nge->fpoints[i][0]; + d = nge->fpoints[i][2] - b; + nge->fpoints[i][0] = b + 0.1*d; + nge->fpoints[i][1] = b + 0.9*d; + } + } + for(i=0; i<2; i++) { /* make one straight or first of two straights */ + b = ge->prev->fpoints[i][2]; + d = ge->fpoints[i][2] - b; + ge->fpoints[i][0] = b + 0.1*d; + ge->fpoints[i][1] = b + 0.9*d; + } + } + continue; + } + + if(ge->frwd == ge) { /* points to itself, just remove the path completely */ + WARNING_3 fprintf(stderr, "glyph %s had a path made of fragments < %g points each, removed\n", + g->name, minlen); + + next = freethisge(ge); + continue; + } + + /* now close the gap by x and y */ + for(i=0; i<2; i++) { + double gap; + + gap = ge->fpoints[i][2] - ge->prev->fpoints[i][2]; + if( fclosegap(ge, ge, i, gap, NULL) != 0.0 ) { + double scale, base; + + /* not good, as the last resort just scale the next line */ + gap = ge->fpoints[i][2] - ge->prev->fpoints[i][2]; + + if(ISDBG(FCONCISE)) + fprintf(stderr, " last resort on %c: closing next by %g\n", + (i==0 ? 'x' : 'y'), gap); + + nge = ge->frwd; + base = nge->fpoints[i][2]; + dx = ge->fpoints[i][2] - base; + if(fabs(dx) < FEPS) + continue; + + scale = ((dx-gap) / dx); + + if(nge->type == GE_CURVE) + for(k = 0; k<2; k++) + nge->fpoints[i][k] = base + + scale * (nge->fpoints[i][k] - base); + + ge->fpoints[i][2] -= gap; + } + } + + /* OK, the gap is closed - remove this useless GENTRY */ + freethisge(ge); + } +#undef TIMESLARGER +} + +/* find the point where two rays continuing vectors cross + * returns 1 if they cross, 0 if they don't + * If they cross optionally (if the pointers are not NULL) returns + * the maximal scales for both vectors and also optionally the point + * where the rays cross (twice). + * Expects that the curves are normalized. + * + * For convenience there are 2 front-end functions taking + * arguments in different formats + */ + +struct ray { + double x1, y1, x2, y2; + int isvert; + double k, b; /* lines are represented as y = k*x + b */ + double *maxp; +}; +static struct ray ray[3]; + +/* the back-end doing the actual work + * the rays are defined in the static array ray[] + */ + +static int +fcrossraysxx( + double crossdot[2][2] +) +{ + double x, y, max; + int i; + + for(i=0; i<2; i++) { + if(ray[i].x1 == ray[i].x2) + ray[i].isvert = 1; + else { + ray[i].isvert = 0; + ray[i].k = (ray[i].y2 - ray[i].y1) / (ray[i].x2 - ray[i].x1); + ray[i].b = ray[i].y2 - ray[i].k * ray[i].x2; + } + } + + if(ray[0].isvert && ray[1].isvert) { + if(ISDBG(FCONCISE)) fprintf(stderr, "crossrays: both vertical\n"); + return 0; /* both vertical, don't cross */ + } + + if(ray[1].isvert) { + ray[2] = ray[0]; /* exchange them */ + ray[0] = ray[1]; + ray[1] = ray[2]; + } + + if(ray[0].isvert) { + x = ray[0].x1; + } else { + if( fabs(ray[0].k - ray[1].k) < FEPS) { + if(ISDBG(FCONCISE)) fprintf(stderr, "crossrays: parallel lines, k = %g, %g\n", + ray[0].k, ray[1].k); + return 0; /* parallel lines */ + } + x = (ray[1].b - ray[0].b) / (ray[0].k - ray[1].k) ; + } + y = ray[1].k * x + ray[1].b; + + for(i=0; i<2; i++) { + if(ray[i].isvert) + max = (y - ray[i].y1) / (ray[i].y2 - ray[i].y1); + else + max = (x - ray[i].x1) / (ray[i].x2 - ray[i].x1); + /* check if wrong sides of rays cross */ + if( max < 0 ) { + if(ISDBG(FCONCISE)) fprintf(stderr, "crossrays: %c scale=%g @(%g,%g) (%g,%g)<-(%g,%g)\n", + (i?'Y':'X'), max, x, y, ray[i].x2, ray[i].y2, ray[i].x1, ray[i].y1); + return 0; + } + if(ray[i].maxp) + *ray[i].maxp = max; + } + if(crossdot != 0) { + crossdot[0][0] = crossdot[1][0] = x; + crossdot[0][1] = crossdot[1][1] = y; + } + return 1; +} + +/* the front-end getting the arguments from 4 dots defining + * a curve in the same format as for fapproxcurve(): + * rays are defined as beginning and end of the curve, + * the crossdot is inserted as the two middle dots of the curve + */ + +int +fcrossrayscv( + double curve[4][2 /*X,Y*/], + double *max1, + double *max2 +) +{ + ray[0].x1 = curve[0][X]; + ray[0].y1 = curve[0][Y]; + ray[0].x2 = curve[1][X]; + ray[0].y2 = curve[1][Y]; + ray[0].maxp = max1; + + ray[1].x1 = curve[2][X]; + ray[1].y1 = curve[2][Y]; + ray[1].x2 = curve[3][X]; + ray[1].y2 = curve[3][Y]; + ray[1].maxp = max2; + + return fcrossraysxx(&curve[1]); +} + +/* the front-end getting the arguments from gentries: + * rays are defined as beginning of curve1 and end of curve 2 + */ + +int +fcrossraysge( + GENTRY *ge1, + GENTRY *ge2, + double *max1, + double *max2, + double crossdot[2][2] +) +{ + ray[0].x1 = ge1->prev->fx3; + ray[0].y1 = ge1->prev->fy3; + ray[0].x2 = ge1->fpoints[X][ge1->ftg]; + ray[0].y2 = ge1->fpoints[Y][ge1->ftg]; + ray[0].maxp = max1; + + ray[1].x1 = ge2->fx3; + ray[1].y1 = ge2->fy3; + if(ge2->rtg < 0) { + ray[1].x2 = ge2->prev->fx3; + ray[1].y2 = ge2->prev->fy3; + } else { + ray[1].x2 = ge2->fpoints[X][ge2->rtg]; + ray[1].y2 = ge2->fpoints[Y][ge2->rtg]; + } + ray[1].maxp = max2; + + return fcrossraysxx(crossdot); +} + +/* debugging printout functions */ + +#if defined(DEBUG_DOTSEG) || defined(DEBUG_DOTCURVE) || defined(DEBUG_APPROXCV) + +/* for debugging */ +static +printdot( + double dot[2] +) +{ + fprintf(stderr, "(%g,%g)", dot[0], dot[1]); +} + +static +printseg( + double seg[2][2] +) +{ + putc('[', stderr); + printdot(seg[0]); + putc(' ', stderr); + printdot(seg[1]); + putc(']', stderr); +} + +#endif /* DEBUG_* */ + +/* + * Find squared distance from a dot to a line segment + */ + +double +fdotsegdist2( + double seg[2][2 /*X,Y*/], + double dot[2 /*X,Y*/] +) +{ +#define x1 seg[0][X] +#define y1 seg[0][Y] +#define x2 seg[1][X] +#define y2 seg[1][Y] +#define xdot dot[X] +#define ydot dot[Y] + + double dx, dy; /* segment dimensions */ + double kline, bline; /* segment line formula is y=k*x+b */ + double kperp, bperp; /* perpendicular from the dot to the line */ + double xcross, ycross; /* where the perpendicular crosses the segment */ + +/* handle the situation where the nearest point of the segment is its end */ +#define HANDLE_LIMITS(less12, lesscr1, lesscr2) \ + if( less12 ) { \ + if( lesscr1 ) { \ + xcross = x1; \ + ycross = y1; \ + } else if( !(lesscr2) ) { \ + xcross = x2; \ + ycross = y2; \ + } \ + } else { \ + if( !(lesscr1) ) { \ + xcross = x1; \ + ycross = y1; \ + } else if( lesscr2 ) { \ + xcross = x2; \ + ycross = y2; \ + } \ + } \ + /* end of macro */ + + + dx = x2 - x1; + dy = y2 - y1; + + if(fabs(dx) < FEPS) { + /* special case - vertical line */ +#ifdef DEBUG_DOTSEG + printf("vertical line!\n"); +#endif + xcross = x1; + ycross = ydot; + HANDLE_LIMITS( y1 < y2, ycross < y1, ycross < y2); + } else if(fabs(dy) < FEPS) { + /* special case - horizontal line */ +#ifdef DEBUG_DOTSEG + printf("horizontal line!\n"); +#endif + xcross = xdot; + ycross = y1; + HANDLE_LIMITS( x1 < x2, xcross < x1, xcross < x2) + } else { + kline = dy/dx; + bline = y1 - x1*kline; + kperp = -1./kline; + bperp = ydot - xdot*kperp; + + xcross = (bline-bperp) / (kperp-kline); + ycross = kline*xcross + bline; + + HANDLE_LIMITS( x1 < x2, xcross < x1, xcross < x2) + } +#ifdef DEBUG_DOTSEG + printf("crossover at (%g,%g)\n", xcross, ycross); +#endif + + dx = xdot-xcross; + dy = ydot-ycross; + return dx*dx+dy*dy; +#undef x1 +#undef y1 +#undef x2 +#undef y2 +#undef xdot +#undef ydot +#undef HANDLE_LIMITS +} + +/* find the weighted quadratic average for the distance of a set + * of dots from the curve; also fills out the individual distances + * for each dot; if maxp!=NULL then returns the maximal squared + * distance in there + */ + +double +fdotcurvdist2( + double curve[4][2 /*X,Y*/ ], + struct dot_dist *dots, + int ndots, /* number of entries in dots */ + double *maxp +) +{ + /* a curve is approximated by this many straight segments */ +#define NAPSECT 16 + /* a curve is divided into this many sections with equal weight each */ +#define NWSECT 4 + /* table of coefficients for finding the dots on the curve */ + /* tt[0] is left unused */ + static double tt[NAPSECT][4]; + static int havett = 0; /* flag: tt is initialized */ + /* dots on the curve */ + double cvd[NAPSECT+1][2 /*X,Y*/]; + /* sums by sections */ + double sum[NWSECT]; + /* counts by sections */ + double count[NWSECT]; + int d, i, j; + int id1, id2; + double dist1, dist2, dist3, dx, dy, x, y; + double max = 0.; + + if(!havett) { + double t, nt, t2, nt2, step; + + havett++; + step = 1. / NAPSECT; + t = 0; + for(i=1; iid1+1; i--) { + dx = x - cvd[i][X]; + dy = y - cvd[i][Y]; + dist3 = dx*dx + dy*dy; +#ifdef DEBUG_DOTCURVE + printf(" dot %d ",i); printdot(cvd[i]); printf(" dist=%g\n", sqrt(dist3)); +#endif + if(dist3 < dist2) { + dist2 = dist3; + id2 = i; + } else + break; + } + + /* now find which of the local minimums is smaller */ + if(dist2 < dist1) { + id1 = id2; + } + } + + /* the nearest segment must include the nearest dot */ + if(id1==0) { + dots[d].seg = 0; + dots[d].dist2 = fdotsegdist2(&cvd[0], dots[d].p); + } else if(id1==NAPSECT) { + dots[d].seg = NAPSECT-1; + dots[d].dist2 = fdotsegdist2(&cvd[NAPSECT-1], dots[d].p); + } else { + dist1 = fdotsegdist2(&cvd[id1], dots[d].p); + dist2 = fdotsegdist2(&cvd[id1-1], dots[d].p); + if(dist2 < dist1) { + dots[d].seg = id1-1; + dots[d].dist2 = dist2; + } else { + dots[d].seg = id1; + dots[d].dist2 = dist1; + } + } + + i = dots[d].seg % NWSECT; + sum[i] += dots[d].dist2; + if(dots[d].dist2 > max) + max = dots[d].dist2; + count[i]++; +#ifdef DEBUG_DOTCURVE + printf(" best seg %d sect %d dist=%g\n", dots[d].seg, i, sqrt(dots[d].dist2)); +#endif + } + + /* calculate the weighted average */ + id1=0; + dist1=0.; + for(i=0; irtg < 0) { + d[1][X] = ge1->fx3 - ge1->prev->fx3; + d[1][Y] = ge1->fy3 - ge1->prev->fy3; + } else { + d[1][X] = ge1->fx3 - ge1->fpoints[X][ge1->rtg]; + d[1][Y] = ge1->fy3 - ge1->fpoints[Y][ge1->rtg]; + } + d[2][X] = ge2->fpoints[X][ge2->ftg] - ge2->prev->fx3; + d[2][Y] = ge2->fpoints[Y][ge2->ftg] - ge2->prev->fy3; + + len1 = sqrt( d[1][X]*d[1][X] + d[1][Y]*d[1][Y] ); + len2 = sqrt( d[2][X]*d[2][X] + d[2][Y]*d[2][Y] ); + /* scale the 2nd segment to the length of 1 + * and to make sure that the 1st segment is longer scale it to + * the length of 2 and extend to the same distance backwards + */ + scale1 = 2./len1; + scale2 = 1./len2; + + for(axis=0; axis <2; axis++) { + d[0][axis] = -( d[1][axis] *= scale1 ); + d[2][axis] *= scale2; + } + return fdotsegdist2(d, d[2]); +} + +#if 0 +/* find the area covered by the curve + * (limited by the projections to the X axis) + */ + +static double +fcvarea( + GENTRY *ge +) +{ + double Ly, My, Ny, Py, Qx, Rx, Sx; + double area; + + /* y = Ly*t^3 + My*t^2 + Ny*t + Py */ + Ly = -ge->prev->fy3 + 3*(ge->fy1 - ge->fy2) + ge->fy3; + My = 3*ge->prev->fy3 - 6*ge->fy1 + 3*ge->fy2; + Ny = 3*(-ge->prev->fy3 + ge->fy1); + Py = ge->prev->fy3; + + /* dx/dt = Qx*t^2 + Rx*t + Sx */ + Qx = 3*(-ge->prev->fx3 + 3*(ge->fx1 - ge->fx2) + ge->fx3); + Rx = 6*(ge->prev->fx3 - 2*ge->fx1 + ge->fx2); + Sx = 3*(-ge->prev->fx3 + ge->fx1); + + /* area is integral[from 0 to 1]( y(t) * dx(t)/dt *dt) */ + area = 1./6.*(Ly*Qx) + 1./5.*(Ly*Rx + My*Qx) + + 1./4.*(Ly*Sx + My*Rx + Ny*Qx) + 1./3.*(My*Sx + Ny*Rx + Py*Qx) + + 1./2.*(Ny*Sx + Py*Rx) + Py*Sx; + + return area; +} +#endif + +/* find the value of point on the curve at the given parameter t, + * along the given axis (0 - X, 1 - Y). + */ + +static double +fcvval( + GENTRY *ge, + int axis, + double t +) +{ + double t2, mt, mt2; + + /* val = A*(1-t)^3 + 3*B*(1-t)^2*t + 3*C*(1-t)*t^2 + D*t^3 */ + t2 = t*t; + mt = 1-t; + mt2 = mt*mt; + + return ge->prev->fpoints[axis][2]*mt2*mt + + 3*(ge->fpoints[axis][0]*mt2*t + ge->fpoints[axis][1]*mt*t2) + + ge->fpoints[axis][2]*t*t2; +} + +/* + * Find ndots equally spaced dots on a curve or line and fill + * their coordinates into the dots array + */ + +static void +fsampledots( + GENTRY *ge, + double dots[][2], /* the dots to fill */ + int ndots +) +{ + int i, axis; + double t, nf, dx, d[2]; + + nf = ndots+1; + if(ge->type == GE_CURVE) { + for(i=0; ifx3 - ge->prev->fx3; + d[1] = ge->fy3 - ge->prev->fy3; + for(i=0; iprev->fpoints[axis][2] + + t*d[axis]; + } + } +} + +/* + * Allocate a structure gex_con + */ + +static void +alloc_gex_con( + GENTRY *ge +) +{ + ge->ext = (void*)calloc(1, sizeof(GEX_CON)); + if(ge->ext == 0) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } +} + +/* + * Normalize a gentry for fforceconcise() : find the points that + * can be used to calculate the tangents. + */ + +static void +fnormalizege( + GENTRY *ge +) +{ + int midsame, frontsame, rearsame; + + if(ge->type == GE_LINE) { + ge->ftg = 2; + ge->rtg = -1; + } else { /* assume it's a curve */ + midsame = (fabs(ge->fx1-ge->fx2)fy1-ge->fy2)fx1-ge->prev->fx3)fy1-ge->prev->fy3)fx3-ge->fx2)fy3-ge->fy2)ftg = 2; + ge->rtg = -1; + } else { + if(frontsame) { + ge->ftg = 1; + } else { + ge->ftg = 0; + } + if(rearsame) { + ge->rtg = 0; + } else { + ge->rtg = 1; + } + } + } +} + +/* various definition for the processing of outlines */ + +/* maximal average quadratic distance from the original curve + * (in dots) to consider the joined curve good + */ +#define CVEPS 1.5 +#define CVEPS2 (CVEPS*CVEPS) +/* squared sinus of the maximal angle that we consider a smooth joint */ +#define SMOOTHSIN2 0.25 /* 0.25==sin(30 degrees)^2 */ +/* squared line length that we consider small */ +#define SMALL_LINE2 (15.*15.) +/* how many times a curve must be bigger than a line to join, squared */ +#define TIMES_LINE2 (3.*3.) + +/* + * Normalize and analyse a gentry for fforceconcise() and fill out the gex_con + * structure + */ + +static void +fanalyzege( + GENTRY *ge +) +{ + int i, ix, iy; + double avsd2, dots[3][2 /*X,Y*/]; + GEX_CON *gex; + + gex = X_CON(ge); + memset(gex, 0, sizeof *gex); + + gex->len2 = 0; + for(i=0; i<2; i++) { + avsd2 = gex->d[i] = ge->fpoints[i][2] - ge->prev->fpoints[i][2]; + gex->len2 += avsd2*avsd2; + } + gex->sin2 = fjointsin2(ge, ge->frwd); + if(ge->type == GE_CURVE) { + ge->dir = fgetcvdir(ge); + for(i=0; i<2; i++) { + dots[0][i] = ge->prev->fpoints[i][2]; + dots[1][i] = ge->fpoints[i][2]; + dots[2][i] = fcvval(ge, i, 0.5); + } + avsd2 = fdotsegdist2(dots, dots[2]); + if(avsd2 <= CVEPS2) { + gex->flags |= GEXF_FLAT; + } + } else { + ge->dir = CVDIR_FEQUAL|CVDIR_REQUAL; + gex->flags |= GEXF_FLAT; + } + if(gex->flags & GEXF_FLAT) { + if( fabs(gex->d[X]) > FEPS && fabs(gex->d[Y]) < 5. + && fabs(gex->d[Y] / gex->d[X]) < 0.2) + gex->flags |= GEXF_HOR; + else if( fabs(gex->d[Y]) > FEPS && fabs(gex->d[X]) < 5. + && fabs(gex->d[X] / gex->d[Y]) < 0.2) + gex->flags |= GEXF_VERT; + } + ix = gex->isd[X] = fsign(gex->d[X]); + iy = gex->isd[Y] = fsign(gex->d[Y]); + if(ix <= 0) { + if(iy <= 0) + gex->flags |= GEXF_QDL; + if(iy >= 0) + gex->flags |= GEXF_QUL; + if(gex->flags & GEXF_HOR) + gex->flags |= GEXF_IDQ_L; + } + if(ix >= 0) { + if(iy <= 0) + gex->flags |= GEXF_QDR; + if(iy >= 0) + gex->flags |= GEXF_QUR; + if(gex->flags & GEXF_HOR) + gex->flags |= GEXF_IDQ_R; + } + if(gex->flags & GEXF_VERT) { + if(iy <= 0) { + gex->flags |= GEXF_IDQ_U; + } else { /* supposedly there is no 0-sized entry */ + gex->flags |= GEXF_IDQ_D; + } + } +} + +/* + * Analyse a joint between this and following gentry for fforceconcise() + * and fill out the corresponding parts of the gex_con structure + * Bothe entries must be analyzed first. + */ + +static void +fanalyzejoint( + GENTRY *ge +) +{ + GENTRY *nge = ge->frwd; + GENTRY tge; + GEX_CON *gex, *ngex; + double avsd2, dots[3][2 /*X,Y*/]; + int i; + + gex = X_CON(ge); ngex = X_CON(nge); + + /* look if they can be joined honestly */ + + /* if any is flat, they should join smoothly */ + if( (gex->flags & GEXF_FLAT || ngex->flags & GEXF_FLAT) + && gex->sin2 > SMOOTHSIN2) + goto try_flatboth; + + if(ge->type == GE_LINE) { + if(nge->type == GE_LINE) { + if(gex->len2 > SMALL_LINE2 || ngex->len2 > SMALL_LINE2) + goto try_flatboth; + } else { + if(gex->len2*TIMES_LINE2 > ngex->len2) + goto try_flatboth; + } + } else if(nge->type == GE_LINE) { + if(ngex->len2*TIMES_LINE2 > gex->len2) + goto try_flatboth; + } + + /* if curve changes direction */ + if( gex->isd[X]*ngex->isd[X]<0 || gex->isd[Y]*ngex->isd[Y]<0) + goto try_idealone; + + /* if would create a zigzag */ + if( ((ge->dir&CVDIR_FRONT)-CVDIR_FEQUAL) * ((nge->dir&CVDIR_REAR)-CVDIR_REQUAL) < 0 ) + goto try_flatone; + + if( fcrossraysge(ge, nge, NULL, NULL, NULL) ) + gex->flags |= GEXF_JGOOD; + +try_flatone: + /* look if they can be joined by flatting out one of the entries */ + + /* at this point we know that the general direction of the + * gentries is OK + */ + + if( gex->flags & GEXF_FLAT ) { + tge = *ge; + tge.fx1 = tge.fx3; + tge.fy1 = tge.fy3; + fnormalizege(&tge); + if( fcrossraysge(&tge, nge, NULL, NULL, NULL) ) + gex->flags |= GEXF_JFLAT|GEXF_JFLAT1; + } + if( ngex->flags & GEXF_FLAT ) { + tge = *nge; + tge.fx2 = ge->fx3; + tge.fy2 = ge->fy3; + fnormalizege(&tge); + if( fcrossraysge(ge, &tge, NULL, NULL, NULL) ) + gex->flags |= GEXF_JFLAT|GEXF_JFLAT2; + } + +try_idealone: + /* look if one of the entries can be brought to an idealized + * horizontal or vertical position and then joined + */ + if( gex->flags & GEXF_HOR && gex->isd[X]*ngex->isd[X]>=0 ) { + tge = *ge; + tge.fx1 = tge.fx3; + tge.fy1 = ge->prev->fy3; /* force horizontal */ + fnormalizege(&tge); + if( fcrossraysge(&tge, nge, NULL, NULL, NULL) ) + gex->flags |= GEXF_JID|GEXF_JID1; + } else if( gex->flags & GEXF_VERT && gex->isd[Y]*ngex->isd[Y]>=0 ) { + tge = *ge; + tge.fx1 = ge->prev->fx3; /* force vertical */ + tge.fy1 = tge.fy3; + fnormalizege(&tge); + if( fcrossraysge(&tge, nge, NULL, NULL, NULL) ) + gex->flags |= GEXF_JID|GEXF_JID1; + } + if( ngex->flags & GEXF_HOR && gex->isd[X]*ngex->isd[X]>=0 ) { + tge = *nge; + tge.fx2 = ge->fx3; + tge.fy2 = nge->fy3; /* force horizontal */ + fnormalizege(&tge); + if( fcrossraysge(ge, &tge, NULL, NULL, NULL) ) + gex->flags |= GEXF_JID|GEXF_JID2; + } else if( ngex->flags & GEXF_VERT && gex->isd[Y]*ngex->isd[Y]>=0 ) { + tge = *nge; + tge.fx2 = nge->fx3; /* force vertical */ + tge.fy2 = ge->fy3; + fnormalizege(&tge); + if( fcrossraysge(ge, &tge, NULL, NULL, NULL) ) + gex->flags |= GEXF_JID|GEXF_JID2; + } + +try_flatboth: + /* look if we can change them to one line */ + if(gex->flags & GEXF_FLAT && ngex->flags & GEXF_FLAT) { + for(i=0; i<2; i++) { + dots[0][i] = ge->prev->fpoints[i][2]; + dots[1][i] = nge->fpoints[i][2]; + dots[2][i] = ge->fpoints[i][2]; + } + if( fdotsegdist2(dots, dots[2]) <= CVEPS2) + gex->flags |= GEXF_JLINE; + } +} + +/* + * Force conciseness of one contour in the glyph, + * the contour is indicated by one entry from it. + */ + +static void +fconcisecontour( + GLYPH *g, + GENTRY *startge +) +{ +/* initial maximal number of dots to be used as reference */ +#define MAXDOTS ((NREFDOTS+1)*12) + + GENTRY *ge, *pge, *nge, *ige; + GEX_CON *gex, *pgex, *ngex, *nngex; + GENTRY tpge, tnge; + int quad, qq, i, j, ndots, maxdots; + int found[2]; + int joinmask, pflag, nflag; + struct dot_dist *dots; + double avsd2, maxd2, eps2; + double apcv[4][2]; + + if(startge == 0) { + fprintf(stderr, "WARNING: assertion in %s line %d, please report it to the ttf2pt1 project\n", + __FILE__, __LINE__); + fprintf(stderr, "Strange contour in glyph %s\n", g->name); + dumppaths(g, NULL, NULL); + return; + } + + if(startge->type != GE_CURVE && startge->type != GE_LINE) + return; /* probably a degenerate contour */ + + if(ISDBG(FCONCISE)) + fprintf(stderr, "processing contour 0x%p of glyph %s\n", startge, g->name); + + maxdots = MAXDOTS; + dots = (struct dot_dist *)malloc(sizeof(*dots)*maxdots); + if(dots == NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + + ge = startge; + joinmask = GEXF_JGOOD; + while(1) { + restart: + gex = X_CON(ge); + if((gex->flags & GEXF_JMASK) > ((joinmask<<1)-1)) { + if(ISDBG(FCONCISE)) + fprintf(stderr, "found higher flag (%x>%x) at 0x%p\n", + gex->flags & GEXF_JMASK, ((joinmask<<1)-1), ge); + joinmask <<= 1; + startge = ge; /* have to redo the pass */ + continue; + } + if(( gex->flags & joinmask )==0) + goto next; + + /* if we happen to be in the middle of a string of + * joinable entries, find its beginning + */ + if( gex->flags & (GEXF_JCVMASK^GEXF_JID) ) + quad = gex->flags & X_CON_F(ge->frwd) & GEXF_QMASK; + else if( gex->flags & GEXF_JID2 ) + quad = gex->flags & GEXF_QFROM_IDEAL(X_CON_F(ge->frwd)) & GEXF_QMASK; + else /* must be GEXF_JID1 */ + quad = GEXF_QFROM_IDEAL(gex->flags) & X_CON_F(ge->frwd) & GEXF_QMASK; + + pge = ge; + pgex = X_CON(pge->bkwd); + + if(ISDBG(FCONCISE)) + fprintf(stderr, "ge %p prev -> 0x%p ", ge, pge); + + while(pgex->flags & GEXF_JCVMASK) { + if( !(pgex->flags & ((GEXF_JCVMASK^GEXF_JID)|GEXF_JID2)) ) + qq = GEXF_QFROM_IDEAL(pgex->flags); + else + qq = pgex->flags & GEXF_QMASK; + + if(ISDBG(FCONCISE)) + fprintf(stderr, "(%x?%x)", quad, qq); + + if( !(quad & qq) ) { + if( !(X_CON_F(pge) & (GEXF_JCVMASK^GEXF_JID)) + && pgex->flags & (GEXF_JCVMASK^GEXF_JID) ) { + /* the previos entry is definitely a better match */ + if(pge == ge) { + if(ISDBG(FCONCISE)) + fprintf(stderr, "\nprev is a better match at %p\n", pge); + startge = ge; + goto next; + } else + pge = pge->frwd; + } + break; + } + + quad &= qq; + pge = pge->bkwd; + pgex = X_CON(pge->bkwd); + if(ISDBG(FCONCISE)) + fprintf(stderr, "0x%p ", pge); + } + + /* collect as many entries for joining as possible */ + nge = ge->frwd; + ngex = X_CON(nge); + nngex = X_CON(nge->frwd); + + if(ISDBG(FCONCISE)) + fprintf(stderr, ": 0x%x\nnext -> 0x%p ", pge, nge); + + while(ngex->flags & GEXF_JCVMASK) { + if( !(ngex->flags & ((GEXF_JCVMASK^GEXF_JID)|GEXF_JID1)) ) + qq = GEXF_QFROM_IDEAL(nngex->flags); + else + qq = nngex->flags & GEXF_QMASK; + + if(ISDBG(FCONCISE)) + fprintf(stderr, "(%x?%x)", quad, qq); + if( !(quad & qq) ) { + if( !(X_CON_F(nge->bkwd) & (GEXF_JCVMASK^GEXF_JID)) + && ngex->flags & (GEXF_JCVMASK^GEXF_JID) ) { + /* the next-next entry is definitely a better match */ + if(nge == ge->frwd) { + if(ISDBG(FCONCISE)) + fprintf(stderr, "\nnext %x is a better match than %x at %p (jmask %x)\n", + ngex->flags & GEXF_JCVMASK, gex->flags & GEXF_JCVMASK, nge, joinmask); + goto next; + } else + nge = nge->bkwd; + } + break; + } + + quad &= qq; + nge = nge->frwd; + ngex = nngex; + nngex = X_CON(nge->frwd); + if(ISDBG(FCONCISE)) + fprintf(stderr, "0x%p ", nge); + } + + if(ISDBG(FCONCISE)) + fprintf(stderr, ": 0x%x\n", nge); + + /* XXX add splitting of last entries if neccessary */ + + /* make sure that all the reference dots are valid */ + for(ige = pge; ige != nge->frwd; ige = ige->frwd) { + nngex = X_CON(ige); + if( !(nngex->flags & GEXF_VDOTS) ) { + fsampledots(ige, nngex->dots, NREFDOTS); + nngex->flags |= GEXF_VDOTS; + } + } + + /* do the actual joining */ + while(1) { + pgex = X_CON(pge); + ngex = X_CON(nge->bkwd); + /* now the segments to be joined are pge...nge */ + + ndots = 0; + for(ige = pge; ige != nge->frwd; ige = ige->frwd) { + if(maxdots < ndots+(NREFDOTS+1)) { + maxdots += MAXDOTS; + dots = (struct dot_dist *)realloc((void *)dots, sizeof(*dots)*maxdots); + if(dots == NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + } + nngex = X_CON(ige); + for(i=0; idots[i][j]; + ndots++; + } + for(j=0; j<2; j++) + dots[ndots].p[j] = ige->fpoints[j][2]; + ndots++; + } + ndots--; /* the last point is not interesting */ + + tpge = *pge; + pflag = pgex->flags; + if(pflag & (GEXF_JGOOD|GEXF_JFLAT2|GEXF_JID2)) { + /* nothing */ + } else if(pflag & GEXF_JFLAT) { + tpge.fx1 = tpge.fx3; + tpge.fy1 = tpge.fy3; + } else if(pflag & GEXF_JID) { + if(pflag & GEXF_HOR) + tpge.fy1 = tpge.bkwd->fy3; + else + tpge.fx1 = tpge.bkwd->fx3; + } + + tnge = *nge; + nflag = ngex->flags; + if(nflag & (GEXF_JGOOD|GEXF_JFLAT1|GEXF_JID) + && !(nflag & GEXF_JID2)) { + /* nothing */ + } else if(nflag & GEXF_JFLAT) { + tnge.fx2 = tnge.bkwd->fx3; + tnge.fy2 = tnge.bkwd->fy3; + } else if(nflag & GEXF_JID) { + if(X_CON_F(nge) & GEXF_HOR) + tnge.fy2 = tnge.fy3; + else + tnge.fx2 = tnge.fx3; + } + + fnormalizege(&tpge); + fnormalizege(&tnge); + if( fcrossraysge(&tpge, &tnge, NULL, NULL, &apcv[1]) ) { + apcv[0][X] = tpge.bkwd->fx3; + apcv[0][Y] = tpge.bkwd->fy3; + /* apcv[1] and apcv[2] were filled by fcrossraysge() */ + apcv[3][X] = tnge.fx3; + apcv[3][Y] = tnge.fy3; + + /* calculate the precision depending on the smaller dimension of the curve */ + maxd2 = apcv[3][X]-apcv[0][X]; + maxd2 *= maxd2; + eps2 = apcv[3][Y]-apcv[0][Y]; + eps2 *= eps2; + if(maxd2 < eps2) + eps2 = maxd2; + eps2 *= (CVEPS2*4.) / (400.*400.); + if(eps2 < CVEPS2) + eps2 = CVEPS2; + else if(eps2 > CVEPS2*4.) + eps2 = CVEPS2*4.; + + fapproxcurve(apcv, dots, ndots); + + avsd2 = fdotcurvdist2(apcv, dots, ndots, &maxd2); + if(ISDBG(FCONCISE)) + fprintf(stderr, "avsd = %g, maxd = %g, ", sqrt(avsd2), sqrt(maxd2)); + if(avsd2 <= eps2 && maxd2 <= eps2*2.) { + /* we've guessed a curve that is close enough */ + ggoodcv++; ggoodcvdots += ndots; + + if(ISDBG(FCONCISE)) { + fprintf(stderr, "in %s joined %p-%p to ", g->name, pge, nge); + for(i=0; i<4; i++) { + fprintf(stderr, " (%g, %g)", apcv[i][X], apcv[i][Y]); + } + fprintf(stderr, " from\n"); + dumppaths(g, pge, nge); + } + for(i=0; i<3; i++) { + pge->fxn[i] = apcv[i+1][X]; + pge->fyn[i] = apcv[i+1][Y]; + } + pge->type = GE_CURVE; + ge = pge; + for(ige = pge->frwd; ; ige = pge->frwd) { + if(ige == pge) { + fprintf(stderr, "WARNING: assertion in %s line %d, please report it to the ttf2pt1 project\n", + __FILE__, __LINE__); + free(dots); + return; + } + if(startge == ige) + startge = pge; + free(ige->ext); + freethisge(ige); + if(ige == nge) + break; + } + fnormalizege(ge); + if(ISDBG(FCONCISE)) { + fprintf(stderr, "normalized "); + for(i=0; i<3; i++) { + fprintf(stderr, " (%g, %g)", ge->fpoints[X][i], ge->fpoints[Y][i]); + } + fprintf(stderr, "\n"); + } + fanalyzege(ge); + fanalyzejoint(ge); + fanalyzege(ge->bkwd); + fanalyzejoint(ge->bkwd); + + /* the results of this join will have to be reconsidered */ + startge = ge = ge->frwd; + goto restart; + } else { + gbadcv++; gbadcvdots += ndots; + } + } + + /* if we're down to 2 entries then the join has failed */ + if(pge->frwd == nge) { + pgex->flags &= ~joinmask; + if(ISDBG(FCONCISE)) + fprintf(stderr, "no match\n"); + goto next; + } + + /* reduce the number of entries by dropping one at some end, + * should never drop the original ge from the range + */ + + if(nge->bkwd == ge + || pge != ge && (pgex->flags & GEXF_JCVMASK) <= (ngex->flags & GEXF_JCVMASK) ) { + pge = pge->frwd; + } else { + nge = nge->bkwd; + } + if(ISDBG(FCONCISE)) + fprintf(stderr, "next try: %p to %p\n", pge, nge); + } + +next: + ge = ge->frwd; + if(ge == startge) { + joinmask = (joinmask >> 1) & GEXF_JCVMASK; + if(joinmask == 0) + break; + } + } + + /* join flat segments into lines */ + /* here ge==startge */ + while(1) { + gex = X_CON(ge); + if( !(gex->flags & GEXF_JLINE) ) + goto next2; + + ndots = 0; + dots[ndots].p[X] = ge->fx3; + dots[ndots].p[Y] = ge->fy3; + ndots++; + + pge = ge->bkwd; + nge = ge->frwd; + + if(ISDBG(FCONCISE)) + fprintf(stderr, "joining LINE from %p-%p\n", ge, nge); + + while(pge!=nge) { + pgex = X_CON(pge); + ngex = X_CON(nge); + if(ISDBG(FCONCISE)) + fprintf(stderr, "(p=%p/%x n=0x%x/%x) ", pge, pgex->flags & GEXF_JLINE, + nge, ngex->flags & GEXF_JLINE); + if( !((pgex->flags | ngex->flags) & GEXF_JLINE) ) { + if(ISDBG(FCONCISE)) + fprintf(stderr, "(end p=%p n=%p) ", pge, nge); + break; + } + + if(maxdots < ndots+2) { + maxdots += MAXDOTS; + dots = (struct dot_dist *)realloc((void *)dots, sizeof(*dots)*maxdots); + if(dots == NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + } + if( pgex->flags & GEXF_JLINE ) { + for(i=0; i<2; i++) { + apcv[0][i] = pge->bkwd->fpoints[i][2]; + apcv[1][i] = nge->fpoints[i][2]; + dots[ndots].p[i] = pge->fpoints[i][2]; + } + ndots++; + for(i=0; i CVEPS2) + break; + } + if(iflags &= ~GEXF_JLINE; + } else { + pge = pge->bkwd; + if(pge == nge) { + if(ISDBG(FCONCISE)) + fprintf(stderr, "intersected at prev %p ", pge); + break; /* oops, tried to self-intersect */ + } + } + } else if(ISDBG(FCONCISE)) + fprintf(stderr, "(p=%p) ", pge); + + if( ngex->flags & GEXF_JLINE ) { + for(i=0; i<2; i++) { + apcv[0][i] = pge->fpoints[i][2]; /* pge points before the 1st segment */ + apcv[1][i] = nge->frwd->fpoints[i][2]; + dots[ndots].p[i] = nge->fpoints[i][2]; + } + ndots++; + for(i=0; i CVEPS2) + break; + } + if(ifrwd); + ndots--; + ngex->flags &= ~GEXF_JLINE; + } else { + nge = nge->frwd; + } + } else if(ISDBG(FCONCISE)) + fprintf(stderr, "(n=%p) ", nge); + } + + pge = pge->frwd; /* now the limits are pge...nge inclusive */ + if(pge == nge) /* a deeply perversive contour */ + break; + + if(ISDBG(FCONCISE)) { + fprintf(stderr, "\nin %s joined LINE %p-%p from\n", g->name, pge, nge); + dumppaths(g, pge, nge); + } + pge->type = GE_LINE; + for(i=0; i<2; i++) { + pge->fpoints[i][2] = nge->fpoints[i][2]; + } + fnormalizege(pge); + X_CON_F(pge) &= ~GEXF_JLINE; + + ge = pge; + for(ige = pge->frwd; ; ige = pge->frwd) { + if(ige == pge) { + fprintf(stderr, "WARNING: assertion in %s line %d, please report it to the ttf2pt1 project\n", + __FILE__, __LINE__); + free(dots); + return; + } + if(startge == ige) + startge = pge; + free(ige->ext); + freethisge(ige); + if(ige == nge) + break; + } +next2: + ge = ge->frwd; + if(ge == startge) + break; + } + + free(dots); +} + +/* force conciseness: substitute 2 or more curves going in the +** same quadrant with one curve +** in floating point +*/ + +void +fforceconcise( + GLYPH * g +) +{ + + GENTRY *ge, *nge, *endge, *xge; + + assertisfloat(g, "enforcing conciseness"); + + fdelsmall(g, 0.05); + assertpath(g->entries, __FILE__, __LINE__, g->name); + + if(ISDBG(FCONCISE)) + dumppaths(g, NULL, NULL); + + /* collect more information about each gentry and their joints */ + for (ge = g->entries; ge != 0; ge = ge->next) + if (ge->type == GE_CURVE || ge->type == GE_LINE) + fnormalizege(ge); + + for (ge = g->entries; ge != 0; ge = ge->next) + if (ge->type == GE_CURVE || ge->type == GE_LINE) { + alloc_gex_con(ge); + fanalyzege(ge); + } + + /* see what we can do about joining */ + for (ge = g->entries; ge != 0; ge = ge->next) + if (ge->type == GE_CURVE || ge->type == GE_LINE) + fanalyzejoint(ge); + + /* now do the joining */ + for (ge = g->entries; ge != 0; ge = ge->next) + if(ge->type == GE_MOVE) + fconcisecontour(g, ge->next); + + for (ge = g->entries; ge != 0; ge = ge->next) + if (ge->type == GE_CURVE || ge->type == GE_LINE) + free(ge->ext); +} + +void +print_glyph( + int glyphno +) +{ + GLYPH *g; + GENTRY *ge; + int x = 0, y = 0; + int i; + int grp, lastgrp= -1; + + if(ISDBG(FCONCISE) && glyphno == 0) { + fprintf(stderr, "Guessed curves: bad %d/%d good %d/%d\n", + gbadcv, gbadcvdots, ggoodcv, ggoodcvdots); + } + + g = &glyph_list[glyphno]; + + fprintf(pfa_file, "/%s { \n", g->name); + + /* consider widths >MAXLEGALWIDTH as bugs */ + if( g->scaledwidth <= MAXLEGALWIDTH ) { + fprintf(pfa_file, "0 %d hsbw\n", g->scaledwidth); + } else { + fprintf(pfa_file, "0 1000 hsbw\n"); + WARNING_2 fprintf(stderr, "glyph %s: width %d seems to be buggy, set to 1000\n", + g->name, g->scaledwidth); + } + +#if 0 + fprintf(pfa_file, "%% contours: "); + for (i = 0; i < g->ncontours; i++) + fprintf(pfa_file, "%s(%d,%d) ", (g->contours[i].direction == DIR_OUTER ? "out" : "in"), + g->contours[i].xofmin, g->contours[i].ymin); + fprintf(pfa_file, "\n"); + + if (g->rymin < 5000) + fprintf(pfa_file, "%d lower%s\n", g->rymin, (g->flatymin ? "flat" : "curve")); + if (g->rymax > -5000) + fprintf(pfa_file, "%d upper%s\n", g->rymax, (g->flatymax ? "flat" : "curve")); +#endif + + if (g->hstems) + for (i = 0; i < g->nhs; i += 2) { + if (g->hstems[i].flags & ST_3) { + fprintf(pfa_file, "%d %d %d %d %d %d hstem3\n", + g->hstems[i].value, + g->hstems[i + 1].value - g->hstems[i].value, + g->hstems[i + 2].value, + g->hstems[i + 3].value - g->hstems[i + 2].value, + g->hstems[i + 4].value, + g->hstems[i + 5].value - g->hstems[i + 4].value + ); + i += 4; + } else { + fprintf(pfa_file, "%d %d hstem\n", g->hstems[i].value, + g->hstems[i + 1].value - g->hstems[i].value); + } + } + + if (g->vstems) + for (i = 0; i < g->nvs; i += 2) { + if (g->vstems[i].flags & ST_3) { + fprintf(pfa_file, "%d %d %d %d %d %d vstem3\n", + g->vstems[i].value, + g->vstems[i + 1].value - g->vstems[i].value, + g->vstems[i + 2].value, + g->vstems[i + 3].value - g->vstems[i + 2].value, + g->vstems[i + 4].value, + g->vstems[i + 5].value - g->vstems[i + 4].value + ); + i += 4; + } else { + fprintf(pfa_file, "%d %d vstem\n", g->vstems[i].value, + g->vstems[i + 1].value - g->vstems[i].value); + } + } + + for (ge = g->entries; ge != 0; ge = ge->next) { + if(g->nsg>0) { + grp=ge->stemid; + if(grp >= 0 && grp != lastgrp) { + fprintf(pfa_file, "%d 4 callsubr\n", grp+g->firstsubr); + lastgrp=grp; + } + } + + switch (ge->type) { + case GE_MOVE: + if (absolute) + fprintf(pfa_file, "%d %d amoveto\n", ge->ix3, ge->iy3); + else + rmoveto(ge->ix3 - x, ge->iy3 - y); + if (0) + fprintf(stderr, "Glyph %s: print moveto(%d, %d)\n", + g->name, ge->ix3, ge->iy3); + x = ge->ix3; + y = ge->iy3; + break; + case GE_LINE: + if (absolute) + fprintf(pfa_file, "%d %d alineto\n", ge->ix3, ge->iy3); + else + rlineto(ge->ix3 - x, ge->iy3 - y); + x = ge->ix3; + y = ge->iy3; + break; + case GE_CURVE: + if (absolute) + fprintf(pfa_file, "%d %d %d %d %d %d arcurveto\n", + ge->ix1, ge->iy1, ge->ix2, ge->iy2, ge->ix3, ge->iy3); + else + rrcurveto(ge->ix1 - x, ge->iy1 - y, + ge->ix2 - ge->ix1, ge->iy2 - ge->iy1, + ge->ix3 - ge->ix2, ge->iy3 - ge->iy2); + x = ge->ix3; + y = ge->iy3; + break; + case GE_PATH: + closepath(); + break; + default: + WARNING_1 fprintf(stderr, "**** Glyph %s: unknown entry type '%c'\n", + g->name, ge->type); + break; + } + } + + fprintf(pfa_file, "endchar } ND\n"); +} + +/* print the subroutines for this glyph, returns the number of them */ +int +print_glyph_subs( + int glyphno, + int startid /* start numbering subroutines from this id */ +) +{ + GLYPH *g; + int i, grp; + + g = &glyph_list[glyphno]; + + if(!hints || !subhints || g->nsg<1) + return 0; + + g->firstsubr=startid; + +#if 0 + fprintf(pfa_file, "%% %s %d\n", g->name, g->nsg); +#endif + for(grp=0; grpnsg; grp++) { + fprintf(pfa_file, "dup %d {\n", startid++); + for(i= (grp==0)? 0 : g->nsbs[grp-1]; insbs[grp]; i++) + fprintf(pfa_file, "\t%d %d %cstem\n", g->sbstems[i].low, + g->sbstems[i].high-g->sbstems[i].low, + g->sbstems[i].isvert ? 'v' : 'h'); + fprintf(pfa_file, "\treturn\n\t} NP\n"); + } + + return g->nsg; +} + +void +print_glyph_metrics( + FILE *afm_file, + int code, + int glyphno +) +{ + GLYPH *g; + + g = &glyph_list[glyphno]; + + if(transform) + fprintf(afm_file, "C %d ; WX %d ; N %s ; B %d %d %d %d ;\n", + code, g->scaledwidth, g->name, + iscale(g->xMin), iscale(g->yMin), iscale(g->xMax), iscale(g->yMax)); + else + fprintf(afm_file, "C %d ; WX %d ; N %s ; B %d %d %d %d ;\n", + code, g->scaledwidth, g->name, + g->xMin, g->yMin, g->xMax, g->yMax); + +} + +void +print_glyph_metrics_ufm( + FILE *ufm_file, + int code, + int glyphno +) +{ + GLYPH *g; + + g = &glyph_list[glyphno]; + + // OAR - added bounding box for Unicode glyphs + fprintf(ufm_file, "U %d ; WX %d ; N %s ; G %d ; B %d %d %d %d ;\n", + code, g->scaledwidth, g->name, glyphno, g->xMin, g->yMin, g->xMax, g->yMax); +} +/* + SB: + An important note about the BlueValues. + + The Adobe documentation says that the maximal width of a Blue zone + is connected to the value of BlueScale, which is by default 0.039625. + The BlueScale value defines, at which point size the overshoot + suppression be disabled. + + The formula for it that is given in the manual is: + + BlueScale=point_size/240, for a 300dpi device + + that makes us wonder what is this 240 standing for. Incidentally + 240=72*1000/300, where 72 is the relation between inches and points, + 1000 is the size of the glyph matrix, and 300dpi is the resolution of + the output device. Knowing that we can recalculate the formula for + the font size in pixels rather than points: + + BlueScale=pixel_size/1000 + + That looks a lot simpler than the original formula, does not it ? + And the limitation about the maximal width of zone also looks + a lot simpler after the transformation: + + max_width < 1000/pixel_size + + that ensures that even at the maximal pixel size when the overshoot + suppression is disabled the zone width will be less than one pixel. + This is important, failure to comply to this limit will result in + really ugly fonts (been there, done that). But knowing the formula + for the pixel width, we see that in fact we can use the maximal width + of 24, not 23 as specified in the manual. + +*/ + +#define MAXBLUEWIDTH (24) + +/* + * Find the indexes of the most frequent values + * in the hystogram, sort them in ascending order, and save which one + * was the best one (if asked). + * Returns the number of values found (may be less than maximal because + * we ignore the zero values) + */ + +#define MAXHYST (2000) /* size of the hystogram */ +#define HYSTBASE 500 + +static int +besthyst( + int *hyst, /* the hystogram */ + int base, /* the base point of the hystogram */ + int *best, /* the array for indexes of best values */ + int nbest, /* its allocated size */ + int width, /* minimal difference between indexes */ + int *bestindp /* returned top point */ +) +{ + unsigned char hused[MAXHYST / 8 + 1]; + int i, max, j, w, last = 0; + int nf = 0; + + width--; + + memset(hused, 0 , sizeof hused); + + max = 1; + for (i = 0; i < nbest && max != 0; i++) { + best[i] = 0; + max = 0; + for (j = 1; j < MAXHYST - 1; j++) { + w = hyst[j]; + + if (w > max && (hused[j>>3] & (1 << (j & 0x07))) == 0) { + best[i] = j; + max = w; + } + } + if (max != 0) { + if (max < last/2) { + /* do not pick the too low values */ + break; + } + for (j = best[i] - width; j <= best[i] + width; j++) { + if (j >= 0 && j < MAXHYST) + hused[j >> 3] |= (1 << (j & 0x07)); + } + last = max; + best[i] -= base; + nf = i + 1; + } + } + + if (bestindp) + *bestindp = best[0]; + + /* sort the indexes in ascending order */ + for (i = 0; i < nf; i++) { + for (j = i + 1; j < nf; j++) + if (best[j] < best[i]) { + w = best[i]; + best[i] = best[j]; + best[j] = w; + } + } + + return nf; +} + +/* + * Find the next best Blue zone in the hystogram. + * Return the weight of the found zone. + */ + +static int +bestblue( + short *zhyst, /* the zones hystogram */ + short *physt, /* the points hystogram */ + short *ozhyst, /* the other zones hystogram */ + int *bluetab /* where to put the found zone */ +) +{ + int i, j, w, max, ind, first, last; + + /* find the highest point in the zones hystogram */ + /* if we have a plateau, take its center */ + /* if we have multiple peaks, take the first one */ + + max = -1; + first = last = -10; + for (i = 0; i <= MAXHYST - MAXBLUEWIDTH; i++) { + w = zhyst[i]; + if (w > max) { + first = last = i; + max = w; + } else if (w == max) { + if (last == i - 1) + last = i; + } + } + ind = (first + last) / 2; + + if (max == 0) /* no zones left */ + return 0; + + /* now we reuse `first' and `last' as inclusive borders of the zone */ + first = ind; + last = ind + (MAXBLUEWIDTH - 1); + + /* our maximal width is far too big, so we try to make it narrower */ + w = max; + j = (w & 1); /* a pseudo-random bit */ + while (1) { + while (physt[first] == 0) + first++; + while (physt[last] == 0) + last--; + if (last - first < (MAXBLUEWIDTH * 2 / 3) || (max - w) * 10 > max) + break; + + if (physt[first] < physt[last] + || physt[first] == physt[last] && j) { + if (physt[first] * 20 > w) /* if weight is >5%, + * stop */ + break; + w -= physt[first]; + first++; + j = 0; + } else { + if (physt[last] * 20 > w) /* if weight is >5%, + * stop */ + break; + w -= physt[last]; + last--; + j = 1; + } + } + + /* save our zone */ + bluetab[0] = first - HYSTBASE; + bluetab[1] = last - HYSTBASE; + + /* invalidate all the zones overlapping with this one */ + /* the constant of 2 is determined by the default value of BlueFuzz */ + for (i = first - (MAXBLUEWIDTH - 1) - 2; i <= last + 2; i++) + if (i >= 0 && i < MAXHYST) { + zhyst[i] = 0; + ozhyst[i] = 0; + } + return w; +} + +/* + * Try to find the Blue Values, bounding box and italic angle + */ + +void +findblues(void) +{ + /* hystograms for upper and lower zones */ + short hystl[MAXHYST]; + short hystu[MAXHYST]; + short zuhyst[MAXHYST]; + short zlhyst[MAXHYST]; + int nchars; + int i, j, k, w, max; + GENTRY *ge; + GLYPH *g; + double ang; + + /* find the lowest and highest points of glyphs */ + /* and by the way build the values for FontBBox */ + /* and build the hystogram for the ItalicAngle */ + + /* re-use hystl for the hystogram of italic angle */ + + bbox[0] = bbox[1] = 5000; + bbox[2] = bbox[3] = -5000; + + for (i = 0; i < MAXHYST; i++) + hystl[i] = 0; + + nchars = 0; + + for (i = 0, g = glyph_list; i < numglyphs; i++, g++) { + if (g->flags & GF_USED) { + nchars++; + + g->rymin = 5000; + g->rymax = -5000; + for (ge = g->entries; ge != 0; ge = ge->next) { + if (ge->type == GE_LINE) { + + j = ge->iy3 - ge->prev->iy3; + k = ge->ix3 - ge->prev->ix3; + if (j > 0) + ang = atan2(-k, j) * 180.0 / M_PI; + else + ang = atan2(k, -j) * 180.0 / M_PI; + + k /= 100; + j /= 100; + if (ang > -45.0 && ang < 45.0) { + /* + * be careful to not overflow + * the counter + */ + hystl[HYSTBASE + (int) (ang * 10.0)] += (k * k + j * j) / 4; + } + if (ge->iy3 == ge->prev->iy3) { + if (ge->iy3 <= g->rymin) { + g->rymin = ge->iy3; + g->flatymin = 1; + } + if (ge->iy3 >= g->rymax) { + g->rymax = ge->iy3; + g->flatymax = 1; + } + } else { + if (ge->iy3 < g->rymin) { + g->rymin = ge->iy3; + g->flatymin = 0; + } + if (ge->iy3 > g->rymax) { + g->rymax = ge->iy3; + g->flatymax = 0; + } + } + } else if (ge->type == GE_CURVE) { + if (ge->iy3 < g->rymin) { + g->rymin = ge->iy3; + g->flatymin = 0; + } + if (ge->iy3 > g->rymax) { + g->rymax = ge->iy3; + g->flatymax = 0; + } + } + if (ge->type == GE_LINE || ge->type == GE_CURVE) { + if (ge->ix3 < bbox[0]) + bbox[0] = ge->ix3; + if (ge->ix3 > bbox[2]) + bbox[2] = ge->ix3; + if (ge->iy3 < bbox[1]) + bbox[1] = ge->iy3; + if (ge->iy3 > bbox[3]) + bbox[3] = ge->iy3; + } + } + } + } + + /* get the most popular angle */ + max = 0; + w = 0; + for (i = 0; i < MAXHYST; i++) { + if (hystl[i] > w) { + w = hystl[i]; + max = i; + } + } + ang = (double) (max - HYSTBASE) / 10.0; + WARNING_2 fprintf(stderr, "Guessed italic angle: %f\n", ang); + if (italic_angle == 0.0) + italic_angle = ang; + + /* build the hystogram of the lower points */ + for (i = 0; i < MAXHYST; i++) + hystl[i] = 0; + + for (i = 0, g = glyph_list; i < numglyphs; i++, g++) { + if ((g->flags & GF_USED) + && g->rymin + HYSTBASE >= 0 && g->rymin < MAXHYST - HYSTBASE) { + hystl[g->rymin + HYSTBASE]++; + } + } + + /* build the hystogram of the upper points */ + for (i = 0; i < MAXHYST; i++) + hystu[i] = 0; + + for (i = 0, g = glyph_list; i < numglyphs; i++, g++) { + if ((g->flags & GF_USED) + && g->rymax + HYSTBASE >= 0 && g->rymax < MAXHYST - HYSTBASE) { + hystu[g->rymax + HYSTBASE]++; + } + } + + /* build the hystogram of all the possible lower zones with max width */ + for (i = 0; i < MAXHYST; i++) + zlhyst[i] = 0; + + for (i = 0; i <= MAXHYST - MAXBLUEWIDTH; i++) { + for (j = 0; j < MAXBLUEWIDTH; j++) + zlhyst[i] += hystl[i + j]; + } + + /* build the hystogram of all the possible upper zones with max width */ + for (i = 0; i < MAXHYST; i++) + zuhyst[i] = 0; + + for (i = 0; i <= MAXHYST - MAXBLUEWIDTH; i++) { + for (j = 0; j < MAXBLUEWIDTH; j++) + zuhyst[i] += hystu[i + j]; + } + + /* find the baseline */ + w = bestblue(zlhyst, hystl, zuhyst, &bluevalues[0]); + if (0) + fprintf(stderr, "BaselineBlue zone %d%% %d...%d\n", w * 100 / nchars, + bluevalues[0], bluevalues[1]); + + if (w == 0) /* no baseline, something weird */ + return; + + /* find the upper zones */ + for (nblues = 2; nblues < 14; nblues += 2) { + w = bestblue(zuhyst, hystu, zlhyst, &bluevalues[nblues]); + + if (0) + fprintf(stderr, "Blue zone %d%% %d...%d\n", w * 100 / nchars, + bluevalues[nblues], bluevalues[nblues+1]); + + if (w * 20 < nchars) + break; /* don't save this zone */ + } + + /* find the lower zones */ + for (notherb = 0; notherb < 10; notherb += 2) { + w = bestblue(zlhyst, hystl, zuhyst, &otherblues[notherb]); + + if (0) + fprintf(stderr, "OtherBlue zone %d%% %d...%d\n", w * 100 / nchars, + otherblues[notherb], otherblues[notherb+1]); + + + if (w * 20 < nchars) + break; /* don't save this zone */ + } + +} + +/* + * Find the actual width of the glyph and modify the + * description to reflect it. Not guaranteed to do + * any good, may make character spacing too wide. + */ + +void +docorrectwidth(void) +{ + int i; + GENTRY *ge; + GLYPH *g; + int xmin, xmax; + int maxwidth, minsp; + + /* enforce this minimal spacing, + * we limit the amount of the enforced spacing to avoid + * spacing the bold wonts too widely + */ + minsp = (stdhw>60 || stdhw<10)? 60 : stdhw; + + for (i = 0, g = glyph_list; i < numglyphs; i++, g++) { + g->oldwidth=g->scaledwidth; /* save the old width, will need for AFM */ + + if (correctwidth && g->flags & GF_USED) { + xmin = 5000; + xmax = -5000; + for (ge = g->entries; ge != 0; ge = ge->next) { + if (ge->type != GE_LINE && ge->type != GE_CURVE) + continue; + + if (ge->ix3 <= xmin) { + xmin = ge->ix3; + } + if (ge->ix3 >= xmax) { + xmax = ge->ix3; + } + } + + maxwidth=xmax+minsp; + if( g->scaledwidth < maxwidth ) { + g->scaledwidth = maxwidth; + WARNING_3 fprintf(stderr, "glyph %s: extended from %d to %d\n", + g->name, g->oldwidth, g->scaledwidth ); + } + } + } + +} + +/* + * Try to find the typical stem widths + */ + +void +stemstatistics(void) +{ +#define MINDIST 10 /* minimal distance between the widths */ + int hyst[MAXHYST+MINDIST*2]; + int best[12]; + int i, j, k, w; + int nchars; + int ns; + STEM *s; + GLYPH *g; + + /* start with typical stem width */ + + nchars=0; + + /* build the hystogram of horizontal stem widths */ + memset(hyst, 0, sizeof hyst); + + for (i = 0, g = glyph_list; i < numglyphs; i++, g++) { + if (g->flags & GF_USED) { + nchars++; + s = g->hstems; + for (j = 0; j < g->nhs; j += 2) { + if ((s[j].flags | s[j + 1].flags) & ST_END) + continue; + w = s[j + 1].value - s[j].value+1; + if(w==20) /* split stems should not be counted */ + continue; + if (w > 0 && w < MAXHYST - 1) { + /* + * handle some fuzz present in + * converted fonts + */ + hyst[w+MINDIST] += MINDIST-1; + for(k=1; kflags & GF_USED) { + s = g->vstems; + for (j = 0; j < g->nvs; j += 2) { + if ((s[j].flags | s[j + 1].flags) & ST_END) + continue; + w = s[j + 1].value - s[j].value+1; + if (w > 0 && w < MAXHYST - 1) { + /* + * handle some fuzz present in + * converted fonts + */ + hyst[w+MINDIST] += MINDIST-1; + for(k=1; knext) { + if(ge->type == GE_LINE || ge->type == GE_CURVE) { + if (ISDBG(REVERSAL)) + fprintf(stderr, "reverse path 0x%x <- 0x%x, 0x%x\n", ge, ge->prev, ge->bkwd); + + /* cut out the path itself */ + pge = ge->prev; /* GE_MOVE */ + if (pge == 0) { + fprintf(stderr, "**! No MOVE before line !!! Fatal. ****\n"); + exit(1); + } + nge = ge->bkwd->next; /* GE_PATH */ + pge->next = nge; + nge->prev = pge; + ge->bkwd->next = 0; /* mark end of chain */ + + /* remember the starting point */ + if(ge->flags & GEF_FLOAT) { + flast[0] = pge->fx3; + flast[1] = pge->fy3; + } else { + ilast[0] = pge->ix3; + ilast[1] = pge->iy3; + } + + /* then reinsert them in backwards order */ + for(cur = ge; cur != 0; cur = next ) { + next = cur->next; /* or addgeafter() will screw it up */ + if(cur->flags & GEF_FLOAT) { + for(i=0; i<2; i++) { + /* reverse the direction of path element */ + f = cur->fpoints[i][0]; + cur->fpoints[i][0] = cur->fpoints[i][1]; + cur->fpoints[i][1] = f; + f = flast[i]; + flast[i] = cur->fpoints[i][2]; + cur->fpoints[i][2] = f; + } + } else { + for(i=0; i<2; i++) { + /* reverse the direction of path element */ + n = cur->ipoints[i][0]; + cur->ipoints[i][0] = cur->ipoints[i][1]; + cur->ipoints[i][1] = n; + n = ilast[i]; + ilast[i] = cur->ipoints[i][2]; + cur->ipoints[i][2] = n; + } + } + addgeafter(pge, cur); + } + + /* restore the starting point */ + if(ge->flags & GEF_FLOAT) { + pge->fx3 = flast[0]; + pge->fy3 = flast[1]; + } else { + pge->ix3 = ilast[0]; + pge->iy3 = ilast[1]; + } + + ge = nge; + } + + } +} + +void +reversepaths( + GLYPH * g +) +{ + reversepathsfromto(g->entries, NULL); +} + +/* add a kerning pair information, scales the value */ + +void +addkernpair( + unsigned id1, + unsigned id2, + int unscval +) +{ + static unsigned char *bits = 0; + static int lastid; + GLYPH *g = &glyph_list[id1]; + int i, n; + struct kern *p; + + if(unscval == 0 || id1 >= numglyphs || id2 >= numglyphs) + return; + + if( (glyph_list[id1].flags & GF_USED)==0 + || (glyph_list[id2].flags & GF_USED)==0 ) + return; + + if(bits == 0) { + bits = calloc( BITMAP_BYTES(numglyphs), 1); + if (bits == NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + lastid = id1; + } + + if(lastid != id1) { + /* refill the bitmap cache */ + memset(bits, 0,BITMAP_BYTES(numglyphs)); + p = g->kern; + for(i=g->kerncount; i>0; i--) { + n = (p++)->id; + SET_BITMAP(bits, n); + } + lastid = id1; + } + + if(IS_BITMAP(bits, id2)) + return; /* duplicate */ + + if(g->kerncount <= g->kernalloc) { + g->kernalloc += 8; + p = realloc(g->kern, sizeof(struct kern) * g->kernalloc); + if(p == 0) { + fprintf (stderr, "** realloc failed, kerning data will be incomplete\n"); + } + g->kern = p; + } + + SET_BITMAP(bits, id2); + p = &g->kern[g->kerncount]; + p->id = id2; + p->val = iscale(unscval) - (g->scaledwidth - g->oldwidth); + g->kerncount++; + kerning_pairs++; +} + +/* print out the kerning information */ + +void +print_kerning( + FILE *afm_file +) +{ + int i, j, n; + GLYPH *g; + struct kern *p; + + if( kerning_pairs == 0 ) + return; + + fprintf(afm_file, "StartKernData\n"); + fprintf(afm_file, "StartKernPairs %hd\n", kerning_pairs); + + for(i=0; iflags & GF_USED) ==0) + continue; + p = g->kern; + for(j=g->kerncount; j>0; j--, p++) { + fprintf(afm_file, "KPX %s %s %d\n", g->name, + glyph_list[ p->id ].name, p->val ); + } + } + + fprintf(afm_file, "EndKernPairs\n"); + fprintf(afm_file, "EndKernData\n"); +} + + +#if 0 + +/* +** This function is commented out because the information +** collected by it is not used anywhere else yet. Now +** it only collects the directions of contours. And the +** direction of contours gets fixed already in draw_glyf(). +** +*********************************************** +** +** Here we expect that the paths are already closed. +** We also expect that the contours do not intersect +** and that curves doesn't cross any border of quadrant. +** +** Find which contours go inside which and what is +** their proper direction. Then fix the direction +** to make it right. +** +*/ + +#define MAXCONT 1000 + +void +fixcontours( + GLYPH * g +) +{ + CONTOUR cont[MAXCONT]; + short ymax[MAXCONT]; /* the highest point */ + short xofmax[MAXCONT]; /* X-coordinate of any point + * at ymax */ + short ymin[MAXCONT]; /* the lowest point */ + short xofmin[MAXCONT]; /* X-coordinate of any point + * at ymin */ + short count[MAXCONT]; /* count of lines */ + char dir[MAXCONT]; /* in which direction they must go */ + GENTRY *start[MAXCONT], *minptr[MAXCONT], *maxptr[MAXCONT]; + int ncont; + int i; + int dx1, dy1, dx2, dy2; + GENTRY *ge, *nge; + + /* find the contours and their most upper/lower points */ + ncont = 0; + ymax[0] = -5000; + ymin[0] = 5000; + for (ge = g->entries; ge != 0; ge = ge->next) { + if (ge->type == GE_LINE || ge->type == GE_CURVE) { + if (ge->iy3 > ymax[ncont]) { + ymax[ncont] = ge->iy3; + xofmax[ncont] = ge->ix3; + maxptr[ncont] = ge; + } + if (ge->iy3 < ymin[ncont]) { + ymin[ncont] = ge->iy3; + xofmin[ncont] = ge->ix3; + minptr[ncont] = ge; + } + } + if (ge->frwd != ge->next) { + start[ncont++] = ge->frwd; + ymax[ncont] = -5000; + ymin[ncont] = 5000; + } + } + + /* determine the directions of contours */ + for (i = 0; i < ncont; i++) { + ge = minptr[i]; + nge = ge->frwd; + + if (ge->type == GE_CURVE) { + dx1 = ge->ix3 - ge->ix2; + dy1 = ge->iy3 - ge->iy2; + + if (dx1 == 0 && dy1 == 0) { /* a pathological case */ + dx1 = ge->ix3 - ge->ix1; + dy1 = ge->iy3 - ge->iy1; + } + if (dx1 == 0 && dy1 == 0) { /* a more pathological + * case */ + dx1 = ge->ix3 - ge->prev->ix3; + dy1 = ge->iy3 - ge->prev->iy3; + } + } else { + dx1 = ge->ix3 - ge->prev->ix3; + dy1 = ge->iy3 - ge->prev->iy3; + } + if (nge->type == GE_CURVE) { + dx2 = ge->ix3 - nge->ix1; + dy2 = ge->iy3 - nge->iy1; + if (dx1 == 0 && dy1 == 0) { /* a pathological case */ + dx2 = ge->ix3 - nge->ix2; + dy2 = ge->iy3 - nge->iy2; + } + if (dx1 == 0 && dy1 == 0) { /* a more pathological + * case */ + dx2 = ge->ix3 - nge->ix3; + dy2 = ge->iy3 - nge->iy3; + } + } else { + dx2 = ge->ix3 - nge->ix3; + dy2 = ge->iy3 - nge->iy3; + } + + /* compare angles */ + cont[i].direction = DIR_INNER; + if (dy1 == 0) { + if (dx1 < 0) + cont[i].direction = DIR_OUTER; + } else if (dy2 == 0) { + if (dx2 > 0) + cont[i].direction = DIR_OUTER; + } else if (dx2 * dy1 < dx1 * dy2) + cont[i].direction = DIR_OUTER; + + cont[i].ymin = ymin[i]; + cont[i].xofmin = xofmin[i]; + } + + /* save the information that may be needed further */ + g->ncontours = ncont; + if (ncont > 0) { + g->contours = malloc(sizeof(CONTOUR) * ncont); + if (g->contours == 0) { + fprintf(stderr, "***** Memory allocation error *****\n"); + exit(255); + } + memcpy(g->contours, cont, sizeof(CONTOUR) * ncont); + } +} + +#endif + +/* + * + */ + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/pt1.h b/application/third_party/dompdf/lib/ttf2ufm/src/pt1.h new file mode 100755 index 00000000..a1d3af33 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/pt1.h @@ -0,0 +1,262 @@ +/* + * see COPYRIGHT + */ + + +/* glyph entry, one drawing command */ +typedef struct gentry { + /* this list links all GENTRYs of a GLYPH sequentially */ + struct gentry *next; /* double linked list */ + struct gentry *prev; + + /* this list links all GENTRYs of one contour - + * of types GE_LINE and GE_CURVE only + * bkwd is also reused: in the very first entry (normally + * of type GE_MOVE) it points to g->entries + */ + struct gentry *cntr[2]; /* double-linked circular list */ +/* convenience handles */ +#define bkwd cntr[0] +#define frwd cntr[1] + + /* various extended structures used at some stage of transformation */ + void *ext; + + union { + struct { + int val[2][3]; /* integer values */ + } i; + struct { + double val[2][3]; /* floating values */ + } f; + } points; /* absolute values, NOT deltas */ +/* convenience handles */ +#define ipoints points.i.val +#define fpoints points.f.val +#define ixn ipoints[0] +#define iyn ipoints[1] +#define fxn fpoints[0] +#define fyn fpoints[1] +#define ix1 ixn[0] +#define ix2 ixn[1] +#define ix3 ixn[2] +#define iy1 iyn[0] +#define iy2 iyn[1] +#define iy3 iyn[2] +#define fx1 fxn[0] +#define fx2 fxn[1] +#define fx3 fxn[2] +#define fy1 fyn[0] +#define fy2 fyn[1] +#define fy3 fyn[2] + + char flags; +#define GEF_FLOAT 0x02 /* entry contains floating point data */ +#define GEF_LINE 0x04 /* entry looks like a line even if it's a curve */ + + unsigned char dir; /* used to temporarily store the values for + * the directions of the ends of curves */ +/* front end */ +#define CVDIR_FUP 0x02 /* goes over the line connecting the ends */ +#define CVDIR_FEQUAL 0x01 /* coincides with the line connecting the + * ends */ +#define CVDIR_FDOWN 0x00 /* goes under the line connecting the ends */ +#define CVDIR_FRONT 0x0F /* mask of all front directions */ +/* rear end */ +#define CVDIR_RSAME 0x30 /* is the same as for the front end */ +#define CVDIR_RUP 0x20 /* goes over the line connecting the ends */ +#define CVDIR_REQUAL 0x10 /* coincides with the line connecting the + * ends */ +#define CVDIR_RDOWN 0x00 /* goes under the line connecting the ends */ +#define CVDIR_REAR 0xF0 /* mask of all rear directions */ + + signed char stemid; /* connection to the substituted stem group */ + char type; +#define GE_HSBW 'B' +#define GE_MOVE 'M' +#define GE_LINE 'L' +#define GE_CURVE 'C' +#define GE_PATH 'P' + + /* indexes of the points to be used for calculation of the tangents */ + signed char ftg; /* front tangent */ + signed char rtg; /* rear tangent, -1 means "idx 2 of the previous entry" */ +} GENTRY; + +/* stem structure, describes one [hv]stem */ +/* acually, it describes one border of a stem */ +/* the whole stem is a pair of these structures */ + +typedef struct stem { + short value; /* value of X or Y coordinate */ + short origin; /* point of origin for curve stems */ + GENTRY *ge; /* entry that has (value, origin) as its first dot */ + /* also for all the stems the couple (value, origin) + * is used to determine whether a stem is relevant for a + * line, it's considered revelant if this tuple is + * equal to any of the ends of the line. + * ge is also used to resolve ambiguity if there is more than + * one line going through certain pointi, it is used to + * distinguish these lines. + */ + + short from, to; /* values of other coordinate between + * which this stem is valid */ + + short flags; + /* ordering of ST_END, ST_FLAT, ST_ZONE is IMPORTANT for sorting */ +#define ST_END 0x01 /* end of line, lowest priority */ +#define ST_FLAT 0x02 /* stem is defined by a flat line, not a + * curve */ +#define ST_ZONE 0x04 /* pseudo-stem, the limit of a blue zone */ +#define ST_UP 0x08 /* the black area is to up or right from + * value */ +#define ST_3 0x20 /* first stem of [hv]stem3 */ +#define ST_BLUE 0x40 /* stem is in blue zone */ +#define ST_TOPZONE 0x80 /* 1 - top zone, 0 - bottom zone */ +#define ST_VERT 0x100 /* vertical stem (used in substitutions) */ +} STEM; + +#define MAX_STEMS 2000 /* we can't have more stems than path + * elements (or hope so) */ +#define NSTEMGRP 50 /* maximal number of the substituted stem groups */ + +/* structure for economical representation of the + * substituted stems + */ + +typedef struct stembounds { + short low; /* low bound */ + short high; /* high bound */ + char isvert; /* 1 - vertical, 0 - horizontal */ + char already; /* temp. flag: is aleready included */ +} STEMBOUNDS; + +struct kern { + unsigned id; /* ID of the second glyph */ + int val; /* kerning value */ +}; + +typedef struct contour { + short ymin, xofmin; + short inside; /* inside which contour */ + char direction; +#define DIR_OUTER 1 +#define DIR_INNER 0 +} CONTOUR; + +/* becnjcarson: allow glyphs to have multiple character codes. This isn't 100% + perfect, but should be enough for most normal fonts. */ +#define GLYPH_MAX_ENCODINGS (4) + +typedef struct glyph { + int char_no;/* Encoding of glyph */ + int orig_code[GLYPH_MAX_ENCODINGS]; /* code(s) of glyph in the font's original encoding */ + char *name; /* Postscript name of glyph */ + int xMin, yMin, xMax, yMax; /* values from TTF dictionary */ + int lsb; /* left sidebearing */ + int ttf_pathlen; /* total length of TTF paths */ + short width; + short flags; +#define GF_USED 0x0001 /* whether is this glyph used in T1 font */ +#define GF_FLOAT 0x0002 /* thys glyph contains floating point entries */ + + GENTRY *entries;/* doube linked list of entries */ + GENTRY *lastentry; /* the last inserted entry */ + GENTRY *path; /* beggining of the last path */ + int oldwidth; /* actually also scaled */ + int scaledwidth; +#define MAXLEGALWIDTH 10000 + + struct kern *kern; /* kerning data */ + int kerncount; /* number of kerning pairs */ + int kernalloc; /* for how many pairs we have space */ + + STEM *hstems; /* global horiz. and vert. stems */ + STEM *vstems; + int nhs, nvs; /* numbers of stems */ + + STEMBOUNDS *sbstems; /* substituted stems for all the groups */ + short *nsbs; /* indexes of the group ends in the common array */ + int nsg; /* actual number of the stem groups */ + int firstsubr; /* first substistuted stems subroutine number */ + + CONTOUR *contours; /* it is not used now */ + int ncontours; + + int rymin, rymax; /* real values */ + /* do we have flat surfaces on top/bottom */ + char flatymin, flatymax; + +} GLYPH; + +/* description of a dot for calculation of its distance to a curve */ + +struct dot_dist { + double p[2 /*X,Y*/]; /* coordinates of a dot */ + double dist2; /* squared distance from the dot to the curve */ + short seg; /* the closest segment of the curve */ +}; + +extern int stdhw, stdvw; /* dominant stems widths */ +extern int stemsnaph[12], stemsnapv[12]; /* most typical stem width */ + +extern int bluevalues[14]; +extern int nblues; +extern int otherblues[10]; +extern int notherb; +extern int bbox[4]; /* the FontBBox array */ +extern double italic_angle; + +extern GLYPH *glyph_list; +extern int encoding[]; /* inverse of glyph[].char_no */ + +/* prototypes of functions */ +void rmoveto( int dx, int dy); +void rlineto( int dx, int dy); +void rrcurveto( int dx1, int dy1, int dx2, int dy2, int dx3, int dy3); +void assertpath( GENTRY * from, char *file, int line, char *name); + +void fg_rmoveto( GLYPH * g, double x, double y); +void ig_rmoveto( GLYPH * g, int x, int y); +void fg_rlineto( GLYPH * g, double x, double y); +void ig_rlineto( GLYPH * g, int x, int y); +void fg_rrcurveto( GLYPH * g, double x1, double y1, + double x2, double y2, double x3, double y3); +void ig_rrcurveto( GLYPH * g, int x1, int y1, + int x2, int y2, int x3, int y3); +void g_closepath( GLYPH * g); + +void pathtoint( GLYPH *g); +void ffixquadrants( GLYPH *g); +void flattencurves( GLYPH * g); +int checkcv( GENTRY * ge, int dx, int dy); +void iclosepaths( GLYPH * g); +void fclosepaths( GLYPH * g); +void smoothjoints( GLYPH * g); +void buildstems( GLYPH * g); +void fstraighten( GLYPH * g); +void istraighten( GLYPH * g, int zigonly); +void isplitzigzags( GLYPH * g); +void fsplitzigzags( GLYPH * g); +void fforceconcise( GLYPH * g); +void iforceconcise( GLYPH * g); +void reversepathsfromto( GENTRY * from, GENTRY * to); +void reversepaths( GLYPH * g); +void dumppaths( GLYPH * g, GENTRY *start, GENTRY *end); +void print_glyph( int glyphno); +int print_glyph_subs( int glyphno, int startid); +void print_glyph_metrics( FILE *afm_file, int code, int glyphno); +void print_glyph_metrics_ufm( FILE *ufm_file, int code, int glyphno); +void findblues(void); +void stemstatistics(void); +void docorrectwidth(void); +void addkernpair( unsigned id1, unsigned id2, int unscval); +void print_kerning( FILE *afm_file); + +int fcrossrayscv( double curve[4][2], double *max1, double *max2); +int fcrossraysge( GENTRY *ge1, GENTRY *ge2, double *max1, double *max2, + double crossdot[2][2]); +double fdotsegdist2( double seg[2][2], double dot[2]); +double fdotcurvdist2( double curve[4][2], struct dot_dist *dots, int ndots, double *maxp); +void fapproxcurve( double cv[4][2], struct dot_dist *dots, int ndots); diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/runt1asm.c b/application/third_party/dompdf/lib/ttf2ufm/src/runt1asm.c new file mode 100755 index 00000000..58c4cad8 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/runt1asm.c @@ -0,0 +1,61 @@ +/* + * Wrap-around code to either compile in t1asm or call it externally + * + * Copyright (C) 2000 by Sergey Babkin + * Copyright (C) 2000 by The TTF2PT1 Project + * + * See COPYRIGHT for full license + */ + +#ifdef EXTERNAL_T1ASM + +#include +#include + +FILE *ifp; +FILE *ofp; + +int +runt1asm( + int pfbflag +) +{ + char *cmd; + int id, od; + int error; + + /* first make a copy in case some of then is already stdin/stdout */ + if(( id = dup(fileno(ifp)) )<0) { + perror("** Re-opening input file for t1asm"); + exit(1); + } + if(( od = dup(fileno(ofp)) )<0) { + perror("** Re-opening output file for t1asm"); + exit(1); + } + fclose(ifp); fclose(ofp); + close(0); + if(( dup(id) )!=0) { + perror("** Re-directing input file for t1asm"); + exit(1); + } + close(1); + if(( dup(od) )!=1) { + perror("** Re-directing output file for t1asm"); + exit(1); + } + close(id); close(od); + + if(pfbflag) + error = execlp("t1asm", "t1asm", "-b", NULL); + else + error = execlp("t1asm", "t1asm", NULL); + + perror("** Calling t1asm"); + + exit(1); +} + +#else +# include "t1asm.c" +#endif diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/convert b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/convert new file mode 100755 index 00000000..35b00cfb --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/convert @@ -0,0 +1,367 @@ +#!/bin/sh +# +# Copyright (c) 1998-2000 +# Sergey A. Babkin. 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. 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. +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +# +# Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net) +# + +# Use : convert [cfgfile] + +# Convert TTF fonts from source directory to Type1 fonts in the destination +# directory, converted to the specified encodings. Also generate the +# fonts.scale, fonts.dir and fonts.alias files in the destination directory. + +# clean some variables so that they won't be inherited from environment + +ENCDIR= +MAPDIR= + +# path to the configuration file + +if [ $# -eq 1 ] +then + CFGFILE=$1 +else + CFGFILE=`pwd`/convert.cfg +fi + +# these setting would be edited during installation + +TTF2PT1_BINDIR= +TTF2PT1_LIBXDIR= +TTF2PT1_SHAREDIR= + +[ -z "$TTF2PT1_BINDIR" ] && { + TTF2PT1_BINDIR=`pwd`/.. +} +[ -z "$TTF2PT1_LIBXDIR" ] && { + TTF2PT1_LIBXDIR=`pwd`/.. +} +[ -z "$TTF2PT1_SHAREDIR" ] && { + TTF2PT1_SHAREDIR=`pwd`/.. +} + +# directory from where we are started + +RUNDIR=`pwd` + +# paths to various utilities + +T1ASM=$TTF2PT1_LIBXDIR/t1asm +[ -f $T1ASM -a -x $T1ASM ] || { + # if it's not in libxdir, use whatever t1asm the system provides + T1ASM=t1asm +} +TTF2PT1=$TTF2PT1_BINDIR/ttf2pt1 +TRANS=$TTF2PT1_SHAREDIR/scripts/trans +T1FDIR=$TTF2PT1_SHAREDIR/scripts/t1fdir +FORCEISO=$TTF2PT1_SHAREDIR/scripts/forceiso +X2GS=$TTF2PT1_SHAREDIR/scripts/x2gs +SUFFIX="pfa" + +MYSELF=convert + +# include the configuration + +if [ -r $CFGFILE ] +then { + . $CFGFILE +} else { + echo " +Can't find the configuration file + $CFGFILE +Please look at the sample file convert.cfg.sample, +copy it to convert.cfg and modify for +you actual configuration." >&2 + exit 1 +} fi + +# path to the directory with descriptions of encodings +[ -z "$ENCDIR" ] && { + ENCDIR=$TTF2PT1_SHAREDIR/encodings +} + +# directory with the external Unicode maps +[ -z "$MAPDIR" ] && { + MAPDIR=$TTF2PT1_SHAREDIR/maps +} + +LOG=$DSTDIR/convert.log + +# configure the ttf2pt1 options from our options + +# artefact of backwards-compatibility with .cfg +[ -z "$CORRECTWIDTH" -a YES != "$DONTCORRECTWIDTH" ] && { + TTF2PT1="$TTF2PT1 -OW" +} +[ YES = "$CORRECTWIDTH" ] && { + TTF2PT1="$TTF2PT1 -OW" +} + +[ YES != "$HINTSUBST" ] && { + TTF2PT1="$TTF2PT1 -Ou" # meaning changed past 3.22 +} + +[ YES = "$ALLGLYPHS" -a YES = "$ENFORCEISO" ] && { + echo "$MYSELF: options ALLGLYPHS and ENFORCEISO are mutually exclusive" >&2 + exit 1 +} + +[ YES = "$ALLGLYPHS" ] && { + TTF2PT1="$TTF2PT1 -a" +} + +[ YES = "$GENUID" ] && { + TTF2PT1="$TTF2PT1 -uA" +} + +[ YES != "$ENFORCEISO" ] && { + FORCEISO=cat +} + +[ YES = "$CREATEPFB" ] && { + T1ASM="$T1ASM -b" + SUFFIX="pfb" +} + +# parse the information about the source files + +eval "`echo \"$SRCDIRS\" | awk ' + BEGIN { n=0; } + /^ *$/ { next; } + { + if(n>9) { + printf(\"echo \\\"Only 9 encodings are supported at once!\\\" >&2\n\"); + printf(\"exit 1\\n\"); + } else { + printf(\"SRCDIR%d=%s\n\",n,$1); + printf(\"SRCLANG%d=%s\n\",n,$2); + printf(\"SRCENC%d=%s\n\",n,$3); + printf(\"SRCMAP%d=%s\n\",n,$4); + n++; + } + }'`" + +# check whether we have the directories + +mkdir $DSTDIR 2>/dev/null >/dev/null +[ -d $DSTDIR -a -r $DSTDIR -a -w $DSTDIR -a -x $DSTDIR ] || { + echo "$MYSELF: can't access the directory $DSTDIR" >&2 + exit 1 +} + +# go to our destination directory + +cd $DSTDIR || { + echo "$MYSELF: can't chdir to $DSTDIR" >&2 + exit 1 +} + +rm -f ./* 2>/dev/null +>$LOG + +for dirno in 0 1 2 3 4 5 6 7 8 9 +do { + + SRCDIR=`eval "echo \\\$SRCDIR$dirno"` + SRCLANG=`eval "echo \\\$SRCLANG$dirno"` + SRCENC=`eval "echo \\\$SRCENC$dirno"` + SRCMAP=`eval "echo \\\$SRCMAP$dirno"` + DSTENC=`eval "echo \\\$DSTENC$SRCLANG"` + + echo $SRCDIR + echo $SRCENC + + [ -z "$SRCDIR" ] && break; + + [ "`ls $SRCDIR/*.[tT][tT][fF] 2>/dev/null |wc -l`" -gt 0 ] || { + echo "$MYSELF: no TTF files in $SRCDIR" >&2 + exit 1 + } + + # check whether we have the encoding tables + + [ -n "$SRCENC" ] || { + echo "$MYSELF: you must specify some source encoding" >&2 + exit 1 + } + + [ unknown = "$SRCLANG" -o -n "$DSTENC" ] || { + echo "$MYSELF: you must specify some destination encodings" >&2 + exit 1 + } + + # handle aliases of the destination encodings + + XDSTENC= + DSTALIAS= + + [ -r $ENCDIR/$SRCLANG/encodings.alias ] && { + for i in $DSTENC + do { + TO=`awk '$1=="'$i'" { print $2; }' <$ENCDIR/$SRCLANG/encodings.alias` + if [ -n "$TO" ] + then { + [ -f $ENCDIR/$SRCLANG/$i.tbl -a -r $ENCDIR/$SRCLANG/$i.tbl ] && { + echo "WARNING: $SRCLANG encoding $i found as both table and alias" >&2 + echo "WARNING: The alias takes precedence" >&2 + } + DSTALIAS="$TO $i +$DSTALIAS" + XDSTENC="$TO +$XDSTENC" + } else { + XDSTENC="$i +$XDSTENC" + } fi + } done + DSTENC=`echo "$XDSTENC" | sort -u | tr ' +' ' '` + } + + [ unknown != "$SRCLANG" ] && { + for i in $SRCENC $DSTENC + do { + [ -f $ENCDIR/$SRCLANG/$i.tbl -a -r $ENCDIR/$SRCLANG/$i.tbl ] || { + echo "$MYSELF: can't read $ENCDIR/$SRCLANG/$i.tbl" >&2 + exit 1 + } + } done + } + + # OK convert the files + + for file in $SRCDIR/*.[tT][tT][fF] + do { + name=`echo $file | tr A-Z a-z` + name=`basename $name .ttf` + + echo "Converting $name" + + # generate the assembler code + + echo "******* $name -> t1a ************" >>$LOG + + if [ -n "$SRCMAP" ] + then { + $TTF2PT1 -L $MAPDIR/$SRCMAP $file ./$name.$SRCENC 2>>$LOG + } else { + $TTF2PT1 -l $SRCLANG $file ./$name.$SRCENC 2>>$LOG + } fi + + [ -s ./$name.$SRCENC.t1a ] || { + echo "$MYSELF: can't generate Type1 assembler code for $name" >&2 + continue; + } + + [ -s ./$name.$SRCENC.afm ] || { + echo "$MYSELF: can't generate AFM metrics file for $name" >&2 + continue; + } + + mv ./$name.$SRCENC.afm ./$name.$SRCENC.xafm + + psname=`$T1FDIR -g $FOUNDRY " " -f ./$name.$SRCENC.t1a \ + | awk '{print substr($1,2);}'` + + # now for each destination encoding generate a .pfa/b file + # and record for fonts.scale + + if [ unknown != "$SRCLANG" ] + then { + for enc in $DSTENC + do { + echo "******* $name -> $enc ************" >>$LOG + + sed 's|^\/FontName.*$|/FontName /'$psname$enc' def|' <./$name.$SRCENC.t1a \ + | $TRANS $ENCDIR/$SRCLANG/$SRCENC.tbl $ENCDIR/$SRCLANG/$enc.tbl \ + | $FORCEISO | $T1ASM >./$name.$enc.$SUFFIX + [ -s ./$name.$enc.$SUFFIX ] || { + echo "$MYSELF: can't convert/assemble Type1 file for $name.$enc" >&2 + continue; + } + + sed 's|^FontName.*$|FontName '$psname$enc'|' <./$name.$SRCENC.xafm \ + | $TRANS $ENCDIR/$SRCLANG/$SRCENC.tbl $ENCDIR/$SRCLANG/$enc.tbl \ + | uniq | $FORCEISO >./$name.$enc.afm + [ -s ./$name.$enc.afm ] || { + echo "$MYSELF: can't convert AFM file for $name.$enc" >&2 + } + + aliases=`echo "$DSTALIAS" | grep "^$enc" | cut -d\ -f2` + echo "******* aliases: $aliases" >>$LOG + + $T1FDIR -d fonts.ttf fonts.alias $FOUNDRY $enc $aliases -f ./$name.$enc.$SUFFIX + echo "/$psname$enc ($name.$enc.$SUFFIX) ;" >>Fontmap.ttf + } done + } else { + enc="$SRCENC" + echo "******* $name -> $enc ************" >>$LOG + + sed 's|^\/FontName.*$|/FontName /'$psname$enc' def|' <./$name.$SRCENC.t1a \ + | $FORCEISO | $T1ASM >./$name.$enc.$SUFFIX + [ -s ./$name.$enc.$SUFFIX ] || { + echo "$MYSELF: can't convert/assemble Type1 file for $name.$enc" >&2 + continue; + } + + sed 's|^FontName.*$|FontName '$psname$enc'|' <./$name.$SRCENC.xafm \ + | uniq | $FORCEISO >./$name.$enc.afm + [ -s ./$name.$enc.afm ] || { + echo "$MYSELF: can't convert AFM file for $name.$enc" >&2 + } + + $T1FDIR -d fonts.ttf fonts.alias $FOUNDRY $enc -f ./$name.$enc.$SUFFIX + echo "/$psname$enc ($name.$enc.$SUFFIX) ;" >>Fontmap.ttf + } fi + + [ YES = "$REMOVET1A" ] && { + rm -f ./$name.$SRCENC.t1a + rm -f ./$name.$SRCENC.xafm + } + + } done +} done + +wc -l fonts.scale +cat fonts.ttf >>fonts.scale +mkfontdir + +[ YES = "$GENUID" ] && { + echo "Checking for duplicate UniqueIDs..." + for id in `find . -name "*.$SUFFIX" -exec grep UniqueID {} \; \ + | cut -d" " -f2 | sort | uniq -d` + do { + echo "Warning: duplicate UniqueID $id in files:" | tee -a $LOG + find . -name "*.$SUFFIX" -exec grep -l "UniqueID $id " {} \; 2>&1 | tee -a $LOG + } done +} + +[ -n "$GSDIR" ] || { + echo "$MYSELF: The Ghostscript base directory is not specified.\n" >&2 + echo "$MYSELF: Installation of the Ghostscript fonts is deferred.\n" >&2 + echo "$MYSELF: You can do it later by running x2gs\n" >&2 + exit 0 +} + +echo "Installing the Ghostscript fonts" +cd $RUNDIR +$X2GS $CFGFILE || { + echo "$MYSELF: Installation of the Ghostscript fonts has failed.\n" >&2 + echo "$MYSELF: You can correct the problem and run x2gs to repeat\n" >&2 + exit 0 +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/convert.cfg.sample b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/convert.cfg.sample new file mode 100755 index 00000000..4adf8e0d --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/convert.cfg.sample @@ -0,0 +1,192 @@ +#!/bin/sh +# +# Copyright (c) 1998, 1999 +# Sergey A. Babkin. 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. 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. +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +# +# Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net) +# + +# Configuration file for the conversion script. +# Convert TTF fonts from source directory to Type1 fonts in the destination +# directory, converted to the specified encodings. Also generate the +# fonts.scale, fonts.dir and fonts.alias files in the destination +# directory. + +# This file is an example of configuration. It contains +# the examples of settings for all the supported languages. +# Please check the settings and change them for +# your needs. + +# The directories with source TTF files. +# The lines are formatted in 3 columns: +# - directory path +# - language name +# - encoding of the fonts in this directory +# - optional Unicode map file name +# There should be a separate directory for each input encoding. +# No more than 10 encodings are supported now for +# one conversion. +# +# If the Unicode map file name is specified then this +# external map file will be used to encode the resulting +# font. Otherwise the built-in table for this language +# will be used. If you have some special encoding map that +# does not conform to any of the defined languages, set the +# language name to 'unknown' and encoding name to whatever +# you want to see in the X11 logical font description. +# +# NOTES: +# For Russian, Bulgarian and English (as a subset of +# Western) languages you may pile together the Unicode +# fonts and the fonts in the Windows encoding into the same +# directory, they will be sorted out automatically. For +# the Russian and Bulgarian Unicode fonts set the +# source encoding to ibm-1251. +# +# For Turkish, Baltic, Central European and other Western +# European languages the resulting fonts will be in +# a proper iso8859 encoding only if the source fonts +# are in Unicode. +# +# AdobeStd encoding will work only +# for the source font in Unicode encoding which +# either have proper character names or map the +# Adobe character extensions to the expected codes +# (or both). +# +# The external maps work only if the source fonts +# are in Unicode, otherwise the original font's +# encoding will be preserved. +# +# Better don't use the map adobe-standard-encoding.map, +# unless you really need it, it's very incomplete. +# +# The map planes are not supported in the scripts yet. + +SRCDIRS=" +/SOME_DIR_WITH_cyrillic_windows_TTF_FONTS cyrillic ibm-1251 +/SOME_DIR_WITH_cyrillic_koi_TTF_FONTS cyrillic koi8-r +/SOME_DIR_WITH_unicode_TTF_FONTS latin4 iso8859-4 +/SOME_DIR_WITH_unicode_TTF_FONTS latin5 iso8859-9 +/SOME_DIR_WITH_unicode_TTF_FONTS latin2 iso8859-2 +/SOME_DIR_WITH_western_TTF_FONTS latin1 iso8859-1 +/SOME_DIR_WITH_unicode_TTF_FONTS adobestd adobe-std +/SOME_DIR_WITH_weird_unicode_TTF_FONTS adobestd adobe-std adobe-standard-encoding.map +/SOME_DIR_WITH_unicode_TTF_FONTS unknown my-special some-very-special.map +" + +# the directory for converted X11 fonts +DSTDIR=/usr/X11R6/lib/X11/fonts/fromttf + +# The base directory of Ghostscript; +# set it to empty space if you don't want the Ghostscript fonts installed. +# For some systems the directory is /usr/share/ghostscript. +GSDIR=/usr/local/share/ghostscript + +# The font directory of Ghostscript; +# should work for all the versions of Ghostscript. Except (as always) the one +# packaged with Red Hat Linux 6.0. For RH6.0 it should be set to either +# /usr/share/fonts/default/ghostscript or /usr/share/fonts/default/Type1. +GSFONTDIR=$GSDIR/fonts + +# The configuration directory of Ghostscript where the Fontmap file is stored; +# the example is for Ghostscript 6.0, change for the version you actually +# have. This directory is used only to reach the Fontmap file, so if your +# installation stores the Fontmap files in the same directory as fonts +# (like Debian Linux does - isn't Linux wonderful in its differences?) +# then set it to the same value as GSFONTDIR. +GSCONFDIR=$GSDIR/6.0 + +# The encodings of generated files by languages +# (see the whole list of possible encodings for each +# language in the directories encoding/ ) +# +# Here prefer windows-1251 over ibm-1251: it aliases +# to the same thing but is the name expected by +# Netscape Navigator. For the same reason prefer +# cp-866 over ibm-866. + +DSTENCcyrillic="koi8-r windows-1251 iso8859-1" +DSTENClatin1="iso8859-1" +DSTENClatin2="iso8859-2" +DSTENClatin4="iso8859-4" +DSTENClatin5="iso8859-9" +DSTENCadobestd="adobe-std" + +# name of foundry for generated fonts +# (for HP-UX or if you just want to use an +# honest name change to "misc") +FOUNDRY=fromttf + +# If you want to use non-standard directories with encoding +# maps and tables then set these values + +MAPDIR= +ENCDIR= + +# Options: +# set the value to YES to enable, NO (or anything else) to disable + +# CORRECTWIDTH - use the option "-w" of converter. Set this +# option to NO if your fonts are well-designed. At least some +# freeware fonts have the width metrics broken and the letters +# look smashed into each other. If this option is set to "YES" +# the converter tries to correct this defect but this may have slight +# side effects on the well-designed fonts: the characters that +# are designed to be close to each other will get wider spacing. +# REMOVET1A - remove the un-encoded .t1a files after they are converted +# and assembled if this option set to YES +# INSTALLFONTMAP - if set to YES install the entries for the converted +# fonts right into the Ghostscript Fontmap file. Otherwise just +# symlink the font files and copy Fontmap.ttf to the Ghostscript +# directories. +# HINTSUBST - enable the hint substitution (option "-H" of +# converter). You may want to compare the looks of the fonts with and +# without this option and decide what is better (see the discussion in +# the README file). If the fonts with this option set to YES look +# completely empty in X11 then set this option to NO or install +# the supplied patches. +# ENFORCEISO - try to disguise the character names according to +# the ISOLatin1 encoding table. Set it to YES if some program +# expects strictly the ISO names but the fonts have different +# character names (this is not the case for X11 any more). +# Options ENFORCEISO and ALLGLYPHS can't be both set to YES. +# ALLGLYPHS - include all the glyphs (characters) from the source +# fonts into the resulting fonts, even if those are not +# included into the encoding tables. If the supplied X11 +# patches are not installed this may cause font size overflow +# in X11. So if you are not sure better leave it as NO. +# For more details see the discussion of the option "-a". +# GENUID - automatically generate UniqueID for all the fonts. +# Setting it to YES may be useful only for the fonts to +# be loaded the fonts into a printer with hard disk. Be +# advised that although unlikely the generated UniqueIDs +# for two fonts may coincide, then the consequences will +# be unpredictable. +# CREATEPFB - if set to YES create .pfb font files, otherwise +# .pfa font files. The .pfb files take somewhat less disk +# space but contain 8-bit binary data. + +CORRECTWIDTH=YES +REMOVET1A=YES +INSTALLFONTMAP=YES +HINTSUBST=NO +ENFORCEISO=NO +ALLGLYPHS=NO +GENUID=NO +CREATEPFB=YES + +# End of the configuration file diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/forceiso b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/forceiso new file mode 100755 index 00000000..34f925e8 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/forceiso @@ -0,0 +1,450 @@ +#!/usr/bin/perl +# +# Copyright (c) 1998 +# Sergey A. Babkin. 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. 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. +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +# +# Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net) +# + +# +# Force the font to use the encoding as close to ISO Latin-1 as possible +# +# Use: +# forceiso [format] file2.t1a +# where format is a printf-type format used to select names for the +# glyphs without standard Latin-1 names. It must expect one argument, +# the character code. The default format is "_%d". + +%latin1=( + 0, "", + 1, "", + 2, "", + 3, "", + 4, "", + 5, "", + 6, "", + 7, "", + 8, "", + 9, "", + 10, "", + 11, "", + 12, "", + 13, "", + 14, "", + 15, "", + 16, "", + 17, "", + 18, "", + 19, "", + 20, "", + 21, "", + 22, "", + 23, "", + 24, "", + 25, "", + 26, "", + 27, "", + 28, "", + 29, "", + 30, "", + 31, "", + 32, "space", + 33, "exclam", + 34, "quotedbl", + 35, "numbersign", + 36, "dollar", + 37, "percent", + 38, "ampersand", + 39, "quoteright", + 40, "parenleft", + 41, "parenright", + 42, "asterisk", + 43, "plus", + 44, "comma", + 45, "hyphen", + 46, "period", + 47, "slash", + 48, "zero", + 49, "one", + 50, "two", + 51, "three", + 52, "four", + 53, "five", + 54, "six", + 55, "seven", + 56, "eight", + 57, "nine", + 58, "colon", + 59, "semicolon", + 60, "less", + 61, "equal", + 62, "greater", + 63, "question", + 64, "at", + 65, "A", + 66, "B", + 67, "C", + 68, "D", + 69, "E", + 70, "F", + 71, "G", + 72, "H", + 73, "I", + 74, "J", + 75, "K", + 76, "L", + 77, "M", + 78, "N", + 79, "O", + 80, "P", + 81, "Q", + 82, "R", + 83, "S", + 84, "T", + 85, "U", + 86, "V", + 87, "W", + 88, "X", + 89, "Y", + 90, "Z", + 91, "bracketleft", + 92, "backslash", + 93, "bracketright", + 94, "asciicircum", + 95, "underscore", + 96, "grave", + 97, "a", + 98, "b", + 99, "c", + 100, "d", + 101, "e", + 102, "f", + 103, "g", + 104, "h", + 105, "i", + 106, "j", + 107, "k", + 108, "l", + 109, "m", + 110, "n", + 111, "o", + 112, "p", + 113, "q", + 114, "r", + 115, "s", + 116, "t", + 117, "u", + 118, "v", + 119, "w", + 120, "x", + 121, "y", + 122, "z", + 123, "braceleft", + 124, "bar", + 125, "braceright", + 126, "asciitilde", + 127, "", + 128, "", + 129, "", + 130, "", + 131, "", + 132, "", + 133, "", + 134, "", + 135, "", + 136, "", + 137, "", + 138, "", + 139, "", + 140, "", + 141, "", + 142, "", + 143, "", + 144, "", + 145, "", + 146, "", + 147, "", + 148, "", + 149, "", + 150, "", + 151, "", + 152, "", + 153, "", + 154, "", + 155, "", + 156, "", + 157, "", + 158, "", + 159, "", + 160, "", + 161, "exclamdown", + 162, "cent", + 163, "sterling", + 164, "currency", + 165, "yen", + 166, "brokenbar", + 167, "section", + 168, "dieresis", + 169, "copyright", + 170, "ordfeminine", + 171, "guillemotleft", + 172, "logicalnot", + 173, "minus", + 174, "registered", + 175, "macron", + 176, "degree", + 177, "plusminus", + 178, "twosuperior", + 179, "threesuperior", + 180, "acute", + 181, "mu", + 182, "paragraph", + 183, "periodcentered", + 184, "cedilla", + 185, "onesuperior", + 186, "ordmasculine", + 187, "guillemotright", + 188, "onequarter", + 189, "onehalf", + 190, "threequarters", + 191, "questiondown", + 192, "Agrave", + 193, "Aacute", + 194, "Acircumflex", + 195, "Atilde", + 196, "Adieresis", + 197, "Aring", + 198, "AE", + 199, "Ccedilla", + 200, "Egrave", + 201, "Eacute", + 202, "Ecircumflex", + 203, "Edieresis", + 204, "Igrave", + 205, "Iacute", + 206, "Icircumflex", + 207, "Idieresis", + 208, "Eth", + 209, "Ntilde", + 210, "Ograve", + 211, "Oacute", + 212, "Ocircumflex", + 213, "Otilde", + 214, "Odieresis", + 215, "multiply", + 216, "Oslash", + 217, "Ugrave", + 218, "Uacute", + 219, "Ucircumflex", + 220, "Udieresis", + 221, "Yacute", + 222, "Thorn", + 223, "germandbls", + 224, "agrave", + 225, "aacute", + 226, "acircumflex", + 227, "atilde", + 228, "adieresis", + 229, "aring", + 230, "ae", + 231, "ccedilla", + 232, "egrave", + 233, "eacute", + 234, "ecircumflex", + 235, "edieresis", + 236, "igrave", + 237, "iacute", + 238, "icircumflex", + 239, "idieresis", + 240, "eth", + 241, "ntilde", + 242, "ograve", + 243, "oacute", + 244, "ocircumflex", + 245, "otilde", + 246, "odieresis", + 247, "divide", + 248, "oslash", + 249, "ugrave", + 250, "uacute", + 251, "ucircumflex", + 252, "udieresis", + 253, "yacute", + 254, "thorn", + 255, "ydieresis" +); + +# how to treat the unknown characters +$unk = "_%d"; + +if($#ARGV >= 0) { + $unk = $ARGV[0]; +} + +# fill in the unnamed characters +if( sprintf($unk, 0) eq sprintf($unk, 1) ) { + die "The format for unnamed characters must not be a constant" +} +for($i=0; $i < 256; $i++) { + if($latin1{$i} eq "") { + $latin1{$i} = sprintf($unk, $i); + } +} + +while() { + print $_; + if(/^\/Encoding\s+.*\s+array/) { + $fontfile=1; + last; + } + if(/^StartCharMetrics\s+/) { + $fontfile=0; + last; + } +} + +$ndups=0; + +if($fontfile) { # .t1a file + while() { + if($_ !~ /^dup\s+(\d+)\s+\/(\S+)\s+put/) { + print $_; + last; + } + $code=$1+0; + $name=$2; + if($name eq ".notdef") { + print $_; + } else { + printf("dup %d /%s put\n",$code,$latin1{$code}); + if($trans{$name}) { # two or more references to the same glyph + $ndups++; + #printf(STDERR "forceiso: %d dups\n", $ndups); + if($copies{$name} eq "") { + $copies{$name} = $latin1{$code}; + } else { + $copies{$name} .= "|" . $latin1{$code}; + } + } else { + $trans{$name}=$latin1{$code}; + } + } + + } + + while() { + if( /\/CharStrings\s+(\d+)\s/) { + $nchars=$1+$ndups; + #printf(STDERR "forceiso: %d dups %d chars\n", $ndups, $nchars); + $_ =~ s|/CharStrings\s+\d+\s|/CharStrings $nchars |; + print $_; + last; + } + print $_; + } + + while() { + if(/^\/(\S+)/) { + $name=$1; + $to=$trans{$name}; + + $header=$_; + $body=""; + + if($to ne "") { + $_ =~ s/^\/\S+/\/$to/; + } + print $_; + } elsif(/endchar/) { + print $_; + if($copies{$name}) { + for $to (split(/\|/,$copies{$name})) { + $header =~ s/^\/\S+/\/$to/; + print($header, $body, $_); + } + } + } else { + print $_; + $body .= $_; + } + } +} else { # .afm file + while() { + if($_ !~ /^C\s+(\d+)(\s*;.*N\s+)(\S+)(\s*;.*)\n/) { + print $_; + last; + } + $code=$1+0; + $name=$3; + $part2=$2; + $part4=$4; + if($name eq ".notdef") { + print $_; + } else { + printf("C %d%s%s%s\n",$code,$part2,$latin1{$code},$part4); + if($copies{$name} eq "") { + $copies{$name} = $latin1{$code}; + } else { + $copies{$name} .= "|" . $latin1{$code}; + $ndups++; + #printf(STDERR "forceiso: %d dups\n", $ndups); + } + } + + } + + while() { + if(/^StartKernPairs\s+(\d+)/) { + last; + } + print $_; + } + + $npairs=0; + $kps=""; + while() { + if(/^KPX\s+(\S+)\s+(\S+)\s+(.*)\n/) { + $name1=$1; + $name2=$2; + $metric=$3; + + $cp1=$copies{$name1}; + if($cp1 eq "") { + $cp1=$name1; + } + + $cp2=$copies{$name2}; + if($cp2 eq "") { + $cp2=$name2; + } + + for $to1 (split(/\|/,$cp1)) { + for $to2 (split(/\|/,$cp2)) { + $kps .= sprintf("KPX %s %s %s\n", $to1, $to2, $metric); + $npairs++; + } + } + } else { + if($npairs!=0) { + printf("StartKernPairs %d\n", $npairs); + printf("%s", $kps); + $npairs=0; + $kps=""; + } + print $_; + } + } +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/frommap b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/frommap new file mode 100755 index 00000000..f32280c2 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/frommap @@ -0,0 +1,24 @@ +#!/usr/bin/perl +# +# A script to convert a Unicode character map to +# the C code +# + +sub fromhex +{ + return eval "0x".$_[0]; +} + +$inmap=0; + +while(<>) +{ + if(/^CHARMAP/) { + $inmap=1; + } elsif(/^END CHARMAP/) { + $inmap=0; + } elsif($inmap + && /^\s*\S+\s+\/x([0-9a-fA-F][0-9a-fA-F])\s+\ [] ] is the directory where the man pages will be created +# (current directory by default). If a file name is given instead of +# directory then the directory of that file is used. +# is the directory containing the ttf2pt1 files version.h +# and CHANGES.html which are used to generate the release name and date +# for the man page (by default looks in current directory and then in up to +# 5 ancestor directories). +# If the version files can not be found then the release defaults to +# "current" and the date defaults to today. +# +# Special formatting in the html file is: +# All controls are hidden within HTML comments that must occupy a whole separate line +# Such a line looks like: +# +# +# Any sort of directive must be followed by a space. The pod directives are +# automatically surrounded by empty lines in the output file. +# The html2man directives are: +# +# +# Define a man page. Multiple man pages can be defined in the same HTML +# file. is a short name by which this man page will be referred in the +# other directives. is the name of the man page, and

is the +# section of the manual (do not confuse with sections within a man page). +# +# +# All the text following this directive is copied (with translation) +# into the specified section of the specified man page. The sections +# may appear in arbitrary order, they will be rearranged to the standard +# order before output. Only standard section names are permitted (see @stdsect +# below). The pod directives which occur outside of man sections are ignored, +# just like the common text. The translation of HTML tags is: +# +#
- to paragraph break +# - to B<> +# - to I<> +# - to C<> +#
- to F<> +#
    ,
  • ,
- to =over 2, =item *, =back +#  , &, <, > - to their symbols, appropriately encoded +# +# The rest of HTML tags is removed +# +# If the same section is started more than once, the text from the +# second appearance will be added to the first, etc. +# +# +# Stop copying text to the man page. +# +# +# Continue copying text to the man page, same section as before. +# +# +# Insert this into the man page (works only when copying is enabled). +# Characters <, >, & are converted as usual. + +@mons = qw(January February March April May June July August September October November December); + +$dir = $ARGV[0]; +$maindir = $ARGV[1]; + +if($dir eq "") { + $dir = "."; +} elsif( ! -d $dir ) { + if( ! ($dir =~ s|\/[^/]*$||) ) { + $dir = "."; + } +} +if($maindir eq "") { + $maindir = "."; + for($i=0; $i<5; $i++) { + if(-f "$maindir/version.h") { + last; + } + $maindir = "../$maindir"; + } +} + +if( open(VERFILE, "<$maindir/version.h") ) { + while() { + if( /^\s*\#define\s+TTF2PT1_VERSION\s+\"(.*)\"/ ) { + $release = "version $1"; + } + } + close(VERFILE); + if( $release =~ /SNAP-([0-9][0-9])([0-9][0-9])([0-9][0-9])/ ) { + $date = sprintf("%s %d, 20%02d", $mons[$2-1], $3, $1); + } elsif( open(CFILE, "<$maindir/CHANGES.html") ) { + while() { + if( /\/) { + last; + } + } + $_ = ; + chomp; + if( $_ =~ s/^.*?-- // ) { + $date = $_; + } + close(CFILE); + } +} + +if($release eq "") { + $release = "current"; +} +if($date eq "") { + @lt = localtime(time); + $date = sprintf("%s %d, %d", $mons[$lt[4]], $lt[3], 1900+$lt[5]); +} + +#printf(STDERR "date=%s release=%s\n", $date, $release); + +$writemode = 0; + +while() { + if( s/^\<\!\-\- \=(\S+)\s+//) { + $cmd = $1; + s/\s*--\>\s*$//; + #printf(STDERR "cmd=%s args=%s\n", $cmd, $_); + if($cmd =~ /^=/) { + if($writemode) { + $text{$tosect} .= "\n\n$cmd $_\n\n"; + } + } elsif($cmd eq "defdoc") { + @sl = split; + push(@allids, $sl[0]); + $file{$sl[0]} = $sl[1]; + $mansect{$sl[0]} = $sl[2]; + } elsif($cmd eq "section") { + # tosect includes the file id + $tosect = $_; + $text{$tosect} .= "\n\n"; + $writemode = 1; + } elsif($cmd eq "stop") { + $writemode = 0; + $text{$tosect} .= "\n"; + } elsif($cmd eq "cont") { + $writemode = 1; + } elsif($cmd eq "text") { + if($writemode) { + s/\<\;//gi; + s/\&\;/\&/gi; + $text{$tosect} .= "$_\n"; + } + } + } elsif($writemode) { + s/^\s+//; + + s/\{/\&lbr;/g; + s/\}/\&rbr;/g; + + s/\/\n\n/gi; + #s/\/\n\n=over 4\n\n/gi; + #s/\<\/blockquote\>/\n\n=back\n\n/gi; + s/\/\n\n=over 4\n\n/gi; + s/\<\/ul\>/\n\n=back\n\n/gi; + s/\\s*/\n\n=item \*\n\n/gi; + s/\(.*?)\<\/i\>/I\{\1\}/gi; + s/\(.*?)\<\/b\>/B\{\1\}/gi; + s/\(.*?)\<\/tt\>/C\{\1\}/gi; + s/\
(.*?)\<\/a\>/F\{\1\}/gi; + s/\<.*?\>//g; + s/\{/\/g; + + s/\ \;/S< >/gi; + s/\&\;/\&/gi; + s/\<\;/E/gi; + s/\>\;/E/gi; + #s/\|/E/g; + #s/\//E/g; + s/\&lbr\;/\{/g; + s/\&rbr\;/\}/g; + + #printf(STDERR "section=%s add=%s", $tosect, $_); + $text{$tosect} .= $_; + } +} + +@stdsect = ( + "NAME", + "SYNOPSIS", + "DESCRIPTION", + "OPTIONS", + "RETURN VALUE", + "ERRORS", + "EXAMPLES", + "ENVIRONMENT", + "FILES", + "SEE ALSO", + "NOTES", + "CAVEATS", + "DIAGNOSTICS", + "BUGS", + "RESTRICTIONS", + "AUTHOR", + "HISTORY" ); + +#printf(STDERR "allids= @allids\n"); +for $id (@allids) { + #print(STDERR "creating man page $id $file{$id} $mansect{$id}\n\n"); + die "Unable to create pod file $dir/$file{$id}.pod" + unless open(PODF, ">$dir/$file{$id}.pod"); + print(PODF "=pod\n\n"); + for $sect (@stdsect) { + $sid = "$id $sect"; + #printf(STDERR "trying %s\n", $sid); + if(defined $text{$sid}) { + print(PODF "=head1 $sect\n\n$text{$sid}\n\n"); + } + } + print(PODF "=cut\n"); + close(PODF); + die "Unable to generate the man page $dir/$file{$id}.1" + if system("pod2man --section=\"$mansect{$id}\" --release=\"$release\" " + . "--center=\"TTF2PT1 Font Converter\" --date=\"$date\" " + . "$dir/$file{$id}.pod >$dir/$file{$id}.1"); + + unlink("$dir/$file{$id}.pod"); +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/inst_dir b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/inst_dir new file mode 100755 index 00000000..7bc10f4c --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/inst_dir @@ -0,0 +1,43 @@ +#!/usr/bin/perl +# +# Script to create a directory for installation +# +# (c) 2000 by The TTF2PT1 Project +# See COPYRIGHT for full license +# + +if( $#ARGV!=0 && $#ARGV !=3) { + die "Use: $0 dir-name [owner group mode]\n" +} + +if( $#ARGV==3 ) { + $owner = $ARGV[1]; + $group = $ARGV[2]; + eval "\$mode = 0$ARGV[3];"; +} else { + $owner = "root"; + $group = "bin"; + $mode = 0755; +} + +@sl = split(/\//, $ARGV[0]); +$prefix = shift(@sl); +if($prefix eq "") { + $prefix = "/" . shift(@sl); +} + +while(1) { + if( ! -d "$prefix" ) { + die "Unable to create directory $prefix:\n$!\n" + unless mkdir($prefix, $mode); + die "Unable to change owner of $prefix to $owner\n" + if system("chown $owner $prefix"); + die "Unable to change group of $prefix to $group\n" + if system("chgrp $group $prefix"); + } + if($#sl < 0) { + last; + } + $prefix .= "/" . shift(@sl); +} +exit(0); diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/inst_file b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/inst_file new file mode 100755 index 00000000..d3758671 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/inst_file @@ -0,0 +1,17 @@ +#!/bin/sh +# +# Script to install a file (for portability reasons) +# +# (c) 2000 by The TTF2PT1 Project +# See COPYRIGHT for full license +# + +[ $# != 5 ] && { + echo "Use: $0 file-from file-to owner group mode" >&2 + exit 1 +} + +cp -f $1 $2 \ +&& chown $3 $2 \ +&& chgrp $4 $2 \ +&& chmod 0$5 $2 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/mkrel b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/mkrel new file mode 100755 index 00000000..e4ac93de --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/mkrel @@ -0,0 +1,104 @@ +#!/bin/sh +# +# See COPYRIGHT +# +# Script to create a release or shapshot archive. +# Also checks for very basic inconsistences. +# Expects that it would be run from the current directory of ttf2pt1, +# and that the parent directory is the place to create archives. +# Expects that the CVS environment variables are set properly. + +VER=`grep TTF2PT1_VERSION version.h | cut -d\" -f2` + +case "$1" in +snapshot) + echo "$VER" | egrep '^[0-9][0-9]*\.[0-9].*-CURRENT$' || { + echo "mkrel: version.h must contain *-CURRENT to create a snapshot" >&2 + exit 1 + } + grep "^current$" CHANGES.html >/dev/null || { + echo "mkrel: CHANGES.html must list 'current' to create a snapshot" >&2 + exit 1 + } + snapdate=`date "+ %y %m %d " | sed 's/ \([0-9]\) / 0& /g;s/ //g'` + NEWVER=`echo "$VER" | sed "s/-CURRENT/-SNAP-$snapdate/"` + TAG="-D tomorrow" + ;; +release) + echo "$VER" | egrep '^[0-9][0-9]*\.[0-9][.0-9]*$' || { + echo "mkrel: version.h must not be -CURRENT to create a release" >&2 + exit 1 + } + grep "^$VER -- " CHANGES.html >/dev/null || { + echo "mkrel: CHANGES.html must list the same version as version.h" >&2 + exit 1 + } + NEWVER="$VER" + TAG=`echo "-r ttf2pt1-$VER" | sed \ + 's/\(-[0-9][0-9]*\.[0-9]\)$/&.0/;s/\./-/g'` + ;; +*) + echo "use: mkrel [snapshot|release]" >&2 + exit 1 + ;; +esac + +cd .. || { + echo "mkrel: can't cd to .." >&2 + exit 1 +} + +rm -f ttf2pt1-$NEWVER.tgz ttf2pt1-$NEWVER.zip +rm -rf ttf2pt1-$NEWVER + +echo "cvs -z9 export $TAG -d ttf2pt1-$NEWVER ttf2pt1" +cvs -z9 export $TAG -d ttf2pt1-$NEWVER ttf2pt1 || { + echo "mkrel: unable to export from CVS" >&2 + echo "mkrel: check that the CVS tree is properly tagged" >&2 + exit 1 +} + + +# a little bit more for snapshot: correct the version +( +case "$1" in +snapshot) + cd ttf2pt1-$NEWVER || { + echo "mkrel: can't cd to ../ttf2pt1-$NEWVER" >&2 + exit 1 + } + + sed "s/^current\$/$NEWVER/" CHANGES.html.new \ + && mv CHANGES.html.new CHANGES.html || { + echo "mkrel: can't update CHANGES.html" >&2 + exit 1 + } + + sed "s/\".*-CURRENT\"/\"$NEWVER\"/" version.h.new \ + && mv version.h.new version.h || { + echo "mkrel: can't update version.h" >&2 + exit 1 + } + ;; +esac +) + +# generate the man pages - in case if the users would have no pod2man +( + cd ttf2pt1-$NEWVER || { + echo "mkrel: can't cd to ../ttf2pt1-$NEWVER" >&2 + exit 1 + } + + make mans +) + +tar czvf ttf2pt1-$NEWVER.tgz ttf2pt1-$NEWVER || { + echo "mkrel: can't create .tgz archive" >&2 + exit 1 +} + +zip -u -r ttf2pt1-$NEWVER.zip ttf2pt1-$NEWVER || { + echo "mkrel: can't create .zip archive" >&2 + exit 1 +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/t1fdir b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/t1fdir new file mode 100755 index 00000000..16c86530 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/t1fdir @@ -0,0 +1,227 @@ +#!/usr/bin/perl +# +# Copyright (c) 1998 +# Sergey A. Babkin. 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. 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. +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +# +# Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net) +# + +# +# Script that reads the Type1 font files and prints out the fonts.scale +# lines for them +# + +# other substrings (regexps) that are considered irrelevant +# and sould be removed from the font names: +@wrongstr= ( + "koi8r", + "koi8", + "cp1251", + "ibm1251", + "win1251", + "cp866", + "ibm866", + "iso8859[1-9]", + "iso8859", + "isolatin[0-9]", + "isolatin", + "latin[0-9]", + "^ER ", + "^K8 ", +); + +sub usage +{ + print STDERR "Use: \n"; + print STDERR " t1fdir [-g] ... [ -f ...]\n"; + print STDERR "or\n"; + print STDERR " t1fdir -d fonts.scale fonts.alias ... [ -f ...]\n"; +} + +$ghost=0; +if( $ARGV[0] eq "-g" ) { + shift @ARGV; + $ghost=1; +} elsif( $ARGV[0] eq "-d" ) { + shift @ARGV; + $files=1; + $scalef=shift @ARGV; + $aliasf=shift @ARGV; +} + +if($#ARGV<2) { + &usage(); + exit 1; +} + +$foundry=$ARGV[0]; +shift @ARGV; + +while($#ARGV>=0) { + if($ARGV[0] eq "-f") { + shift @ARGV; + last; + } + push(@encodings,$ARGV[0]); + shift @ARGV; +} + +if($files) { + open(SCALEF, ">>$scalef") || die "Can't write to $scalef"; + open(ALIASF, ">>$aliasf") || die "Can't write to $aliasf"; +} +for $name (@ARGV) { + + $familyname=""; + $fullname=""; + $fontname=""; + $weight=""; + $angle=0; + + open(FILE,"<$name") || die "Unable to open file $name\n"; + + $type="p"; # by default + + while() { + if(/eexec/) { last; } + if(/^\/FamilyName.*\((.+)\)/ ) { $familyname= $1; } + if(/^\/FullName.*\((.+)\)/ ) { $fullname= $1; } + if(/^\/FontName.*\((.+)\)/ ) { $fontname= $1; } + if(/^\/Weight.*\((.+)\)/ ) { $weight= $1; } + if(/^\/ItalicAngle.*(\d+)/ ) { $angle= $1+0; } + if(/^\/isFixedPitch/) { + if(/true/) { + $type="m"; + } else { + $type="p"; + } + } + } + + # now try to interpret this information + + $allinfo= $familyname ." ". $fullname ." ". $fontname ." ". $weight; + $lcallinfo=$allinfo; + $lcallinfo=~tr[A-Z][a-z]; + + $familyname.="_"; # just a delimiter for substitutions + $familyname=~s/Bold([^a-z])/$1/g; + $familyname=~s/Italic([^a-z])/$1/g; + $familyname=~s/Oblique([^a-z])/$1/g; + $familyname=~s/Roman([^a-z])/$1/g; + + for $i (@wrongstr) { # for uppercase- and space- sensitive strings + $familyname =~ s/$i//g; + } + + $familyname=~tr[A-Z][a-z]; + $familyname=~tr[A-Za-z0-9][]cd; + + for $i (@wrongstr) { # for case-insensitive strings + $familyname =~ s/$i//g; + } + + if( $familyname eq "") { + $familyname="unknown"; + } + + $fn=$name; + $fn=~ s/.*\///g; + + $n=0; + for $encoding (@encodings) { + $n++; + if($ghost) { + printf("/%s-", uc(substr($familyname,0,1)).substr($familyname,1)); + + $r=1; + + if( $allinfo =~ /Bold[^a-z]/ + || $lcallinfo =~ /\bbold\b/ ) { + printf("Bold"); + $r=0; + } + if( $allinfo =~ /Italic[^a-z]/ + || $lcallinfo =~ /\bitalic\b/ + || $angle>0 ) { + printf("Italic"); + $r=0; + } elsif( $allinfo =~ /Oblique[^a-z]/ + || $lcallinfo =~ /\boblique\b/ + || $angle<0 ) { + printf("Oblique"); + $r=0; + } + + if($r) { + printf("Roman"); + } + + printf("-%s\t (%s) ;\n",$encoding,$fn); + } else { + $xenc=$encoding; + $xenc =~ s/\-/_/g; + + $srec = sprintf("-%s-%s_%s-",$foundry,$familyname,$xenc); + $arec = sprintf("-%s-%s-",$foundry,$familyname); + + if( $allinfo =~ /Bold[^a-z]/ + || $lcallinfo =~ /\bbold\b/ ) { + $srec .= "bold-"; + $arec .= "bold-"; + } else { + $srec .= "medium-"; + $arec .= "medium-"; + } + + if( $allinfo =~ /Italic[^a-z]/ + || $lcallinfo =~ /\bitalic\b/ + || $angle>0 ) { + $srec .= "i-"; + $arec .= "i-"; + } elsif( $allinfo =~ /Oblique[^a-z]/ + || $lcallinfo =~ /\boblique\b/ + || $angle<0 ) { + $srec .= "o-"; + $arec .= "o-"; + } else { + $srec .= "r-"; + $arec .= "r-"; + } + + $srec .= sprintf("normal--0-0-0-0-%s-0-adobe-fontspecific",$type,$encoding); + $arec .= sprintf("normal--0-0-0-0-%s-0-%s",$type,$encoding); + + if($files) { + if($n==1) { + printf(SCALEF "%s %s\n",$fn,$srec); + printf(ALIASF "%s %s\n",$arec,$srec); + $srec1=$srec; + } else { + printf(ALIASF "%s %s\n",$arec,$srec1); + } + } else { + printf("%s %s\n",$fn,$arec); + } + } + } + + close(FILE); +} +if($files) { + close(SCALEF); + close(ALIASF); +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/trans b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/trans new file mode 100755 index 00000000..d52760e6 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/trans @@ -0,0 +1,164 @@ +#!/usr/bin/perl +# +# Copyright (c) 1998-2000 +# Sergey A. Babkin. All rights reserved. +# +# See the full text of the license in the COPYRIGHT file. +# +# Sergey A. Babkin (sab123@hotmail.com, babkin@users.sourceforge.net) +# + +# +# Script to transcode the Type1 disassembled font to other encoding +# + +# calculation of UniqueID from old UID and encoding name +# we don't have unsigned integer arithmetic in Perl +# so we try to do at least something +sub newuid +{ + use integer; + my ($u,$enc)=@_; + my $i, $uid; + + $uid=substr($u, -6, 6); + $u=substr($u, 0, 4); + + $uid+=0; + for $i (split(//,$enc)) { + $uid*=37; + $uid+=ord($i); + $uid+=($uid>>16) & 0xff; + $uid&=0xffffff; + } + + ($uid % 1000000) + 4000000; + #$u . substr(sprintf("%d",$uid), 0, 5); +} + +if($#ARGV != 1) { + printf(STDERR "Use: trans src-table dst-table dst-font\n"); + exit 1; +} + +# tables are formatted in two columns, one row per character +# name decimal-code + +# Read the destination table + +open(FILE,"<".$ARGV[1]) + or die "Unable to read $ARGV[2]\n"; +while() { + @sl=split(/\s+/); + $dst{$sl[0]}=$sl[1]; +} +close(FILE); + +#read the source table and build the translation table + +open(FILE,"<".$ARGV[0]) + or die "Unable to read $ARGV[0]\n"; +while() { + @sl=split(/\s+/); + $trans{$sl[1]}=$dst{$sl[0]}; +} +close(FILE); + +# name of the encoding, for UniqueID +$encname=$ARGV[1]; +$encname =~ s|^.*\/||g; +$encname =~ s|\..*$||g; + +# now read the font file, skip everything upto the encoding table +# we suppose that the file was autogenerated by ttf2pt1 with my patches + +while() { + if( /^\/FontName\s+(\S+)/) { + $fontname=$1; + } + if( /^\/UniqueID\s+(\S+)/) { + use integer; + my $uid=$1; + $_=sprintf("/UniqueID %u def\n", &newuid($uid, $encname)); + } + print $_; + if(/^\/Encoding/) { + $fontfile=1; + last; + } + if(/^StartCharMetrics/) { + $fontfile=0; + last; + } +} + +# read the old encoding table and build the new encoding table + +if($fontfile) { # .t1a + while($row=) { + if( $row !~ /^dup/) { + last; + } + + @sl=split(/\s+/,$row); + + $new=$trans{$sl[1]}; + if($new eq "") { + $new=$sl[1]; + if($enc{$new} eq "") { + $enc{$new}=$sl[2]; + } + } else { + $enc{$new}=$sl[2]; + } + } + + # print new encoding table + + for $i (0..255) { + if($enc{$i}) { + printf("dup %d %s put\n",$i,$enc{$i}); + } else { + printf("dup %d /.notdef put\n",$i); + } + } +} else { # .afm + while($row=) { + if($row !~ /^C\s+(\d+)(\s*;.*)\n/) { + last; + } + $code=$1; + $part2=$2; + + $new=$trans{$code}; + if($new eq "") { + $new=$code; + if($enc{$new} eq "") { + $enc{$new}=$part2; + } + } else { + $enc{$new}=$part2; + } + } + + # print new encoding table + + for $i (0..255) { + if($enc{$i}) { + printf("C %d%s\n",$i,$enc{$i}); + } + } +} + +print $row; + +# now copy the rest of file + +while() { + if( /^\/UniqueID\s+(\S+)/) { + use integer; + my $uid=$1; + $_=sprintf("/UniqueID %u def\n", &newuid($uid, $encname)); + } + print; +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/unhtml b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/unhtml new file mode 100755 index 00000000..1e660f54 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/unhtml @@ -0,0 +1,22 @@ +#!/bin/sh +# +# This script removes the HTML formatting from a file. If the file was designed +# with such use in mind and was properly formatted besides HTML (such as the README +# file for ttf2pt1) it will look good as a plain text file. +# +# This script supports a very limited set of HTML formatting. Everything that +# goes before is removed. Any lines that +# contain only the HTML formatting or start with "" +# are completely removed. Then all the in-line formatting is removed. +# Then " ", "<", ">" are changed to " ", "<", ">". + +sed '1,/<[bB][oO][dD][yY]>/d; +/^/-/g; +s/^ *$/>>/; +s/<[^<>]*>//g; +/^< *>$/d; +/^>>$/d;s/^< //; +s/>$//; +s/&[nN][bB][sS][pP];/ /g;s/&[lL][tT];//g;s/&[aA][mM][pP];/\&/g;' diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/scripts/x2gs b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/x2gs new file mode 100755 index 00000000..558ef3df --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/scripts/x2gs @@ -0,0 +1,118 @@ +#!/bin/sh +# +# Copyright (c) 1998-2000 +# Sergey A. Babkin. 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. 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. +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +# +# Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net) +# + +# Use : x2gs [cfgfile] + +# path to the configuration file + +if [ $# -eq 1 ] +then + CFGFILE=$1 +else + CFGFILE=`pwd`/convert.cfg +fi + +MYSELF=x2gs + +# include the configuration + +if [ -r $CFGFILE ] +then { + . $CFGFILE +} else { + echo " +Can't find the configuration file + $CFGFILE +Please look at the sample file convert.cfg.sample, +copy it to convert.cfg and modify for +you actual configuration." >&2 + exit 1 +} fi + +LOG=$DSTDIR/convert.log + +[ -n "$GSDIR" ] || { + echo "$MYSELF: The Ghostscript base directory is not specified." >&2 + echo "$MYSELF: Installation of the Ghostscript fonts is deferred." >&2 + exit 0 +} + +[ -n "$GSCONFDIR" -a -d "$GSCONFDIR" ] || { + echo "$MYSELF: The Ghostscript configuration directory does not exist." >&2 + echo "$MYSELF: Installation of the Ghostscript fonts is aborted." >&2 + exit 1 +} + +[ -r "$GSCONFDIR/Fontmap" ] || { + echo "$MYSELF: Can't find Fontmap in the GS configuration directory." >&2 + echo "$MYSELF: Installation of the Ghostscript fonts is aborted." >&2 + exit 1 +} + +[ -n "$GSFONTDIR" -a -d "$GSFONTDIR" ] || { + echo "$MYSELF: The Ghostscript font directory does not exist." >&2 + echo "$MYSELF: Installation of the Ghostscript fonts is aborted." >&2 + exit 1 +} + +# link the fonts to $GSFONTDIR + +rm -f $GSCONFDIR/Fontmap.ttf + +# historically x2gs supported multiple X11 directories +for d in $DSTDIR +do { + for i in $d/*.pfa $d/*.afm + do { + [ -f $i ] || break; + + n=`basename $i` + + rm -f $GSFONTDIR/$n + + ln -s $i $GSFONTDIR/$n || { + echo "$MYSELF: Unable to link $n to GS font directory">&2 + } + } done + + cat $d/Fontmap.ttf >>$GSCONFDIR/Fontmap.ttf +} done + +if [ YES = "$INSTALLFONTMAP" ] +then { + mv $GSCONFDIR/Fontmap $GSCONFDIR/Fontmap.old || { + echo "$MYSELF: can't save Fontmap.old" >&2 + exit 1 + } + + sed "\\|^% begin fonts from $DSTDIR|,\\|^% end fonts from $DSTDIR|d" \ + <$GSCONFDIR/Fontmap.old >$GSCONFDIR/Fontmap || { + echo "$MYSELF: Can't create the new Fontmap file" >&2 + echo "$MYSELF: Trying to restore the old Fontmap file" >&2 + cp $GSCONFDIR/Fontmap.old $GSCONFDIR/Fontmap + exit 1 + } + echo "% begin fonts from $DSTDIR" >>$GSCONFDIR/Fontmap + echo "" >>$GSCONFDIR/Fontmap + cat $GSCONFDIR/Fontmap.ttf >>$GSCONFDIR/Fontmap + echo "" >>$GSCONFDIR/Fontmap + echo "% end fonts from $DSTDIR" >>$GSCONFDIR/Fontmap +} fi diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/t1asm.c b/application/third_party/dompdf/lib/ttf2ufm/src/t1asm.c new file mode 100755 index 00000000..d9c3061c --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/t1asm.c @@ -0,0 +1,604 @@ +/* t1asm + * + * This program `assembles' Adobe Type-1 font programs in pseudo-PostScript + * form into either PFB or PFA format. The human readable/editable input is + * charstring- and eexec-encrypted as specified in the `Adobe Type 1 Font + * Format' version 1.1 (the `black book'). There is a companion program, + * t1disasm, which `disassembles' PFB and PFA files into a pseudo-PostScript + * file. + * + * Copyright (c) 1992 by I. Lee Hetherington, all rights reserved. + * + * Permission is hereby granted to use, modify, and distribute this program + * for any purpose provided this copyright notice and the one below remain + * intact. + * + * I. Lee Hetherington (ilh@lcs.mit.edu) + * + * Revision 1.2 92/05/22 11:54:45 ilh + * Fixed bug where integers larger than 32000 could not be encoded in + * charstrings. Now integer range is correct for four-byte + * twos-complement integers: -(1<<31) <= i <= (1<<31)-1. Bug detected by + * Piet Tutelaers (rcpt@urc.tue.nl). + * + * Revision 1.1 92/05/22 11:48:46 ilh + * initial version + * + * Ported to Microsoft C/C++ Compiler and MS-DOS operating system by + * Kai-Uwe Herbing (herbing@netmbx.netmbx.de) on June 12, 1992. Code + * specific to the MS-DOS version is encapsulated with #ifdef _MSDOS + * ... #endif, where _MSDOS is an identifier, which is automatically + * defined, if you compile with the Microsoft C/C++ Compiler. + * + */ + +#ifndef lint +static char copyright[] = + "@(#) Copyright (c) 1992 by I. Lee Hetherington, all rights reserved."; +#ifdef _MSDOS +static char portnotice[] = + "@(#) Ported to MS-DOS by Kai-Uwe Herbing (herbing@netmbx.netmbx.de)."; +#endif +#endif + +/* Note: this is ANSI C. */ + +#ifdef _MSDOS + #include + #include + #include +#endif +#include +#include +#include +#include +#include + +#ifdef WINDOWS +# ifdef STANDALONE +# define WINDOWS_FUNCTIONS +# include "windows.h" +# endif +#endif + +/* int32 must be at least 32-bit and uint16 must be at least 16-bit */ +#if INT_MAX >= 0x7FFFFFFFUL +typedef int int32; +#else +typedef long int32; +#endif +#if USHRT_MAX >= 0xFFFFUL +typedef unsigned short uint16; +#else +typedef unsigned int uint16; +#endif + +#define LINESIZE 256 + +#define MAXBLOCKLEN ((1L<<17)-6) +#define MINBLOCKLEN ((1L<<8)-6) + +#define MARKER 128 +#define ASCII 1 +#define BINARY 2 +#define DONE 3 + +typedef unsigned char byte; + +/* must be visible from outside */ +FILE *ifp; +FILE *ofp; + +/* flags */ +static int pfb = 0; +static int active = 0; +static int start_charstring = 0; +static int in_eexec = 0; + +static char line[LINESIZE]; + +/* lenIV and charstring start command */ +static int lenIV = 4; +static char cs_start[10]; + +/* for charstring buffering */ +static byte charstring_buf[65535]; +static byte *charstring_bp; + +/* for PFB block buffering */ +static byte blockbuf[MAXBLOCKLEN]; +static int32 blocklen = MAXBLOCKLEN; +static int32 blockpos = -1; +static int blocktyp = ASCII; + +/* decryption stuff */ +static uint16 er, cr; +static uint16 c1 = 52845, c2 = 22719; + +/* table of charstring commands */ +static struct command { + char *name; + int one, two; +} command_table[] = { + { "callothersubr", 12, 16 }, + { "callsubr", 10, -1 }, + { "closepath", 9, -1 }, + { "div", 12, 12 }, + { "dotsection", 12, 0 }, + { "endchar", 14, -1 }, + { "hlineto", 6, -1 }, + { "hmoveto", 22, -1 }, + { "hsbw", 13, -1 }, + { "hstem", 1, -1 }, + { "hstem3", 12, 2 }, + { "hvcurveto", 31, -1 }, + { "pop", 12, 17 }, + { "return", 11, -1 }, + { "rlineto", 5, -1 }, + { "rmoveto", 21, -1 }, + { "rrcurveto", 8, -1 }, + { "sbw", 12, 7 }, + { "seac", 12, 6 }, + { "setcurrentpoint", 12, 33 }, + { "vhcurveto", 30, -1 }, + { "vlineto", 7, -1 }, + { "vmoveto", 4, -1 }, + { "vstem", 3, -1 }, + { "vstem3", 12, 1 }, +}; /* alphabetical */ + +/* Two separate encryption functions because eexec and charstring encryption + must proceed in parallel. */ + +static byte eencrypt(byte plain) +{ + byte cipher; + + cipher = (byte) (plain ^ (er >> 8)); + er = (uint16) ((cipher + er) * c1 + c2); + return cipher; +} + +static byte cencrypt(byte plain) +{ + byte cipher; + + cipher = (byte) (plain ^ (cr >> 8)); + cr = (uint16) ((cipher + cr) * c1 + c2); + return cipher; +} + +/* This function flushes a buffered PFB block. */ + +static void output_block() +{ + int32 i; + + /* output four-byte block length */ + fputc((int) (blockpos & 0xff), ofp); + fputc((int) ((blockpos >> 8) & 0xff), ofp); + fputc((int) ((blockpos >> 16) & 0xff), ofp); + fputc((int) ((blockpos >> 24) & 0xff), ofp); + + /* output block data */ + for (i = 0; i < blockpos; i++) + fputc(blockbuf[i], ofp); + + /* mark block buffer empty and uninitialized */ + blockpos = -1; +} + +/* This function outputs a single byte. If output is in PFB format then output + is buffered through blockbuf[]. If output is in PFA format, then output + will be hexadecimal if in_eexec is set, ASCII otherwise. */ + +static void output_byte(byte b) +{ + static char *hexchar = "0123456789ABCDEF"; + static int hexcol = 0; + + if (pfb) { + /* PFB */ + if (blockpos < 0) { + fputc(MARKER, ofp); + fputc(blocktyp, ofp); + blockpos = 0; + } + blockbuf[blockpos++] = b; + if (blockpos == blocklen) + output_block(); + } else { + /* PFA */ + if (in_eexec) { + /* trim hexadecimal lines to 64 columns */ + if (hexcol >= 64) { + fputc('\n', ofp); + hexcol = 0; + } + fputc(hexchar[(b >> 4) & 0xf], ofp); + fputc(hexchar[b & 0xf], ofp); + hexcol += 2; + } else { + fputc(b, ofp); + } + } +} + +/* This function outputs a byte through possible eexec encryption. */ + +static void eexec_byte(byte b) +{ + if (in_eexec) + output_byte(eencrypt(b)); + else + output_byte(b); +} + +/* This function outputs a null-terminated string through possible eexec + encryption. */ + +static void eexec_string(char *string) +{ + while (*string) + eexec_byte((byte) *string++); +} + +/* This function gets ready for the eexec-encrypted data. If output is in + PFB format then flush current ASCII block and get ready for binary block. + We start encryption with four random (zero) bytes. */ + +static void eexec_start() +{ + eexec_string(line); + if (pfb) { + output_block(); + blocktyp = BINARY; + } + + in_eexec = 1; + er = 55665; + eexec_byte(0); + eexec_byte(0); + eexec_byte(0); + eexec_byte(0); +} + +/* This function wraps-up the eexec-encrypted data. + If output is in PFB format then this entails flushing binary block and + starting an ASCII block. */ + +static void eexec_end() +{ + int i, j; + + if (pfb) { + output_block(); + blocktyp = ASCII; + } else { + fputc('\n', ofp); + } + in_eexec = 0; + for (i = 0; i < 8; i++) { + for (j = 0; j < 64; j++) + eexec_byte('0'); + eexec_byte('\n'); + } +#if 0 + eexec_string("cleartomark\n"); +#endif +} + +/* This function writes ASCII trailer. + If output is in PFB format then this entails flushing binary block and + starting an ASCII block. */ + +static void file_end() +{ + if (pfb) { + output_block(); + fputc(MARKER, ofp); + fputc(DONE, ofp); + } +} +/* This function returns an input line of characters. A line is terminated by + length (including terminating null) greater than LINESIZE, a newline \n, or + when active (looking for charstrings) by '{'. When terminated by a newline + the newline is put into line[]. When terminated by '{', the '{' is not put + into line[], and the flag start_charstring is set to 1. */ + +static void t1asm_getline() +{ + int c; + char *p = line; + int comment = 0; + + start_charstring = 0; + while (p < line + LINESIZE) { + c = fgetc(ifp); + if (c == EOF) + break; + if (c == '%') + comment = 1; + if (active && !comment && c == '{') { + start_charstring = 1; + break; + } + *p++ = (char) c; + if (c == '\n') + break; + } + *p = '\0'; +} + +/* This function is used by the binary search, bsearch(), for command names in + the command table. */ + +static int command_compare(const void *key, const void *item) +{ + return strcmp((char *) key, ((struct command *) item)->name); +} + +/* This function returns 1 if the string is an integer and 0 otherwise. */ + +static int is_integer(char *string) +{ + if (isdigit(string[0]) || string[0] == '-' || string[0] == '+') { + while (*++string && isdigit(*string)) + ; /* deliberately empty */ + if (!*string) + return 1; + } + return 0; +} + +/* This function initializes charstring encryption. Note that this is called + at the beginning of every charstring. */ + +static void charstring_start() +{ + int i; + + charstring_bp = charstring_buf; + cr = 4330; + for (i = 0; i < lenIV; i++) + *charstring_bp++ = cencrypt((byte) 0); +} + +/* This function encrypts and buffers a single byte of charstring data. */ + +static void charstring_byte(int v) +{ + byte b = (byte) (v & 0xff); + + if (charstring_bp - charstring_buf > sizeof(charstring_buf)) { + fprintf(stderr, "error: charstring_buf full (%d bytes)\n", + sizeof(charstring_buf)); + exit(1); + } + *charstring_bp++ = cencrypt(b); +} + +/* This function outputs buffered, encrypted charstring data through possible + eexec encryption. */ + +static void charstring_end() +{ + byte *bp; + + sprintf(line, "%d ", charstring_bp - charstring_buf); + eexec_string(line); + sprintf(line, "%s ", cs_start); + eexec_string(line); + for (bp = charstring_buf; bp < charstring_bp; bp++) + eexec_byte(*bp); +} + +/* This function generates the charstring representation of an integer. */ + +static void charstring_int(int num) +{ + int x; + + if (num >= -107 && num <= 107) { + charstring_byte(num + 139); + } else if (num >= 108 && num <= 1131) { + x = num - 108; + charstring_byte(x / 256 + 247); + charstring_byte(x % 256); + } else if (num >= -1131 && num <= -108) { + x = abs(num) - 108; + charstring_byte(x / 256 + 251); + charstring_byte(x % 256); + } else if (num >= (-2147483647-1) && num <= 2147483647) { + charstring_byte(255); + charstring_byte(num >> 24); + charstring_byte(num >> 16); + charstring_byte(num >> 8); + charstring_byte(num); + } else { + fprintf(stderr, + "error: cannot format the integer %d, too large\n", num); + exit(1); + } +} + +/* This function parses an entire charstring into integers and commands, + outputting bytes through the charstring buffer. */ + +static void parse_charstring() +{ + struct command *cp; + + charstring_start(); + while (fscanf(ifp, "%s", line) == 1) { + if (line[0] == '%') { + /* eat comment to end of line */ + while (fgetc(ifp) != '\n' && !feof(ifp)) + ; /* deliberately empty */ + continue; + } + if (line[0] == '}') + break; + if (is_integer(line)) { + charstring_int(atoi(line)); + } else { + cp = (struct command *) + bsearch((void *) line, (void *) command_table, + sizeof(command_table) / sizeof(struct command), + sizeof(struct command), + command_compare); + if (cp) { + charstring_byte(cp->one); + if (cp->two >= 0) + charstring_byte(cp->two); + } else { + fprintf(stderr, "error: cannot use `%s' in charstring\n",line); + exit(1); + } + } + } + charstring_end(); +} + +static void usage() +{ + fprintf(stderr, + "usage: t1asm [-b] [-l block-length] [input [output]]\n"); + fprintf(stderr, + "\n-b means output in PFB format, otherwise PFA format.\n"); + fprintf(stderr, + "The block length applies to the length of blocks in the\n"); + fprintf(stderr, + "PFB output file; the default is to use the largest possible.\n"); + exit(1); +} + +static void print_banner() +{ + static char rcs_revision[] = ""; /* removed RCS */ + static char revision[20]; + + if (sscanf(rcs_revision, "$Revision: %19s", revision) != 1) + revision[0] = '\0'; + fprintf(stderr, "This is t1asm %s.\n", revision); +} + +#ifdef STANDALONE +int main(int argc, char **argv) +{ + char *p, *q, *r; + int c; + + extern char *optarg; + extern int optind; + + ifp = stdin; + ofp = stdout; + + print_banner(); + + /* interpret command line arguments using getopt */ + while ((c = getopt(argc, argv, "bl:")) != -1) + switch (c) { + case 'b': + pfb = 1; + break; + case 'l': + blocklen = atoi(optarg); + if (blocklen < MINBLOCKLEN) { + blocklen = MINBLOCKLEN; + fprintf(stderr, + "warning: using minimum block length of %d\n", + blocklen); + } else if (blocklen > MAXBLOCKLEN) { + blocklen = MAXBLOCKLEN; + fprintf(stderr, + "warning: using maximum block length of %d\n", + blocklen); + } + break; + default: + usage(); + break; + } + if (argc - optind > 2) + usage(); + + /* possibly open input & output files */ + if (argc - optind >= 1) { + ifp = fopen(argv[optind], "r"); + if (!ifp) { + fprintf(stderr, "error: cannot open %s for reading\n", argv[1]); + exit(1); + } + } + if (argc - optind >= 2) { + ofp = fopen(argv[optind + 1], "w"); + if (!ofp) { + fprintf(stderr, "error: cannot open %s for writing\n", argv[2]); + exit(1); + } + } + +#else +int runt1asm(int pfbflag) +{ + char *p, *q, *r; + + pfb = pfbflag; +#endif + + #ifdef _MSDOS + /* If we are processing a PFB (binary) output */ + /* file, we must set its file mode to binary. */ + if (pfb) + _setmode(_fileno(ofp), _O_BINARY); + #endif + + /* Finally, we loop until no more input. Some special things to look for + are the `currentfile eexec' line, the beginning of the `/Subrs' + definition, the definition of `/lenIV', and the definition of the + charstring start command which has `...string currentfile...' in it. */ + + while (!feof(ifp) && !ferror(ifp)) { + t1asm_getline(); + if (strcmp(line, "currentfile eexec\n") == 0) { + eexec_start(); + continue; + } else if (strstr(line, "/Subrs") && isspace(line[6])) { + active = 1; + } else if ((p = strstr(line, "/lenIV"))) { + sscanf(p, "%*s %d", &lenIV); + } else if ((p = strstr(line, "string currentfile"))) { + /* locate the name of the charstring start command */ + *p = '\0'; /* damage line[] */ + q = strrchr(line, '/'); + if (q) { + r = cs_start; + ++q; + while (!isspace(*q) && *q != '{') + *r++ = *q++; + *r = '\0'; + } + *p = 's'; /* repair line[] */ + } + /* output line data */ + eexec_string(line); + if ((p = strstr(line, "currentfile closefile"))) { + eexec_end(); + } + if (start_charstring) { + if (!cs_start[0]) { + fprintf(stderr, "error: couldn't find charstring start command\n"); + exit(1); + } + parse_charstring(); + } + } + file_end(); + + fclose(ifp); + fclose(ofp); + + return 0; +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/ttf.c b/application/third_party/dompdf/lib/ttf2ufm/src/ttf.c new file mode 100755 index 00000000..761eb995 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/ttf.c @@ -0,0 +1,1502 @@ +/* + * True Type Font to Adobe Type 1 font converter + * By Mark Heath + * Based on ttf2pfa by Andrew Weeks + * With help from Frank M. Siegert + * + * see COPYRIGHT + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef WINDOWS +# include +# include +#else +# include "windows.h" +#endif + +#include "ttf.h" +#include "pt1.h" +#include "global.h" + +/* prototypes of call entries */ +static void openfont(char *fname, char *arg); +static void closefont( void); +static int getnglyphs ( void); +static int glnames( GLYPH *glyph_list); +static void glmetrics( GLYPH *glyph_list); +static int glenc( GLYPH *glyph_list, int *encoding, int *unimap); +static void fnmetrics( struct font_metrics *fm); +static void glpath( int glyphno, GLYPH *glyph_list); +static void kerning( GLYPH *glyph_list); + +/* globals */ + +/* front-end descriptor */ +struct frontsw ttf_sw = { + /*name*/ "ttf", + /*descr*/ "built-in TTF support", + /*suffix*/ { "ttf" }, + /*open*/ openfont, + /*close*/ closefont, + /*nglyphs*/ getnglyphs, + /*glnames*/ glnames, + /*glmetrics*/ glmetrics, + /*glenc*/ glenc, + /*fnmetrics*/ fnmetrics, + /*glpath*/ glpath, + /*kerning*/ kerning, +}; + +/* statics */ + +static FILE *ttf_file; +static int ttf_nglyphs, long_offsets; + +static TTF_DIRECTORY *directory; +static TTF_DIR_ENTRY *dir_entry; +static char *filebuffer; +static char *filebuffer_end; +static TTF_NAME *name_table = NULL; +static TTF_NAME_REC *name_record; +static TTF_HEAD *head_table = NULL; +static TTF_HHEA *hhea_table = NULL; +static TTF_KERN *kern_table = NULL; +static TTF_CMAP *cmap_table = NULL; +static LONGHORMETRIC *hmtx_table = NULL; +static TTF_GLYF *glyf_table; +static BYTE *glyf_start = NULL; +static TTF_MAXP *maxp_table = NULL; +static TTF_POST_HEAD *post_table = NULL; +static union { + USHORT *sp; + ULONG *lp; +} loca_table; +#define short_loca_table loca_table.sp +#define long_loca_table loca_table.lp + +static short cmap_n_segs; +static USHORT *cmap_seg_start, *cmap_seg_end; +static short *cmap_idDelta, *cmap_idRangeOffset; +static TTF_CMAP_FMT0 *encoding0; +static int enc_type; + +static char *name_fields[8]; + +static int enc_found_ms, enc_found_mac; + +static char *mac_glyph_names[258] = { + ".notdef", ".null", "CR", + "space", "exclam", "quotedbl", "numbersign", + "dollar", "percent", "ampersand", "quotesingle", + "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", + "zero", "one", "two", "three", + "four", "five", "six", "seven", + "eight", "nine", "colon", "semicolon", + "less", "equal", "greater", "question", + "at", "A", "B", "C", + "D", "E", "F", "G", + "H", "I", "J", "K", + "L", "M", "N", "O", + "P", "Q", "R", "S", + "T", "U", "V", "W", + "X", "Y", "Z", "bracketleft", + "backslash", "bracketright", "asciicircum", "underscore", + "grave", "a", "b", "c", + "d", "e", "f", "g", + "h", "i", "j", "k", + "l", "m", "n", "o", + "p", "q", "r", "s", + "t", "u", "v", "w", + "x", "y", "z", "braceleft", + "bar", "braceright", "asciitilde", "Adieresis", + "Aring", "Ccedilla", "Eacute", "Ntilde", + "Odieresis", "Udieresis", "aacute", "agrave", + "acircumflex", "adieresis", "atilde", "aring", + "ccedilla", "eacute", "egrave", "ecircumflex", + "edieresis", "iacute", "igrave", "icircumflex", + "idieresis", "ntilde", "oacute", "ograve", + "ocircumflex", "odieresis", "otilde", "uacute", + "ugrave", "ucircumflex", "udieresis", "dagger", + "degree", "cent", "sterling", "section", + "bullet", "paragraph", "germandbls", "registered", + "copyright", "trademark", "acute", "dieresis", + "notequal", "AE", "Oslash", "infinity", + "plusminus", "lessequal", "greaterequal", "yen", + "mu", "partialdiff", "summation", "product", + "pi", "integral", "ordfeminine", "ordmasculine", + "Omega", "ae", "oslash", "questiondown", + "exclamdown", "logicalnot", "radical", "florin", + "approxequal", "increment", "guillemotleft", "guillemotright", + "ellipsis", "nbspace", "Agrave", "Atilde", + "Otilde", "OE", "oe", "endash", + "emdash", "quotedblleft", "quotedblright", "quoteleft", + "quoteright", "divide", "lozenge", "ydieresis", + "Ydieresis", "fraction", "currency", "guilsinglleft", + "guilsinglright", "fi", "fl", "daggerdbl", + "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", + "Acircumflex", "Ecircumflex", "Aacute", "Edieresis", + "Egrave", "Iacute", "Icircumflex", "Idieresis", + "Igrave", "Oacute", "Ocircumflex", "applelogo", + "Ograve", "Uacute", "Ucircumflex", "Ugrave", + "dotlessi", "circumflex", "tilde", "macron", + "breve", "dotaccent", "ring", "cedilla", + "hungarumlaut", "ogonek", "caron", "Lslash", + "lslash", "Scaron", "scaron", "Zcaron", + "zcaron", "brokenbar", "Eth", "eth", + "Yacute", "yacute", "Thorn", "thorn", + "minus", "multiply", "onesuperior", "twosuperior", + "threesuperior", "onehalf", "onequarter", "threequarters", + "franc", "Gbreve", "gbreve", "Idot", + "Scedilla", "scedilla", "Cacute", "cacute", + "Ccaron", "ccaron", "dmacron" +}; + +/* other prototypes */ +static void draw_composite_glyf( GLYPH *g, GLYPH *glyph_list, int glyphno, + double *matrix, int level); +static void draw_simple_glyf( GLYPH *g, GLYPH *glyph_list, int glyphno, + double *matrix); +static double f2dot14( short x); + +/* get the TTF description table address and length for this index */ + +static void +get_glyf_table( + int glyphno, + TTF_GLYF **tab, + int *len +) +{ + if(tab!=NULL) { + if (long_offsets) { + *tab = (TTF_GLYF *) (glyf_start + ntohl(long_loca_table[glyphno])); + } else { + *tab = (TTF_GLYF *) (glyf_start + (ntohs(short_loca_table[glyphno]) << 1)); + } + } + if(len!=NULL) { + if (long_offsets) { + *len = ntohl(long_loca_table[glyphno + 1]) - ntohl(long_loca_table[glyphno]); + } else { + *len = (ntohs(short_loca_table[glyphno + 1]) - ntohs(short_loca_table[glyphno])) << 1; + } + } +} + +static void +handle_name(void) +{ + int j, k, lang, len, platform; + char *p, *string_area; + int found3 = 0; + + string_area = (char *) name_table + ntohs(name_table->offset); + name_record = &(name_table->nameRecords); + + for (j = 0; j < 8; j++) { + name_fields[j] = ""; + } + + for (j = 0; j < ntohs(name_table->numberOfNameRecords); j++) { + + platform = ntohs(name_record->platformID); + + if (platform == 3) { + + found3 = 1; + lang = ntohs(name_record->languageID) & 0xff; + len = ntohs(name_record->stringLength); + if (lang == 0 || lang == 9) { + k = ntohs(name_record->nameID); + if (k < 8) { + p = string_area + ntohs(name_record->stringOffset); + name_fields[k] = dupcnstring(p, len); + } + } + } + name_record++; + } + + string_area = (char *) name_table + ntohs(name_table->offset); + name_record = &(name_table->nameRecords); + + if (!found3) { + for (j = 0; j < ntohs(name_table->numberOfNameRecords); j++) { + + platform = ntohs(name_record->platformID); + + if (platform == 1) { + + found3 = 1; + lang = ntohs(name_record->languageID) & 0xff; + len = ntohs(name_record->stringLength); + if (lang == 0 || lang == 9) { + k = ntohs(name_record->nameID); + if (k < 8) { + p = string_area + ntohs(name_record->stringOffset); + name_fields[k] = dupcnstring(p, len); + } + } + } + name_record++; + } + } + if (!found3) { + fprintf(stderr, "**** Cannot decode font name fields ****\n"); + exit(1); + } + if (name_fields[4][0] == 0) { /* Full Name empty, use Family Name */ + name_fields[4] = name_fields[1]; + } + if (name_fields[6][0] == 0) { /* Font Name empty, use Full Name */ + name_fields[6] = name_fields[4]; + if (name_fields[6][0] == 0) { /* oops, empty again */ + WARNING_1 fprintf(stderr, "Font name is unknown, setting to \"Unknown\"\n"); + name_fields[6] = "Unknown"; + } + } + p = name_fields[6]; + /* must not start with a digit */ + if(isdigit(*p)) + *p+= 'A'-'0'; /* change to a letter */ + while (*p != '\0') { + if (!isalnum(*p) || *p=='_') { + *p = '-'; + } + p++; + } +} + +static void +handle_head(void) +{ + long_offsets = ntohs(head_table->indexToLocFormat); + if (long_offsets != 0 && long_offsets != 1) { + fprintf(stderr, "**** indexToLocFormat wrong ****\n"); + exit(1); + } +} + +/* limit the recursion level to avoid cycles */ +#define MAX_COMPOSITE_LEVEL 20 + +static void +draw_composite_glyf( + GLYPH *g, + GLYPH *glyph_list, + int glyphno, + double *orgmatrix, + int level +) +{ + int len; + short ncontours; + USHORT flagbyte, glyphindex; + double arg1, arg2; + BYTE *ptr; + char *bptr; + SHORT *sptr; + double matrix[6], newmatrix[6]; + + get_glyf_table(glyphno, &glyf_table, &len); + + if(len<=0) /* nothing to do */ + return; + + ncontours = ntohs(glyf_table->numberOfContours); + if (ncontours >= 0) { /* simple case */ + draw_simple_glyf(g, glyph_list, glyphno, orgmatrix); + return; + } + + if(ISDBG(COMPOSITE) && level ==0) + fprintf(stderr, "* %s [ %.2f %.2f %.2f %.2f %.2f %.2f ]\n", g->name, + orgmatrix[0], orgmatrix[1], orgmatrix[2], orgmatrix[3], + orgmatrix[4], orgmatrix[5]); + + /* complex case */ + if(level >= MAX_COMPOSITE_LEVEL) { + WARNING_1 fprintf(stderr, + "*** Glyph %s: stopped (possibly infinite) recursion at depth %d\n", + g->name, level); + return; + } + + ptr = ((BYTE *) glyf_table + sizeof(TTF_GLYF)); + sptr = (SHORT *) ptr; + do { + flagbyte = ntohs(*sptr); + sptr++; + glyphindex = ntohs(*sptr); + sptr++; + + if (flagbyte & ARG_1_AND_2_ARE_WORDS) { + arg1 = (short)ntohs(*sptr); + sptr++; + arg2 = (short)ntohs(*sptr); + sptr++; + } else { + bptr = (char *) sptr; + arg1 = (signed char) bptr[0]; + arg2 = (signed char) bptr[1]; + sptr++; + } + matrix[1] = matrix[2] = 0.0; + + if (flagbyte & WE_HAVE_A_SCALE) { + matrix[0] = matrix[3] = f2dot14(*sptr); + sptr++; + } else if (flagbyte & WE_HAVE_AN_X_AND_Y_SCALE) { + matrix[0] = f2dot14(*sptr); + sptr++; + matrix[3] = f2dot14(*sptr); + sptr++; + } else if (flagbyte & WE_HAVE_A_TWO_BY_TWO) { + matrix[0] = f2dot14(*sptr); + sptr++; + matrix[2] = f2dot14(*sptr); + sptr++; + matrix[1] = f2dot14(*sptr); + sptr++; + matrix[3] = f2dot14(*sptr); + sptr++; + } else { + matrix[0] = matrix[3] = 1.0; + } + + /* + * See * + * http://fonts.apple.com/TTRefMan/RM06/Chap6g + * lyf.html * matrix[0,1,2,3,4,5]=a,b,c,d,m,n + */ + + if (fabs(matrix[0]) > fabs(matrix[1])) + matrix[4] = fabs(matrix[0]); + else + matrix[4] = fabs(matrix[1]); + if (fabs(fabs(matrix[0]) - fabs(matrix[2])) <= 33. / 65536.) + matrix[4] *= 2.0; + + if (fabs(matrix[2]) > fabs(matrix[3])) + matrix[5] = fabs(matrix[2]); + else + matrix[5] = fabs(matrix[3]); + if (fabs(fabs(matrix[2]) - fabs(matrix[3])) <= 33. / 65536.) + matrix[5] *= 2.0; + + /* + * fprintf (stderr,"Matrix Opp %hd + * %hd\n",arg1,arg2); + */ +#if 0 + fprintf(stderr, "Matrix: %f %f %f %f %f %f\n", + matrix[0], matrix[1], matrix[2], matrix[3], + matrix[4], matrix[5]); + fprintf(stderr, "Offset: %f %f (%s)\n", + arg1, arg2, + ((flagbyte & ARGS_ARE_XY_VALUES) ? "XY" : "index")); +#endif + + if (flagbyte & ARGS_ARE_XY_VALUES) { + matrix[4] *= arg1; + matrix[5] *= arg2; + } else { + WARNING_1 fprintf(stderr, + "*** Glyph %s: reusing scale from another glyph is unsupported\n", + g->name); + /* + * must extract values from a glyph + * but it seems to be too much pain + * and it's not clear now that it + * would be really used in any + * interesting font + */ + } + + /* at this point arg1,arg2 contain what logically should be matrix[4,5] */ + + /* combine matrices */ + + newmatrix[0] = orgmatrix[0]*matrix[0] + orgmatrix[2]*matrix[1]; + newmatrix[1] = orgmatrix[0]*matrix[2] + orgmatrix[2]*matrix[3]; + + newmatrix[2] = orgmatrix[1]*matrix[0] + orgmatrix[3]*matrix[1]; + newmatrix[3] = orgmatrix[1]*matrix[2] + orgmatrix[3]*matrix[3]; + + newmatrix[4] = orgmatrix[0]*matrix[4] + orgmatrix[2]*matrix[5] + orgmatrix[4]; + newmatrix[5] = orgmatrix[1]*matrix[4] + orgmatrix[3]*matrix[5] + orgmatrix[5]; + + if(ISDBG(COMPOSITE)) { + fprintf(stderr, "%*c+-> %2d %s [ %.2f %.2f %.2f %.2f %.2f %.2f ]\n", + level+1, ' ', level, glyph_list[glyphindex].name, + matrix[0], matrix[1], matrix[2], matrix[3], + matrix[4], matrix[5]); + fprintf(stderr, "%*c = [ %.2f %.2f %.2f %.2f %.2f %.2f ]\n", + level+1, ' ', + newmatrix[0], newmatrix[1], newmatrix[2], newmatrix[3], + newmatrix[4], newmatrix[5]); + } + draw_composite_glyf(g, glyph_list, glyphindex, newmatrix, level+1); + + } while (flagbyte & MORE_COMPONENTS); +} + +static void +draw_simple_glyf( + GLYPH *g, + GLYPH *glyph_list, + int glyphno, + double *matrix +) +{ + int i, j, k, k1, len, first, cs, ce; + /* We assume that hsbw always sets to(0, 0) */ + double xlast = 0, ylast = 0; + int finished, nguide, contour_start, contour_end; + short ncontours, n_inst, last_point; + USHORT *contour_end_pt; + BYTE *ptr; +#define GLYFSZ 2000 + short xabs[GLYFSZ], yabs[GLYFSZ], xrel[GLYFSZ], yrel[GLYFSZ]; + double xcoord[GLYFSZ], ycoord[GLYFSZ]; + BYTE flags[GLYFSZ]; + double tx, ty; + int needreverse = 0; /* transformation may require + * that */ + GENTRY *lge; + + lge = g->lastentry; + + get_glyf_table(glyphno, &glyf_table, &len); + + if (len <= 0) { + WARNING_1 fprintf(stderr, + "**** Composite glyph %s refers to non-existent glyph %s, ignored\n", + g->name, + glyph_list[glyphno].name); + return; + } + ncontours = ntohs(glyf_table->numberOfContours); + if (ncontours < 0) { + WARNING_1 fprintf(stderr, + "**** Composite glyph %s refers to composite glyph %s, ignored\n", + g->name, + glyph_list[glyphno].name); + return; + } + contour_end_pt = (USHORT *) ((char *) glyf_table + sizeof(TTF_GLYF)); + + last_point = ntohs(contour_end_pt[ncontours - 1]); + n_inst = ntohs(contour_end_pt[ncontours]); + + ptr = ((BYTE *) contour_end_pt) + (ncontours << 1) + n_inst + 2; + j = k = 0; + while (k <= last_point) { + flags[k] = ptr[j]; + + if (ptr[j] & REPEAT) { + for (k1 = 0; k1 < ptr[j + 1]; k1++) { + k++; + flags[k] = ptr[j]; + } + j++; + } + j++; + k++; + } + + for (k = 0; k <= last_point; k++) { + if (flags[k] & XSHORT) { + if (flags[k] & XSAME) { + xrel[k] = ptr[j]; + } else { + xrel[k] = -ptr[j]; + } + j++; + } else if (flags[k] & XSAME) { + xrel[k] = 0.0; + } else { + xrel[k] = (short)( ptr[j] * 256 + ptr[j + 1] ); + j += 2; + } + if (k == 0) { + xabs[k] = xrel[k]; + } else { + xabs[k] = xrel[k] + xabs[k - 1]; + } + + } + + for (k = 0; k <= last_point; k++) { + if (flags[k] & YSHORT) { + if (flags[k] & YSAME) { + yrel[k] = ptr[j]; + } else { + yrel[k] = -ptr[j]; + } + j++; + } else if (flags[k] & YSAME) { + yrel[k] = 0; + } else { + yrel[k] = ptr[j] * 256 + ptr[j + 1]; + j += 2; + } + if (k == 0) { + yabs[k] = yrel[k]; + } else { + yabs[k] = yrel[k] + yabs[k - 1]; + } + } + + if (matrix) { + for (i = 0; i <= last_point; i++) { + tx = xabs[i]; + ty = yabs[i]; + xcoord[i] = fscale(matrix[0] * tx + matrix[2] * ty + matrix[4]); + ycoord[i] = fscale(matrix[1] * tx + matrix[3] * ty + matrix[5]); + } + } else { + for (i = 0; i <= last_point; i++) { + xcoord[i] = fscale(xabs[i]); + ycoord[i] = fscale(yabs[i]); + } + } + + i = j = 0; + first = 1; + + while (i <= ntohs(contour_end_pt[ncontours - 1])) { + contour_end = ntohs(contour_end_pt[j]); + + if (first) { + fg_rmoveto(g, xcoord[i], ycoord[i]); + xlast = xcoord[i]; + ylast = ycoord[i]; + contour_start = i; + first = 0; + } else if (flags[i] & ONOROFF) { + fg_rlineto(g, xcoord[i], ycoord[i]); + xlast = xcoord[i]; + ylast = ycoord[i]; + } else { + cs = i - 1; + finished = nguide = 0; + while (!finished) { + if (i == contour_end + 1) { + ce = contour_start; + finished = 1; + } else if (flags[i] & ONOROFF) { + ce = i; + finished = 1; + } else { + i++; + nguide++; + } + } + + switch (nguide) { + case 0: + fg_rlineto(g, xcoord[ce], ycoord[ce]); + xlast = xcoord[ce]; + ylast = ycoord[ce]; + break; + + case 1: + fg_rrcurveto(g, + (xcoord[cs] + 2.0 * xcoord[cs + 1]) / 3.0, + (ycoord[cs] + 2.0 * ycoord[cs + 1]) / 3.0, + (2.0 * xcoord[cs + 1] + xcoord[ce]) / 3.0, + (2.0 * ycoord[cs + 1] + ycoord[ce]) / 3.0, + xcoord[ce], + ycoord[ce] + ); + xlast = xcoord[ce]; + ylast = ycoord[ce]; + + break; + + case 2: + fg_rrcurveto(g, + (-xcoord[cs] + 4.0 * xcoord[cs + 1]) / 3.0, + (-ycoord[cs] + 4.0 * ycoord[cs + 1]) / 3.0, + (4.0 * xcoord[cs + 2] - xcoord[ce]) / 3.0, + (4.0 * ycoord[cs + 2] - ycoord[ce]) / 3.0, + xcoord[ce], + ycoord[ce] + ); + xlast = xcoord[ce]; + ylast = ycoord[ce]; + break; + + case 3: + fg_rrcurveto(g, + (xcoord[cs] + 2.0 * xcoord[cs + 1]) / 3.0, + (ycoord[cs] + 2.0 * ycoord[cs + 1]) / 3.0, + (5.0 * xcoord[cs + 1] + xcoord[cs + 2]) / 6.0, + (5.0 * ycoord[cs + 1] + ycoord[cs + 2]) / 6.0, + (xcoord[cs + 1] + xcoord[cs + 2]) / 2.0, + (ycoord[cs + 1] + ycoord[cs + 2]) / 2.0 + ); + + fg_rrcurveto(g, + (xcoord[cs + 1] + 5.0 * xcoord[cs + 2]) / 6.0, + (ycoord[cs + 1] + 5.0 * ycoord[cs + 2]) / 6.0, + (5.0 * xcoord[cs + 2] + xcoord[cs + 3]) / 6.0, + (5.0 * ycoord[cs + 2] + ycoord[cs + 3]) / 6.0, + (xcoord[cs + 3] + xcoord[cs + 2]) / 2.0, + (ycoord[cs + 3] + ycoord[cs + 2]) / 2.0 + ); + + fg_rrcurveto(g, + (xcoord[cs + 2] + 5.0 * xcoord[cs + 3]) / 6.0, + (ycoord[cs + 2] + 5.0 * ycoord[cs + 3]) / 6.0, + (2.0 * xcoord[cs + 3] + xcoord[ce]) / 3.0, + (2.0 * ycoord[cs + 3] + ycoord[ce]) / 3.0, + xcoord[ce], + ycoord[ce] + ); + ylast = ycoord[ce]; + xlast = xcoord[ce]; + + break; + + default: + k1 = cs + nguide; + fg_rrcurveto(g, + (xcoord[cs] + 2.0 * xcoord[cs + 1]) / 3.0, + (ycoord[cs] + 2.0 * ycoord[cs + 1]) / 3.0, + (5.0 * xcoord[cs + 1] + xcoord[cs + 2]) / 6.0, + (5.0 * ycoord[cs + 1] + ycoord[cs + 2]) / 6.0, + (xcoord[cs + 1] + xcoord[cs + 2]) / 2.0, + (ycoord[cs + 1] + ycoord[cs + 2]) / 2.0 + ); + + for (k = cs + 2; k <= k1 - 1; k++) { + fg_rrcurveto(g, + (xcoord[k - 1] + 5.0 * xcoord[k]) / 6.0, + (ycoord[k - 1] + 5.0 * ycoord[k]) / 6.0, + (5.0 * xcoord[k] + xcoord[k + 1]) / 6.0, + (5.0 * ycoord[k] + ycoord[k + 1]) / 6.0, + (xcoord[k] + xcoord[k + 1]) / 2.0, + (ycoord[k] + ycoord[k + 1]) / 2.0 + ); + + } + + fg_rrcurveto(g, + (xcoord[k1 - 1] + 5.0 * xcoord[k1]) / 6.0, + (ycoord[k1 - 1] + 5.0 * ycoord[k1]) / 6.0, + (2.0 * xcoord[k1] + xcoord[ce]) / 3.0, + (2.0 * ycoord[k1] + ycoord[ce]) / 3.0, + xcoord[ce], + ycoord[ce] + ); + xlast = xcoord[ce]; + ylast = ycoord[ce]; + + break; + } + } + if (i >= contour_end) { + g_closepath(g); + first = 1; + i = contour_end + 1; + j++; + } else { + i++; + } + } + + if (matrix) { + /* guess whether do we need to reverse the results */ + + double x[3], y[3]; + int max = 0, from, to; + + /* transform a triangle going in proper direction */ + /* + * the origin of triangle is in (0,0) so we know it in + * advance + */ + + x[0] = y[0] = 0; + x[1] = matrix[0] * 0 + matrix[2] * 300; + y[1] = matrix[1] * 0 + matrix[3] * 300; + x[2] = matrix[0] * 300 + matrix[2] * 0; + y[2] = matrix[1] * 300 + matrix[3] * 0; + + /* then find the topmost point */ + for (i = 0; i < 3; i++) + if (y[i] > y[max]) + max = i; + from = (max + 3 - 1) % 3; + to = (max + 1) % 3; + + needreverse = 0; + + /* special cases for horizontal lines */ + if (y[max] == y[from]) { + if (x[max] < y[from]) + needreverse = 1; + } else if (y[to] == y[from]) { + if (x[to] < x[max]) + needreverse = 1; + } else { /* generic case */ + if ((x[to] - x[max]) * (y[max] - y[from]) + > (x[max] - x[from]) * (y[to] - y[max])) + needreverse = 1; + } + + if (needreverse) { + if (lge) { + assertpath(lge->next, __FILE__, __LINE__, g->name); + reversepathsfromto(lge->next, NULL); + } else { + assertpath(g->entries, __FILE__, __LINE__, g->name); + reversepaths(g); + } + } + } +} + +static double +f2dot14( + short x +) +{ + short y = ntohs(x); + return (y >> 14) + ((y & 0x3fff) / 16384.0); +} + + +/* check that the pointer points within the file */ +/* returns 0 if pointer is good, 1 if bad */ +static int +badpointer( + void *ptr +) +{ + return (ptr < (void *)filebuffer || ptr >= (void *)filebuffer_end); +} + +/* + * Externally accessible methods + */ + +/* + * Open font and prepare to return information to the main driver. + * May print error and warning messages. + * Exit on error. + */ + +static void +openfont( + char *fname, + char *arg /* unused now */ +) +{ + int i, j; + struct stat statbuf; + static struct { + void **tbpp; /* pointer to pointer to the table */ + char name[5]; /* table name */ + char optional; /* flag: table may be missing */ + } tables[] = { + { (void **)&name_table, "name", 0 }, + { (void **)&head_table, "head", 0 }, + { (void **)&hhea_table, "hhea", 0 }, + { (void **)&post_table, "post", 0 }, + { (void **)&glyf_start, "glyf", 0 }, + { (void **)&cmap_table, "cmap", 0 }, + { (void **)&kern_table, "kern", 1 }, + { (void **)&maxp_table, "maxp", 0 }, + { (void **)&hmtx_table, "hmtx", 0 }, + { (void **)&long_loca_table, "loca", 0 }, + { NULL, "", 0 } /* end of table */ + }; + + if (stat(fname, &statbuf) == -1) { + fprintf(stderr, "**** Cannot access %s ****\n", fname); + exit(1); + } + if ((filebuffer = malloc(statbuf.st_size)) == NULL) { + fprintf(stderr, "**** Cannot malloc space for file ****\n"); + exit(1); + } + + filebuffer_end = filebuffer + statbuf.st_size; + + if ((ttf_file = fopen(fname, "rb")) == NULL) { + fprintf(stderr, "**** Cannot open file '%s'\n", fname); + exit(1); + } else { + WARNING_2 fprintf(stderr, "Processing file %s\n", fname); + } + + if (fread(filebuffer, 1, statbuf.st_size, ttf_file) != statbuf.st_size) { + fprintf(stderr, "**** Could not read whole file \n"); + exit(1); + } + fclose(ttf_file); + + directory = (TTF_DIRECTORY *) filebuffer; + + if (ntohl(directory->sfntVersion) != 0x00010000) { + fprintf(stderr, + "**** Unknown File Version number [%x], or not a TrueType file\n", + directory->sfntVersion); + exit(1); + } + + /* clear the tables */ + for(j=0; tables[j].tbpp != NULL; j++) + *(tables[j].tbpp) = NULL; + + dir_entry = &(directory->list); + + for (i = 0; i < ntohs(directory->numTables); i++) { + + for(j=0; tables[j].tbpp != NULL; j++) + if (memcmp(dir_entry->tag, tables[j].name, 4) == 0) { + *(tables[j].tbpp) = (void *) (filebuffer + ntohl(dir_entry->offset)); + break; + } + + if (memcmp(dir_entry->tag, "EBDT", 4) == 0 || + memcmp(dir_entry->tag, "EBLC", 4) == 0 || + memcmp(dir_entry->tag, "EBSC", 4) == 0) { + WARNING_1 fprintf(stderr, "Font contains bitmaps\n"); + } + dir_entry++; + } + + for(j=0; tables[j].tbpp != NULL; j++) + if(!tables[j].optional && badpointer( *(tables[j].tbpp) )) { + fprintf(stderr, "**** File contains no required table '%s'\n", tables[j].name); + exit(1); + } + + handle_name(); + + handle_head(); + + ttf_nglyphs = ntohs(maxp_table->numGlyphs); + + enc_found_ms = enc_found_mac = 0; +} + +/* + * Close font. + * Exit on error. + */ + +static void +closefont( + void +) +{ + return; /* empty operation */ +} + +/* + * Get the number of glyphs in font. + */ + +static int +getnglyphs ( + void +) +{ + return ttf_nglyphs; +} + +/* + * Get the names of the glyphs. + * Returns 0 if the names were assigned, non-zero if the font + * provides no glyph names. + */ + +static int +glnames( + GLYPH *glyph_list +) +{ + int i, len, n, npost; + unsigned int format; + USHORT *name_index; + char *ptr, *p; + char **ps_name_ptr = (char **) malloc(ttf_nglyphs * sizeof(char *)); + int n_ps_names; + int ps_fmt_3 = 0; + + format = ntohl(post_table->formatType); + + if (format == 0x00010000) { + for (i = 0; i < 258 && i < ttf_nglyphs; i++) { + glyph_list[i].name = mac_glyph_names[i]; + } + } else if (format == 0x00020000) { + npost = ntohs(post_table->numGlyphs); + if (ttf_nglyphs != npost) { + /* This is an error in the font, but we can now cope */ + WARNING_1 fprintf(stderr, "**** Postscript table size mismatch %d/%d ****\n", + npost, ttf_nglyphs); + } + n_ps_names = 0; + name_index = &(post_table->glyphNameIndex); + + /* This checks the integrity of the post table */ + for (i=0; i n_ps_names + 257) { + n_ps_names = n - 257; + } + } + + ptr = (char *) post_table + 34 + (ttf_nglyphs << 1); + i = 0; + while (*ptr > 0 && i < n_ps_names) { + len = *ptr; + /* previously the program wrote nulls into the table. If the table + was corrupt, this could put zeroes anywhere, leading to obscure bugs, + so now I malloc space for the names. Yes it is much less efficient */ + + if ((p = malloc(len+1)) == NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + + ps_name_ptr[i] = p; + strncpy(p, ptr+1, len); + p[len] = '\0'; + i ++; + ptr += len + 1; + } + + if (i != n_ps_names) + { + WARNING_2 fprintf (stderr, "** Postscript Name mismatch %d != %d **\n", + i, n_ps_names); + n_ps_names = i; + } + + /* + * for (i=0; inumGlyphs); + for (i = 0; i < ttf_nglyphs; i++) { + glyph_list[i].name = mac_glyph_names[i + ptr[i]]; + } + } else { + fprintf(stderr, + "**** Postscript table in wrong format %x ****\n", + format); + exit(1); + } + + return ps_fmt_3; +} + +/* + * Get the metrics of the glyphs. + */ + +static void +glmetrics( + GLYPH *glyph_list +) +{ + int i; + int n_hmetrics = ntohs(hhea_table->numberOfHMetrics); + GLYPH *g; + LONGHORMETRIC *hmtx_entry = hmtx_table; + FWORD *lsblist; + + for (i = 0; i < n_hmetrics; i++) { + g = &(glyph_list[i]); + g->width = ntohs(hmtx_entry->advanceWidth); + g->lsb = ntohs(hmtx_entry->lsb); + hmtx_entry++; + } + + lsblist = (FWORD *) hmtx_entry; + hmtx_entry--; + + for (i = n_hmetrics; i < ttf_nglyphs; i++) { + g = &(glyph_list[i]); + g->width = ntohs(hmtx_entry->advanceWidth); + g->lsb = ntohs(lsblist[i - n_hmetrics]); + } + + for (i = 0; i < ttf_nglyphs; i++) { + g = &(glyph_list[i]); + get_glyf_table(i, &glyf_table, &g->ttf_pathlen); + + g->xMin = (short)ntohs(glyf_table->xMin); + g->xMax = (short)ntohs(glyf_table->xMax); + g->yMin = (short)ntohs(glyf_table->yMin); + g->yMax = (short)ntohs(glyf_table->yMax); + } + +} + + +static void +handle_ms_encoding( + GLYPH *glyph_list, + int *encoding, + int *unimap +) +{ + int i, j, k, kk, set_ok; + USHORT start, end, ro; + short delta, n; + + for (j = 0; j < cmap_n_segs - 1; j++) { + start = ntohs(cmap_seg_start[j]); + end = ntohs(cmap_seg_end[j]); + delta = ntohs(cmap_idDelta[j]); + ro = ntohs(cmap_idRangeOffset[j]); + + for (k = start; k <= end; k++) { + if (ro == 0) { + n = k + delta; + } else { + n = ntohs(*((ro >> 1) + (k - start) + + &(cmap_idRangeOffset[j]))); + if (delta != 0) + { + /* Not exactly sure how to deal with this circumstance, + I suspect it never occurs */ + n += delta; + fprintf (stderr, + "rangeoffset and delta both non-zero - %d/%d", + ro, delta); + } + } + if(n<0 || n>=ttf_nglyphs) { + WARNING_1 fprintf(stderr, "Font contains a broken glyph code mapping, ignored\n"); + continue; + } + + // Find the first available orig_code slot + for (i = 0; i < GLYPH_MAX_ENCODINGS; i++ ) { + + if ( glyph_list[n].orig_code[i] == -1 ) + break; + + } + + if ( i == GLYPH_MAX_ENCODINGS ) { + //#if 0 + if (strcmp(glyph_list[n].name, ".notdef") != 0) { + WARNING_2 fprintf(stderr, + "Glyph %s has >= %d encodings (A), %4.4x & %4.4x\n", + glyph_list[n].name, + GLYPH_MAX_ENCODINGS, + glyph_list[n].orig_code[0], + k); + } + //#endif + set_ok = 0; + break; + } else { + set_ok = 1; + } + if (enc_type==1 || forcemap) { + kk = unicode_rev_lookup(k); + if(ISDBG(UNICODE)) + fprintf(stderr, "Unicode %s - 0x%04x\n",glyph_list[n].name,k); + if (set_ok) { + glyph_list[n].orig_code[i] = k; + /* glyph_list[n].char_no = kk; */ + } + if (kk >= 0 && kk < ENCTABSZ && encoding[kk] == -1) + encoding[kk] = n; + } else { + if ((k & 0xff00) == 0xf000) { + if( encoding[k & 0x00ff] == -1 ) { + encoding[k & 0x00ff] = n; + if (set_ok) { + /* glyph_list[n].char_no = k & 0x00ff; */ + glyph_list[n].orig_code[i] = k; + } + } + } else { + if (set_ok) { + /* glyph_list[n].char_no = k; */ + glyph_list[n].orig_code[i] = k; + } + WARNING_2 fprintf(stderr, + "Glyph %s has non-symbol encoding %4.4x\n", + glyph_list[n].name, + k & 0xffff); + /* + * just use the code + * as it is + */ + if ((k & ~0xff) == 0 && encoding[k] == -1 ) + encoding[k] = n; + } + } + } + } +} + +static void +handle_mac_encoding( + GLYPH *glyph_list, + int *encoding, + int *unimap +) +{ + short n; + int j, size; + + size = ntohs(encoding0->length) - 6; + for (j = 0; j < size; j++) { + n = encoding0->glyphIdArray[j]; + if (glyph_list[n].char_no != -1) { + WARNING_2 fprintf(stderr, + "Glyph %s has >= two encodings (B), %4.4x & %4.4x\n", + glyph_list[n].name, + glyph_list[n].char_no, + j); + } else { + if (j < ENCTABSZ) { + if(encoding[j] == -1) { + glyph_list[n].char_no = j; + encoding[j] = n; + } + } + } + } +} + +/* + * Get the original encoding of the font. + * Returns 1 for if the original encoding is Unicode, 2 if the + * original encoding is other 16-bit, 0 if 8-bit. + */ + +static int +glenc( + GLYPH *glyph_list, + int *encoding, + int *unimap +) +{ + int num_tables = ntohs(cmap_table->numberOfEncodingTables); + BYTE *ptr; + int i, format, offset, seg_c2, found; + int platform, encoding_id; + TTF_CMAP_ENTRY *table_entry; + TTF_CMAP_FMT4 *encoding4; + + if(enc_found_ms) { + handle_ms_encoding(glyph_list, encoding, unimap); + return enc_type; + } else if(enc_found_mac) { + handle_mac_encoding(glyph_list, encoding, unimap); + return 0; + } + + enc_type = 0; + found = 0; + + for (i = 0; i < num_tables && !found; i++) { + table_entry = &(cmap_table->encodingTable[i]); + offset = ntohl(table_entry->offset); + encoding4 = (TTF_CMAP_FMT4 *) ((BYTE *) cmap_table + offset); + format = ntohs(encoding4->format); + platform = ntohs(table_entry->platformID); + encoding_id = ntohs(table_entry->encodingID); + + if (format != 4) + continue; + + if(force_pid != -1) { + if(force_pid != platform || encoding_id != force_eid) + continue; + WARNING_1 fprintf(stderr, "Found Encoding PID=%d/EID=%d\n", + force_pid, force_eid); + enc_type = 1; + } else { + if (platform == 3 ) { + switch (encoding_id) { + case 0: + WARNING_1 fputs("Found Symbol Encoding\n", stderr); + break; + case 1: + WARNING_1 fputs("Found Unicode Encoding\n", stderr); + enc_type = 1; + break; + default: + WARNING_1 { + fprintf(stderr, + "****MS Encoding ID %d not supported****\n", + encoding_id); + fputs("Treating it like Symbol encoding\n", stderr); + } + break; + } + } else + continue; + } + + found = 1; + seg_c2 = ntohs(encoding4->segCountX2); + cmap_n_segs = seg_c2 >> 1; + ptr = (BYTE *) encoding4 + 14; + cmap_seg_end = (USHORT *) ptr; + cmap_seg_start = (USHORT *) (ptr + seg_c2 + 2); + cmap_idDelta = (short *) (ptr + (seg_c2 * 2) + 2); + cmap_idRangeOffset = (short *) (ptr + (seg_c2 * 3) + 2); + enc_found_ms = 1; + + handle_ms_encoding(glyph_list, encoding, unimap); + } + + if (!found && force_pid == -1) { + WARNING_1 fputs("No Microsoft encoding, looking for MAC encoding\n", stderr); + for (i = 0; i < num_tables && !found; i++) { + table_entry = &(cmap_table->encodingTable[i]); + offset = ntohl(table_entry->offset); + encoding0 = (TTF_CMAP_FMT0 *) ((BYTE *) cmap_table + offset); + format = ntohs(encoding0->format); + platform = ntohs(table_entry->platformID); + encoding_id = ntohs(table_entry->encodingID); + + if (format == 0) { + found = 1; + enc_found_mac = 1; + + handle_mac_encoding(glyph_list, encoding, unimap); + } + } + } + + if (!found && force_pid == -1) { + WARNING_1 fputs("No MAC encoding either, looking for any format 4 encoding\n", stderr); + for (i = 0; i < num_tables && !found; i++) { + table_entry = &(cmap_table->encodingTable[i]); + offset = ntohl(table_entry->offset); + encoding4 = (TTF_CMAP_FMT4 *) ((BYTE *) cmap_table + offset); + format = ntohs(encoding4->format); + platform = ntohs(table_entry->platformID); + encoding_id = ntohs(table_entry->encodingID); + + if (format != 4) + continue; + + WARNING_1 fprintf(stderr, "Found a last ditch encoding PID=%d/EID=%d, treating it as Unicode.\n", + platform, encoding_id); + found = 1; + enc_type = 1; + seg_c2 = ntohs(encoding4->segCountX2); + cmap_n_segs = seg_c2 >> 1; + ptr = (BYTE *) encoding4 + 14; + cmap_seg_end = (USHORT *) ptr; + cmap_seg_start = (USHORT *) (ptr + seg_c2 + 2); + cmap_idDelta = (short *) (ptr + (seg_c2 * 2) + 2); + cmap_idRangeOffset = (short *) (ptr + (seg_c2 * 3) + 2); + enc_found_ms = 1; + + handle_ms_encoding(glyph_list, encoding, unimap); + + } + } + + if (!found) { + if(force_pid != -1) { + fprintf(stderr, "*** TTF encoding table PID=%d/EID=%d not found\n", + force_pid, force_eid); + } + fprintf(stderr, "**** No Recognised Encoding Table ****\n"); + if(warnlevel >= 2) { + fprintf(stderr, "Font contains the following unsupported encoding tables:\n"); + for (i = 0; i < num_tables && !found; i++) { + table_entry = &(cmap_table->encodingTable[i]); + offset = ntohl(table_entry->offset); + encoding0 = (TTF_CMAP_FMT0 *) ((BYTE *) cmap_table + offset); + format = ntohs(encoding0->format); + platform = ntohs(table_entry->platformID); + encoding_id = ntohs(table_entry->encodingID); + + fprintf(stderr, " format=%d platform=%d encoding_id=%d\n", + format, platform, encoding_id); + } + } + exit(1); + } + + return enc_type; +} + +/* + * Get the font metrics + */ +static void +fnmetrics( + struct font_metrics *fm +) +{ + char *str; + static int fieldstocheck[]= {2,4,6}; + int i, j, len; + + fm->italic_angle = (short) (ntohs(post_table->italicAngle.upper)) + + ((short) ntohs(post_table->italicAngle.lower) / 65536.0); + fm->underline_position = (short) ntohs(post_table->underlinePosition); + fm->underline_thickness = (short) ntohs(post_table->underlineThickness); + fm->is_fixed_pitch = ntohl(post_table->isFixedPitch); + + fm->ascender = (short)ntohs(hhea_table->ascender); + fm->descender = (short)ntohs(hhea_table->descender); + + fm->units_per_em = ntohs(head_table->unitsPerEm); + + fm->bbox[0] = (short) ntohs(head_table->xMin); + fm->bbox[1] = (short) ntohs(head_table->yMin); + fm->bbox[2] = (short) ntohs(head_table->xMax); + fm->bbox[3] = (short) ntohs(head_table->yMax); + + fm->name_copyright = name_fields[0]; + fm->name_family = name_fields[1]; + fm->name_style = name_fields[2]; + fm->name_full = name_fields[4]; + fm->name_version = name_fields[5]; + fm->name_ps = name_fields[6]; + + /* guess the boldness from the font names */ + fm->force_bold=0; + + for(i=0; !fm->force_bold && i= len || !islower(str[j+4])) + ) { + fm->force_bold=1; + break; + } + } + } +} + +/* + * Get the path of contrours for a glyph. + */ + +static void +glpath( + int glyphno, + GLYPH *glyf_list +) +{ + double matrix[6]; + GLYPH *g; + + g = &glyph_list[glyphno]; + + matrix[0] = matrix[3] = 1.0; + matrix[1] = matrix[2] = matrix[4] = matrix[5] = 0.0; + draw_composite_glyf(g, glyf_list, glyphno, matrix, 0 /*level*/); +} + +/* + * Get the kerning data. + */ + +static void +kerning( + GLYPH *glyph_list +) +{ + TTF_KERN_SUB *subtable; + TTF_KERN_ENTRY *kern_entry; + int i, j; + int ntables; + int npairs; + char *ptr; + + if(kern_table == NULL) { + WARNING_1 fputs("No Kerning data\n", stderr); + return; + } + if(badpointer(kern_table)) { + fputs("**** Defective Kerning table, ignored\n", stderr); + return; + } + + ntables = ntohs(kern_table->nTables); + ptr = (char *) kern_table + 4; + + for (i = 0; i < ntables; i++) { + subtable = (TTF_KERN_SUB *) ptr; + if ((ntohs(subtable->coverage) & 0xff00) == 0) { + npairs = (short) ntohs(subtable->nPairs); + kern_entry = (TTF_KERN_ENTRY *) (ptr + sizeof(TTF_KERN_SUB)); + + kern_entry = (TTF_KERN_ENTRY *) (ptr + sizeof(TTF_KERN_SUB)); + for (j = 0; j < npairs; j++) { + if( kern_entry->value != 0) + addkernpair(ntohs(kern_entry->left), + ntohs(kern_entry->right), (short)ntohs(kern_entry->value)); + kern_entry++; + } + } + ptr += subtable->length; + } +} + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/ttf.h b/application/third_party/dompdf/lib/ttf2ufm/src/ttf.h new file mode 100755 index 00000000..8c38808d --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/ttf.h @@ -0,0 +1,172 @@ +/* + * see COPYRIGHT + */ + +/* these definitions are mostly taken from Microsoft's True Type + documentation. +*/ + +#define BYTE unsigned char +#define CHAR signed char +#define USHORT unsigned short +#define SHORT signed short +#define ULONG unsigned int +#define LONG signed int +#define FWORD SHORT +#define UFWORD USHORT + +#define ONOROFF 0x01 +#define XSHORT 0x02 +#define YSHORT 0x04 +#define REPEAT 0x08 +#define XSAME 0x10 +#define YSAME 0x20 + +#define ARG_1_AND_2_ARE_WORDS 0x0001 +#define ARGS_ARE_XY_VALUES 0x0002 +#define XY_BOUND_TO_GRID 0x0004 +#define WE_HAVE_A_SCALE 0x0008 +#define MORE_COMPONENTS 0x0020 +#define WE_HAVE_AN_X_AND_Y_SCALE 0x0040 +#define WE_HAVE_A_TWO_BY_TWO 0x0080 +#define WE_HAVE_INSTRUCTIONS 0x0100 +#define USE_MY_METRICS 0x0200 + +typedef struct short_2 { + SHORT upper; + USHORT lower; +} FIXED ; + +typedef struct longhormetric { + UFWORD advanceWidth; + FWORD lsb; +} LONGHORMETRIC; + +typedef struct ttf_hhea { + BYTE version[4]; + SHORT ascender, descender, lineGap; + USHORT advnaceWidthMax; + SHORT minLSB, minRSB, xMaxExtent; + SHORT caretSlopeRise, caretSlopeRun; + SHORT reserved[5]; + SHORT metricDataFormat; + USHORT numberOfHMetrics; +} TTF_HHEA; + +typedef struct ttf_dir_entry { + char tag[4]; + ULONG checksum; + ULONG offset; + ULONG length; +} TTF_DIR_ENTRY ; + +typedef struct ttf_directory { + ULONG sfntVersion; + USHORT numTables; + USHORT searchRange; + USHORT entrySelector; + USHORT rangeShift; + TTF_DIR_ENTRY list; +} TTF_DIRECTORY ; + +typedef struct ttf_name_rec { + USHORT platformID; + USHORT encodingID; + USHORT languageID; + USHORT nameID; + USHORT stringLength; + USHORT stringOffset; +} TTF_NAME_REC; + +typedef struct ttf_name { + USHORT format; + USHORT numberOfNameRecords; + USHORT offset; + TTF_NAME_REC nameRecords; +} TTF_NAME ; + +typedef struct ttf_head { + ULONG version; + ULONG fontRevision; + ULONG checksumAdjust; + ULONG magicNo; + USHORT flags; + USHORT unitsPerEm; + BYTE created[8]; + BYTE modified[8]; + FWORD xMin, yMin, xMax, yMax; + USHORT macStyle, lowestRecPPEM; + SHORT fontDirection, indexToLocFormat, glyphDataFormat; +} TTF_HEAD ; + +typedef struct ttf_kern { + USHORT version, nTables; +} TTF_KERN ; + +typedef struct ttf_kern_sub { + USHORT version, length, coverage; + USHORT nPairs, searchRange, entrySelector, rangeShift; +} TTF_KERN_SUB; + +typedef struct ttf_kern_entry { + USHORT left, right; + FWORD value; +} TTF_KERN_ENTRY; + +typedef struct ttf_cmap_fmt0 { + USHORT format; + USHORT length; + USHORT version; + BYTE glyphIdArray[256]; +} TTF_CMAP_FMT0; + +typedef struct ttf_cmap_fmt4 { + USHORT format; + USHORT length; + USHORT version; + USHORT segCountX2; + USHORT searchRange; + USHORT entrySelector; + USHORT rangeShift; +} TTF_CMAP_FMT4; + +typedef struct ttf_cmap_entry { + USHORT platformID; + USHORT encodingID; + ULONG offset; +} TTF_CMAP_ENTRY; + +typedef struct ttf_cmap { + USHORT version; + USHORT numberOfEncodingTables; + TTF_CMAP_ENTRY encodingTable[1]; +} TTF_CMAP ; + +typedef struct ttf_glyf { + SHORT numberOfContours; + FWORD xMin, yMin, xMax, yMax; +} TTF_GLYF ; + +typedef struct ttf_maxp { + ULONG version; + USHORT numGlyphs, maxPoints, maxContours; + USHORT maxCompositePoints, maxCompositeContours; + USHORT maxZones, maxTwilightPoints, maxStorage; + USHORT maxFunctionDefs, maxInstructionsDefs; + USHORT maxSizeOfInstructions, maxComponentElements; + USHORT maxComponentDepth; +} TTF_MAXP ; + +typedef struct ttf_post_head { + ULONG formatType; + FIXED italicAngle; + FWORD underlinePosition; + FWORD underlineThickness; + ULONG isFixedPitch; + ULONG minMemType42; + ULONG maxMemType42; + ULONG minMemType1; + ULONG maxMemType1; + USHORT numGlyphs; + USHORT glyphNameIndex; +} TTF_POST_HEAD ; diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1.1 b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1.1 new file mode 100755 index 00000000..b5a416a1 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1.1 @@ -0,0 +1,822 @@ +.rn '' }` +''' $RCSfile: ttf2pt1.1,v $$Revision: 1.1 $$Date: 2008-03-12 06:35:44 $ +''' +''' $Log: not supported by cvs2svn $ +''' +.de Sh +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp +.if t .sp .5v +.if n .sp +.. +.de Ip +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.de Vb +.ft CW +.nf +.ne \\$1 +.. +.de Ve +.ft R + +.fi +.. +''' +''' +''' Set up \*(-- to give an unbreakable dash; +''' string Tr holds user defined translation string. +''' Bell System Logo is used as a dummy character. +''' +.tr \(*W-|\(bv\*(Tr +.ie n \{\ +.ds -- \(*W- +.ds PI pi +.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +.ds L" "" +.ds R" "" +''' \*(M", \*(S", \*(N" and \*(T" are the equivalent of +''' \*(L" and \*(R", except that they are used on ".xx" lines, +''' such as .IP and .SH, which do another additional levels of +''' double-quote interpretation +.ds M" """ +.ds S" """ +.ds N" """"" +.ds T" """"" +.ds L' ' +.ds R' ' +.ds M' ' +.ds S' ' +.ds N' ' +.ds T' ' +'br\} +.el\{\ +.ds -- \(em\| +.tr \*(Tr +.ds L" `` +.ds R" '' +.ds M" `` +.ds S" '' +.ds N" `` +.ds T" '' +.ds L' ` +.ds R' ' +.ds M' ` +.ds S' ' +.ds N' ` +.ds T' ' +.ds PI \(*p +'br\} +.\" If the F register is turned on, we'll generate +.\" index entries out stderr for the following things: +.\" TH Title +.\" SH Header +.\" Sh Subsection +.\" Ip Item +.\" X<> Xref (embedded +.\" Of course, you have to process the output yourself +.\" in some meaninful fashion. +.if \nF \{ +.de IX +.tm Index:\\$1\t\\n%\t"\\$2" +.. +.nr % 0 +.rr F +.\} +.TH TTF2PT1 1 "version 3.4.4" "December 31, 2003" "TTF2PT1 Font Converter" +.UC +.if n .hy 0 +.if n .na +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.de CQ \" put $1 in typewriter font +.ft CW +'if n "\c +'if t \\&\\$1\c +'if n \\&\\$1\c +'if n \&" +\\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7 +'.ft R +.. +.\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2 +. \" AM - accent mark definitions +.bd B 3 +. \" fudge factors for nroff and troff +.if n \{\ +. ds #H 0 +. ds #V .8m +. ds #F .3m +. ds #[ \f1 +. ds #] \fP +.\} +.if t \{\ +. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +. ds #V .6m +. ds #F 0 +. ds #[ \& +. ds #] \& +.\} +. \" simple accents for nroff and troff +.if n \{\ +. ds ' \& +. ds ` \& +. ds ^ \& +. ds , \& +. ds ~ ~ +. ds ? ? +. ds ! ! +. ds / +. ds q +.\} +.if t \{\ +. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +. ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10' +. ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m' +. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +. ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10' +.\} +. \" troff and (daisy-wheel) nroff accents +.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#] +.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u' +.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u' +.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#] +.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +.ds ae a\h'-(\w'a'u*4/10)'e +.ds Ae A\h'-(\w'A'u*4/10)'E +.ds oe o\h'-(\w'o'u*4/10)'e +.ds Oe O\h'-(\w'O'u*4/10)'E +. \" corrections for vroff +.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +. \" for low resolution devices (crt and lpr) +.if \n(.H>23 .if \n(.V>19 \ +\{\ +. ds : e +. ds 8 ss +. ds v \h'-1'\o'\(aa\(ga' +. ds _ \h'-1'^ +. ds . \h'-1'. +. ds 3 3 +. ds o a +. ds d- d\h'-1'\(ga +. ds D- D\h'-1'\(hy +. ds th \o'bp' +. ds Th \o'LP' +. ds ae ae +. ds Ae AE +. ds oe oe +. ds Oe OE +.\} +.rm #[ #] #H #V #F C +.SH "NAME" +TTF2PT1 \- A True Type to PostScript Type 1 Font Converter +.SH "SYNOPSIS" +\f(CWttf2pt1 \fI[-options] ttffont.ttf [Fontname]\fR\fR +.PP +or +.PP +\f(CWttf2pt1 \fI[-options] ttffont.ttf -\fR\fR +.SH "DESCRIPTION" +Ttf2pt1 is a font converter from the True Type format (and some other formats +supported by the FreeType library as well) to the Adobe Type1 format. +.PP +The versions 3.0 and later got rather extensive post-processing algorithm that +brings the converted fonts to the requirements of the Type1 standard, tries to +correct the rounding errors introduced during conversions and some simple +kinds of bugs that are typical for the public domain TTF fonts. It +also generates the hints that enable much better rendering of fonts in +small sizes that are typical for the computer displays. But everything +has its price, and some of the optimizations may not work well for certain +fonts. That's why the options were added to the converter, to control +the performed optimizations. +.SH "OPTIONS" +The first variant creates the file \f(CWFontname.pfa\fR (or \f(CWFontname.pfb\fR if the +option \*(L'\fB\-b\fR\*(R' was used) with the converted font and \f(CWFontname.afm\fR with the +font metrics, the second one prints the font or another file (if the option +\&\*(R'\fB\-G\fR\*(R' was used) on the standard output from where it can be immediately +piped through some filter. If no \f(CWFontname\fR is specified for the first +variant, the name is generated from \f(CWttffont\fR by replacing the \f(CW.ttf\fR +filename suffix. +.PP +Most of the time no options are neccessary (with a possible exception +of \*(L'\fB\-e\fR'). But if there are some troubles with the resulting font, they +may be used to control the conversion. +The \fBoptions\fR are: +.Ip "\(bu" 2 +\f(CW\fB-a\fR\fR \- Include all the glyphs from the source file into the converted +file. If this option is not specified then only the glyphs that have +been assigned some encoding are included, because the rest of glyphs +would be inaccessible anyway and would only consume the disk space. +But some applications are clever enough to change the encoding on +the fly and thus use the other glyphs, in this case they could +benefit from using this option. But there is a catch: the X11 library +has rather low limit for the font size. Including more glyphs increases +the file size and thus increases the chance of hitting this limit. +See \f(CWapp/X11/README\fR for the description of a +patch to X11 which fixes this problem. +.Ip "\(bu" 2 +\f(CW\fB-b\fR\fR \- Encode the resulting font to produce a ready \f(CW.pfb\fR file. +.Ip "\(bu" 2 +\f(CW\fB-d \fIsuboptions\fR\fR\fR \- Debugging options. The suboptions are: +.Sp +\f(CW\fBa\fR\fR \- Print out the absolute coordinates of dots in outlines. Such +a font can not be used by any program (that's why this option is +incompatible with \*(L'\fB\-e\fR') but it has proven to be a valuable debuging +information. +.Sp +\f(CW\fBr\fR\fR \- Do not reverse the direction of outlines. The \s-1TTF\s0 fonts have +the standard direction of outlines opposite to the Type1 fonts. So +they should be reversed during proper conversion. This option +may be used for debugging or to handle a \s-1TTF\s0 font with wrong +direction of outlines (possibly, converted in a broken way from +a Type1 font). The first signs of the wrong direction are the +letters like \*(L"P\*(R" or \*(L"B\*(R" without the unpainted \*(L"holes\*(R" inside. +.Ip "\(bu" 2 +\f(CW\fB-e\fR\fR \- Assemble the resulting font to produce a ready \f(CW.pfa\fR file. +.Sp +[ S.B.: Personally I don't think that this option is particularly useful. +The same result may be achieved by piping the unassembled data +through t1asm, the Type 1 assembler. And, anyways, it's good to +have the t1utils package handy. But Mark and many users think that +this functionality is good and it took not much time to add this option. ] +.Ip "\(bu" 2 +\f(CW\fB-F\fR\fR \- Force the Unicode encoding: any type of \s-1MS\s0 encoding specified +in the font is ignored and the font is treated like it has Unicode +encoding. \fB\s-1WARNING\s0:\fR this option is intended for buggy fonts +which actually are in Unicode but are marked as something else. The +effect on the other fonts is unpredictable. +.Ip "\(bu" 2 +\f(CW\fB-G \fIsuboptions\fR\fR\fR \- File generation options. The suboptions may be lowercase +or uppercase, the lowercase ones disable the generation of particular +files, the corresponding uppercase suboptions enable the generation of the +same kind of files. If the result of ttf2pt1 is requested to be printed on +the standard output, the last enabling suboption of \fB\-G\fR determines +which file will be written to the standard output and the rest of files +will be discarded. For example, \fB\-G A\fR will request the \s-1AFM\s0 file. +The suboptions to disable/enable the generation of the files are: +.Sp +\f(CW\fBf/F\fR\fR \- The font file. Depending on the other options this file +will have one of the suffixes \f(CW.t1a\fR, \f(CW.pfa\fR or \f(CW.pfb\fR. If the conversion result +is requested on the standard output ('\f(CW-\fR\*(R' is used as the output file name) +then the font file will also be written there by default, if not overwritten +by another suboption of \fB\-G\fR. +\fBDefault: enabled\fR +.Sp +\f(CW\fBa/A\fR\fR \- The Adobe font metrics file (\f(CW.afm\fR). +\fBDefault: enabled\fR +.Sp +\f(CW\fBe/E\fR\fR \- The dvips encoding file (\f(CW.enc\fR). +\fBDefault: disabled\fR +.Ip "\(bu" 2 +\f(CW\fB-l \fIlanguage\fR[+\fIargument\fR]\fR\fR \- Extract the fonts for the specified language from a +multi-language Unicode font. If this option is not used the converter +tries to guess the language by the values of the shell variable \s-1LANG\s0. +If it is not able to guess the language by \s-1LANG\s0 it tries all the +languages in the order they are listed. +.Sp +After the plus sign an optional argument for the language extractor +may be specified. The format of the argument is absolutely up to +the particular language converter. The primary purpose of the +argument is to support selection of planes for the multi-plane +Eastern encodings but it can also be used in any other way. The +language extractor may decide to add the plane name in some form +to the name of the resulting font. None of the currently supported +languages make any use of the argument yet. +.Sp +As of now the following languages are supported: +.Sp +\ \ \f(CWlatin1\fR \- for all the languages using the Latin-1 encoding +.Sp +\ \ \f(CWlatin2\fR \- for the Central European languages +.Sp +\ \ \f(CWlatin4\fR \- for the Baltic languages +.Sp +\ \ \f(CWlatin5\fR \- for the Turkish language +.Sp +\ \ \f(CWcyrillic\fR \- for the languages with Cyrillic alphabet +.Sp +\ \ \f(CWrussian\fR \- historic synonym for cyrillic +.Sp +\ \ \f(CWbulgarian\fR \- historic synonym for cyrillic +.Sp +\ \ \f(CWadobestd\fR \- for the AdobeStandard encoding used by TeX +.Sp +\ \ \f(CWplane+\fIargument\fR\fR \- to select one plane from a multi-byte encoding +.Sp +The argument of the \*(L"\f(CWplane\fR\*(R" language may be in one of three forms: +.Sp +\ \ \f(CWplane+\fBpid=\fR\fI\fR\fB,eid=\fR\fI\fR\fR +.Sp +\ \ \f(CWplane+\fBpid=\fR\fI\fR\fB,eid=\fR\fI\fR\fB,\fR\fI\fR\fR +.Sp +\ \ \f(CWplane+\fI\fR\fR +.Sp +Pid (\s-1TTF\s0 platform id) and eid (\s-1TTF\s0 encoding id) select a particular +\s-1TTF\s0 encoding table in the original font. They are specified as decimal +numbers. If this particular encoding table is not present in the font +file then the conversion fails. The native ("ttf") front-end parser supports +only pid=3 (Windows platform), the FreeType-based ("ft") front-end supports +any platform. If pid/eid is not specified then the \s-1TTF\s0 encoding table is +determined as usual: Unicode encoding if it's first or an 8-bit encoding +if not (and for an 8-bit encoding the plane number is silently ignored). +To prevent the converter from falling back to an 8-bit encoding, specify +the Unicode pid/eid value explicitly. +.Sp +Plane_number is a hexadecimal (if starts with \*(L"\fB0x\fR") or decimal number. +It gives the values of upper bytes for which 256 characters will be +selected. If not specified, defaults to 0. It is also used as a font +name suffix (the leading \*(L"0x\*(R" is not included into the suffix). +.Sp +\fB\s-1NOTE\s0:\fR +You may notice that the language names are not uniform: some are the +names of particular languages and some are names of encodings. This +is because of the different approaches. The original idea was to +implement a conversion from Unicode to the appropriate Windows +encoding for a given language. And then use the translation tables +to generate the fonts in whatever final encodings are needed. This +would allow to pile together the Unicode fonts and the non-Unicode +Windows fonts for that language and let the program to sort them out +automatically. And then generate fonts in all the possible encodings +for that language. An example of this approach is the Russian language +support. But if there is no multiplicity of encodings used for some +languages and if the non-Unicode fonts are not considered important +by the users, another way would be simpler to implement: just provide +only one table for extraction of the target encoding from Unicode +and don't bother with the translation tables. The latin* \*(L"languages\*(R" +are examples of this approach. If somebody feels that he needs the +Type1 fonts both in Latin-* and Windows encodings he or she is absolutely +welcome to submit the code to implement it. +.Sp +\fB\s-1WARNING\s0:\fR +Some of the glyphs included into the AdobeStandard encoding are not +included into the Unicode standard. The most typical examples of such +glyphs are ligatures like \*(L'fi\*(R', \*(L'fl\*(R' etc. Because of this the font +designers may place them at various places. The converter tries to +do its best, if the glyphs have honest Adobe names and/or are +placed at the same codes as in the Microsoft fonts they will be +picked up. Otherwise a possible solution is to use the option \*(L'\fB\-L\fR\*(R' +with an external map. +.Ip "\(bu" 2 +\f(CW\fB-L \fIfile\fR[+[pid=\fI\fR,eid=\fI\fR,][\fIplane\fR]]\fR\fR \- Extract the fonts for the specified +language from a multi-language font using the map from this file. This is +rather like the option \*(L'\fB\-l\fR\*(R' but the encoding map is not +compiled into the program, it's taken from that file, so it's +easy to edit. Examples of such files are provided in +\f(CWmaps/adobe-standard-encoding.map\fR, \f(CWCP1250.map\fR. (\fB\s-1NOTE\s0:\fR +the \*(L'standard encoding\*(R' map does not include all the glyphs of the +AdobeStandard encoding, it's provided only as an example.) The +description of the supported map formats is in the file +\f(CWmaps/unicode-sample.map\fR. +.Sp +Likewise to \*(L'\fB\-l\fR\*(R', an argument may be specified after the map file +name. But in this case the argument has fixed meaning: it selects the +original \s-1TTF\s0 encoding table (the syntax is the same as in \*(L'\fB\-l plane\fR') +and/or a plane of the map file. The plane name also gets added after dash +to the font name. The plane is a concept used in the Eastern fonts with big +number of glyphs: one \s-1TTF\s0 font gets divided into multiple Type1 fonts, +each containing one plane of up to 256 glyphs. But with a little +creativity this concept may be used for other purposes of combining +multiple translation maps into one file. To extract multiple planes +from a \s-1TTF\s0 font \f(CWttf2pt1\fR must be run multiple times, each time with +a different plane name specified. +.Sp +The default original \s-1TTF\s0 encoding table used for the option \*(L'\fB\-L\fR\*(R' is +Unicode. The map files may include directives to specify different original +\s-1TTF\s0 encodings. However if the pid/eid pair is specified with +it overrides any original encoding specified in the map file. +.Ip "\(bu" 2 +\f(CW\fB-m \fItype\fR=\fIvalue\fR\fR\fR \- Set maximal or minimal limits of resources. +These limits control the the font generation by limiting the resources +that the font is permitted to require from the PostScript interpreter. +The currently supported types of limits are: +.Sp +\f(CW\fBh\fR\fR \- the maximal hint stack depth for the substituted hints. +The default value is 128, according to the limitation in X11. This seems to +be the lowest (and thus the safest) widespread value. To display the +hint stack depth required by each glyph in a \f(CW.t1a\fR file use the script +\f(CWscripts/cntstems.pl\fR. +.Ip "\(bu" 2 +\f(CW\fB-O \fIsuboptions\fR\fR\fR \- Outline processing options. The suboptions +may be lowercase or uppercase, the lowercase ones disable the features, +the corresponding uppercase suboptions enable the same features. +The suboptions to disable/enable features are: +.Sp +\f(CW\fBb/B\fR\fR \- Guessing of the ForceBold parameter. This parameter helps +the Type1 engine to rasterize the bold fonts properly at small sizes. +But the algorithm used to guess the proper value of this flag makes +that guess based solely on the font name. In rare cases that may cause +errors, in these cases you may want to disable this guessing. +\fBDefault: enabled\fR +.Sp +\f(CW\fBh/H\fR\fR \- Autogeneration of hints. The really complex outlines +may confuse the algorithm, so theoretically it may be useful +sometimes to disable them. Although up to now it seems that +even bad hints are better than no hints at all. +\fBDefault: enabled\fR +.Sp +\f(CW\fBu/U\fR\fR \- Hint substitution. Hint substitution is a technique +permitting generation of more detailed hints for the rasterizer. It allows +to use different sets of hints for different parts of a glyph and change +these sets as neccessary during rasterization (that's why \*(L"substituted"). +So it should improve the quality of the fonts rendered at small sizes. +But there are two catches: First, the X11 library has rather low limit for +the font size. More detailed hints increase the file size and thus increase +the chance of hitting this limit (that does not mean that you shall hit it +but you may if your fonts are particularly big). This is especially +probable for Unicode fonts converted with option \*(L'\fB\-a\fR\*(R', so you may want to +use \*(L'\fB\-a\fR\*(R' together with \*(L'\fB\-Ou\fR\*(R'. See \f(CWapp/X11/README\fR for the description of +a patch to X11 which fixes this problem. Second, some rasterizers (again, +X11 is the typical example) have a limitation for total number of hints +used when drawing a glyph (also known as the hint stack depth). If that +stack overflows the glyph is ignored. Starting from version 3.22 \f(CWttf2pt1\fR +uses algorithms to minimizing this depth, with the trade-off of slightly +bigger font files. The glyphs which still exceed the limit set by option +\&\*(R'\fB\-mh\fR\*(R' have all the substituted hints removed and only base hints left. +The algorithms seem to have been refined far enough to make the fonts with +substituted hints look better than the fonts without them or at least the +same. Still if the original fonts are not well-designed the detailed +hinting may emphasize the defects of the design, such as non-even thickness +of lines. So provided that you are not afraid of the X11 bug the best idea +would be to generate a font with this feature and without it, then compare +the results using the program \f(CWother/cmpf\fR (see the description +in \f(CWother/README\fR) and decide which one looks better. +\fBDefault: enabled\fR +.Sp +\f(CW\fBo/O\fR\fR \- Space optimization of the outlines\*(R' code. This kind of optimization +never hurts, and the only reason to disable this feature is for comparison +of the generated fonts with the fonts generated by the previous versions of +converter. Well, it _almost_ never hurts. As it turned out there exist +some brain-damaged printers which don't understand it. Actually this +feature does not change the outlines at all. The Type 1 font manual +provides a set of redundant operators that make font description shorter, +such as \*(L'10 hlineto\*(R' instead of \*(L'0 10 rlineto\*(R' to describe a horizontal +line. This feature enables use of these operators. +\fBDefault: enabled\fR +.Sp +\f(CW\fBs/S\fR\fR \- Smoothing of outlines. If the font is broken in some +way (even the ones that are not easily noticeable), such smoothing +may break it further. So disabling this feature is the first thing to be +tried if some font looks odd. But with smoothing off the hint generation +algorithms may not work properly too. +\fBDefault: enabled\fR +.Sp +\f(CW\fBt/T\fR\fR \- Auto-scaling to the 1000x1000 Type1 standard matrix. The +\s-1TTF\s0 fonts are described in terms of an arbitrary matrix up to +4000x4000. The converted fonts must be scaled to conform to +the Type1 standard. But the scaling introduces additional rounding +errors, so it may be curious sometimes to look at the font in its +original scale. +\fBDefault: enabled\fR +.Sp +\f(CW\fBv/V\fR\fR \- Do vectorization on the bitmap fonts. Functionally +\*(L"vectorization\*(R" is the same thing as \*(L"autotracing\*(R", a different word is +used purely to differentiate it from the Autotrace library. It tries to +produce nice smooth outlines from bitmaps. This feature is still a work +in progress though the results are already mostly decent. +\fBDefault: disabled\fR +.Sp +\f(CW\fBw/W\fR\fR \- Glyphs\*(R' width corection. This option is designed to be +used on broken fonts which specify too narrow widths for the +letters. You can tell that a font can benefit from this option +if you see that the characters are smashed together without +any whitespace between them. This option causes the converter +to set the character widths to the actual width of this character +plus the width of a typical vertical stem. But on the other hand +the well-designed fonts may have characters that look better if +their widths are set slightly narrower. Such well-designed fonts +will benefit from disabling this feature. You may want to convert +a font with and without this feature, compare the results and +select the better one. This feature may be used only on proportional +fonts, it has no effect on the fixed-width fonts. +\fBDefault: disabled\fR +.Sp +\f(CW\fBz/Z\fR\fR \- Use the Autotrace library on the bitmap fonts. The results +are horrible and \fBthe use of this option is not recommended\fR. This option is +present for experimental purposes. It may change or be removed in the +future. The working tracing can be achieved with option \f(CW\fB-OV\fR\fR. +\fBDefault: disabled\fR +.Ip "\(bu" 2 +\f(CW\fB-p \fIparser_name\fR\fR\fR \- Use the specified front-end parser to read the font file. +If this option is not used, ttf2pt1 selects the parser automatically based +on the suffix of the font file name, it uses the first parser in its +list that supports this font type. Now two parsers are supported: +.Sp +\ \ \f(CWttf\fR \- built-in parser for the ttf files (suffix \f(CW.ttf\fR) +.Sp +\ \ \f(CWbdf\fR \- built-in parser for the \s-1BDF\s0 files (suffix \f(CW.bdf\fR) +.Sp +\ \ \f(CWft\fR \- parser based on the FreeType-2 library (suffixes \f(CW.ttf\fR, +\&\f(CW.otf\fR, \f(CW.pfa\fR, \f(CW.pfb\fR) +.Sp +The parser \f(CWft\fR is \fB\s-1NOT\s0\fR linked in by default. See \f(CWMakefile\fR +for instructions how to enable it. We do no support this parser on +Windows: probably it will work but nobody tried and nobody knows how +to build it. +.Sp +The conversion of the bitmap fonts (such as \s-1BDF\s0) is simplistic yet, +producing jagged outlines. When converting such fonts, it might be +a good idea to turn off the hint substitution (using option \fB\-Ou\fR) +because the hints produced will be huge but not adding much to the +quality of the fonts. +.Ip "\(bu" 2 +\f(CW\fB-u \fInumber\fR\fR\fR \- Mark the font with this value as its +UniqueID. The UniqueID is used by the printers with the hard disks +to cache the rasterized characters and thus significantly +speed-up the printing. Some of those printers just can't +store the fonts without UniqueID on their disk.The problem +is that the \s-1ID\s0 is supposed to be unique, as it name says. And +there is no easy way to create a guaranteed unique \s-1ID\s0. Adobe specifies +the range 4000000-4999999 for private IDs but still it's difficult +to guarantee the uniqueness within it. So if you don't really need the +UniqueID don't use it, it's optional. Luckily there are a few millions of +possible IDs, so the chances of collision are rather low. +If instead of the number a special value \*(L'\f(CW\fBA\fR\fR\*(R' is given +then the converter generates the value of UniqueID automatically, +as a hash of the font name. (\fB\s-1NOTE\s0:\fR in the version 3.22 the +algorithm for autogeneration of UniqueID was changed to fit the values +into the Adobe-spacified range. This means that if UniqueIDs were used +then the printer's cache may need to be flushed before replacing the +fonts converted by an old version with fonts converted by a newer version). +A simple way to find if any of the fonts in a given directory have +duplicated UniqueIDs is to use the command: +.Sp +\f(CW\ \ cat *.pf[ab] | grep UniqueID | sort | uniq -c | grep -v ' 1 '\fR +.Sp +Or if you use \f(CWscripts/convert\fR it will do that for you automatically +plus it will also give the exact list of files with duplicate UIDs. +.Ip "\(bu" 2 +\f(CW\fB-v \fIsize\fR\fR\fR \- Re-scale the font to get the size of a typical uppercase +letter somewhere around the specified size. Actually, it re-scales +the whole font to get the size of one language-dependent letter to be +at least of the specified size. Now this letter is \*(L"A\*(R" in all the +supported languages. The size is specified in the points of the +Type 1 coordinate grids, the maximal value is 1000. This is an +experimental option and should be used with caution. It tries to +increase the visible font size for a given point size and thus make +the font more readable. But if overused it may cause the fonts to +look out of scale. As of now the interesting values of size for +this option seem to be located mostly between 600 and 850. This +re-scaling may be quite useful but needs more experience to +understand the balance of its effects. +.Ip "\(bu" 2 +\f(CW\fB-W \fIlevel\fR\fR\fR \- Select the verbosity level of the warnings. +Currently the levels from 0 to 4 are supported. Level 0 means no warnings +at all, level 4 means all the possible warnings. The default level is 3. +Other levels may be added in the future, so using the level number 99 is +recommended to get all the possible warnings. Going below level 2 is +not generally recommended because you may miss valuable information about +the problems with the fonts being converted. +.Ip "\(bu" 2 +\fBObsolete option:\fR +\f(CW\fB-A\fR\fR \- Print the font metrics (.afm file) instead of the font on \s-1STDOUT\s0. +Use \fB\-\s-1GA\s0\fR instead. +.Ip "\(bu" 2 +\fBVery obsolete option:\fR +.Sp +The algorithm that implemented the forced fixed width had major +flaws, so it was disabled. The code is still in the program and +some day it will be refined and returned back. Meanwhile the +option name \*(L'\fB\-f\fR\*(R' was reused for another option. The old version was: +.Sp +\f(CW\fB-f\fR\fR \- Don't try to force the fixed width of font. Normally the converter +considers the fonts in which the glyph width deviates by not more +than 5% as buggy fixed width fonts and forces them to have really +fixed width. If this is undesirable, it can be disabled by this option. +.PP +The \f(CW.pfa\fR font format supposes that the description of the characters +is binary encoded and encrypted. This converter does not encode or +encrypt the data by default, you have to specify the option \*(L'\fB\-e\fR\*(R' +or use the \f(CWt1asm\fR program to assemble (that means, encode and +encrypt) the font program. The \f(CWt1asm\fR program that is included with +the converter is actually a part of the \f(CWt1utils\fR package, rather old +version of which may be obtained from +.PP +http://ttf2pt1.sourceforge.net/t1utils.tar.gz +.PP +Note that \f(CWt1asm\fR from the old version of that package won't work properly +with the files generated by \f(CWttf2pt1\fR version 3.20 and later. Please use +\f(CWt1asm\fR packaged with \f(CWttf2pt1\fR or from the new version \f(CWt1utils\fR +instead. For a newer version of \f(CWt1utils\fR please look at +.PP +http://www.lcdf.org/~eddietwo/type/ +.SH "EXAMPLES" +So, the following command lines: +.PP +\f(CWttf2pt1 -e ttffont.ttf t1font\fR +.PP +\f(CWttf2pt1 ttffont.ttf - | t1asm >t1font.pfa\fR +.PP +represent two ways to get a working font. The benefit of the second form +is that other filters may be applied to the font between the converter +and assembler. +.SH "FILES" +.Ip "\(bu" 2 +\s-1TTF2PT1_LIBXDIR/\s0t1asm +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR\s0/* +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/\s0scripts/* +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/\s0other/* +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/README\s0 +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/FONTS\s0 +.SH "SEE ALSO" +.Ip "\(bu" 4 +the \fIttf2pt1_convert(1)\fR manpage +.Ip "\(bu" 4 +the \fIttf2pt1_x2gs(1)\fR manpage +.Ip "\(bu" 4 +the \fIt1asm(1)\fR manpage +.Ip "\(bu" 4 +ttf2pt1-announce@lists.sourceforge.net +.Sp +The mailing list with announcements about ttf2pt1. It is a moderated mailing +with extremely low traffic. Everyone is encouraged to subscribe to keep in +touch with the current status of project. To subscribe use the Web interface +at http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-announce. +If you have only e-mail access to the Net then send a subscribe request to +the development mailing list ttf2pt1-devel@lists.sourceforge.net and somebody +will help you with subscription. +.Ip "\(bu" 4 +ttf2pt1-devel@lists.sourceforge.net +.Sp +ttf2pt1-users@lists.sourceforge.net +.Sp +The ttf2pt1 mailing lists for development and users issues. They have not +that much traffic either. To subscribe use the Web interface at +http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-devel +and http://lists.sourceforge.net/mailman/listinfo/ttf2pt1-users. +If you have only e-mail access to the Net then send a subscribe request to +the development mailing list ttf2pt1-devel@lists.sourceforge.net and somebody +will help you with subscription. +.Ip "\(bu" 4 +http://ttf2pt1.sourceforge.net +.Sp +The main page of the project. +.Sp +http://www.netspace.net.au/~mheath/ttf2pt1/ +.Sp +The old main page of the project. +.SH "BUGS" +It seems that many Eastern fonts use features of the TTF format that are +not supported by the ttf2pt1's built-in front-end parser. Because of +this for now we recommend using the FreeType-based parser (option +\&\*(R'\fB\-p ft\fR') with the \*(L"\f(CWplane\fR\*(R" language. +.Sh "Troubleshooting and bug reports" +Have problems with conversion of some font ? The converter dumps core ? Or your +printer refuses to understand the converted fonts ? Or some characters are +missing ? Or some characters look strange ? +.PP +Send the bug reports to the ttf2pt1 development mailing list at +ttf2pt1-devel@lists.sourceforge.net. +.PP +Try to collect more information about the problem and include it into +the bug report. (Of course, even better if you would provide a ready +fix, but just a detailed bug report is also good). Provide detailed +information about your problem, this will speed up the response greatly. +Don't just write \*(L"this font looks strange after conversion\*(R" but describe +what's exactly wrong with it: for example, what characters look wrong +and what exactly is wrong about their look. Providing a link to the +original font file would be also a good idea. Try to do a little +troublehooting and report its result. This not only would help with +the fix but may also give you a temporary work-around for the bug. +.PP +First, enable full warnings with option \*(L'\fB\-W99\fR\*(R', save them to +a file and read carefully. Sometimes the prolem is with a not implemented +feature which is reported in the warnings. Still, reporting about such +problems may be a good idea: some features were missed to cut corners, +in hope that no real font is using them. So a report about a font using +such a feature may motivate someone to implement it. Of course, you +may be the most motivated person: after all, you are the one wishing +to convert that font. ;\-) Seriously, the philosophy \*(L"scrath your own itch\*(R" +seems to be the strongest moving force behind the Open Source software. +.PP +The next step is playing with the options. This serves a dual purpose: +on one hand, it helps to localize the bug, on the other hand you may be +able to get a working version of the font for the meantime while the +bug is being fixed. The typical options to try out are: first \*(L'\fB\-Ou\fR\*(R', if +it does not help then \*(L'\fB\-Os\fR\*(R', then \*(L'\fB\-Oh\fR\*(R', then \*(L'\fB\-Oo\fR\*(R'. +They are described in a bit more detail above. Try them one by one +and in combinations. See if with them the resulting fonts look better. +.PP +On some fonts ttf2pt1 just crashes. Commonly that happens because the +font being converted is highly defective (although sometimes the bug +is in ttf2pt1 itself). In any case it should not crash, so the reports +about such cases will help to handle these defects properly in future. +.PP +We try to respond to the bug reports in a timely fashion but alas, this +may not always be possible, especially if the problem is complex. +This is a volunteer project and its resources are limited. Because +of this we would appreciate bug reports as detailed as possible, +and we would appreciate the ready fixes and contributions even more. +.SH "HISTORY" +Based on ttf2pfa by Andrew Weeks, and help from Frank Siegert. +.PP +Modification by Mark Heath. +.PP +Further modification by Sergey Babkin. +.PP +The Type1 assembler by I. Lee Hetherington with modifications by +Kai-Uwe Herbing. + +.rn }` '' +.IX Title "TTF2PT1 1" +.IX Name "TTF2PT1 - A True Type to PostScript Type 1 Font Converter" + +.IX Header "NAME" + +.IX Header "SYNOPSIS" + +.IX Header "DESCRIPTION" + +.IX Header "OPTIONS" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Header "EXAMPLES" + +.IX Header "FILES" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Header "SEE ALSO" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Header "BUGS" + +.IX Subsection "Troubleshooting and bug reports" + +.IX Header "HISTORY" + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1.c b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1.c new file mode 100755 index 00000000..5e7b9c8f --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1.c @@ -0,0 +1,2694 @@ +/* + * True Type Font to Adobe Type 1 font converter + * By Mark Heath + * Based on ttf2pfa by Andrew Weeks + * With help from Frank M. Siegert + * + * see COPYRIGHT for full copyright notice + * +*********************************************************************** + * + * Orion Richardson + * + * Added bounding box calculations for Unicode glyphs in the .ufm file + * +*********************************************************************** + * + * Steven Wittens + * + * Added generation of .ufm file + * +*********************************************************************** + * + * Sergey Babkin , + * + * Added post-processing of resulting outline to correct the errors + * both introduced during conversion and present in the original font, + * autogeneration of hints (has yet to be improved though) and BlueValues, + * scaling to 1000x1000 matrix, option to print the result on STDOUT, + * support of Unicode to CP1251 conversion, optimization of the + * resulting font code by space (that improves the speed too). Excluded + * the glyphs that are unaccessible through the encoding table from + * the output file. Added the built-in Type1 assembler (taken from + * the `t1utils' package). + * +*********************************************************************** + * + * Thomas Henlich + * + * Added generation of .afm file (font metrics) + * Read encoding information from encoding description file + * Fixed bug in error message about unknown language ('-l' option) + * Added `:' after %%!PS-AdobeFont-1.0 + * changed unused entries in ISOLatin1Encoding[] from .notdef to c127,c128... + * +*********************************************************************** + * + * Thomas Henlich + * + * Added generation of .afm file (font metrics) + * +*********************************************************************** + * + * Bug Fixes: +************************************************************************ + * + * Sun, 21 Jun 1998 Thomas Henlich + * 1. "width" should be "short int" because otherwise: + * characters with negative widths (e.g. -4) become *very* wide (65532) + * 2. the number of /CharStrings is numglyphs and not numglyphs+1 + * +*********************************************************************** + * + * + * + * The resultant font file produced by this program still needs to be ran + * through t1asm (from the t1utils archive) to produce a completely valid + * font. + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _GNU_SOURCE +#include +#endif + +#ifndef WINDOWS +# include +# include +# define BITBUCKET "/dev/null" +# include +#else +# define WINDOWS_FUNCTIONS /* ask to define functions - in one file only */ +# include "windows.h" +# define BITBUCKET "NUL" +# define snprintf _snprintf +#endif + +#include "pt1.h" +#include "global.h" +#include "version.h" + +/* globals */ + +/* table of front-ends */ + +extern struct frontsw ttf_sw; +extern struct frontsw bdf_sw; +#if defined(USE_FREETYPE) + extern struct frontsw freetype_sw; +#endif + +struct frontsw *frontswtab[] = { + &bdf_sw, +#if defined(USE_FREETYPE) && defined(PREFER_FREETYPE) + &freetype_sw, +#endif + &ttf_sw, +#if defined(USE_FREETYPE) && !defined(PREFER_FREETYPE) + &freetype_sw, +#endif + NULL /* end of table */ +}; + +struct frontsw *cursw=0; /* the active front end */ +char *front_arg=""; /* optional argument */ + +/* options */ +int encode = 0; /* encode the resulting file */ +int pfbflag = 0; /* produce compressed file */ +int wantafm=0; /* want to see .afm instead of .t1a on stdout */ +int correctvsize=0; /* try to correct the vertical size of characters */ +int wantuid = 0; /* user wants UniqueID entry in the font */ +int allglyphs = 0; /* convert all glyphs, not only 256 of them */ +int warnlevel = 3; /* the level of permitted warnings */ +int forcemap = 0; /* do mapping even on non-Unicode fonts */ +/* options - maximal limits */ +int max_stemdepth = 128; /* maximal depth of stem stack in interpreter (128 - limit from X11) */ +/* options - debugging */ +int absolute = 0; /* print out in absolute values */ +int reverse = 1; /* reverse font to Type1 path directions */ +/* options - suboptions of Outline Processing, defaults are set in table */ +int optimize; /* enables space optimization */ +int smooth; /* enable smoothing of outlines */ +int transform; /* enables transformation to 1000x1000 matrix */ +int hints; /* enables autogeneration of hints */ +int subhints; /* enables autogeneration of substituted hints */ +int trybold; /* try to guess whether the font is bold */ +int correctwidth; /* try to correct the character width */ +int vectorize; /* vectorize the bitmaps */ +int use_autotrace; /* use the autotrace library on bitmap */ +/* options - suboptions of File Generation, defaults are set in table */ +int gen_pfa; /* generate the font file */ +int gen_afm; /* generate the metrics file */ +int gen_ufm; /* generate the unicode metrics file */ +int gen_dvienc; /* generate the dvips encoding file */ + +/* not quite options to select a particular source encoding */ +int force_pid = -1; /* specific platform id */ +int force_eid = -1; /* specific encoding id */ + +/* structure to define the sub-option lists controlled by the + * case: uppercase enables them, lowercase disables + */ +struct subo_case { + char disbl; /* character to disable - enforced lowercase */ + char enbl; /* character to enable - auto-set as toupper(disbl) */ + int *valp; /* pointer to the actual variable containing value */ + int dflt; /* default value */ + char *descr; /* description */ +}; + +int debug = DEBUG; /* debugging flag */ + +FILE *null_file, *pfa_file, *afm_file, *ufm_file, *dvienc_file; +int numglyphs; +struct font_metrics fontm; + +/* non-globals */ +static char *strUID = 0; /* user-supplied UniqueID */ +static unsigned long numUID; /* auto-generated UniqueID */ + +static int ps_fmt_3 = 0; +static double scale_factor, original_scale_factor; + +static char *glyph_rename[ENCTABSZ]; + +/* the names assigned if the original font + * does not specify any + */ + +static char *Fmt3Encoding[256] = { + "c0", "c1", "c2", "c3", + "c4", "c5", "c6", "c7", + "c8", "c9", "c10", "c11", + "c12", "CR", "c14", "c15", + "c16", "c17", "c18", "c19", + "c20", "c21", "c22", "c23", + "c24", "c25", "c26", "c27", + "c28", "c29", "c30", "c31", + "space", "exclam", "quotedbl", "numbersign", + "dollar", "percent", "ampersand", "quotesingle", + "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", + "zero", "one", "two", "three", + "four", "five", "six", "seven", + "eight", "nine", "colon", "semicolon", + "less", "equal", "greater", "question", + "at", "A", "B", "C", + "D", "E", "F", "G", + "H", "I", "J", "K", + "L", "M", "N", "O", + "P", "Q", "R", "S", + "T", "U", "V", "W", + "X", "Y", "Z", "bracketleft", + "backslash", "bracketright", "asciicircum", "underscore", + "grave", "a", "b", "c", + "d", "e", "f", "g", + "h", "i", "j", "k", + "l", "m", "n", "o", + "p", "q", "r", "s", + "t", "u", "v", "w", + "x", "y", "z", "braceleft", + "bar", "braceright", "asciitilde", "c127", + "c128", "c129", "quotesinglbase", "florin", + "quotedblbase", "ellipsis", "dagger", "daggerdbl", + "circumflex", "perthousand", "Scaron", "guilsinglleft", + "OE", "c141", "c142", "c143", + "c144", "quoteleft", "quoteright", "quotedblleft", + "quotedblright", "bullet", "endash", "emdash", + "tilde", "trademark", "scaron", "guilsinglright", + "oe", "c157", "c158", "Ydieresis", + "nbspace", "exclamdown", "cent", "sterling", + "currency", "yen", "brokenbar", "section", + "dieresis", "copyright", "ordfeminine", "guillemotleft", + "logicalnot", "sfthyphen", "registered", "macron", + "degree", "plusminus", "twosuperior", "threesuperior", + "acute", "mu", "paragraph", "periodcentered", + "cedilla", "onesuperior", "ordmasculine", "guillemotright", + "onequarter", "onehalf", "threequarters", "questiondown", + "Agrave", "Aacute", "Acircumflex", "Atilde", + "Adieresis", "Aring", "AE", "Ccedilla", + "Egrave", "Eacute", "Ecircumflex", "Edieresis", + "Igrave", "Iacute", "Icircumflex", "Idieresis", + "Eth", "Ntilde", "Ograve", "Oacute", + "Ocircumflex", "Otilde", "Odieresis", "multiply", + "Oslash", "Ugrave", "Uacute", "Ucircumflex", + "Udieresis", "Yacute", "Thorn", "germandbls", + "agrave", "aacute", "acircumflex", "atilde", + "adieresis", "aring", "ae", "ccedilla", + "egrave", "eacute", "ecircumflex", "edieresis", + "igrave", "iacute", "icircumflex", "idieresis", + "eth", "ntilde", "ograve", "oacute", + "ocircumflex", "otilde", "odieresis", "divide", + "oslash", "ugrave", "uacute", "ucircumflex", + "udieresis", "yacute", "thorn", "ydieresis" +}; + +#ifdef notdef /* { */ +/* This table is not used anywhere in the code + * so it's ifdef-ed out by default but left in + * the source code for reference purposes (and + * possibly for future use) + */ + +static char *ISOLatin1Encoding[256] = { + ".null", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", "CR", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + "space", "exclam", "quotedbl", "numbersign", + "dollar", "percent", "ampersand", "quoteright", + "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", + "zero", "one", "two", "three", + "four", "five", "six", "seven", + "eight", "nine", "colon", "semicolon", + "less", "equal", "greater", "question", + "at", "A", "B", "C", + "D", "E", "F", "G", + "H", "I", "J", "K", + "L", "M", "N", "O", + "P", "Q", "R", "S", + "T", "U", "V", "W", + "X", "Y", "Z", "bracketleft", + "backslash", "bracketright", "asciicircum", "underscore", + "grave", "a", "b", "c", + "d", "e", "f", "g", + "h", "i", "j", "k", + "l", "m", "n", "o", + "p", "q", "r", "s", + "t", "u", "v", "w", + "x", "y", "z", "braceleft", + "bar", "braceright", "asciitilde", "c127", + "c128", "c129", "quotesinglbase", "florin", + "quotedblbase", "ellipsis", "dagger", "daggerdbl", + "circumflex", "perthousand", "Scaron", "guilsinglleft", + "OE", "c141", "c142", "c143", + "c144", "quoteleft", "quoteright", "quotedblleft", + "quotedblright", "bullet", "endash", "emdash", + "tilde", "trademark", "scaron", "guilsinglright", + "oe", "c157", "c158", "Ydieresis", + "nbspace", "exclamdown", "cent", "sterling", + "currency", "yen", "brokenbar", "section", + "dieresis", "copyright", "ordfeminine", "guillemotleft", + "logicalnot", "sfthyphen", "registered", "macron", + "degree", "plusminus", "twosuperior", "threesuperior", + "acute", "mu", "paragraph", "periodcentered", + "cedilla", "onesuperior", "ordmasculine", "guillemotright", + "onequarter", "onehalf", "threequarters", "questiondown", + "Agrave", "Aacute", "Acircumflex", "Atilde", + "Adieresis", "Aring", "AE", "Ccedilla", + "Egrave", "Eacute", "Ecircumflex", "Edieresis", + "Igrave", "Iacute", "Icircumflex", "Idieresis", + "Eth", "Ntilde", "Ograve", "Oacute", + "Ocircumflex", "Otilde", "Odieresis", "multiply", + "Oslash", "Ugrave", "Uacute", "Ucircumflex", + "Udieresis", "Yacute", "Thorn", "germandbls", + "agrave", "aacute", "acircumflex", "atilde", + "adieresis", "aring", "ae", "ccedilla", + "egrave", "eacute", "ecircumflex", "edieresis", + "igrave", "iacute", "icircumflex", "idieresis", + "eth", "ntilde", "ograve", "oacute", + "ocircumflex", "otilde", "odieresis", "divide", + "oslash", "ugrave", "uacute", "ucircumflex", + "udieresis", "yacute", "thorn", "ydieresis" +}; + +#endif /* } notdef */ + +static char *adobe_StandardEncoding[256] = { + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + "space", "exclam", "quotedbl", "numbersign", + "dollar", "percent", "ampersand", "quoteright", + "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", + "zero", "one", "two", "three", + "four", "five", "six", "seven", + "eight", "nine", "colon", "semicolon", + "less", "equal", "greater", "question", + "at", "A", "B", "C", "D", "E", "F", "G", + "H", "I", "J", "K", "L", "M", "N", "O", + "P", "Q", "R", "S", "T", "U", "V", "W", + "X", "Y", "Z", "bracketleft", + "backslash", "bracketright", "asciicircum", "underscore", + "quoteleft", "a", "b", "c", "d", "e", "f", "g", + "h", "i", "j", "k", "l", "m", "n", "o", + "p", "q", "r", "s", "t", "u", "v", "w", + "x", "y", "z", "braceleft", + "bar", "braceright", "asciitilde", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", "exclamdown", "cent", "sterling", + "fraction", "yen", "florin", "section", + "currency", "quotesingle", "quotedblleft", "guillemotleft", + "guilsinglleft", "guilsinglright", "fi", "fl", + ".notdef", "endash", "dagger", "daggerdbl", + "periodcentered", ".notdef", "paragraph", "bullet", + "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", + "ellipsis", "perthousand", ".notdef", "questiondown", + ".notdef", "grave", "acute", "circumflex", + "tilde", "macron", "breve", "dotaccent", + "dieresis", ".notdef", "ring", "cedilla", + ".notdef", "hungarumlaut", "ogonek", "caron", + "emdash", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", "AE", ".notdef", "ordfeminine", + ".notdef", ".notdef", ".notdef", ".notdef", + "Lslash", "Oslash", "OE", "ordmasculine", + ".notdef", ".notdef", ".notdef", ".notdef", + ".notdef", "ae", ".notdef", ".notdef", + ".notdef", "dotlessi", ".notdef", ".notdef", + "lslash", "oslash", "oe", "germandbls", + ".notdef", ".notdef", ".notdef", ".notdef" +}; + +/* + * Decription of the supported conversions from Unicode + * + * SB + * Yes, I know that the compiled-in conversion is stupid but + * it is simple to implement and allows not to worry about the + * filesystem context. After all, the source is always available + * and adding another language to it is easy. + * + * The language name is expected to be the same as the subdirectory name + * in the `encodings' directory (for possible future extensions). + * The primary use of the aliases is for guessing based on the current + * locale. + */ + +#define MAXUNIALIAS 10 +#define MAXUNITABLES 3 + +/* the character used as the language argument separator */ +#define LANG_ARG_SEP '+' + + +/* + * Types of language-related routines. Arguments are: + * name is the glyph name + * arg is the user-specified language-dependent argument + * which can for example select the subfont plane for Eastern fonts. + * If none is supplied by user then an empty string ("") is passed. + * If no language is specified by user and auto-guessing happens + * then NULL is passed. + * when shows if the conversion by name was called before conversion by + * map or after (it's called twice) + */ + +/* type of the Unicode map initialization routine */ +typedef void uni_init_t(char *arg); + +/* type of Unicode converter-by-name function + * it's called for each glyph twice: one time for each glyph + * before doing conversion by map and one time after + */ +typedef int uni_conv_t(char *name, char *arg, int when); +#define UNICONV_BYNAME_BEFORE 0 +#define UNICONV_BYNAME_AFTER 1 + +struct uni_language { + uni_init_t *init[MAXUNITABLES]; /* map initialization routines */ + uni_conv_t *convbyname; /* the name-based conversion function */ + char *name; /* the language name */ + char *descr; /* description */ + char *alias[MAXUNIALIAS]; /* aliases of the language name */ + int sample_upper; /* code of some uppercase character for correctvsize() */ +}; + +/* the converter routines have an option of adding this suffix to the font name */ +static char *uni_font_name_suffix = ""; /* empty by default */ +/* this buffer may be used to store the suffix */ +#define UNI_MAX_SUFFIX_LEN 100 +static char uni_suffix_buf[UNI_MAX_SUFFIX_LEN+1]; + +/* + * Prototypes of the conversion routines + */ + +static uni_init_t unicode_latin1; +static uni_init_t unicode_latin2; +static uni_init_t unicode_latin4; +static uni_init_t unicode_latin5; +static uni_init_t unicode_cyrillic; +static uni_init_t unicode_adobestd; +static uni_init_t unicode_plane; +static uni_conv_t unicode_adobestd_byname; + +static uni_init_t unicode_init_user; + +/* + * The order of descriptions is important: if we can't guess the + * language we just call all the conversion routines in order until + * we find one that understands this glyph. + */ +static struct uni_language uni_lang[]= { + /* pseudo-language for all the languages using Latin1 */ + { + { unicode_latin1 }, + 0, /* no name-based mapping */ + "latin1", + "works for most of the Western languages", + { "en_", "de_", "fr_", "nl_", "no_", "da_", "it_" }, + 'A' + }, + { /* by Szalay Tamas */ + { unicode_latin2 }, + 0, /* no name-based mapping */ + "latin2", + "works for Central European languages", + { "hu_","pl_","cz_","si_","sk_" }, + 'A' + }, + { /* by Rièardas Èepas */ + { unicode_latin4 }, + 0, /* no name-based mapping */ + "latin4", + "works for Baltic languages", + { "lt_", "lv_" }, /* doubt about ee_ */ + 'A' + }, + { /* by Turgut Uyar */ + { unicode_latin5 }, + 0, /* no name-based mapping */ + "latin5", + "for Turkish", + { "tr_" }, + 'A' + }, + { /* by Zvezdan Petkovic */ + { unicode_cyrillic, unicode_latin1 }, + 0, /* no name-based mapping */ + "cyrillic", + "in Windows encoding", + { "bg_", "be_", "mk_", "ru_", "sr_", "su_", "uk_" }, + 'A' + }, + { + { unicode_cyrillic, unicode_latin1 }, + 0, /* no name-based mapping */ + "russian", + "obsolete, use cyrillic instead", + { 0 }, + 'A' + }, + { + { unicode_cyrillic, unicode_latin1 }, + 0, /* no name-based mapping */ + "bulgarian", + "obsolete, use cyrillic instead", + { 0 }, + 'A' + }, + { + { unicode_adobestd }, + unicode_adobestd_byname, + "adobestd", + "Adobe Standard, expected by TeX", + { NULL }, + 'A' + }, + { + { unicode_plane }, + 0, /* no name-based mapping */ + "plane", + "one plane of Unicode or other multi-byte encoding as is", + { NULL }, + 0 /* no easy way to predict the capital letters */ + }, +}; + +static struct uni_language uni_lang_user = { + { unicode_init_user }, + 0, /* no name-based mapping */ + 0, /* no name */ + 0, /* no description */ + { 0 }, + 0 /* no sample */ +}; + +static struct uni_language *uni_lang_selected=0; /* 0 means "unknown, try all" */ +static int uni_sample='A'; /* sample of an uppercase character */ +static char *uni_lang_arg=""; /* user-supplied language-dependent argument */ + +extern int runt1asm(int); + +/* + * user-defined loadable maps + */ + + +/* The idea begind buckets is to avoid comparing every code with all ENCTABSZ codes in table. + * All the 16-bit unicode space is divided between a number of equal-sized buckets. + * Initially all the buckets are marked with 0. Then if any code in the bucket is + * used it's marked with 1. Later during translation we check the code's bucket first + * and it it's 0 then return failure right away. This may be useful for + * Chinese fonts with many thousands of glyphs. + */ + +#define BUCKET_ID_BITS 11 +#define MARK_UNI_BUCKET(unicode) SET_BITMAP(uni_user_buckets, (unicode)>>(16-BUCKET_ID_BITS)) +#define IS_UNI_BUCKET(unicode) IS_BITMAP(uni_user_buckets, (unicode)>>(16-BUCKET_ID_BITS)) + +static DEF_BITMAP(uni_user_buckets, 1< UNI_MAX_SUFFIX_LEN-1) + arg = NULL; + else { + sprintf(uni_suffix_buf, "-%s", arg); + uni_font_name_suffix = uni_suffix_buf; + } + } + + /* now read in the encoding description file, if requested */ + if ((unicode_map_file = fopen(path, "r")) == NULL) { + fprintf(stderr, "**** Cannot access map file '%s' ****\n", path); + exit(1); + } + + sawplane = 0; + if(arg==NULL) + enabled = found = 1; + else + enabled = found = 0; + + lineno=0; curpos=0; + while (fgets (buffer, UNIBFSZ, unicode_map_file) != NULL) { + char name[UNIBFSZ]; + + lineno++; + + if(sscanf(buffer, "plane %s", name)==1) { + sawplane = 1; + if(arg == 0) { + fprintf(stderr, "**** map file '%s' requires plane name\n", path); + fprintf(stderr, "for example:\n"); + fprintf(stderr, " ttf2pt1 -L %s%c[pid=N,eid=N,]%s ...\n", + path, LANG_ARG_SEP, name); + fprintf(stderr, "to select plane '%s'\n", name); + exit(1); + } + if( !strcmp(arg, name) ) { + enabled = found = 1; + curpos = 0; + } else { + enabled = 0; + if(found) /* no need to read further */ + break; + } + continue; + } + + if(sscanf(buffer, "id %d %d", pid, eid)==2) { + if( !overid /* only if the user has not overriden */ + && (enabled || !sawplane) ) { + force_pid = pid; force_eid = eid; + forcemap = 1; + } + continue; + } + + if( !enabled ) + continue; /* skip to the next plane */ + + if( sscanf(buffer, "at %i", &curpos) == 1 ) { + if(curpos > 255) { + fprintf(stderr, "**** map file '%s' line %d: code over 255\n", path, lineno); + exit(1); + } + if(ISDBG(EXTMAP)) fprintf(stderr, "=== at 0x%x\n", curpos); + continue; + } + + /* try the format of Roman Czyborra's files */ + if ( sscanf (buffer, " =%x U+%4x", &code, &unicode) == 2 + /* try the format of Linux locale charmap file */ + || sscanf (buffer, " <%*s /x%x ", &code, &unicode) == 2 ) { + if (code < ENCTABSZ) { + if(code >= enctabsz) enctabsz=code+1; + unicode_map[code] = unicode; + glyph_rename[code] = NULL; + } + } + /* try the format with glyph renaming */ + else if (sscanf (buffer, " !%x U+%4x %128s", &code, + &unicode, name) == 3) { + if (code < ENCTABSZ) { + if(code >= enctabsz) enctabsz=code+1; + unicode_map[code] = unicode; + glyph_rename[code] = strdup(name); + } + } + /* try the compact sequence format */ + else if( (n=sscanf(buffer, " %i%n", &unicode, &cnt)) == 1 ) { + p = buffer; + do { + if(curpos > 255) { + fprintf(stderr, "**** map file '%s' line %d: code over 255 for unicode 0x%x\n", + path, lineno, unicode); + exit(1); + } + if(ISDBG(EXTMAP)) fprintf(stderr, "=== 0x%d -> 0x%x\n", curpos, unicode); + unicode_map[curpos++] = unicode; + p += cnt; + if( sscanf(p, " %[,-]%n", &next,&cnt) == 1 ) { + if(ISDBG(EXTMAP)) fprintf(stderr, "=== next: '%c'\n", next); + p += cnt; + if( next == '-' ) { /* range */ + if ( sscanf(p, " %i%n", &unicode2, &cnt) != 1 ) { + fprintf(stderr, "**** map file '%s' line %d: missing end of range\n", path, lineno); + exit(1); + } + p += cnt; + if(ISDBG(EXTMAP)) fprintf(stderr, "=== range 0x%x to 0x%x\n", unicode, unicode2); + for(unicode++; unicode <= unicode2; unicode++) { + if(curpos > 255) { + fprintf(stderr, "**** map file '%s' line %d: code over 255 in unicode range ...-0x%x\n", + path, lineno, unicode2); + exit(1); + } + if(ISDBG(EXTMAP)) fprintf(stderr, "=== 0x%x -> 0x%x\n", curpos, unicode); + unicode_map[curpos++] = unicode; + } + } + } + } while ( sscanf(p, " %i%n", &unicode, &cnt) == 1 ); + } + + } + + fclose (unicode_map_file); + + if( !found ) { + fprintf(stderr, "**** map file '%s' has no plane '%s'\n", path, arg); + exit(1); + } + + if(unicode_map['A'] == 'A') + uni_sample = 'A'; /* seems to be compatible with Latin */ + else + uni_sample = 0; /* don't make any assumptions */ +} + +/* + * by Zvezdan Petkovic + */ +static void +unicode_cyrillic( + char *arg +) +{ + int i; + static unsigned int cyrillic_unicode_map[] = { + 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, /* 80 */ + 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f, /* 88 */ + 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, /* 90 */ + 0x02dc, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f, /* 98 */ + 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7, /* A0 */ + 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407, /* A8 */ + 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7, /* B0 */ + 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457, /* B8 */ + }; + + for(i=0; i<=0x7F; i++) + unicode_map[i] = i; + + for(i=0x80; i<=0xBF; i++) + unicode_map[i] = cyrillic_unicode_map[i-0x80]; + + for(i=0xC0; i<=0xFF; i++) + unicode_map[i] = i+0x350; + +} + +static void +unicode_latin1( + char *arg +) +{ + int i; + static unsigned int latin1_unicode_map[] = { + 0x20ac, -1, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, /* 80 */ + 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x017d, 0x008f, /* 88 */ + 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, /* 90 */ + 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x017e, 0x0178, /* 98 */ + }; + + for(i=0; i<=0x7F; i++) + unicode_map[i] = i; + + for(i=0x80; i<=0x9F; i++) + unicode_map[i] = latin1_unicode_map[i-0x80]; + + for(i=0xA0; i<=0xFF; i++) + unicode_map[i] = i; +} + +static void +unicode_adobestd( + char *arg +) +{ + int i; + static unsigned int adobestd_unicode_map[] = { + -1, 0x00a1, 0x00a2, 0x00a3, 0x2215, 0x00a5, 0x0192, 0x00a7, /* A0 */ + 0x00a4, 0x0027, 0x201c, 0x00ab, 0x2039, 0x203a, 0xfb01, 0xfb02, /* A8 */ + -1, 0x2013, 0x2020, 0x2021, 0x2219, -1, 0x00b6, 0x2022, /* B0 */ + 0x201a, 0x201e, 0x201d, 0x00bb, 0x2026, 0x2030, -1, 0x00bf, /* B8 */ + -1, 0x0060, 0x00b4, 0x02c6, 0x02dc, 0x02c9, 0x02d8, 0x02d9, /* C0 */ + 0x00a8, -1, 0x02da, 0x00b8, -1, 0x02dd, 0x02db, 0x02c7, /* C8 */ + 0x2014, -1, -1, -1, -1, -1, -1, -1, /* D0 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* D8 */ + -1, 0x00c6, -1, 0x00aa, -1, -1, -1, -1, /* E0 */ + 0x0141, 0x00d8, 0x0152, 0x00ba, -1, -1, -1, -1, /* E8 */ + -1, 0x00e6, -1, -1, -1, 0x0131, -1, -1, /* F0 */ + 0x0142, 0x00f8, 0x0153, 0x00df, -1, -1, -1, -1, /* F8 */ + }; + + for(i=0; i<=0x7F; i++) + unicode_map[i] = i; + + unicode_map[0x27] = 0x2019; + unicode_map[0x60] = -1; + + /* 0x80 to 0x9F is a hole */ + + for(i=0xA0; i<=0xFF; i++) + unicode_map[i] = adobestd_unicode_map[i-0xA0]; +} + +/* + * Not all of the Adobe glyphs are in the Unicode + * standard maps, so the font creators have + * different ideas about their codes. Because + * of this we try to map based on the glyph + * names instead of Unicode codes. If there are + * no glyph names (ps_fmt_3!=0) we fall back + * to the code-based scheme. + */ + +static int +unicode_adobestd_byname( + char *name, + char *arg, + int where +) +{ + int i; + + /* names always take precedence over codes */ + if(where == UNICONV_BYNAME_AFTER) + return -1; + + for(i=32; i<256; i++) { + if(!strcmp(name, adobe_StandardEncoding[i])) + return i; + } + return -1; + +} + +static void +unicode_latin2( + char *arg +) +{ + int i; + static unsigned int latin2_unicode_map[] = { + 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, /* A0 */ + 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, /* A8 */ + 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, /* B0 */ + 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, /* B8 */ + 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, /* C0 */ + 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, /* C8 */ + 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, /* D0 */ + 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, /* D8 */ + 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, /* E0 */ + 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, /* E8 */ + 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, /* F0 */ + 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, /* F8 */ + }; + + for(i=0; i<=0x7E; i++) + unicode_map[i] = i; + + /* 7F-9F are unused */ + + for(i=0xA0; i<=0xFF; i++) + unicode_map[i] = latin2_unicode_map[i-0xA0]; +} + +static void +unicode_latin4( + char *arg +) +{ + int i; + static unsigned int latin4_unicode_map[] = { + 0x0080, 0x0081, 0x201a, 0x0192, -1, 0x2026, 0x2020, 0x2021, /* 80 */ + 0x02c6, 0x2030, -1, 0x2039, 0x0152, 0x008d, 0x008e, 0x008f, /* 88 */ + 0x201e, 0x201c, 0x2019, -1, 0x201d, 0x2022, 0x2013, 0x2014, /* 90 */ + 0x02dc, 0x2122, -1, 0x203a, 0x0153, 0x009d, 0x009e, 0x0178, /* 98 */ + 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7, /* A0 */ + 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, /* A8 */ + 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, /* B0 */ + 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, /* B8 */ + 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, /* C0 */ + 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, /* C8 */ + 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, /* D0 */ + 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, /* D8 */ + 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, /* E0 */ + 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, /* E8 */ + 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, /* F0 */ + 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9, /* F8 */ + }; + + for(i=0; i<=0x7F; i++) + unicode_map[i] = i; + + for(i=0x80; i<=0xFF; i++) + unicode_map[i] = latin4_unicode_map[i-0x80]; + +#if 0 /* for documentation purposes only */ + case 0x201e: return 0x90; /* these two quotes are a hack only */ + case 0x201c: return 0x91; /* these two quotes are a hack only */ + case 0x00A0: return 0xA0; /* NO-BREAK SPACE */ + case 0x0104: return 0xA1; /* LATIN CAPITAL LETTER A WITH OGONEK */ + case 0x0138: return 0xA2; /* LATIN SMALL LETTER KRA */ + case 0x0156: return 0xA3; /* LATIN CAPITAL LETTER R WITH CEDILLA */ + case 0x00A4: return 0xA4; /* CURRENCY SIGN */ + case 0x0128: return 0xA5; /* LATIN CAPITAL LETTER I WITH TILDE */ + case 0x013B: return 0xA6; /* LATIN CAPITAL LETTER L WITH CEDILLA */ + case 0x00A7: return 0xA7; /* SECTION SIGN */ + case 0x00A8: return 0xA8; /* DIAERESIS */ + case 0x0160: return 0xA9; /* LATIN CAPITAL LETTER S WITH CARON */ + case 0x0112: return 0xAA; /* LATIN CAPITAL LETTER E WITH MACRON */ + case 0x0122: return 0xAB; /* LATIN CAPITAL LETTER G WITH CEDILLA */ + case 0x0166: return 0xAC; /* LATIN CAPITAL LETTER T WITH STROKE */ + case 0x00AD: return 0xAD; /* SOFT HYPHEN */ + case 0x017D: return 0xAE; /* LATIN CAPITAL LETTER Z WITH CARON */ + case 0x00AF: return 0xAF; /* MACRON */ + case 0x00B0: return 0xB0; /* DEGREE SIGN */ + case 0x0105: return 0xB1; /* LATIN SMALL LETTER A WITH OGONEK */ + case 0x02DB: return 0xB2; /* OGONEK */ + case 0x0157: return 0xB3; /* LATIN SMALL LETTER R WITH CEDILLA */ + case 0x00B4: return 0xB4; /* ACUTE ACCENT */ + case 0x0129: return 0xB5; /* LATIN SMALL LETTER I WITH TILDE */ + case 0x013C: return 0xB6; /* LATIN SMALL LETTER L WITH CEDILLA */ + case 0x02C7: return 0xB7; /* CARON */ + case 0x00B8: return 0xB8; /* CEDILLA */ + case 0x0161: return 0xB9; /* LATIN SMALL LETTER S WITH CARON */ + case 0x0113: return 0xBA; /* LATIN SMALL LETTER E WITH MACRON */ + case 0x0123: return 0xBB; /* LATIN SMALL LETTER G WITH CEDILLA */ + case 0x0167: return 0xBC; /* LATIN SMALL LETTER T WITH STROKE */ + case 0x014A: return 0xBD; /* LATIN CAPITAL LETTER ENG */ + case 0x017E: return 0xBE; /* LATIN SMALL LETTER Z WITH CARON */ + case 0x014B: return 0xBF; /* LATIN SMALL LETTER ENG */ + case 0x0100: return 0xC0; /* LATIN CAPITAL LETTER A WITH MACRON */ + case 0x00C1: return 0xC1; /* LATIN CAPITAL LETTER A WITH ACUTE */ + case 0x00C2: return 0xC2; /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ + case 0x00C3: return 0xC3; /* LATIN CAPITAL LETTER A WITH TILDE */ + case 0x00C4: return 0xC4; /* LATIN CAPITAL LETTER A WITH DIAERESIS */ + case 0x00C5: return 0xC5; /* LATIN CAPITAL LETTER A WITH RING ABOVE */ + case 0x00C6: return 0xC6; /* LATIN CAPITAL LIGATURE AE */ + case 0x012E: return 0xC7; /* LATIN CAPITAL LETTER I WITH OGONEK */ + case 0x010C: return 0xC8; /* LATIN CAPITAL LETTER C WITH CARON */ + case 0x00C9: return 0xC9; /* LATIN CAPITAL LETTER E WITH ACUTE */ + case 0x0118: return 0xCA; /* LATIN CAPITAL LETTER E WITH OGONEK */ + case 0x00CB: return 0xCB; /* LATIN CAPITAL LETTER E WITH DIAERESIS */ + case 0x0116: return 0xCC; /* LATIN CAPITAL LETTER E WITH DOT ABOVE */ + case 0x00CD: return 0xCD; /* LATIN CAPITAL LETTER I WITH ACUTE */ + case 0x00CE: return 0xCE; /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ + case 0x012A: return 0xCF; /* LATIN CAPITAL LETTER I WITH MACRON */ + case 0x0110: return 0xD0; /* LATIN CAPITAL LETTER D WITH STROKE */ + case 0x0145: return 0xD1; /* LATIN CAPITAL LETTER N WITH CEDILLA */ + case 0x014C: return 0xD2; /* LATIN CAPITAL LETTER O WITH MACRON */ + case 0x0136: return 0xD3; /* LATIN CAPITAL LETTER K WITH CEDILLA */ + case 0x00D4: return 0xD4; /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ + case 0x00D5: return 0xD5; /* LATIN CAPITAL LETTER O WITH TILDE */ + case 0x00D6: return 0xD6; /* LATIN CAPITAL LETTER O WITH DIAERESIS */ + case 0x00D7: return 0xD7; /* MULTIPLICATION SIGN */ + case 0x00D8: return 0xD8; /* LATIN CAPITAL LETTER O WITH STROKE */ + case 0x0172: return 0xD9; /* LATIN CAPITAL LETTER U WITH OGONEK */ + case 0x00DA: return 0xDA; /* LATIN CAPITAL LETTER U WITH ACUTE */ + case 0x00DB: return 0xDB; /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ + case 0x00DC: return 0xDC; /* LATIN CAPITAL LETTER U WITH DIAERESIS */ + case 0x0168: return 0xDD; /* LATIN CAPITAL LETTER U WITH TILDE */ + case 0x016A: return 0xDE; /* LATIN CAPITAL LETTER U WITH MACRON */ + case 0x00DF: return 0xDF; /* LATIN SMALL LETTER SHARP S */ + case 0x0101: return 0xE0; /* LATIN SMALL LETTER A WITH MACRON */ + case 0x00E1: return 0xE1; /* LATIN SMALL LETTER A WITH ACUTE */ + case 0x00E2: return 0xE2; /* LATIN SMALL LETTER A WITH CIRCUMFLEX */ + case 0x00E3: return 0xE3; /* LATIN SMALL LETTER A WITH TILDE */ + case 0x00E4: return 0xE4; /* LATIN SMALL LETTER A WITH DIAERESIS */ + case 0x00E5: return 0xE5; /* LATIN SMALL LETTER A WITH RING ABOVE */ + case 0x00E6: return 0xE6; /* LATIN SMALL LIGATURE AE */ + case 0x012F: return 0xE7; /* LATIN SMALL LETTER I WITH OGONEK */ + case 0x010D: return 0xE8; /* LATIN SMALL LETTER C WITH CARON */ + case 0x00E9: return 0xE9; /* LATIN SMALL LETTER E WITH ACUTE */ + case 0x0119: return 0xEA; /* LATIN SMALL LETTER E WITH OGONEK */ + case 0x00EB: return 0xEB; /* LATIN SMALL LETTER E WITH DIAERESIS */ + case 0x0117: return 0xEC; /* LATIN SMALL LETTER E WITH DOT ABOVE */ + case 0x00ED: return 0xED; /* LATIN SMALL LETTER I WITH ACUTE */ + case 0x00EE: return 0xEE; /* LATIN SMALL LETTER I WITH CIRCUMFLEX */ + case 0x012B: return 0xEF; /* LATIN SMALL LETTER I WITH MACRON */ + case 0x0111: return 0xF0; /* LATIN SMALL LETTER D WITH STROKE */ + case 0x0146: return 0xF1; /* LATIN SMALL LETTER N WITH CEDILLA */ + case 0x014D: return 0xF2; /* LATIN SMALL LETTER O WITH MACRON */ + case 0x0137: return 0xF3; /* LATIN SMALL LETTER K WITH CEDILLA */ + case 0x00F4: return 0xF4; /* LATIN SMALL LETTER O WITH CIRCUMFLEX */ + case 0x00F5: return 0xF5; /* LATIN SMALL LETTER O WITH TILDE */ + case 0x00F6: return 0xF6; /* LATIN SMALL LETTER O WITH DIAERESIS */ + case 0x00F7: return 0xF7; /* DIVISION SIGN */ + case 0x00F8: return 0xF8; /* LATIN SMALL LETTER O WITH STROKE */ + case 0x0173: return 0xF9; /* LATIN SMALL LETTER U WITH OGONEK */ + case 0x00FA: return 0xFA; /* LATIN SMALL LETTER U WITH ACUTE */ + case 0x00FB: return 0xFB; /* LATIN SMALL LETTER U WITH CIRCUMFLEX */ + case 0x00FC: return 0xFC; /* LATIN SMALL LETTER U WITH DIAERESIS */ + case 0x0169: return 0xFD; /* LATIN SMALL LETTER U WITH TILDE */ + case 0x016B: return 0xFE; /* LATIN SMALL LETTER U WITH MACRON */ + case 0x02D9: return 0xFF; /* DOT ABOVE */ +#endif +} + +static void +unicode_latin5( + char *arg +) +{ + int i; + static unsigned int latin5_unicode_map1[] = { + 0x0080, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, /* 80 */ + 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x008e, 0x008f, /* 88 */ + 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, /* 90 */ + 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x009e, 0x0178, /* 98 */ + }; + static unsigned int latin5_unicode_map2[] = { + 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, /* D0 */ + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, /* D8 */ + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, /* E0 direct */ + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* E8 direct */ + 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, /* F0 */ + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, /* F8 */ + }; + + for(i=0; i<=0x7F; i++) + unicode_map[i] = i; + + for(i=0x80; i<=0x9F; i++) + unicode_map[i] = latin5_unicode_map1[i-0x80]; + + for(i=0xA0; i<=0xCF; i++) + unicode_map[i] = i; + + for(i=0xD0; i<=0xFF; i++) + unicode_map[i] = latin5_unicode_map2[i-0xD0]; +} + +/* a way to select one 256-character plane from Unicode + * or other multi-byte encoding + */ + +static void +unicode_plane( + char *arg +) +{ + static unsigned plane; + int nchars; + int c1, c2, i; + + if(uni_lang_selected == 0) + return; /* don't participate in auto-guessing */ + + plane = 0; force_pid = force_eid = -1; + + c1 = sscanf(arg, "pid=%d,eid=%d%n", &force_pid, &force_eid, &nchars); + if(c1 == 2) { + arg += nchars; + if(*arg == ',') + arg++; + } + if(arg[0] == '0' && (arg[1]=='x' || arg[1]=='X') ) { + arg += 2; + c2 = sscanf(arg, "%x", &plane); + } else { + c2 = sscanf(arg, "%d", &plane); + } + + if( (c1!=2 && c1!=0) || (c1==0 && c2==0) ) { + fprintf(stderr, "**** option -l plane expects one of the following formats:\n"); + fprintf(stderr, " -l plane+0xNN - select hexadecimal number of plane of Unicode\n"); + fprintf(stderr, " -l plane+NN - select decimal number of plane of Unicode\n"); + fprintf(stderr, " -l plane+pid=N,eid=N - select plane 0 of specified encoding\n"); + fprintf(stderr, " -l plane+pid=N,eid=N,0xNN - select hex plane of TTF encoding with this PID/EID\n"); + fprintf(stderr, " -l plane+pid=N,eid=N,NN - select decimal plane of TTF encoding with this PID/EID\n"); + exit(1); + } + + if(c2!=0) { + if(strlen(arg) > sizeof(uni_suffix_buf)-2) { + fprintf(stderr, "**** plane number is too large\n"); + } + + sprintf(uni_suffix_buf, "-%s", arg); + uni_font_name_suffix = uni_suffix_buf; + } else { + uni_font_name_suffix = ""; + } + + plane <<= 8; + for(i=0; i<=0xFF; i++) + unicode_map[i] = plane | i; +} + +/* look up the 8-bit code by unicode */ + +int +unicode_rev_lookup( + int unival +) +{ + int res; + + if( ! IS_UNI_BUCKET(unival) ) + return -1; + + for (res = 0; res < enctabsz; res++) + if (unicode_map[res] == unival) + return res; + return -1; +} + +/* mark the buckets for quick lookup */ + +static void +unicode_prepare_buckets( + void +) +{ + int i; + + memset(uni_user_buckets, 0, sizeof uni_user_buckets); + for(i=0; i 126) { + sprintf(res+i, "\\x%02X", c); + i+=4; + } else { + res[i++] = c; + } + } + if(*s != 0) { + res[i++] = '.'; + res[i++] = '.'; + res[i++] = '.'; + } + res[i++] = 0; + return res; +} + +/* + * Scale the values according to the scale_factor + */ + +double +fscale( + double val +) +{ + return scale_factor * val; +} + +int +iscale( + int val +) +{ + return (int) (val > 0 ? scale_factor * val + 0.5 + : scale_factor * val - 0.5); +} + +/* + * Try to force fixed width of characters + */ + +static void +alignwidths(void) +{ + int i; + int n = 0, avg, max = 0, min = 3000, sum = 0, x; + + for (i = 0; i < numglyphs; i++) { + if (glyph_list[i].flags & GF_USED) { + x = glyph_list[i].width; + + if (x != 0) { + if (x < min) + min = x; + if (x > max) + max = x; + + sum += x; + n++; + } + } + } + + if (n == 0) + return; + + avg = sum / n; + + WARNING_3 fprintf(stderr, "widths: max=%d avg=%d min=%d\n", max, avg, min); + + /* if less than 5% variation from average */ + /* force fixed width */ + if (20 * (avg - min) < avg && 20 * (max - avg) < avg) { + for (i = 0; i < numglyphs; i++) { + if (glyph_list[i].flags & GF_USED) + glyph_list[i].width = avg; + } + fontm.is_fixed_pitch = 1; + } +} + +static void +convert_glyf( + int glyphno +) +{ + GLYPH *g; + int ncurves; + + g = &glyph_list[glyphno]; + + + g->scaledwidth = iscale(g->width); + + g->entries = 0; + g->lastentry = 0; + g->path = 0; + if (g->ttf_pathlen != 0) { + cursw->glpath(glyphno, glyph_list); + g->lastentry = 0; + + if(ISDBG(BUILDG)) + dumppaths(g, NULL, NULL); + + assertpath(g->entries, __FILE__, __LINE__, g->name); + + fclosepaths(g); + assertpath(g->entries, __FILE__, __LINE__, g->name); + + /* float processing */ + if(smooth) { + ffixquadrants(g); + assertpath(g->entries, __FILE__, __LINE__, g->name); + + fsplitzigzags(g); + assertpath(g->entries, __FILE__, __LINE__, g->name); + + fforceconcise(g); + assertpath(g->entries, __FILE__, __LINE__, g->name); + + fstraighten(g); + assertpath(g->entries, __FILE__, __LINE__, g->name); + } + + pathtoint(g); + /* all processing past this point expects integer path */ + assertpath(g->entries, __FILE__, __LINE__, g->name); + +#if 0 + fixcontours(g); + testfixcvdir(g); +#endif + + /* int processing */ + if (smooth) { + smoothjoints(g); + assertpath(g->entries, __FILE__, __LINE__, g->name); + } + + ncurves = 0; + { + GENTRY *ge; + for(ge = g->entries; ge; ge = ge->next) + ncurves++; + } + if (ncurves > 200) { + WARNING_3 fprintf(stderr, + "** Glyph %s is too long, may display incorrectly\n", + g->name); + } + } else { + /* for buildstems */ + g->flags &= ~GF_FLOAT; + } +} + +static void +handle_gnames(void) +{ + int i, n, found, c, type; + + /* get the names from the font file */ + ps_fmt_3 = cursw->glnames(glyph_list); + + /* check for names with wrong characters */ + for (n = 0; n < numglyphs; n++) { + int c; + for (i = 0; (c = glyph_list[n].name[i]) != 0; i++) { + if (!(isalnum(c) || c == '.' || c == '_' || c == '-') + || i==0 && isdigit(c)) { /* must not start with a digit */ + WARNING_3 fprintf(stderr, "Glyph %d %s (%s), ", + n, isdigit(c) ? "name starts with a digit" : + "has bad characters in name", + nametoprint(glyph_list[n].name)); + glyph_list[n].name = malloc(16); + sprintf(glyph_list[n].name, "_b_%d", n); + WARNING_3 fprintf(stderr, "changing to %s\n", glyph_list[n].name); + break; + } + } + } + + if( !ps_fmt_3 ) { + /* check for duplicate names */ + for (n = 0; n < numglyphs; n++) { + found = 0; + for (i = 0; i < n && !found; i++) { + if (strcmp(glyph_list[i].name, glyph_list[n].name) == 0) { + if (( glyph_list[n].name = malloc(16) )==0) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + sprintf(glyph_list[n].name, "_d_%d", n); + + /* if the font has no names in it (what the native parser + * recognises as ps_fmt_3), FreeType returns all the + * names as .notdef, so don't complain in this case + */ + if(strcmp(glyph_list[i].name, ".notdef")) { + WARNING_3 fprintf(stderr, + "Glyph %d has the same name as %d: (%s), changing to %s\n", + n, i, + glyph_list[i].name, + glyph_list[n].name); + } + found = 1; + } + } + } + + } + + /* start the encoding stuff */ + for (i = 0; i < ENCTABSZ; i++) { + encoding[i] = -1; + } + + /* do the 1st round of encoding by name */ + if(!ps_fmt_3 && uni_lang_selected && uni_lang_selected->convbyname) { + for (n = 0; n < numglyphs; n++) { + c = uni_lang_selected->convbyname(glyph_list[n].name, + uni_lang_arg, UNICONV_BYNAME_BEFORE); + if(c>=0 && cinit[i]; i++) { + for (n = 0; n < ENCTABSZ; n++) + unicode_map[n] = -1; + uni_lang_selected->init[i](uni_lang_arg); + unicode_prepare_buckets(); + type = cursw->glenc(glyph_list, encoding, unicode_map); + if( type == 0 ) + /* if we have an 8-bit encoding we don't need more tries */ + break; + } + } else { + /* language is unknown, try the first table of each */ + for(i=0; i < sizeof uni_lang/(sizeof uni_lang[0]); i++) { + if(uni_lang[i].init[0] == NULL) + continue; + for (n = 0; n < ENCTABSZ; n++) + unicode_map[n] = -1; + uni_lang[i].init[0](uni_lang_arg); + unicode_prepare_buckets(); + type = cursw->glenc(glyph_list, encoding, unicode_map); + if( type == 0 ) + /* if we have an 8-bit encoding we don't need more tries */ + break; + } + } + + if (ps_fmt_3) { + /* get rid of the old names, they are all "UNKNOWN" anyawy */ + for (i = 0; i < numglyphs; i++) { + glyph_list[i].name = 0; + } + if(type == 0) { + /* 8-bit - give 8859/1 names to the first 256 glyphs */ + for (i = 0; i < 256; i++) { /* here 256, not ENCTABSZ */ + if (encoding[i] > 0) { + glyph_list[encoding[i]].name = Fmt3Encoding[i]; + } + } + } else if(type == 1) { + /* Unicode - give 8859/1 names to the first 256 glyphs of Unicode */ + for (n = 0; n < 256; n++) { /* here 256, not ENCTABSZ */ + i = unicode_rev_lookup(n); + if (i>=0 && encoding[i] > 0) { + glyph_list[encoding[i]].name = Fmt3Encoding[i]; + } + } + } /* for other types of encodings just give generated names */ + /* assign unique names to the rest of the glyphs */ + for (i = 0; i < numglyphs; i++) { + if (glyph_list[i].name == 0) { + if (( glyph_list[i].name = malloc(16) )==0) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + sprintf(glyph_list[i].name, "_d_%d", i); + } + } + } + + /* do the 2nd round of encoding by name */ + if(uni_lang_selected && uni_lang_selected->convbyname) { + for (n = 0; n < numglyphs; n++) { + c = uni_lang_selected->convbyname(glyph_list[n].name, + uni_lang_arg, UNICONV_BYNAME_AFTER); + if(c>=0 && c 0) + glyph_list[0].name = ".notdef"; + if(numglyphs > 1) + glyph_list[1].name = ".null"; + + for (i = 0; i < ENCTABSZ; i++) { + if ((encoding[i] != 0) && glyph_rename[i]) { + glyph_list[encoding[i]].name = glyph_rename[i]; + } + } + +} + +/* duplicate a string with counter to a 0-terminated string, + * and by the way filter out the characters that won't look good + * in the Postscript strings or comments; limit the length + * to a reasonable amount. + */ + +char * +dupcnstring( + unsigned char *s, + int len +) +{ + char *res, *out; + int i, c; + static int warned=0; + + if(len > 255) { + WARNING_1 fprintf(stderr, "Some font name strings are longer than 255 characters, cut down\n"); + len = 255; + } + + if(( res = malloc(len+1) )==NULL) { + fprintf (stderr, "****malloc failed %s line %d\n", __FILE__, __LINE__); + exit(255); + } + + out = res; + for(i=0; i=' ' && c!=127) { + /* translate the inconvenient chacracters */ + if( c== '(' ) + c = '['; + else if( c== ')' ) + c = ']'; + *out++ = c; + } else if( c=='\n' || c=='\r' ) { + WARNING_1 fprintf(stderr, "Some font name strings contain end of line or Unicode, cut down\n"); + *out = 0; + return res; + } else if(!warned) { + warned=1; + WARNING_1 fprintf(stderr, "Some font name strings are in Unicode, may not show properly\n"); + } + } + *out = 0; + return res; +} + +static void +usage(void) +{ + +#ifdef _GNU_SOURCE +# define fplop(txt) fputs(txt, stderr); +#else +# define fplop(txt) +#endif + + fputs("Use:\n", stderr); + fputs("ttf2pt1 [-] [-l language | -L file] []\n", stderr); + fputs(" or\n", stderr); + fputs("ttf2pt1 [-] [-l language | -L file] -\n", stderr); + fputs(" or\n", stderr); + fputs("ttf2pt1 [-] [-l language | -L file] - | t1asm > \n", stderr); + + fplop("\n"); + fplop("This build supports both short and long option names,\n"); + fplop("the long options are listed before corresponding short ones\n"); + + fplop(" --all-glyphs\n"); + fputs(" -a - include all glyphs, even those not in the encoding table\n", stderr); + fplop(" --pfb\n"); + fputs(" -b - produce a compressed .pfb file\n", stderr); + fplop(" --debug dbg_suboptions\n"); + fputs(" -d dbg_suboptions - debugging options, run ttf2pt1 -d? for help\n", stderr); + fplop(" --encode\n"); + fputs(" -e - produce a fully encoded .pfa file\n", stderr); + fplop(" --force-unicode\n"); + fputs(" -F - force use of Unicode encoding even if other MS encoding detected\n", stderr); + fplop(" --generate suboptions\n"); + fputs(" -G suboptions - control the file generation, run ttf2pt1 -G? for help\n", stderr); + fplop(" --language language\n"); + fputs(" -l language - convert Unicode to specified language, run ttf2pt1 -l? for list\n", stderr); + fplop(" --language-map file\n"); + fputs(" -L file - convert Unicode according to encoding description file\n", stderr); + fplop(" --limit =\n"); + fputs(" -m = - set maximal limit of given type to value, types:\n", stderr); + fputs(" h - maximal hint stack depth in the PostScript interpreter\n", stderr); + fplop(" --processing suboptions\n"); + fputs(" -O suboptions - control outline processing, run ttf2pt1 -O? for help\n", stderr); + fplop(" --parser name\n"); + fputs(" -p name - use specific front-end parser, run ttf2pt1 -p? for list\n", stderr); + fplop(" --uid id\n"); + fputs(" -u id - use this UniqueID, -u A means autogeneration\n", stderr); + fplop(" --vertical-autoscale size\n"); + fputs(" -v size - scale the font to make uppercase letters >size/1000 high\n", stderr); + fplop(" --version\n"); + fputs(" -V - print ttf2pt1 version number\n", stderr); + fplop(" --warning number\n"); + fputs(" -W number - set the level of permitted warnings (0 - disable)\n", stderr); + fputs("Obsolete options (will be removed in future releases):\n", stderr); + fplop(" --afm\n"); + fputs(" -A - write the .afm file to STDOUT instead of the font, now -GA\n", stderr); + fputs(" -f - don't try to guess the value of the ForceBold hint, now -Ob\n", stderr); + fputs(" -h - disable autogeneration of hints, now -Oh\n", stderr); + fputs(" -H - disable hint substitution, now -Ou\n", stderr); + fputs(" -o - disable outline optimization, now -Oo\n", stderr); + fputs(" -s - disable outline smoothing, now -Os\n", stderr); + fputs(" -t - disable auto-scaling to 1000x1000 standard matrix, now -Ot\n", stderr); + fputs(" -w - correct the glyph widths (use only for buggy fonts), now -OW\n", stderr); + fputs("With no , write to with suffix replaced.\n", stderr); + fputs("The last '-' means 'use STDOUT'.\n", stderr); + +#undef fplop + +} + +static void +printversion(void) +{ + fprintf(stderr, "ttf2pt1 %s\n", TTF2PT1_VERSION); +} + +/* initialize a table of suboptions */ +static void +init_subo_tbl( + struct subo_case *tbl +) +{ + int i; + + for(i=0; tbl[i].disbl != 0; i++) { + tbl[i].disbl = tolower(tbl[i].disbl); + tbl[i].enbl = toupper(tbl[i].disbl); + *(tbl[i].valp) = tbl[i].dflt; + } +} + +/* print the default value of the suboptions */ +static void +print_subo_dflt( + FILE *f, + struct subo_case *tbl +) +{ + int i; + + for(i=0; tbl[i].disbl != 0; i++) { + if(tbl[i].dflt) + putc(tbl[i].enbl, f); + else + putc(tbl[i].disbl, f); + } +} + +/* print the usage message for the suboptions */ +static void +print_subo_usage( + FILE *f, + struct subo_case *tbl +) +{ + int i; + + fprintf(f,"The lowercase suboptions disable features, corresponding\n"); + fprintf(f,"uppercase suboptions enable them. The supported suboptions,\n"); + fprintf(f,"their default states and the features they control are:\n"); + for(i=0; tbl[i].disbl != 0; i++) { + fprintf(f," %c/%c - [%s] %s\n", tbl[i].disbl, tbl[i].enbl, + tbl[i].dflt ? "enabled" : "disabled", tbl[i].descr); + } +} + +/* find and set the entry according to suboption, + * return the found entry (or if not found return NULL) + */ +struct subo_case * +set_subo( + struct subo_case *tbl, + int subopt +) +{ + int i; + + for(i=0; tbl[i].disbl != 0; i++) { + if(subopt == tbl[i].disbl) { + *(tbl[i].valp) = 0; + return &tbl[i]; + } else if(subopt == tbl[i].enbl) { + *(tbl[i].valp) = 1; + return &tbl[i]; + } + } + return NULL; +} + + +int +main( + int argc, + char **argv +) +{ + int i, j; + time_t now; + char filename[4096]; + int c,nchars,nmetrics; + int ws; + int forcebold= -1; /* -1 means "don't know" */ + char *lang; + int oc; + int subid; + char *cmdline; +#ifdef _GNU_SOURCE +# define ttf2pt1_getopt(a, b, c, d, e) getopt_long(a, b, c, d, e) + static struct option longopts[] = { + { "afm", 0, NULL, 'A' }, + { "all-glyphs", 0, NULL, 'a' }, + { "pfb", 0, NULL, 'b' }, + { "debug", 1, NULL, 'd' }, + { "encode", 0, NULL, 'e' }, + { "force-unicode", 0, NULL, 'F' }, + { "generate", 1, NULL, 'G' }, + { "language", 1, NULL, 'l' }, + { "language-map", 1, NULL, 'L' }, + { "limit", 1, NULL, 'm' }, + { "processing", 1, NULL, 'O' }, + { "parser", 1, NULL, 'p' }, + { "uid", 1, NULL, 'u' }, + { "vertical-autoscale", 1, NULL, 'v' }, + { "version", 0, NULL, 'V' }, + { "warning", 1, NULL, 'W' }, + { NULL, 0, NULL, 0 } + }; +#else +# define ttf2pt1_getopt(a, b, c, d, e) getopt(a, b, c) +#endif + /* table of Outline Processing (may think also as Optimization) options */ + static struct subo_case opotbl[] = { + { 'b', 0/*auto-set*/, &trybold, 1, "guessing of the ForceBold hint" }, + { 'h', 0/*auto-set*/, &hints, 1, "autogeneration of hints" }, + { 'u', 0/*auto-set*/, &subhints, 1, "hint substitution technique" }, + { 'o', 0/*auto-set*/, &optimize, 1, "space optimization of font files" }, + { 's', 0/*auto-set*/, &smooth, 1, "smoothing and repair of outlines" }, + { 't', 0/*auto-set*/, &transform, 1, "auto-scaling to the standard matrix 1000x1000" }, + { 'w', 0/*auto-set*/, &correctwidth, 0, "correct the glyph widths (use only for buggy fonts)" }, + { 'v', 0/*auto-set*/, &vectorize, 0, "vectorize (trace) the bitmaps" }, +#ifdef USE_AUTOTRACE + { 'z', 0/*auto-set*/, &use_autotrace, 0, "use the autotrace library on bitmaps (works badly)" }, +#endif /*USE_AUTOTRACE*/ + { 0, 0, 0, 0, 0} /* terminator */ + }; + /* table of the File Generation options */ + static struct subo_case fgotbl[] = { + { 'f', 0/*auto-set*/, &gen_pfa, 1, "generate the font file (.t1a, .pfa or .pfb)" }, + { 'a', 0/*auto-set*/, &gen_afm, 1, "generate the Adobe metrics file (.afm)" }, + { 'u', 0/*auto-set*/, &gen_ufm, 1, "generate the Unicode metrics file (.ufm)" }, + { 'e', 0/*auto-set*/, &gen_dvienc, 0, "generate the dvips encoding file (.enc)" }, + { 0, 0, 0, 0, 0} /* terminator */ + }; + int *genlast = NULL; + + + init_subo_tbl(opotbl); /* initialize sub-options of -O */ + init_subo_tbl(fgotbl); /* initialize sub-options of -G */ + + /* save the command line for the record + * (we don't bother about escaping the shell special characters) + */ + + j = 0; + for(i=1; ivalp) ) + genlast = s->valp; + } + break; + } + case 'h': + fputs("Warning: option -h is obsolete, use -Oh instead\n", stderr); + hints = 0; + break; + case 'H': + fputs("Warning: meaning of option -H has been changed to its opposite\n", stderr); + fputs("Warning: option -H is obsolete, use -Ou instead\n", stderr); + subhints = 0; + break; + case 'f': + fputs("Warning: option -f is obsolete, use -Ob instead\n", stderr); + trybold = 0; + break; + case 'w': + fputs("Warning: option -w is obsolete, use -OW instead\n", stderr); + correctwidth = 1; + break; + case 'u': + if(wantuid) { + fprintf(stderr, "**** UniqueID may be specified only once ****\n"); + exit(1); + } + wantuid = 1; + if(optarg[0]=='A' && optarg[1]==0) + strUID=0; /* will be generated automatically */ + else { + strUID=optarg; + for(i=0; optarg[i]!=0; i++) + if( !isdigit(optarg[i]) ) { + fprintf(stderr, "**** UniqueID must be numeric or A for automatic ****\n"); + exit(1); + } + } + break; + case 'v': + correctvsize = atoi(optarg); + if(correctvsize <= 0 && correctvsize > 1000) { + fprintf(stderr, "**** wrong vsize '%d', ignored ****\n", correctvsize); + correctvsize=0; + } + break; + case 'p': + if(cursw!=0) { + fprintf(stderr, "**** only one front-end parser be used ****\n"); + exit(1); + } + + { /* separate parser from parser-specific argument */ + char *p = strchr(optarg, LANG_ARG_SEP); + if(p != 0) { + *p = 0; + front_arg = p+1; + } else + front_arg = ""; + } + for(i=0; frontswtab[i] != NULL; i++) + if( !strcmp(frontswtab[i]->name, optarg) ) { + cursw = frontswtab[i]; + break; + } + + if(cursw==0) { + if (strcmp(optarg, "?")) + fprintf(stderr, "**** unknown front-end parser '%s' ****\n", optarg); + fputs("the following front-ends are supported now:\n", stderr); + for(i=0; frontswtab[i] != NULL; i++) { + fprintf(stderr," %s (%s)\n file suffixes: ", + frontswtab[i]->name, + frontswtab[i]->descr ? frontswtab[i]->descr : "no description" + ); + for(j=0; jsuffix[j]) + fprintf(stderr, "%s ", frontswtab[i]->suffix[j]); + fprintf(stderr, "\n"); + } + exit(1); + } + break; + case 'l': + if(uni_lang_selected!=0) { + fprintf(stderr, "**** only one language option may be used ****\n"); + exit(1); + } + + { /* separate language from language-specific argument */ + char *p = strchr(optarg, LANG_ARG_SEP); + if(p != 0) { + *p = 0; + uni_lang_arg = p+1; + } else + uni_lang_arg = ""; + } + for(i=0; i < sizeof uni_lang/(sizeof uni_lang[0]); i++) + if( !strcmp(uni_lang[i].name, optarg) ) { + uni_lang_selected = &uni_lang[i]; + uni_sample = uni_lang[i].sample_upper; + break; + } + + if(uni_lang_selected==0) { + if (strcmp(optarg, "?")) + fprintf(stderr, "**** unknown language '%s' ****\n", optarg); + fputs(" the following languages are supported now:\n", stderr); + for(i=0; i < sizeof uni_lang/(sizeof uni_lang[0]); i++) + fprintf(stderr," %s (%s)\n", + uni_lang[i].name, + uni_lang[i].descr ? uni_lang[i].descr : "no description" + ); + exit(1); + } + break; + case 'L': + if(uni_lang_selected!=0) { + fprintf(stderr, "**** only one language option may be used ****\n"); + exit(1); + } + uni_lang_selected = &uni_lang_user; + uni_lang_arg = optarg; + break; + case 'V': + printversion(); + exit(0); + break; + default: + usage(); + exit(1); + break; + } + } + argc-=optind-1; /* the rest of code counts from argv[0] */ + argv+=optind-1; + + if (absolute && encode) { + fprintf(stderr, "**** options -a and -e are incompatible ****\n"); + exit(1); + } + if ((argc != 2) && (argc != 3)) { + usage(); + exit(1); + } + + /* try to guess the language by the locale used */ + if(uni_lang_selected==0 && (lang=getenv("LANG"))!=0 ) { + for(i=0; i < sizeof uni_lang/sizeof(struct uni_language); i++) { + if( !strncmp(uni_lang[i].name, lang, strlen(uni_lang[i].name)) ) { + uni_lang_selected = &uni_lang[i]; + goto got_a_language; + } + } + /* no full name ? try aliases */ + for(i=0; i < sizeof uni_lang/sizeof(struct uni_language); i++) { + for(c=0; csuffix[j] + && !strcmp(p, frontswtab[i]->suffix[j]) ) { + cursw = frontswtab[i]; + WARNING_1 fprintf(stderr, "Auto-detected front-end parser '%s'\n", + cursw->name); + WARNING_1 fprintf(stderr, " (use ttf2pt1 -p? to get the full list of available front-ends)\n"); + break; + } + } + free(s); + } + + if(cursw==0) { + cursw = frontswtab[0]; + WARNING_1 fprintf(stderr, "Can't detect front-end parser, using '%s' by default\n", + cursw->name); + WARNING_1 fprintf(stderr, " (use ttf2pt1 -p? to get the full list of available front-ends)\n"); + } + } + + /* open the input file */ + cursw->open(argv[1], front_arg); + + /* Get base name of output file (if not specified) + * by removing (known) suffixes + */ + if (argc == 2) { + char *p; + argv[2] = strdup (argv[1]); + p = strrchr(argv[2], '.'); + if (p != NULL) + for (j = 0; (j < MAXSUFFIX) && (cursw->suffix[j]); j++) + if (!strcmp(p+1, cursw->suffix[j])) { + *p = '\0'; + break; + } + } + + if ((null_file = fopen(BITBUCKET, "w")) == NULL) { + fprintf(stderr, "**** Cannot open %s ****\n", + BITBUCKET); + exit(1); + } + + if (argv[2][0] == '-' && argv[2][1] == 0) { +#ifdef WINDOWS + if(encode) { + fprintf(stderr, "**** can't write encoded file to stdout ***\n"); + exit(1); + } +#endif /* WINDOWS */ + pfa_file = ufm_file = afm_file = dvienc_file = null_file; + + if(wantafm || genlast == &gen_afm) { /* print .afm instead of .pfa */ + afm_file=stdout; + } else if(genlast == &gen_dvienc) { /* print .enc instead of .pfa */ + dvienc_file=stdout; + } else { + pfa_file=stdout; + } + } else { +#ifndef WINDOWS + snprintf(filename, sizeof filename, "%s.%s", argv[2], encode ? (pfbflag ? "pfb" : "pfa") : "t1a" ); +#else /* WINDOWS */ + snprintf(filename, sizeof filename, "%s.t1a", argv[2]); +#endif /* WINDOWS */ + if(gen_pfa) { + if ((pfa_file = fopen(filename, "w+b")) == NULL) { + fprintf(stderr, "**** Cannot create %s ****\n", filename); + exit(1); + } else { + WARNING_2 fprintf(stderr, "Creating file %s\n", filename); + } + } else + pfa_file = null_file; + + if(gen_ufm) { + snprintf(filename, sizeof filename, "%s.ufm", argv[2]) ; + if ((ufm_file = fopen(filename, "w+")) == NULL) { + fprintf(stderr, "**** Cannot create %s ****\n", filename); + exit(1); + } + } else + ufm_file = null_file; + + if(gen_afm) { + snprintf(filename, sizeof filename, "%s.afm", argv[2]) ; + if ((afm_file = fopen(filename, "w+")) == NULL) { + fprintf(stderr, "**** Cannot create %s ****\n", filename); + exit(1); + } + } else + afm_file = null_file; + + if(gen_dvienc) { + snprintf(filename, sizeof filename, "%s.enc", argv[2]) ; + if ((dvienc_file = fopen(filename, "w+")) == NULL) { + fprintf(stderr, "**** Cannot create %s ****\n", filename); + exit(1); + } + } else + dvienc_file = null_file; + } + + /* + * Now check whether we want a fully encoded .pfa file + */ +#ifndef WINDOWS + if (encode && pfa_file != null_file) { + int p[2]; + extern FILE *ifp, *ofp; /* from t1asm.c */ + + ifp=stdin; + ofp=stdout; + + if (pipe(p) < 0) { + perror("**** Cannot create pipe ****\n"); + exit(1); + } + ofp = pfa_file; + ifp = fdopen(p[0], "r"); + if (ifp == NULL) { + perror("**** Cannot use pipe for reading ****\n"); + exit(1); + } + pfa_file = fdopen(p[1], "w"); + if (pfa_file == NULL) { + perror("**** Cannot use pipe for writing ****\n"); + exit(1); + } + switch (fork()) { + case -1: + perror("**** Cannot fork the assembler process ****\n"); + exit(1); + case 0: /* child */ + fclose(pfa_file); + exit(runt1asm(pfbflag)); + default: /* parent */ + fclose(ifp); fclose(ofp); + } + } +#endif /* WINDOWS */ + + numglyphs = cursw->nglyphs(); + + WARNING_3 fprintf(stderr, "numglyphs = %d\n", numglyphs); + + glyph_list = (GLYPH *) calloc(numglyphs, sizeof(GLYPH)); + + /* initialize non-0 fields */ + for (i = 0; i < numglyphs; i++) { + int j; + GLYPH *g; + + g = &glyph_list[i]; + g->char_no = -1; + for (j = 0; j < GLYPH_MAX_ENCODINGS; j++ ) { + g->orig_code[j] = -1; + } + g->name = "UNKNOWN"; + g->flags = GF_FLOAT; /* we start with float representation */ + } + + handle_gnames(); + + cursw->glmetrics(glyph_list); + cursw->fnmetrics(&fontm); + + original_scale_factor = 1000.0 / (double) fontm.units_per_em; + + if(transform == 0) + scale_factor = 1.0; /* don't transform */ + else + scale_factor = original_scale_factor; + + if(correctvsize && uni_sample!=0) { /* only for known languages */ + /* try to adjust the scale factor to make a typical + * uppercase character of hight at least (correctvsize), this + * may improve the appearance of the font but also + * make it weird, use with caution + */ + int ysz; + + ysz = iscale(glyph_list[encoding[uni_sample]].yMax); + if( ysz 45.0 || italic_angle < -45.0) + italic_angle = 0.0; /* consider buggy */ + + if (hints) { + findblues(); + for (i = 0; i < numglyphs; i++) { + if (glyph_list[i].flags & GF_USED) { + DBG_TO_GLYPH(&glyph_list[i]); + buildstems(&glyph_list[i]); + assertpath(glyph_list[i].entries, __FILE__, __LINE__, glyph_list[i].name); + DBG_FROM_GLYPH(&glyph_list[i]); + } + } + stemstatistics(); + } else { + for(i=0; i<4; i++) + bbox[i] = iscale(fontm.bbox[i]); + } + /* don't touch the width of fixed width fonts */ + if( fontm.is_fixed_pitch ) + correctwidth=0; + docorrectwidth(); /* checks correctwidth inside */ + if (reverse) + for (i = 0; i < numglyphs; i++) { + if (glyph_list[i].flags & GF_USED) { + DBG_TO_GLYPH(&glyph_list[i]); + reversepaths(&glyph_list[i]); + assertpath(glyph_list[i].entries, __FILE__, __LINE__, glyph_list[i].name); + DBG_FROM_GLYPH(&glyph_list[i]); + } + } + + +#if 0 + /* + ** It seems to bring troubles. The problem is that some + ** styles of the font may be recognized as fixed-width + ** while other styles of the same font as proportional. + ** So it's better to be commented out yet. + */ + if (tryfixed) + alignwidths(); +#endif + + if(trybold) { + forcebold = fontm.force_bold; + } + + fprintf(pfa_file, "%%!PS-AdobeFont-1.0: %s %s\n", fontm.name_ps, fontm.name_copyright); + time(&now); + fprintf(pfa_file, "%%%%CreationDate: %s", ctime(&now)); + fprintf(pfa_file, "%% Converted by ttf2pt1 %s/%s\n", TTF2PT1_VERSION, cursw->name); + fprintf(pfa_file, "%% Args: %s\n", cmdline); + fprintf(pfa_file, "%%%%EndComments\n"); + fprintf(pfa_file, "12 dict begin\n/FontInfo 9 dict dup begin\n"); + + WARNING_3 fprintf(stderr, "FontName %s%s\n", fontm.name_ps, uni_font_name_suffix); + + + fprintf(pfa_file, "/version (%s) readonly def\n", fontm.name_version); + + fprintf(pfa_file, "/Notice (%s) readonly def\n", fontm.name_copyright); + + fprintf(pfa_file, "/FullName (%s) readonly def\n", fontm.name_full); + fprintf(pfa_file, "/FamilyName (%s) readonly def\n", fontm.name_family); + + if(wantuid) { + if(strUID) + fprintf(pfa_file, "/UniqueID %s def\n", strUID); + else { + numUID=0; + for(i=0; fontm.name_full[i]!=0; i++) { + numUID *= 37; /* magic number, good for hash */ + numUID += fontm.name_full[i]-' '; + /* if the name is long the first chars + * may be lost forever, so re-insert + * them thus making kind of CRC + */ + numUID += (numUID>>24) & 0xFF; + } + /* the range for private UIDs is 4 000 000 - 4 999 999 */ + fprintf(pfa_file, "/UniqueID %lu def\n", numUID%1000000+4000000); + } + } + + fprintf(pfa_file, "/Weight (%s) readonly def\n", fontm.name_style); + + fprintf(pfa_file, "/ItalicAngle %f def\n", italic_angle); + fprintf(pfa_file, "/isFixedPitch %s def\n", + fontm.is_fixed_pitch ? "true" : "false"); + + /* we don't print out the unused glyphs */ + nchars = 0; + for (i = 0; i < numglyphs; i++) { + if (glyph_list[i].flags & GF_USED) { + nchars++; + } + } + + fprintf(afm_file, "StartFontMetrics 4.1\n"); + fprintf(afm_file, "FontName %s%s\n", fontm.name_ps, uni_font_name_suffix); + fprintf(afm_file, "FullName %s\n", fontm.name_full); + fprintf(afm_file, "Notice %s\n", fontm.name_copyright); + fprintf(afm_file, "EncodingScheme FontSpecific\n"); + fprintf(afm_file, "FamilyName %s\n", fontm.name_family); + fprintf(afm_file, "Weight %s\n", fontm.name_style); + fprintf(afm_file, "Version %s\n", fontm.name_version); + fprintf(afm_file, "Characters %d\n", nchars); + fprintf(afm_file, "ItalicAngle %.1f\n", italic_angle); + + fprintf(afm_file, "Ascender %d\n", iscale(fontm.ascender)); + fprintf(afm_file, "Descender %d\n", iscale(fontm.descender)); + + fprintf(ufm_file, "StartFontMetrics 4.1\n"); + fprintf(ufm_file, "FontName %s%s\n", fontm.name_ps, uni_font_name_suffix); + fprintf(ufm_file, "FullName %s\n", fontm.name_full); + fprintf(ufm_file, "Notice %s\n", fontm.name_copyright); + fprintf(ufm_file, "EncodingScheme FontSpecific\n"); + fprintf(ufm_file, "FamilyName %s\n", fontm.name_family); + fprintf(ufm_file, "Weight %s\n", fontm.name_style); + fprintf(ufm_file, "Version %s\n", fontm.name_version); + fprintf(ufm_file, "Characters %d\n", nchars); + fprintf(ufm_file, "ItalicAngle %.1f\n", italic_angle); + + fprintf(ufm_file, "Ascender %d\n", iscale(fontm.ascender)); + fprintf(ufm_file, "Descender %d\n", iscale(fontm.descender)); + + fprintf(pfa_file, "/UnderlinePosition %d def\n", + iscale(fontm.underline_position)); + + fprintf(pfa_file, "/UnderlineThickness %hd def\nend readonly def\n", + iscale(fontm.underline_thickness)); + + fprintf(afm_file, "UnderlineThickness %d\n", + iscale(fontm.underline_thickness)); + + fprintf(afm_file, "UnderlinePosition %d\n", + iscale(fontm.underline_position)); + + fprintf(afm_file, "IsFixedPitch %s\n", + fontm.is_fixed_pitch ? "true" : "false"); + fprintf(afm_file, "FontBBox %d %d %d %d\n", + bbox[0], bbox[1], bbox[2], bbox[3]); + + fprintf(ufm_file, "UnderlineThickness %d\n", + iscale(fontm.underline_thickness)); + + fprintf(ufm_file, "UnderlinePosition %d\n", + iscale(fontm.underline_position)); + + fprintf(ufm_file, "IsFixedPitch %s\n", + fontm.is_fixed_pitch ? "true" : "false"); + fprintf(ufm_file, "FontBBox %d %d %d %d\n", + bbox[0], bbox[1], bbox[2], bbox[3]); + + fprintf(pfa_file, "/FontName /%s%s def\n", fontm.name_ps, uni_font_name_suffix); + fprintf(pfa_file, "/PaintType 0 def\n/StrokeWidth 0 def\n"); + /* I'm not sure if these are fixed */ + fprintf(pfa_file, "/FontType 1 def\n"); + + if (transform) { + fprintf(pfa_file, "/FontMatrix [0.001 0 0 0.001 0 0] def\n"); + } else { + fprintf(pfa_file, "/FontMatrix [%9.7f 0 0 %9.7f 0 0] def\n", + original_scale_factor / 1000.0, original_scale_factor / 1000.0); + } + + fprintf(pfa_file, "/FontBBox {%d %d %d %d} readonly def\n", + bbox[0], bbox[1], bbox[2], bbox[3]); + + fprintf(pfa_file, "/Encoding 256 array\n"); + /* determine number of elements for metrics table */ + nmetrics = 256; + for (i = 0; i < numglyphs; i++) { + if( glyph_list[i].flags & GF_USED + && glyph_list[i].char_no == -1 ) { + nmetrics++; + } + } + fprintf(afm_file, "StartCharMetrics %d\n", nmetrics); + fprintf(ufm_file, "StartCharMetrics %d\n", nmetrics); + + fprintf(dvienc_file, "/%s%sEncoding [\n", + fontm.name_ps, uni_font_name_suffix); + + for (i = 0; i < 256; i++) { /* here 256, not ENCTABSZ */ + fprintf(pfa_file, + "dup %d /%s put\n", i, glyph_list[encoding[i]].name); + if( glyph_list[encoding[i]].flags & GF_USED ) { + int j = 0; + print_glyph_metrics(afm_file, i, encoding[i]); + while ( glyph_list[encoding[i]].orig_code[j] != -1 ) { + //print_glyph_metrics_ufm(ufm_file, glyph_list[encoding[i]].orig_code, encoding[i]); + //print_glyph_metrics_ufm(ufm_file, i, encoding[i]); + print_glyph_metrics_ufm(ufm_file, glyph_list[encoding[i]].orig_code[j], encoding[i]); + j++; + } + } + if (encoding[i]) + fprintf (dvienc_file, "/index0x%04X\n", encoding[i]); + else + fprintf (dvienc_file, "/.notdef\n"); + } + + /* print the metrics for glyphs not in encoding table */ + for(i=0; ikerning(glyph_list); + print_kerning(afm_file); + } + if(ufm_file != null_file) { /* save time if the output would be wasted */ + /* print the kerning data if present */ + cursw->kerning(glyph_list); + print_kerning(ufm_file); + } + + fprintf(afm_file, "EndFontMetrics\n"); + if(afm_file != null_file) + fclose(afm_file); + + fprintf(ufm_file, "EndFontMetrics\n"); + if(ufm_file != null_file) + fclose(ufm_file); + + fprintf(dvienc_file, "] def\n"); + if(dvienc_file != null_file) + fclose(dvienc_file); + + WARNING_1 fprintf(stderr, "Finished - font files created\n"); + + cursw->close(); + +#ifndef WINDOWS + while (wait(&ws) > 0) { + } +#else + if (encode && pfa_file != null_file) { + extern FILE *ifp, *ofp; /* from t1asm.c */ + + snprintf(filename, sizeof filename, "%s.%s", argv[2], pfbflag ? "pfb" : "pfa" ); + + if ((ofp = fopen(filename, "w+b")) == NULL) { + fprintf(stderr, "**** Cannot create %s ****\n", filename); + exit(1); + } else { + WARNING_2 fprintf(stderr, "Creating file %s\n", filename); + } + + snprintf(filename, sizeof filename, "%s.t1a", argv[2]); + + if ((ifp = fopen(filename, "rb")) == NULL) { + fprintf(stderr, "**** Cannot read %s ****\n", filename); + exit(1); + } else { + WARNING_2 fprintf(stderr, "Converting file %s\n", filename); + } + + runt1asm(pfbflag); + + WARNING_2 fprintf(stderr, "Removing file %s\n", filename); + if(unlink(filename) < 0) + WARNING_1 fprintf(stderr, "Unable to remove file %s\n", filename); + } +#endif /* WINDOWS */ + + fclose(null_file); + return 0; +} diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1_convert.1 b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1_convert.1 new file mode 100755 index 00000000..beada4fc --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1_convert.1 @@ -0,0 +1,506 @@ +.rn '' }` +''' $RCSfile: ttf2pt1_convert.1,v $$Revision: 1.1 $$Date: 2008-03-12 06:35:44 $ +''' +''' $Log: not supported by cvs2svn $ +''' +.de Sh +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp +.if t .sp .5v +.if n .sp +.. +.de Ip +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.de Vb +.ft CW +.nf +.ne \\$1 +.. +.de Ve +.ft R + +.fi +.. +''' +''' +''' Set up \*(-- to give an unbreakable dash; +''' string Tr holds user defined translation string. +''' Bell System Logo is used as a dummy character. +''' +.tr \(*W-|\(bv\*(Tr +.ie n \{\ +.ds -- \(*W- +.ds PI pi +.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +.ds L" "" +.ds R" "" +''' \*(M", \*(S", \*(N" and \*(T" are the equivalent of +''' \*(L" and \*(R", except that they are used on ".xx" lines, +''' such as .IP and .SH, which do another additional levels of +''' double-quote interpretation +.ds M" """ +.ds S" """ +.ds N" """"" +.ds T" """"" +.ds L' ' +.ds R' ' +.ds M' ' +.ds S' ' +.ds N' ' +.ds T' ' +'br\} +.el\{\ +.ds -- \(em\| +.tr \*(Tr +.ds L" `` +.ds R" '' +.ds M" `` +.ds S" '' +.ds N" `` +.ds T" '' +.ds L' ` +.ds R' ' +.ds M' ` +.ds S' ' +.ds N' ` +.ds T' ' +.ds PI \(*p +'br\} +.\" If the F register is turned on, we'll generate +.\" index entries out stderr for the following things: +.\" TH Title +.\" SH Header +.\" Sh Subsection +.\" Ip Item +.\" X<> Xref (embedded +.\" Of course, you have to process the output yourself +.\" in some meaninful fashion. +.if \nF \{ +.de IX +.tm Index:\\$1\t\\n%\t"\\$2" +.. +.nr % 0 +.rr F +.\} +.TH TTF2PT1_CONVERT 1 "version 3.4.4" "December 31, 2003" "TTF2PT1 Font Converter" +.UC +.if n .hy 0 +.if n .na +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.de CQ \" put $1 in typewriter font +.ft CW +'if n "\c +'if t \\&\\$1\c +'if n \\&\\$1\c +'if n \&" +\\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7 +'.ft R +.. +.\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2 +. \" AM - accent mark definitions +.bd B 3 +. \" fudge factors for nroff and troff +.if n \{\ +. ds #H 0 +. ds #V .8m +. ds #F .3m +. ds #[ \f1 +. ds #] \fP +.\} +.if t \{\ +. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +. ds #V .6m +. ds #F 0 +. ds #[ \& +. ds #] \& +.\} +. \" simple accents for nroff and troff +.if n \{\ +. ds ' \& +. ds ` \& +. ds ^ \& +. ds , \& +. ds ~ ~ +. ds ? ? +. ds ! ! +. ds / +. ds q +.\} +.if t \{\ +. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +. ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10' +. ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m' +. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +. ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10' +.\} +. \" troff and (daisy-wheel) nroff accents +.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#] +.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u' +.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u' +.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#] +.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +.ds ae a\h'-(\w'a'u*4/10)'e +.ds Ae A\h'-(\w'A'u*4/10)'E +.ds oe o\h'-(\w'o'u*4/10)'e +.ds Oe O\h'-(\w'O'u*4/10)'E +. \" corrections for vroff +.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +. \" for low resolution devices (crt and lpr) +.if \n(.H>23 .if \n(.V>19 \ +\{\ +. ds : e +. ds 8 ss +. ds v \h'-1'\o'\(aa\(ga' +. ds _ \h'-1'^ +. ds . \h'-1'. +. ds 3 3 +. ds o a +. ds d- d\h'-1'\(ga +. ds D- D\h'-1'\(hy +. ds th \o'bp' +. ds Th \o'LP' +. ds ae ae +. ds Ae AE +. ds oe oe +. ds Oe OE +.\} +.rm #[ #] #H #V #F C +.SH "NAME" +\fBttf2pt1_convert\fR \- convenience font conversion script +.SH "SYNOPSIS" +ttf2pt1_convert \fB[config-file]\fR +.SH "DESCRIPTION" +`\fBConvert\fR\*(R' is the master conversion script provided with ttf2pt1. +When installed into a public directory it's named `\fBttf2pt1_convert\fR\*(R' +to avoid name collisions with the other programs. +.PP +If the configuration file is not specified as an argument then the file +`\f(CWconvert.cfg\fR\*(R' in the current directory is used. This file contains +a set of configuration variables. The distribution contains a sample file +file `\f(CWconvert.cfg.sample\fR\*(R'. Please copy it to `\f(CWconvert.cfg\fR\*(R', +look inside it and change the configuration variables. The more stable +configuration variables, such as the path names of the scripts and +encoding files are located in `\f(CWconvert\fR\*(R' itself, they are +automatically updated when installing \fBttf2pt1\fR. +.PP +Put all the TTF fonts you want to convert into some directory (this +may be just the directory that already contains all the Windows +fonts on a mounted FAT filesystem). If you have fonts in different +source encoding then put the fonts in each of the encodings +into a separate directory. Up to 10 source directories are +supported. If you (in a rather unlikely case) have more source +directories then you can make two separate runs of the converter, +converting up to 10 directories at a time. +.PP +The variables in the configuration file are: +.Ip "\(bu" 2 +\fB\f(CWSRCDIRS\fR\fR \- the list of directories (with absolute paths) with +\s-1TTF\s0 fonts. Each line contains at least 3 fields: the name of the directory, +the language of the fonts in it (if you have fonts for different +languages you have to put them into the separate directories) and the +encoding of the fonts. Again, if you have some of the \s-1TTF\s0 typefaces in +one encoding, and some in another (say, \s-1CP\s0\-1251 and \s-1KOI\s0\-8), you have +to put them into the separate source directories. Some lines may contain +4 fields. Then the fourth field is the name of the external map to +convert the Unicode fonts into the desirable encoding. This map is +used instead of the built-in map for the specified language. +.Sp +*8* +An interesting thing is that some languages have more than one +widely used character encodings. For example, the widely used +encodings for Russian are \s-1IBM\s0 \s-1CP\s0\-866 (\s-1MS\s0\-\s-1DOS\s0 and Unix), \s-1KOI\s0\-8 +(Unix and \s-1VAX\s0, also the standard Internet encoding), \s-1IBM\s0 \s-1CP\s0\-1251 (\s-1MS\s0 Windows). +That's why I have provided the means to generate the converted fonts +in more than one encoding. See the file encodings/\s-1README\s0 for +details about the encoding tables. Actually, if you plan to use +these fonts with Netscape Navigator better use the aliases +cp-866 instead of ibm-866 and windows-1251 instead of ibm-1251 +because that's what Netscape wants. +.Ip "\(bu" 2 +\fB\f(CWDSTDIR\fR\fR \- directory for the resulting Type1 fonts. Be careful! +This directory gets completely wiped out before conversion, +so don't use any already existing directory for this purpose. +.Ip "\(bu" 2 +\fB\f(CWDSTENC\fI{language}\fR\fR\fR \- the list of encodings in which the destination +fonts will be generated for each language. Each font of that +language will be generated in each of the specified +encodings. If you don't want any translation, just specify both +\f(CWSRCENC\fR and \f(CWDSTENC\fR as iso8859-1 (or if you want any other encoding +specified in the fonts.dir, copy the description of 8859-1 with +new name and use this new name for \f(CWSRCENC\fR and \f(CWDSTENC\fR). +.Ip "\(bu" 2 +\fB\f(CWFOUNDRY\fR\fR \- the foundry name to be used in the fonts.dir file. I have +set it to `fromttf\*(R' to avoid name conflicts with any existing font for +sure. But this foundry name is not registered in X11 standards and +if you want to get the full standard compliance or have a font server +that enforces such a compliance, use `misc\*(R'. +.PP +The next few parameters control the general behavior of the converter. +They default values are set to something reasonable. +.Ip "\(bu" 2 +\fB\f(CWCORRECTWIDTH\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then use the +converter option \f(CW\fB-w\fR\fR, otherwise don't use it. See the description of +this option in the \s-1README\s0 file. +.Ip "\(bu" 2 +\fB\f(CWREMOVET1A\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then after +conversion remove the un-encoded \f(CW.t1a\fR font files and the +intermediate \f(CW.xpfa\fR font metric files. +.Ip "\(bu" 2 +\fB\f(CWINSTALLFONTMAP\fR\fR \- a Ghostscript parameter, if the value is set to +\fB\f(CWYES\fR\fR then install the entries for the new fonts +right into the main \f(CWFontmap\fR file. Otherwise just leave +the file \f(CWFontmap.ttf\fR in the Ghostscript configuration +directory. +.Ip "\(bu" 2 +\fB\f(CWHINTSUBST\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR use the option +\f(CW\fB-H\fR\fR, otherwise don't use it. This option enables the +hint substitution technique. If you have not installed the X11 patch +described above, use this option with great caution. See further +description of this option in the \s-1README\s0 file. +.Ip "\(bu" 2 +\fB\f(CWENFORCEISO\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then +disguise the resulting fonts as the fonts in ISOLatin1 encoding. Historically +this was neccessary due to the way the installer scripts created the +X11 font configuration files. It is not neccessary any more for this +purpose. But if you plan to use these fonts with some other application +that expects ISOLatin1 encoding then better enable this option. +.Ip "\(bu" 2 +\fB\f(CWALLGLYPHS\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then +include all the glyphs from the source fonts into the resulting fonts, even +if these glyphs are inaccessible. If it's set to \fB\f(CWNO\fR\fR then +include only the glyphs which have codes assigned to them. The glyphs +without codes can not be used directly. But some clever programs, +such as the Type 1 library from XFree86 3.9 and higher can change +the encoding on the fly and use another set of glyphs. If you have not +installed the X11 patch described above, use this option with great +caution. See further description of the option option \f(CW\fB-a\fR\fR in the +\s-1README\s0 file. +.Ip "\(bu" 2 +\fB\f(CWGENUID\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then use +the option \f(CW\fB-uA\fR\fR of the converter to generate UniqueIDs for +the converted fonts. The standard X11 Type 1 library does not use +this \s-1ID\s0, so it may only be neccessary for the other applications. +The script is clever enough to generate different UniqueID for the +same font converted to multiple encodings. Also after conversion it +checks all the fonts generacted during the session for duplicated +UniqueID and shows those. Still, this does not quarantee that these +UniqueIDs won't overlap with some other fonts. The UniqueIDs are +generated as hash values from the font names, so it's guaranteed +that if the `\f(CWconvert\fR\*(R' script runs multiple times it will +generate the same UniqueIDs during each run. See further description +of this option in the \s-1README\s0 file. +.Ip "\(bu" 2 +\fB\f(CWGENUID\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then create +the \f(CW.pfb\fR files, otherwise the \f(CW.pfa\fR files. The \f(CW.pfb\fR +files are more compact but contain binary data, so you may experience some +troubles when transferring them through the network. +.PP +The following parameters are used to locate the other scripts and +configuration files. By default the scripts do a bit of guessing for them: +they search in the \fBttf2pt1\fR installation directory if \fBttf2pt1\fR +was installed or otherwise suppose that you are running `\f(CWconvert\fR\*(R' with +`\f(CWscripts\fR\*(R' subdirectory being the current directory. +.Ip "\(bu" 2 +\fB\f(CWENCDIR\fR\fR \- directory containing the descriptions of encodings +.Ip "\(bu" 2 +\fB\f(CWMAPDIR\fR\fR \- directory containing the external map files +.PP +Besides that a few parameters are built into the `\f(CWconvert\fR\*(R' script itself. +You probably won't need to change them: +.Ip "\(bu" 2 +\f(CW\fBT1ASM\fR\fR, \f(CW\fBTTF2PT1\fR\fR, \f(CW\fBTRANS\fR\fR, \f(CW\fBT1FDIR\fR\fR, \f(CW\fBFORCEISO\fR\fR \- paths to the other script +.PP +Also there are a few parameters controlling the installation of +fonts for Ghostscript. Please look at their description in the +Ghostscript section of documentation or in the \fBttf2pt1_x2gs(1)\fR +manual page before running `\f(CWconvert\fR\*(R'. If these parameters are +set, `\f(CWconvert\fR\*(R' will call the `\f(CWx2gs\fR\*(R' script automatically +to install the newly converted fonts in Ghostscript. +.PP +After creating the configuration file run the `\f(CWconvert\fR\*(R' script. Look at +the result and the log file in \f(CWDSTDIR\fR. +.PP +Add the directory with newly converted fonts to the configuration +of X server or font server. For most of the systems this step is +very straightforward. For \s-1HP\s0\-\s-1UX\s0 it's rather tricky and poorly +documented, so the file \s-1FONTS\s0.hpux gives a short description. +.PP +If you don't have the privileges of the root user, you still can +configure your private font server. Just use some non-standard +port number (see \s-1FONTS\s0.hpux for an example, exept that you won't +need all the \s-1HP\s0\-related stuff on any other system). +.SH "FILES" +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/\s0scripts/convert.cfg.sample +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/\s0scripts/* +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/README\s0 +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/FONTS\s0 +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR\s0/* +.Ip "\(bu" 2 +\s-1TTF2PT1_BINDIR/\s0ttf2pt1 +.SH "SEE ALSO" +.Ip "\(bu" 4 +the \fIttf2pt1(1)\fR manpage +.Ip "\(bu" 4 +the \fIttf2pt1_x2gs(1)\fR manpage +.Ip "\(bu" 4 +the \fIt1asm(1)\fR manpage +.SH "BUGS" +.Sh "Known problems" +.Ip "\(bu" 4 +One catch is that the X11 Type 1 font library has a rather low limit +on the font size. Because of this the fonts with more complicated +outlines and the enabled hint substitution may not fit into +this limit. The same applies to the fonts with very complicated +outlines or with very many glyphs (especially the fonts with +over 256 glyphs). So you will need to excercise caution with +these options if you plan using these fonts with X11. Some vendors +such as \s-1HP\s0 provide the Type 1 implementation licensed from Adobe +which should have no such problem. +.Sp +But there is a solution even for the generic X11. A patch located +in the subdirectory `\f(CWapp/X11\fR\*(R' fixes this problem as well +as some other minor problems. Its description is provided in +app/X11/\s-1README\s0. +.Sp +To fix the X11 font library, you have to get the X11 sources. I +can recommend the ftp sites of the XFree86 project ftp://ftp.xfree86.org +or of the Open Group ftp://ftp.x.org. This patch was made on the sources +of XFree86 so you may have better success with applying it to the +XFree86 distribution. After you have got the sources, make sure +that you can compile them. Then apply the patch as described. +Make sure that it was applied properly. Compile the sources again +(actually, you need only the fonts library, the fonts server, and +possibly the X server). It would be prudent now to save your old +font library, font server and, possibly, X server. Then install +the new recently compiled versions of these files. Of course, +if you know someone who already has compiled these files for the +same \s-1OS\s0 as yours, you can just copy the binary fles from him. +.Sp +Alas, building the X11 system from the source code is not the +easiest thing in the world and if you have no experience it +can be quite difficult. In this case just avoid the aforementioned +features or check each converted font to make sure that it +works properly. +.Ip "\(bu" 4 +The Type1 font library from the standard X11 distribution +does not work on \s-1HP\s0\-\s-1UX\s0 (at least, up to 10.01). The font server +supplied with \s-1HP\s0\-\s-1UX\s0 up to 10.01 is also broken. Starting from +\s-1HP\s0\-\s-1UX\s0 10.20 (I don't know about 10.10) they supply a proprietary font +library and the converted fonts work fine with it, provided that +they are configured properly (see the file \s-1FONTS\s0.hpux). +.Ip "\(bu" 4 +The \f(CWfonts.scale\fR files created by the older versions of the +\f(CWttf2pt1\fR installation program (up to release 3.1) have conflicted +with the language definitions of the \f(CWXfsft\fR font server and +parts of it included into XFree86. To overcome this incompatibility +the never versions creats the \f(CWfonts.scale\fR file describing all the +fonts as belonging to the \f(CWadobe-fontspecific\fR encoding and +the \f(CWfonts.alias\fR file with the proper names. The drawback of +this solution is that \f(CWxlsfonts\fR gives the list of twice more +fonts. But as a side effect the option \f(CW\fBENFORCEISO\fR\fR in +`\f(CWconvert.cfg\fR\*(R' is not required for X11 any more. +.Ip "\(bu" 4 +The conversion script has no support for Eastern multi-plane fonts. +Contribution of such a support would be welcome. + +.rn }` '' +.IX Title "TTF2PT1_CONVERT 1" +.IX Name "B - convenience font conversion script" + +.IX Header "NAME" + +.IX Header "SYNOPSIS" + +.IX Header "DESCRIPTION" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Header "FILES" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Header "SEE ALSO" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Header "BUGS" + +.IX Subsection "Known problems" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1_x2gs.1 b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1_x2gs.1 new file mode 100755 index 00000000..b8fc998e --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2pt1_x2gs.1 @@ -0,0 +1,313 @@ +.rn '' }` +''' $RCSfile: ttf2pt1_x2gs.1,v $$Revision: 1.1 $$Date: 2008-03-12 06:35:44 $ +''' +''' $Log: not supported by cvs2svn $ +''' +.de Sh +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp +.if t .sp .5v +.if n .sp +.. +.de Ip +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.de Vb +.ft CW +.nf +.ne \\$1 +.. +.de Ve +.ft R + +.fi +.. +''' +''' +''' Set up \*(-- to give an unbreakable dash; +''' string Tr holds user defined translation string. +''' Bell System Logo is used as a dummy character. +''' +.tr \(*W-|\(bv\*(Tr +.ie n \{\ +.ds -- \(*W- +.ds PI pi +.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +.ds L" "" +.ds R" "" +''' \*(M", \*(S", \*(N" and \*(T" are the equivalent of +''' \*(L" and \*(R", except that they are used on ".xx" lines, +''' such as .IP and .SH, which do another additional levels of +''' double-quote interpretation +.ds M" """ +.ds S" """ +.ds N" """"" +.ds T" """"" +.ds L' ' +.ds R' ' +.ds M' ' +.ds S' ' +.ds N' ' +.ds T' ' +'br\} +.el\{\ +.ds -- \(em\| +.tr \*(Tr +.ds L" `` +.ds R" '' +.ds M" `` +.ds S" '' +.ds N" `` +.ds T" '' +.ds L' ` +.ds R' ' +.ds M' ` +.ds S' ' +.ds N' ` +.ds T' ' +.ds PI \(*p +'br\} +.\" If the F register is turned on, we'll generate +.\" index entries out stderr for the following things: +.\" TH Title +.\" SH Header +.\" Sh Subsection +.\" Ip Item +.\" X<> Xref (embedded +.\" Of course, you have to process the output yourself +.\" in some meaninful fashion. +.if \nF \{ +.de IX +.tm Index:\\$1\t\\n%\t"\\$2" +.. +.nr % 0 +.rr F +.\} +.TH TTF2PT1_X2GS 1 "version 3.4.4" "December 31, 2003" "TTF2PT1 Font Converter" +.UC +.if n .hy 0 +.if n .na +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.de CQ \" put $1 in typewriter font +.ft CW +'if n "\c +'if t \\&\\$1\c +'if n \\&\\$1\c +'if n \&" +\\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7 +'.ft R +.. +.\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2 +. \" AM - accent mark definitions +.bd B 3 +. \" fudge factors for nroff and troff +.if n \{\ +. ds #H 0 +. ds #V .8m +. ds #F .3m +. ds #[ \f1 +. ds #] \fP +.\} +.if t \{\ +. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +. ds #V .6m +. ds #F 0 +. ds #[ \& +. ds #] \& +.\} +. \" simple accents for nroff and troff +.if n \{\ +. ds ' \& +. ds ` \& +. ds ^ \& +. ds , \& +. ds ~ ~ +. ds ? ? +. ds ! ! +. ds / +. ds q +.\} +.if t \{\ +. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +. ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10' +. ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m' +. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +. ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10' +.\} +. \" troff and (daisy-wheel) nroff accents +.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#] +.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u' +.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u' +.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#] +.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +.ds ae a\h'-(\w'a'u*4/10)'e +.ds Ae A\h'-(\w'A'u*4/10)'E +.ds oe o\h'-(\w'o'u*4/10)'e +.ds Oe O\h'-(\w'O'u*4/10)'E +. \" corrections for vroff +.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +. \" for low resolution devices (crt and lpr) +.if \n(.H>23 .if \n(.V>19 \ +\{\ +. ds : e +. ds 8 ss +. ds v \h'-1'\o'\(aa\(ga' +. ds _ \h'-1'^ +. ds . \h'-1'. +. ds 3 3 +. ds o a +. ds d- d\h'-1'\(ga +. ds D- D\h'-1'\(hy +. ds th \o'bp' +. ds Th \o'LP' +. ds ae ae +. ds Ae AE +. ds oe oe +. ds Oe OE +.\} +.rm #[ #] #H #V #F C +.SH "NAME" +\fBttf2pt1_x2gs\fR \- font installer for Ghostscript +.SH "SYNOPSIS" +ttf2pt1_x2gs \fB[config-file]\fR +.SH "DESCRIPTION" +The fonts generated with \fBttf2pt1\fR work fine with Ghostscript by +themselves. The script `\fBx2gs\fR\*(R' (or `\fBttf2pt1_x2gs\fR\*(R' when installed +into a public directory, to avoid name conflicts with other +programs) links the font files from the X11 direcotry into the Ghostscript +directory and automatically creates the description file (\f(CWFontmap\fR) +in Ghostscript format. +.PP +If the configuration file is not specified as an argument then the file +`\f(CWconvert.cfg\fR\*(R' in the current directory is used, just like the +`\f(CWconvert\fR\*(R' script does. Indeed, this configuration file is used for +both scripts. +.PP +The Ghostscript-related parameters in the configuration file are: +.PP +\fB\f(CWDSTDIR\fR\fR \- the X11 font directory used by `\f(CWx2gs\fR\*(R' as the +source of the fonts. This parameter is common with the X11 +configuration. +.PP +\fB\f(CWGSDIR\fR\fR \- the base directory of Ghostsript. If this +parameter is set to an empty string then `\f(CWconvert\fR\*(R' won't +call `\f(CWx2gs\fR\*(R'. So if you want to get only the X11 fonts +installed then set this parameter to an empty string. This +directory may vary on various system, so please check your +system and set this value accordingly before running the script. +.PP +\fB\f(CWGSFONTDIR\fR\fR \- the font directory of Ghostscript. In the standard +Ghostscript installation it's a subdirectory of \f(CWGSDIR\fR +but some systems may use completely different directories. +.PP +\fB\f(CWGSCONFDIR\fR\fR \- the configuration subdirectory of Ghostscript +that contains the \f(CWFontmap\fR file. +.PP +\fB\f(CWINSTALLFONTMAP\fR\fR \- if the value is set to \fB\f(CWYES\fR\fR then +install the entries for the new fonts right into the main +\f(CWFontmap\fR file. Otherwise just leave the file \f(CWFontmap.ttf\fR +in the Ghostscript configuration directory. +.PP +After preparing the configuration file run the script. It symbolicaly links +all the font files and creates the description file \f(CWFontmap.ttf\fR in +\f(CWGSCONDFIR\fR. After that there are two choices. +.PP +If the option \f(CWINSTALLFONTMAP\fR was set to \f(CWYES\fR then +the font descriptions are also automatically installed into the +master \f(CWFontmap\fR file. The script is clever enough to +detect if it was run multiple times with the same directories +and if so it replaces the old \f(CWFontmap\fR entries with +the new ones instead of just accumulating all of them. You +may also run it multiple times for multiple X11 directories +and all the results will be properly collected in the \f(CWFontmap\fR. +But it's your responsibility to watch that the names of the +font files don't overlap. If the X11 font directory gets +renamed then you have to remove its font entries from the +\f(CWFontmap\fR and only after that re-run `\f(CWx2gs\fR\*(R' +for the new directory. +.PP +On the other hand if the option \f(CWINSTALLFONTMAP\fR was set to +\f(CWNO\fR then go to the \f(CWGSCONFDIR\fR directory and insert the +contents of \f(CWFontmap.ttf\fR into the \f(CWFontmap\fR file +manually. This step may be left manual to make the installation +a little bit more safe. +.PP +After that you may also want to redefine some of the aliases in +\f(CWFontmap\fR to refer to the newly installed fonts. +But the redefinition of the aliases may be dangerous if the width of +characters in the new font will be different from the old font. +Alas, there is no visible solution of this problem yet. +.SH "FILES" +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/\s0scripts/convert.cfg.sample +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/\s0scripts/* +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/README\s0 +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR/FONTS\s0 +.Ip "\(bu" 2 +\s-1TTF2PT1_SHAREDIR\s0/* +.Ip "\(bu" 2 +\s-1TTF2PT1_BINDIR/\s0ttf2pt1 +.SH "SEE ALSO" +.Ip "\(bu" 4 +the \fIttf2pt1(1)\fR manpage +.Ip "\(bu" 4 +the \fIttf2pt1_convert(1)\fR manpage +.Ip "\(bu" 4 +the \fIt1asm(1)\fR manpage + +.rn }` '' +.IX Title "TTF2PT1_X2GS 1" +.IX Name "B - font installer for Ghostscript" + +.IX Header "NAME" + +.IX Header "SYNOPSIS" + +.IX Header "DESCRIPTION" + +.IX Header "FILES" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Header "SEE ALSO" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/ttf2ufm b/application/third_party/dompdf/lib/ttf2ufm/src/ttf2ufm new file mode 100755 index 0000000000000000000000000000000000000000..5b6b3173fa28085955d70af047f632d5b65e4849 GIT binary patch literal 325617 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 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/version.h b/application/third_party/dompdf/lib/ttf2ufm/src/version.h new file mode 100755 index 00000000..d13c4c46 --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/version.h @@ -0,0 +1,7 @@ +/* + * see COPYRIGHT + */ + + +/* version number */ +#define TTF2PT1_VERSION "3.4.4" diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/winbuild.bat b/application/third_party/dompdf/lib/ttf2ufm/src/winbuild.bat new file mode 100755 index 00000000..59a157ca --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/winbuild.bat @@ -0,0 +1,11 @@ +rem file to build ttf2pt1 with Visual C++ + +cl -DWINDOWS -c bdf.c +cl -DWINDOWS -c ttf2pt1.c +cl -DWINDOWS -c pt1.c +cl -DWINDOWS -c ttf.c +cl -DWINDOWS -c t1asm.c +cl -DWINDOWS -c bitmap.c +cl -o ttf2ufm ttf2pt1.obj pt1.obj t1asm.obj ttf.obj bdf.obj bitmap.obj +cl -o t1asm -DWINDOWS -DSTANDALONE t1asm.c + diff --git a/application/third_party/dompdf/lib/ttf2ufm/src/windows.h b/application/third_party/dompdf/lib/ttf2ufm/src/windows.h new file mode 100755 index 00000000..a90ecf7e --- /dev/null +++ b/application/third_party/dompdf/lib/ttf2ufm/src/windows.h @@ -0,0 +1,93 @@ +/* + * Implementation of things missing in Windows + */ + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#undef ntohs +#undef ntohl +#undef htonl + +#ifdef WINDOWS_FUNCTIONS +/* byte order */ + +static unsigned short StoM(unsigned short inv) { + union iconv { + unsigned short ui; + unsigned char uc[2]; + } *inp, outv; + + inp = (union iconv *)&inv; + + outv.uc[0] = inp->uc[1]; + outv.uc[1] = inp->uc[0]; + + return (outv.ui); +} + +static unsigned int ItoM(unsigned int inv) { + union iconv { + unsigned int ui; + unsigned char uc[4]; + } *inp, outv; + + inp = (union iconv *)&inv; + + outv.uc[0] = inp->uc[3]; + outv.uc[1] = inp->uc[2]; + outv.uc[2] = inp->uc[1]; + outv.uc[3] = inp->uc[0]; + + return (outv.ui); +} + +unsigned short ntohs(unsigned short inv) { return StoM(inv); } +unsigned long ntohl(unsigned long inv) { return ItoM(inv); } +unsigned long htonl(unsigned long inv) { return ItoM(inv); } + +char *optarg; +int optind=1; + +char getopt(int argc, char **argv, char *args) { + int n,nlen=strlen(args),nLen=0; + char nCmd; + + if (argv[optind] && *argv[optind]=='-') { + nCmd=*((argv[optind]+1)); + + for (n=0;n + * + * 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 in the file LICENSE.LGPL; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + * + * Alternatively, you may distribute this software under the terms of the + * PHP License, version 3.0 or later. A copy of this license should have + * been distributed with this file in the file LICENSE.PHP . If this is not + * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. + * + * The latest version of DOMPDF might be available at: + * http://www.dompdf.com/ + * + * @link http://www.dompdf.com/ + * @copyright 2004 Benj Carson + * @author Benj Carson + * @package dompdf + + */ + +require_once("dompdf_config.inc.php"); + +/** + * @access private + */ +define("_TTF2AFM", escapeshellarg(TTF2AFM) . " -a -GAef -OW "); + +if ( !file_exists(TTF2AFM) ) { + die("Unable to locate the ttf2afm / ttf2pt1 executable (checked " . TTF2AFM . ").\n"); +} + + +/** + * Display command line usage + * + */ +function usage() { + + echo << array("_Bold", "b", "B", "bd", "BD"), + "italic" => array("_Italic", "i", "I"), + "bold_italic" => array("_Bold_Italic", "bi", "BI", "ib", "IB"), + ); + + foreach ($patterns as $type => $_patterns) { + if ( !isset($$type) || !is_readable($$type) ) { + foreach($_patterns as $_pattern) { + if ( is_readable("$path$_pattern$ext") ) { + $$type = "$path$_pattern$ext"; + break; + } + } + if ( is_null($$type) ) + echo ("Unable to find $type face file.\n"); + } + } + + $fonts = compact("normal", "bold", "italic", "bold_italic"); + $entry = array(); + + if ( $ext === ".pfb" || $ext === ".ttf" || $ext === ".otf" ) { + + // Copy the files to the font directory. + foreach ($fonts as $var => $src) { + if ( is_null($src) ) { + $entry[$var] = DOMPDF_FONT_DIR . basename($normal); + continue; + } + + // Verify that the fonts exist and are readable + if ( !is_readable($src) ) + throw new DOMPDF_Exception("Requested font '$pathname' is not readable"); + + $dest = DOMPDF_FONT_DIR . basename($src); + if ( !is_writeable(dirname($dest)) ) + throw new DOMPDF_Exception("Unable to write to destination '$dest'."); + + echo "Copying $src to $dest...\n"; + + if ( !copy($src, $dest) ) + throw new DOMPDF_Exception("Unable to copy '$src' to '" . DOMPDF_FONT_DIR . "$dest'."); + + $entry[$var] = $dest; + } + + } else + throw new DOMPDF_Exception("Unable to process fonts of type '$ext'."); + + + // If the extension is a ttf, try and convert the fonts to afm too + if ( $ext === ".ttf" || $ext === ".otf" ) { + foreach ($fonts as $var => $font) { + if ( is_null($font) ) { + $entry[$var] = DOMPDF_FONT_DIR . mb_substr(basename($normal), 0, -4); + continue; + } + + $dest = DOMPDF_FONT_DIR . mb_substr(basename($font), 0 , -4); + $stdout = ( ( strpos(PHP_OS, "WIN") === false ) ? " >/dev/null" : " 2>&1" ); + $command = _TTF2AFM . " " . escapeshellarg($font) . " " . escapeshellarg($dest) . $stdout; + echo "Generating .afm for $font...\n"; + //echo $command . "\n"; + exec( $command, $output, $ret ); + + $entry[$var] = $dest; + } + } + + // FIXME: how to generate afms from pfb? + + // Store the fonts in the lookup table + Font_Metrics::set_font_family($fontname, $entry); + + // Save the changes + Font_Metrics::save_font_families(); +} + +// If installing system fonts (may take a long time) +if ( $_SERVER["argv"][1] === "system_fonts" ) { + $fonts = Font_Metrics::get_system_fonts(); + var_dump($fonts); + foreach ( $fonts as $family => $files ) { + echo " >> Installing '$family'... \n"; + + if ( !isset($files["normal"]) ) { + echo "No 'normal' style font file\n"; + } + else { + install_font_family( $family, @$files["normal"], @$files["bold"], @$files["italic"], @$files["bold_italic"]); + echo "Done !\n"; + } + + echo "\n"; + } +} +else { + call_user_func_array("install_font_family", array_slice($_SERVER["argv"], 1)); +} \ No newline at end of file diff --git a/application/third_party/dompdf/www/controller.php b/application/third_party/dompdf/www/controller.php new file mode 100755 index 00000000..289aca01 --- /dev/null +++ b/application/third_party/dompdf/www/controller.php @@ -0,0 +1,15 @@ +"; + break; +} \ No newline at end of file diff --git a/application/third_party/dompdf/www/cssSandpaper/css/reset.css b/application/third_party/dompdf/www/cssSandpaper/css/reset.css new file mode 100755 index 00000000..93463b4e --- /dev/null +++ b/application/third_party/dompdf/www/cssSandpaper/css/reset.css @@ -0,0 +1,71 @@ +/* + * CSS Reset based on code from + * http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/ + * + * Earlier copy stated: + * "If you want to use my reset styles, then feel free! It's all + * explicitly in the public domain (I have to formally say that + * or else people ask me about licensing)." + */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-weight: inherit; + font-style: inherit; + font-size: 100%; + font-family: inherit; + vertical-align: baseline; +} +/* remember to define focus styles! */ +:focus { + outline: 0; +} +body { + line-height: 1; + color: black; + background: white; +} +ol, ul { + list-style: none; +} +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse: separate; + border-spacing: 0; +} +caption, th, td { + text-align: left; + font-weight: normal; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ""; +} +blockquote, q { + quotes: "" ""; +} + +/* + * Added 2009/02/04 to fix IE7's issue with interpolated + * scaling not turned on by default. Based on an idea from + * http://acidmartin.wordpress.com/2009/01/05/better-image-scaling-and-resampling-in-internet-explorer/ + */ +img +{ + -ms-interpolation-mode: bicubic; +} +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px \9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.form-group-sm .form-control{height:30px;line-height:30px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:5px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.form-group-lg .form-control{height:46px;line-height:46px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:10px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px)and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px)and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px)and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/application/third_party/dompdf/www/cssSandpaper/js/EventHelpers.js b/application/third_party/dompdf/www/cssSandpaper/js/EventHelpers.js new file mode 100755 index 00000000..52fe7e67 --- /dev/null +++ b/application/third_party/dompdf/www/cssSandpaper/js/EventHelpers.js @@ -0,0 +1,441 @@ +/******************************************************************************* + * This notice must be untouched at all times. + * + * This javascript library contains helper routines to assist with event + * handling consinstently among browsers + * + * EventHelpers.js v.1.3 available at http://www.useragentman.com/ + * + * released under the MIT License: + * http://www.opensource.org/licenses/mit-license.php + * + *******************************************************************************/ +var EventHelpers = new function(){ + var me = this; + + var safariTimer; + var isSafari = /WebKit/i.test(navigator.userAgent); + var globalEvent; + + me.init = function () { + if (me.hasPageLoadHappened(arguments)) { + return; + } + + if (document.createEventObject){ + // dispatch for IE + globalEvent = document.createEventObject(); + } else if (document.createEvent) { + globalEvent = document.createEvent("HTMLEvents"); + } + + me.docIsLoaded = true; + } + + /** + * Adds an event to the document. Examples of usage: + * me.addEvent(window, "load", myFunction); + * me.addEvent(docunent, "keydown", keyPressedFunc); + * me.addEvent(document, "keyup", keyPressFunc); + * + * @author Scott Andrew - http://www.scottandrew.com/weblog/articles/cbs-events + * @author John Resig - http://ejohn.org/projects/flexible-javascript-events/ + * @param {Object} obj - a javascript object. + * @param {String} evType - an event to attach to the object. + * @param {Function} fn - the function that is attached to the event. + */ + me.addEvent = function(obj, evType, fn){ + + if (obj.addEventListener) { + obj.addEventListener(evType, fn, false); + } else if (obj.attachEvent) { + obj['e' + evType + fn] = fn; + obj[evType + fn] = function(){ + obj["e" + evType + fn](self.event); + } + obj.attachEvent("on" + evType, obj[evType + fn]); + } + } + + + /** + * Removes an event that is attached to a javascript object. + * + * @author Scott Andrew - http://www.scottandrew.com/weblog/articles/cbs-events + * @author John Resig - http://ejohn.org/projects/flexible-javascript-events/ * @param {Object} obj - a javascript object. + * @param {String} evType - an event attached to the object. + * @param {Function} fn - the function that is called when the event fires. + */ + me.removeEvent = function(obj, evType, fn){ + + if (obj.removeEventListener) { + obj.removeEventListener(evType, fn, false); + } else if (obj.detachEvent) { + try { + obj.detachEvent("on" + evType, obj[evType + fn]); + obj[evType + fn] = null; + obj["e" + evType + fn] = null; + } + catch (ex) { + // do nothing; + } + } + } + + function removeEventAttribute(obj, beginName){ + var attributes = obj.attributes; + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i] + var name = attribute.name + if (name.indexOf(beginName) == 0) { + //obj.removeAttributeNode(attribute); + attribute.specified = false; + } + } + } + + me.addScrollWheelEvent = function(obj, fn){ + if (obj.addEventListener) { + /** DOMMouseScroll is for mozilla. */ + obj.addEventListener('DOMMouseScroll', fn, true); + } + + /** IE/Opera. */ + if (obj.attachEvent) { + obj.attachEvent("onmousewheel", fn); + } + + } + + me.removeScrollWheelEvent = function(obj, fn){ + if (obj.removeEventListener) { + /** DOMMouseScroll is for mozilla. */ + obj.removeEventListener('DOMMouseScroll', fn, true); + } + + /** IE/Opera. */ + if (obj.detachEvent) { + obj.detatchEvent("onmousewheel", fn); + } + + } + + /** + * Given a mouse event, get the mouse pointer's x-coordinate. + * + * @param {Object} e - a DOM Event object. + * @return {int} - the mouse pointer's x-coordinate. + */ + me.getMouseX = function(e){ + if (!e) { + return; + } + // NS4 + if (e.pageX != null) { + return e.pageX; + // IE + } else if (window.event != null && window.event.clientX != null && + document.body != null && + document.body.scrollLeft != null) + return window.event.clientX + document.body.scrollLeft; + // W3C + else if (e.clientX != null) + return e.clientX; + else + return null; + } + + /** + * Given a mouse event, get the mouse pointer's y-coordinate. + * @param {Object} e - a DOM Event Object. + * @return {int} - the mouse pointer's y-coordinate. + */ + me.getMouseY = function(e){ + // NS4 + if (e.pageY != null) + return e.pageY; + // IE + else if (window.event != null && window.event.clientY != null && + document.body != null && + document.body.scrollTop != null) + return window.event.clientY + document.body.scrollTop; + // W3C + else if (e.clientY != null) { + return e.clientY; + } + } + /** + * Given a mouse scroll wheel event, get the "delta" of how fast it moved. + * @param {Object} e - a DOM Event Object. + * @return {int} - the mouse wheel's delta. It is greater than 0, the + * scroll wheel was spun upwards; if less than 0, downwards. + */ + me.getScrollWheelDelta = function(e){ + var delta = 0; + if (!e) /* For IE. */ + e = window.event; + if (e.wheelDelta) { /* IE/Opera. */ + delta = e.wheelDelta / 120; + /** In Opera 9, delta differs in sign as compared to IE. + */ + if (window.opera) { + delta = -delta; + } + } else if (e.detail) { /** Mozilla case. */ + /** In Mozilla, sign of delta is different than in IE. + * Also, delta is multiple of 3. + */ + delta = -e.detail / 3; + } + return delta + } + + /** + * Sets a mouse move event of a document. + * + * @deprecated - use only if compatibility with IE4 and NS4 is necessary. Otherwise, just + * use EventHelpers.addEvent(window, 'mousemove', func) instead. Cannot be used to add + * multiple mouse move event handlers. + * + * @param {Function} func - the function that you want a mouse event to fire. + */ + me.addMouseEvent = function(func){ + + if (document.captureEvents) { + document.captureEvents(Event.MOUSEMOVE); + } + + document.onmousemove = func; + window.onmousemove = func; + window.onmouseover = func; + + } + + + + /** + * Find the HTML object that fired an Event. + * + * @param {Object} e - an HTML object + * @return {Object} - the HTML object that fired the event. + */ + me.getEventTarget = function(e){ + // first, IE method for mouse events(also supported by Safari and Opera) + if (e.toElement) { + return e.toElement; + // W3C + } else if (e.currentTarget) { + return e.currentTarget; + + // MS way + } else if (e.srcElement) { + return e.srcElement; + } else { + return null; + } + } + + + + + /** + * Given an event fired by the keyboard, find the key associated with that event. + * + * @param {Object} e - an event object. + * @return {String} - the ASCII character code representing the key associated with the event. + */ + me.getKey = function(e){ + if (e.keyCode) { + return e.keyCode; + } else if (e.event && e.event.keyCode) { + return window.event.keyCode; + } else if (e.which) { + return e.which; + } + } + + + /** + * Will execute a function when the page's DOM has fully loaded (and before all attached images, iframes, + * etc., are). + * + * Usage: + * + * EventHelpers.addPageLoadEvent('init'); + * + * where the function init() has this code at the beginning: + * + * function init() { + * + * if (EventHelpers.hasPageLoadHappened(arguments)) return; + * + * // rest of code + * .... + * } + * + * @author This code is based off of code from http://dean.edwards.name/weblog/2005/09/busted/ by Dean + * Edwards, with a modification by me. + * + * @param {String} funcName - a string containing the function to be called. + */ + me.addPageLoadEvent = function(funcName){ + + var func = eval(funcName); + + // for Internet Explorer (using conditional comments) + /*@cc_on @*/ + /*@if (@_win32) + pageLoadEventArray.push(func); + return; + /*@end @*/ + if (isSafari) { // sniff + pageLoadEventArray.push(func); + + if (!safariTimer) { + + safariTimer = setInterval(function(){ + if (/loaded|complete/.test(document.readyState)) { + clearInterval(safariTimer); + + /* + * call the onload handler + * func(); + */ + me.runPageLoadEvents(); + return; + } + set = true; + }, 10); + } + /* for Mozilla */ + } else if (document.addEventListener) { + var x = document.addEventListener("DOMContentLoaded", func, null); + + /* Others */ + } else { + me.addEvent(window, 'load', func); + } + } + + var pageLoadEventArray = new Array(); + + me.runPageLoadEvents = function(e){ + if (isSafari || e.srcElement.readyState == "complete") { + + for (var i = 0; i < pageLoadEventArray.length; i++) { + pageLoadEventArray[i](); + } + } + } + /** + * Determines if either addPageLoadEvent('funcName') or addEvent(window, 'load', funcName) + * has been executed. + * + * @see addPageLoadEvent + * @param {Function} funcArgs - the arguments of the containing. function + */ + me.hasPageLoadHappened = function(funcArgs){ + // If the function already been called, return true; + if (funcArgs.callee.done) + return true; + + // flag this function so we don't do the same thing twice + funcArgs.callee.done = true; + } + + + + /** + * Used in an event method/function to indicate that the default behaviour of the event + * should *not* happen. + * + * @param {Object} e - an event object. + * @return {Boolean} - always false + */ + me.preventDefault = function(e){ + + if (e.preventDefault) { + e.preventDefault(); + } + + try { + e.returnValue = false; + } + catch (ex) { + // do nothing + } + + } + + me.cancelBubble = function(e){ + if (e.stopPropagation) { + e.stopPropagation(); + } + + try { + e.cancelBubble = true; + } + catch (ex) { + // do nothing + } + } + + /* + * Fires an event manually. + * @author Scott Andrew - http://www.scottandrew.com/weblog/articles/cbs-events + * @author John Resig - http://ejohn.org/projects/flexible-javascript-events/ * @param {Object} obj - a javascript object. + * @param {String} evType - an event attached to the object. + * @param {Function} fn - the function that is called when the event fires. + * + */ + me.fireEvent = function (element,event, options){ + + if(!element) { + return; + } + + if (document.createEventObject){ + /* + var stack = DebugHelpers.getStackTrace(); + var s = stack.toString(); + jslog.debug(s); + if (s.indexOf('fireEvent') >= 0) { + return; + } + */ + return element.fireEvent('on' + event, globalEvent) + jslog.debug('ss'); + + } + else{ + // dispatch for firefox + others + globalEvent.initEvent(event, true, true); // event type,bubbling,cancelable + return !element.dispatchEvent(globalEvent); + } +} + + /* EventHelpers.init () */ + function init(){ + // Conditional comment alert: Do not remove comments. Leave intact. + // The detection if the page is secure or not is important. If + // this logic is removed, Internet Explorer will give security + // alerts. + /*@cc_on @*/ + /*@if (@_win32) + + document.write(' + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+ + + + +
+
diff --git a/application/third_party/dompdf/www/demo.php b/application/third_party/dompdf/www/demo.php new file mode 100755 index 00000000..6d07acc2 --- /dev/null +++ b/application/third_party/dompdf/www/demo.php @@ -0,0 +1,84 @@ +load_html($_POST["html"]); + $dompdf->set_paper($_POST["paper"], $_POST["orientation"]); + $dompdf->render(); + + $dompdf->stream("dompdf_out.pdf", array("Attachment" => false)); + + exit(0); +} + +?> + + +
+

Demo

+ + + +

Enter your html snippet in the text box below to see it rendered as a +PDF: (Note by default, remote stylesheets, images & inline PHP are disabled.)

+ +
" method="post"> +

Paper size and orientation: + + +

+ + + +
+ +
+ +
+

(Note: if you use a KHTML +based browser and are having difficulties loading the sample output, try +saving it to a file first.)

+ + + +

+ User input has been disabled for remote connections. +

+ + + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/examples.php b/application/third_party/dompdf/www/examples.php new file mode 100755 index 00000000..06a541c2 --- /dev/null +++ b/application/third_party/dompdf/www/examples.php @@ -0,0 +1,96 @@ + + + + + + + +

Samples

+ +

Below are some sample files. The PDF version is generated on the fly by dompdf. (The source HTML & CSS for +these files is included in the test/ directory of the distribution +package.)

+ + array(), + "dom" => array(), + "image" => array(), + "page" => array(), + "encoding" => array(), + "script" => array(), + "quirks" => array(), + "other" => array(), +); + +//if dompdf.php runs in virtual server root, dirname does not return empty folder but '/' or '\' (windows). +//This leads to a duplicate separator in unix etc. and an error in Windows. Therefore strip off. + +$dompdf = dirname(dirname($_SERVER["PHP_SELF"])); +if ( $dompdf == '/' || $dompdf == '\\') { + $dompdf = ''; +} + +$dompdf .= "/dompdf.php?base_path=" . rawurlencode("www/test/"); + + +foreach ( $test_files as $file ) { + preg_match("@[\\/](([^_]+)_?(.*))\.(".implode("|", $extensions).")$@i", $file, $matches); + $prefix = $matches[2]; + + if ( array_key_exists($prefix, $sections) ) { + $sections[$prefix][] = array($file, $matches[3]); + } + else { + $sections["other"][] = array($file, $matches[1]); + } +} + +foreach ( $sections as $section => $files ) { + echo "

$section

"; + + echo "
    "; + foreach ( $files as $file ) { + $filename = basename($file[0]); + $title = $file[1]; + $arrow = "images/arrow_0" . rand(1, 6) . ".gif"; + echo "
  • \n"; + echo " + [HTML] + [PDF] "; + echo $title; + echo "
  • \n"; + } + echo "
"; +} +?> + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/foot.inc b/application/third_party/dompdf/www/foot.inc new file mode 100755 index 00000000..81b1819f --- /dev/null +++ b/application/third_party/dompdf/www/foot.inc @@ -0,0 +1,10 @@ + + + + diff --git a/application/third_party/dompdf/www/head.inc b/application/third_party/dompdf/www/head.inc new file mode 100755 index 00000000..8eb0213b --- /dev/null +++ b/application/third_party/dompdf/www/head.inc @@ -0,0 +1,37 @@ +'; +} +function li_star() { + return '
  • '; +} +?> + + + + dompdf - The PHP 5 HTML to PDF Converter + + + + + + + + + + + +
    \ No newline at end of file diff --git a/application/third_party/dompdf/www/images/arrow_01.gif b/application/third_party/dompdf/www/images/arrow_01.gif new file mode 100755 index 0000000000000000000000000000000000000000..0a49fe88f634e266b29e49b79a1b1dfa3b5648b6 GIT binary patch literal 237 zcmVE)rF znzgX3%E`+1_44uV>5`6%sHUWrlaYXaeXgmbe0q7`-{P&Ts)T}qu&%1?>+O$@k?-*H z%+Ary(A3b%!~g&QA^8LW0018VEC2ui022TW000GQ;3tmcK%S^LFhuH#7*M^bKq-|; zt5yUVhm9^Z$RG?6jv!(XAXEcH1gjTI!)y#O8)$R(h7NEYEi0kAmO n35`$XQ8y?OBMuHjBMA`;0uLTLA`J=v5CnuY1O*?o)goDx2*2Tuk{r&yCxwfaJrjLt8VL;^M1Kqj2OfVV3|A;206P{;Y$E^w literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/images/arrow_03.gif b/application/third_party/dompdf/www/images/arrow_03.gif new file mode 100755 index 0000000000000000000000000000000000000000..66ce13e8658274fba574c1c877a869ca93b65f32 GIT binary patch literal 232 zcmV7X*eZJfA{msd zQb3ge1lTBmAx0RBMMTkSTn2_giWNz^&N`7J;MDc^o9&gXWOXAP^M^Vn7W9 i9+!t6GMNM>KN=bd7dj~oTLTb=DFF=*1&op+ApkptH*QM+ literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/images/arrow_04.gif b/application/third_party/dompdf/www/images/arrow_04.gif new file mode 100755 index 0000000000000000000000000000000000000000..a48984075502f8f2bcee620766842a61f5097b26 GIT binary patch literal 251 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 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/images/favicon.ico b/application/third_party/dompdf/www/images/favicon.ico new file mode 100755 index 0000000000000000000000000000000000000000..4c4c7c2907252f1303b261aab39c110a5d9b451b GIT binary patch literal 1406 zcmeHD$x6de6g|;2#wKQJUTQ{M`f2`yAUJ>uU8pE3v`7~%f(5O(som(Jpa|lC2vVyS z!MX@iOVLfi*CayrF5L7!?sV?(E(c)fQxs6kV=4g{04AwY2oqHMcpyyZ;_>YKBKG%6 zI5<4Q#o0NQGb^YbSFpOaf$5n!+}EE`IjN!1e8u|aHgdTgl&h!M%I5Lbd_nu;6NTa~ zx}6ScmshxZcto*O#`VoD{B{RV^#;0M-{|#vSXj!y_kCpZ1+-f4v110|fPn!6|G|J| zS!SA=m?TrNgoZlt0>Dd#II&4EA-PH)Fh!_D=lK*TIzhuQE7>+{vuq;lPfHLaiBCnT zLu^5pUE+=hWs?X)+?eUQT(DkKX){J#QDD_k`i<$xjwOo%!>Np58{tNau~kOVyhOOd dvJBSMqf+2xj)b>FpvV1AhJa>hQRT0k{{TJlT$um> literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/images/favicon.png b/application/third_party/dompdf/www/images/favicon.png new file mode 100755 index 0000000000000000000000000000000000000000..a6de7bdbd54bdc1983c16de3685cf1357f8e2da9 GIT binary patch literal 308 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 L?{$dm{oMZmO+K?! literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/images/php5-power-micro.png b/application/third_party/dompdf/www/images/php5-power-micro.png new file mode 100755 index 0000000000000000000000000000000000000000..19c4953b5dd0f696caa3a1f4c501d7b44f1e1028 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^0YJ>p!2~4#tiFE(NU<>&kwGlaqrd8NxA(Q&^n0*Qe%^+^a`GG5WQ2cI+(~7T zJ#$cj>2zd}pX!`p}LUMWue|ff_4`TkuUa+SAWxzJ3mdKI;Vst0E-}A{{R30 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/images/small_logo.png b/application/third_party/dompdf/www/images/small_logo.png new file mode 100755 index 0000000000000000000000000000000000000000..0b8517dce137fead0e570d9a4392b372453d7cfd GIT binary patch literal 887 zcmV--1Bm>IP)i^U>}bm?^(!u}$@v2l8VpNOz|ly=_RO}s`;FY)+uJJ?3j4A^Fp)@r;c~fT60u6Dz;S$g zXJ=;SEt|<~zTZUZ`6!o*bSV`|kr30WHN@yB`M%3ddQuQxPfEyM(k4fUIwNqR^7%^TNgtq*uyL?-DTuoxE?7ARoyh?nl_ z0--Ne4N?PB_lK1-V2Z8M&#{6-z zD>L8@nqwoJFBC~Xm4Y(2hk!*G*4v{8hM^}`p#Zg5EDE{2N2i6XmP*9!t<9m&t6~x6 zblBHpQMF0|0fz);batrZGWXP^SR|B6C6K*pC2qA2tgb9`Sd8uMt*XFqM9ASQEq!I7 zI0HNw?_-BT{B*%*z4_fu3VHX4lzTsAU12-9~S&vGEJU%g8UtWm?Hha-Q7qtWQN(*a$oMt^p@CNT^$y42>f9qNf z`nxdXwm@la7er*weka zw)Xn`pq-nCgn{wx=cuKj`uX^xprpaV#d~>p>FeISZp>G%4Kp0H~?3TNFc#_ z8k2~i447y~7+(!|0~izl9uom15DtzC0|WyH4FC@SHUIz+3U~k#1RFOV5*QH&0FoYy zDSZkL2Q?W04SFO3a1To(0ty_9dmUihYb+Mnm52lY z0fhVk4vFJY*aRFDl#Fv3NH9*uLPG*P9uPz45U2>sg4h#YV4pRUF4=EZG77Y;! z5)~B}6$1tY2MKg58iWD@3la4{1PKfb5p)Cy0g7WQ4HpWx WA`cP@+bRVVr6~jt!_eR>Apkp}H**~T literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/images/star_03.gif b/application/third_party/dompdf/www/images/star_03.gif new file mode 100755 index 0000000000000000000000000000000000000000..b3733cd87e4012ab895cf73ecbc4e06fe185ce29 GIT binary patch literal 312 zcmV-80muGFNk%w1VG;lo0K^{v=;`U2n3nzh{fdW$r=_FR)zY@Lx5dK2mXeOo$iDLO z^LBD^kd2Ge($Dtu?%Leofqi?Zp_#I8f9>t==i}X;oSC1WpUun3 z_xJhs`1ktx_y7O^A^8LW0018VEC2ui01^Nc000HG;3tmWa|vUrii(C%-YP4^kYVzw zWDGH-9*zuvKtwhuQRDDf0T>a2fsHUae+SR$byYut))6&tgtfr-* zoS~eU$;iu)jEVE{?Uj;|`1kd+vasRe=k4w7f_{6@&c)>7-mI&y!Mm}CgMr}O*YfZ2 z#lX3rot@s?-v9srA^8LW0018VEC2ui02Kff000Hd;3tmafglH|u43?H2rG*dkYU5j zN{^6Cx)q`UP!vSDfl@ZO2qJ{bW^f1?BAx+cB9Tm#k`4fIc@P*EfB^Oh5FP-6fzhEf z6k>t?p{PJU2Lu!u01E^e6bcDq4Q3n;BoGJ*01*Zc7!U>u3J(nyG7|}U00j~eiV6T8 zGY$)bg&hkT6#xb~ECC4(84Y_;9RvX~3`7fh0=^B)w<{1G8D1rbL<+ZKNG&fxeV06UU@f++w1 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/images/star_05.gif b/application/third_party/dompdf/www/images/star_05.gif new file mode 100755 index 0000000000000000000000000000000000000000..4983634da42e766d2ba99d9ac4476a765e8e09ff GIT binary patch literal 380 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 LvoDwpgQfoixWm3J literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/images/v_bar.gif b/application/third_party/dompdf/www/images/v_bar.gif new file mode 100755 index 0000000000000000000000000000000000000000..ccbc3fe335bf1d081674e269ce4b114a49cbdd2e GIT binary patch literal 2607 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 + + +

    Overview

    + +

    dompdf is an HTML to PDF converter. At its heart, dompdf is (mostly) +CSS2.1 compliant HTML layout and rendering engine written in PHP. It is +a style-driven renderer: it will download and read external stylesheets, +inline style tags, and the style attributes of individual HTML elements. It +also supports most presentational HTML attributes.

    + +

    PDF rendering is currently provided either by PDFLib (www.pdflib.com) or by a bundled +version the R&OS CPDF class written by Wayne Munro (www.ros.co.nz/pdf). (Some +performance related changes have been made to the R&OS class, +however). In order to use PDFLib with dompdf, the PDFLib PECL +extension is required. Using PDFLib improves performance and reduces +the memory requirements of dompdf somewhat, while the R&OS CPDF class, +though slightly slower, eliminates any dependencies on external PDF +libraries.

    + +

    Please note that dompdf works only with PHP 5. There are no plans for +a PHP 4 port. If your web host does not offer PHP 4, I suggest either pestering +them, or setting up your own PHP 5 box and using it to run dompdf. Your scripts +on your web host can redirect PDF requests to your PHP 5 box.

    + + diff --git a/application/third_party/dompdf/www/jquery-1.4.2.js b/application/third_party/dompdf/www/jquery-1.4.2.js new file mode 100755 index 00000000..48a88b8f --- /dev/null +++ b/application/third_party/dompdf/www/jquery-1.4.2.js @@ -0,0 +1,154 @@ +/*! + * jQuery JavaScript Library v1.4.2 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Sat Feb 13 22:33:48 2010 -0500 + */ +(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, +Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& +(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, +a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== +"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, +function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
    a"; +var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, +parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= +false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= +s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, +applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; +else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, +a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== +w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, +cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= +c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); +a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, +function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); +k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), +C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= +e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& +f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; +if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", +e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, +"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, +d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, +e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); +t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| +g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, +CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, +g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, +text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, +setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= +h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== +"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, +h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& +q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; +if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

    ";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); +(function(){var g=s.createElement("div");g.innerHTML="
    ";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: +function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= +{},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== +"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", +d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? +a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== +1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
    ","
    "];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, +""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); +return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", +""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= +c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? +c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= +function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= +Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, +"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= +a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= +a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== +"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
    ").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, +serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), +function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, +global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& +e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? +"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== +false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= +false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", +c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| +d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); +g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== +1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== +"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; +if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== +"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| +c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; +this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= +this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, +e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
    "; +a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); +c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, +d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- +f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": +"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in +e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); \ No newline at end of file diff --git a/application/third_party/dompdf/www/setup.php b/application/third_party/dompdf/www/setup.php new file mode 100755 index 00000000..6bc64daa --- /dev/null +++ b/application/third_party/dompdf/www/setup.php @@ -0,0 +1,325 @@ + + + +

    Setup

    + +

    System Configuration

    + + array( + "required" => "5.0", + "value" => phpversion(), + "result" => version_compare(phpversion(), "5.0"), + ), + "DOMDocument extension" => array( + "required" => true, + "value" => phpversion("DOM"), + "result" => class_exists("DOMDocument"), + ), + "PCRE" => array( + "required" => true, + "value" => phpversion("pcre"), + "result" => function_exists("preg_match"), + ), + "Zlib" => array( + "required" => true, + "value" => phpversion("zlib"), + "result" => function_exists("gzcompress"), + "fallback" => "Recommended to compress PDF documents", + ), + "MBString extension" => array( + "required" => true, + "value" => phpversion("mbstring"), + "result" => function_exists("mb_send_mail"), // Should never be reimplemented in dompdf + "fallback" => "Recommended, will use fallback functions", + ), + "GD" => array( + "required" => true, + "value" => phpversion("gd"), + "result" => function_exists("imagecreate"), + "fallback" => "Required if you have images in your documents", + ), + "APC" => array( + "required" => true, + "value" => phpversion("apc"), + "result" => function_exists("apc_fetch"), + "fallback" => "Recommended for better performances", + ), +); + +?> + + + + + + + + + $server_config) { ?> + + + + + + + +
    RequiredPresent
    "> + No. ".$server_config["fallback"].""; + } + ?> +
    + +

    DOMPDF Configuration

    + + array( + "desc" => "Root directory of DOMPDF", + "success" => "read", + ), + "DOMPDF_INC_DIR" => array( + "desc" => "Include directory of DOMPDF", + "success" => "read", + ), + "DOMPDF_LIB_DIR" => array( + "desc" => "Third-party libraries directory of DOMPDF", + "success" => "read", + ), + "DOMPDF_FONT_DIR" => array( + "desc" => "Additional fonts directory", + "success" => "read", + ), + "DOMPDF_FONT_CACHE" => array( + "desc" => "Font metrics cache", + "success" => "write", + ), + "DOMPDF_TEMP_DIR" => array( + "desc" => "Temporary folder", + "success" => "write", + ), + "DOMPDF_CHROOT" => array( + "desc" => "Restricted path", + "success" => "read", + ), + "DOMPDF_UNICODE_ENABLED" => array( + "desc" => "Unicode support (thanks to additionnal fonts)", + ), + "TTF2AFM" => array( + "desc" => "Path to the ttf2afm executable", + "success" => "read", + ), + "DOMPDF_PDF_BACKEND" => array( + "desc" => "Backend library that makes the outputted file (PDF, image)", + "success" => "backend", + ), + "DOMPDF_DEFAULT_MEDIA_TYPE" => array( + "desc" => "Default media type (print, screen, ...)", + ), + "DOMPDF_DEFAULT_PAPER_SIZE" => array( + "desc" => "Default paper size (A4, letter, ...)", + ), + "DOMPDF_DEFAULT_FONT" => array( + "desc" => "Default font, used if the specified font in the CSS stylesheet was not found", + ), + "DOMPDF_DPI" => array( + "desc" => "DPI scale of the document", + ), + "DOMPDF_ENABLE_PHP" => array( + "desc" => "Inline PHP support", + ), + "DOMPDF_ENABLE_JAVASCRIPT" => array( + "desc" => "Inline JavaScript support", + ), + "DOMPDF_ENABLE_REMOTE" => array( + "desc" => "Allow remote stylesheets and images", + "success" => "remote", + ), + "DEBUGPNG" => array( + "desc" => "Debug PNG images", + ), + "DEBUGKEEPTEMP" => array( + "desc" => "Keep temporary image files", + ), + "DEBUGCSS" => array( + "desc" => "Debug CSS", + ), + "DEBUG_LAYOUT" => array( + "desc" => "Debug layout", + ), + "DEBUG_LAYOUT_LINES" => array( + "desc" => "Debug text lines layout", + ), + "DEBUG_LAYOUT_BLOCKS" => array( + "desc" => "Debug block elements layout", + ), + "DEBUG_LAYOUT_INLINE" => array( + "desc" => "Debug inline elements layout", + ), + "DEBUG_LAYOUT_PADDINGBOX" => array( + "desc" => "Debug padding boxes layout", + ), + "DOMPDF_LOG_OUTPUT_FILE" => array( + "desc" => "The file in which dompdf will write warnings and messages", + "success" => "write", + ), + "DOMPDF_FONT_HEIGHT_RATIO" => array( + "desc" => "The line height ratio to apply to get a render like web browsers", + ), + "DOMPDF_ENABLE_CSS_FLOAT" => array( + "desc" => "Enable CSS float support (experimental)", + ), +); +?> + + + + + + + + + + $value) { ?> + + + + + + + + +
    Config nameValueDescriptionStatus
    >
    + +

    Installed fonts for the Cpdf Backend

    + + + + + + + + + + + + + + + + + + + + $variants) { ?> + + + $path) { + if ($i > 0) { + echo ""; + } + + echo " + "; + + foreach ($extensions as $ext) { + $v = ""; + $class = ""; + + if (is_readable("$path.$ext")) { + // if not cache file + if (strpos($ext, ".php") === false) { + $class = "ok"; + $v = $ext; + } + + // cache file + else { + // check if old cache format + $content = file_get_contents("$path.$ext", null, null, null, 50); + if (strpos($content, '$this->')) { + $v = "DEPREC."; + } + else { + ob_start(); + $d = include("$path.$ext"); + ob_end_clean(); + + if ($d == 1) + $v = "DEPREC."; + else { + $class = "ok"; + $v = $d["_version_"]; + } + } + } + } + + echo ""; + } + + echo ""; + $i++; + } + ?> + + +
    Font familyVariantsFile versions
    TTFAFMAFM cacheUFMUFM cache
    + (default)'; + ?> +
    + $name : $path
    +
    $v
    + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/style.css b/application/third_party/dompdf/www/style.css new file mode 100755 index 00000000..a86a0468 --- /dev/null +++ b/application/third_party/dompdf/www/style.css @@ -0,0 +1,251 @@ +body, select { + color: #7d7a7a; + font-family: 'trebuchet ms', verdana, sans-serif; + font-size: 13px; +} + +a:link, a:visited, a:active { + color: #5F83BA; + text-decoration: none; +} + +a:hover { + color: #5f83ba; + text-decoration: underline; +} + +img { + border: none; +} + +pre, +code { + font-size: 0.8em; + font-family: "lucida console", monospace; +} + +pre { + background-color: #f8f8f8; + padding: 10px; +} + +select { + font-weight: bold; +} + +h2 { + margin: 0.3em 0; +} + +.bar { + background-image: url('images/h_bar.gif'); + background-repeat: repeat-x; + background-position: bottom right; +} + +#header { + height: 50px; + line-height: 30px; +} + +#footer { + font-size: 0.75em; + padding-top: 12px; + background-image: url('images/h_bar.gif'); + background-repeat: repeat-x; + background-position: top left; + height: 35px; + vertical-align: middle; + clear: both; +} + +#logo { + position: absolute; + top: 0px; + right: 0px; + border: none; +} + +.badges { + float: right; +} + +#left_col, #content { + vertical-align: top; +} +/* +#left_col { + padding: 3px 3px 2em 3px; + margin-top: 2px; + width: 210px; + padding-right: 10px; + background-image: url('images/v_bar.gif'); + background-repeat: repeat-y; + background-position: top right; +} +*/ + +#left_col { + padding: 3px 3px 3em 3px; + margin-top: 2px; + width: 120px; + padding-right: 10px; + float: left; +} + +#left_col h2 { + font-size: 1.0em; + margin-top: 0.5em; + margin-bottom: 0.25em; +} + +#left_col ul { + margin-top: 0.25em; + padding-left: 0px; + margin-left: 0px; + position: fixed; +} + +#left_col ul li { list-style-position: inside; } + +#left_col iframe { margin-left: 40px; margin-top: 10px; } + +#content { + margin-left: 120px; + padding: 1em 1em 1em 2em; + min-width: 800px; + background-image: url('images/v_bar.gif'); + background-repeat: repeat-y; + background-position: top left; +} + +.message { + margin-top: 1em; + border: 1px dashed #5E83BA; +} + +#content li { + margin-top: 0.3em; + vertical-align: top; +} + +#content>*>li { + margin-right: 40px; /* keep things in line */ +} + +#content h2 { + text-align: left; + color: #4A9166; +} + +#content h3 { + margin-top: 2em; +} + +#content p { + text-align: justify; +} + +#content table td, +#content table th { + padding: 0.3em; +} + +#content table td.input { + white-space: nowrap; + font-family: "lucida console", monospace; + font-size: 0.8em; +} + +#content textarea { + padding: 4px; + width: 100%; + border: 1px dashed #5F83BA; + -moz-box-shadow: inset 3px 3px 3px rgba(0,0,0,0.1); + -webkit-box-shadow: inset 3px 3px 3px rgba(0,0,0,0.1); + box-shadow: inset 3px 3px 3px rgba(0,0,0,0.1); +} + +#content button { + color: #6d6a6a; + font-family: 'trebuchet ms', verdana, sans-serif; +} + +#preview { + float: right; + height: 800px; + min-width: 400px; + width: 60%; + border: 1px solid #666; + margin-left: 1em; + -moz-box-shadow: 0px 0px 6px rgba(0,0,0,0.5); + -webkit-box-shadow: 0px 0px 6px rgba(0,0,0,0.5); + box-shadow: 0px 0px 6px rgba(0,0,0,0.5); +} + +table.setup { + border: 1px solid #ccc; + border-collapse: collapse; +} + +table.setup td, +table.setup th { + border: 1px solid #ccc; +} + +table.setup th { + background-color: #ddd; +} + +table.setup td.title { + background-color: #f6f6f6; +} + +table.setup td.ok, +table.setup tr:hover td.ok { + background-color: #9e4; +} + +table.setup td.failed, +table.setup tr:hover td.failed { + background-color: #f43; + color: white; +} + +table.setup td.warning, +table.setup tr:hover td.warning { + background-color: #FCC612; +} + +table.setup tr:hover td { + background-color: #EBF1F7; +} + +table.setup tr:hover td.title { + background-color: #D0E0F2; +} + +/* Method definitions from phpdoc */ +.method-definition { + background-image: url('images/h_bar.gif'); + background-position: bottom center; + background-repeat: repeat-x; + padding: 10px 10px 20px 10px; + margin-bottom: 1em; +} + +.method-title { + color: #5F83BA; +} + +.var-name, +.method-name, +.method-title { + font-weight: bold; +} + +.var-type, +.method-result { + color: #4A9166; + font-style: italic; +} diff --git a/application/third_party/dompdf/www/test/backgroundcolor_fontdecoration_pageborder.html b/application/third_party/dompdf/www/test/backgroundcolor_fontdecoration_pageborder.html new file mode 100755 index 00000000..3b8dfd64 --- /dev/null +++ b/application/third_party/dompdf/www/test/backgroundcolor_fontdecoration_pageborder.html @@ -0,0 +1,139 @@ + + + + + + + + +
    +

    Background color, text decoration, page border

    +

    see more testcases with background images in image_variants.html

    + +
    +
    + +

     

    + +

    Text

    +

    Link

    + +

     

    + +

    +block +inline +block +_underlinex +block +_underline stylex +block +_line-through stylex +block +_overline stylex +block +
    + +

     

    + +

    +block +inline +block +_underlinex +block +_underline stylex +block +_line-through stylex +block +_overline stylex +block +
    + +

     

    + +

    +block +inline +block +_underlinex +block +_underline stylex +block +_line-through stylex +block +_overline stylex +block +
    + +

     

    + +

    +block +inline +block +_underlinex +block +_underline stylex +block +_line-through stylex +block +_overline stylex +block +
    +

     

    + +

    +block +inline + +underline sdfjsfh sdfs sfd sf sf sdfsdfasf asdfasdfa asdfasdf asdf asdfas dfasdf afsafasf asdfasdasdf adfasfasdf + +block +
    + +

     

    + +

    +block +inline +block +underline +block +underline style +block +
    + +

     

    + +

    +The PHP 5 HTML to PDF converter +

    + +

    Fill fill fill fill fill fill fill fill

    +

    Fill fill fill fill fill fill fill fill

    +

    Fill fill fill fill fill fill fill fill

    +

    Fill fill fill fill fill fill fill fill

    +

    Fill fill fill fill fill fill fill fill

    +

    Fill fill fill fill fill fill fill fill

    +

    Fill fill fill fill fill fill fill fill

    +
    + diff --git a/application/third_party/dompdf/www/test/css/common.css b/application/third_party/dompdf/www/test/css/common.css new file mode 100755 index 00000000..eb8c732b --- /dev/null +++ b/application/third_party/dompdf/www/test/css/common.css @@ -0,0 +1,128 @@ +/* Notes +-----------------------------------------------------------------------*/ +.note_form { + display: none; +} + + +/* Page +-----------------------------------------------------------------------*/ +.page { + background-color: white; + padding: 20px; + font-size: 0.7em; + margin-bottom: 15px; + margin-right: 5px; +} + +.page table.header td h1 { + margin: 0px; +} + +.page table.header { + border-bottom: 1px solid black; +} + +.page h1 { + text-align: center; + color: black; + font-style: normal; + font-size: 2em; +} + +.page h2 { + text-align: center; + color: black; +} + +.page h3 { + color: black; + font-size: 1em; +} + +.page p { + text-align: justify; + font-size: 1em; +} + +.page em { + font-weight: bold; + font-style: normal; + text-decoration: underline; + margin-left: 1%; + margin-right: 1%; + +} + +.money_table { + width: 85%; + margin-left: auto; + margin-right: auto; +} + +.money { + text-align: right; + padding-right: 20px; +} + +.money_field { + text-align: right; + padding: 0px 15px 5px 15px; + font-weight: bold; +} + +.total_label { + border-top: 2px double black; + font-weight: bold; +} + +.total_field { + border-top: 2px double black; + text-align: right; + padding: 0px 15px 5px 15px; + font-weight: bold; +} + +.written_field { + border-bottom: 0.1pt solid black; +} + +.page .indent * { margin-left: 4em; } + +.checkbox { + border: 1px solid black; + padding: 1px 2px; + font-size: 7px; + font-weight: bold; +} + +table.fax_head { + width: 100%; + font-weight: bold; + font-size: 1.1em; + border-bottom: 1px solid black; +} + +/* Sales-agreement specific +-----------------------------------------------------------------------*/ +table.sa_signature_box { + margin: 2em auto 2em auto; +} + +table.sa_signature_box tr td { + padding-top: 1.5em; + vertical-align: top; + white-space: nowrap; +} + +.special_conditions { + font-style: italic; + margin-left: 2em; + white-space: pre; + font-weight: bold; +} + +.page h2 { + text-align: left; +} + diff --git a/application/third_party/dompdf/www/test/css/importabs.css b/application/third_party/dompdf/www/test/css/importabs.css new file mode 100755 index 00000000..d6cbfb9c --- /dev/null +++ b/application/third_party/dompdf/www/test/css/importabs.css @@ -0,0 +1,2 @@ +p.importabs {background-color:#ffffc0;} + diff --git a/application/third_party/dompdf/www/test/css/importall.css b/application/third_party/dompdf/www/test/css/importall.css new file mode 100755 index 00000000..89f4379b --- /dev/null +++ b/application/third_party/dompdf/www/test/css/importall.css @@ -0,0 +1,2 @@ +li.import {background-color:#ffffc0;} + diff --git a/application/third_party/dompdf/www/test/css/importdisplay.css b/application/third_party/dompdf/www/test/css/importdisplay.css new file mode 100755 index 00000000..7610d901 --- /dev/null +++ b/application/third_party/dompdf/www/test/css/importdisplay.css @@ -0,0 +1,2 @@ +p.import {background-color:#c0c0ff;} + diff --git a/application/third_party/dompdf/www/test/css/importprint.css b/application/third_party/dompdf/www/test/css/importprint.css new file mode 100755 index 00000000..cc9e8c5f --- /dev/null +++ b/application/third_party/dompdf/www/test/css/importprint.css @@ -0,0 +1,2 @@ +p.import {background-color:#eeeeee;} + diff --git a/application/third_party/dompdf/www/test/css/importsub.css b/application/third_party/dompdf/www/test/css/importsub.css new file mode 100755 index 00000000..96b5338f --- /dev/null +++ b/application/third_party/dompdf/www/test/css/importsub.css @@ -0,0 +1,2 @@ +p.importsub {background-color:#ffffc0;} + diff --git a/application/third_party/dompdf/www/test/css/linkall.css b/application/third_party/dompdf/www/test/css/linkall.css new file mode 100755 index 00000000..d3668cfc --- /dev/null +++ b/application/third_party/dompdf/www/test/css/linkall.css @@ -0,0 +1,2 @@ +li.link {background-color:#ffffc0;} + diff --git a/application/third_party/dompdf/www/test/css/linkdefault.css b/application/third_party/dompdf/www/test/css/linkdefault.css new file mode 100755 index 00000000..06115010 --- /dev/null +++ b/application/third_party/dompdf/www/test/css/linkdefault.css @@ -0,0 +1,2 @@ +li.link {color:#ff0000;} + diff --git a/application/third_party/dompdf/www/test/css/linkdisplay.css b/application/third_party/dompdf/www/test/css/linkdisplay.css new file mode 100755 index 00000000..77f3d191 --- /dev/null +++ b/application/third_party/dompdf/www/test/css/linkdisplay.css @@ -0,0 +1,2 @@ +p.link {background-color:#c0c0ff;} + diff --git a/application/third_party/dompdf/www/test/css/linkprint.css b/application/third_party/dompdf/www/test/css/linkprint.css new file mode 100755 index 00000000..dd3f3ca5 --- /dev/null +++ b/application/third_party/dompdf/www/test/css/linkprint.css @@ -0,0 +1,2 @@ +p.link {background-color:#eeeeee;} + diff --git a/application/third_party/dompdf/www/test/css/print_static.css b/application/third_party/dompdf/www/test/css/print_static.css new file mode 100755 index 00000000..2acd05d6 --- /dev/null +++ b/application/third_party/dompdf/www/test/css/print_static.css @@ -0,0 +1,701 @@ +/* Default style definitions */ + +@import url(common.css); + +@page { + margin: 0.25in; +} + +/* General +-----------------------------------------------------------------------*/ +body { + background-color: transparent; + color: black; + font-family: "verdana", "sans-serif"; + margin: 0px; + padding-top: 0px; + font-size: 1em; +} + +@media print { + p { margin: 2px; } +} + +h1 { + font-size: 1.1em; + font-style: italic; +} + +h2 { + font-size: 1.05em; +} + +img { + border: none; +} + +pre { + font-family: "verdana", "sans-serif"; + font-size: 0.7em; +} + +ul { + list-style-type: circle; + list-style-position: inside; + margin: 0px; + padding: 3px; +} + +li.alpha { + list-style-type: lower-alpha; + margin-left: 15px; +} + +p { + font-size: 0.8em; +} + +a:link, +a:visited { + /* font-weight: bold; */ + text-decoration: none; + color: black; +} + +a:hover { + text-decoration: underline; +} + +#body { + padding-bottom: 2em; + padding-top: 5px; +} + +#body pre { +} + +.center { + text-align: center; +} + +.right { + text-align: right; +} + +#money { + text-align: right; + padding-right: 20px; +} + +/* Footer +-----------------------------------------------------------------------*/ +#footer { + color: black; +} + +#copyright { + padding: 5px; + font-size: 0.6em; + background-color: white; +} + +#footer_spacer_row { + width: 100%; +} + +#footer_spacer_row td { + padding: 0px; + border-bottom: 1px solid #000033; + background-color: #F7CF07; + height: 2px; + font-size: 2px; + line-height: 2px; +} + +#logos { + padding: 5px; + float: right; +} + +/* Section Header +-----------------------------------------------------------------------*/ +#section_header { + text-align: center; +} + +#job_header { + text-align: left; + background-color: white; + margin-left: 5px; + padding: 5px; + border: 1px dashed black; +} + +#job_info { + font-weight: bold; +} + +.header_details td { + font-size: 0.6em; +} + +.header_label { + padding-left: 20px; +} + +.header_field { + padding-left: 5px; + font-weight: bold; +} + +/* Content +-----------------------------------------------------------------------*/ +#content { + padding: 0.2em 1% 0.2em 1%; + min-height: 15em; +} + +.page_buttons { + text-align: center; + margin: 3px; + font-size: 0.7em; + white-space: nowrap; + font-weight: bold; + width: 74%; +} + +.link_bar { + font-size: 0.7em; + text-align: center; + margin: auto; +/* white-space: nowrap; */ +} + +.link_bar a { + white-space: nowrap; + font-weight: bold; +} + +.page_menu li { + margin: 5px; + font-size: 0.8em; +} + +/* Detail +-----------------------------------------------------------------------*/ +.detail_table { + border-top: 1px solid black; + border-bottom: 1px solid black; + padding: 3px; + margin: 15px; +} + +.detail_head td { + background-color: #ddd; + color: black; + font-weight: bold; + padding: 3px; + font-size: 0.75em; + text-align: center; +} + +.detail_label { + padding: 3px; + font-size: 0.75em; + width: 16%; + border-top: 1px solid #fff; + border-bottom: 1px solid #fff; + background-color: #ddd; +} + +.detail_field { + width: 33%; + font-size: 0.8em; + color: ; + text-align: center; + padding: 3px; +} + +.detail_sub_table { + font-size: 1em; +} + +.detail_spacer_row td { + border-top: 1px solid white; + border-bottom: 1px solid white; + background-color: #999; + font-size: 2px; + line-height: 2px; +} + +#narrow { + width: 50%; +} + +.operation { + width: 1%; +} + +.summary_spacer_row { + font-size: 0.1em; +} + +.bar { + border-top: 1px solid black; +} + +/* Forms +-----------------------------------------------------------------------*/ +.form { + border-top: 1px solid black; + border-bottom: 1px solid black; + margin-top: 10px; +} + +.form td { + padding: 3px; +} + +.form th, .form_head td { + background-color: #ddd + border-bottom: 1px solid black; + color: black; + padding: 3px; + text-align: center; + font-size: 0.65em; + font-weight: bold; +} + +.form_head a:link, +.form_head a:visited { + color: black; +} + +.form_head a:hover { +} + +.sub_form_head td { + border: none; + font-size: 0.9em; + white-space: nowrap; +} + +.form input { + color: black; + background-color: white; + border: 1px solid black; + padding: 1px 2px 1px 2px; + text-decoration: none; + font-size: 1em; +} + +.form textarea { + color: black; + background-color: white; + border: 1px solid black; + font-size: 1em; +} + +.form select { + color: black; + background-color: white; + font-size: 1em; +} + +.button, a.button { + color: black; + background-color: white; + border: 1px solid black; + font-weight: normal; + white-space: nowrap; + text-decoration: none; +} + +a.button { + display: inline-block; + text-align: center; + padding: 2px; +} + +a.button:hover { + text-decoration: none; + color: black; +} + +.form_field { + color: black; + background-color: white; + font-size: 0.7em; +} + +.form_label { + color: black; + background-color: #ddd; + font-size: 0.7em; + padding: 3px; +} + +/* +.form_foot { + background-color: #E5D9C3; + font-size: 0.6em; +} +*/ + +.form_foot td { + background-color: #ddd + border-bottom: 1px solid black; + color: black; + padding: 3px; + text-align: center; + font-size: 0.65em; + font-weight: bold; +} + +.form_foot a:link, +.form_foot a:visited { + color: black; +} + +.form_foot a:hover { + color: black; +} + +.no_border_input input { + border: none; +} + +.no_wrap { + white-space: nowrap; +} + +tr.row_form td { + white-space: nowrap; +} + +/* Wizards +-----------------------------------------------------------------------*/ +.wizard { + font-size: 0.8em; + border-top: 1px solid black; +} + +#no_border { + border: none; +} + +.wizard p { + text-indent: 2%; +} + +.wizard td { + padding: 3px; +/* padding-left: 3px; + padding-right: 3px; + padding-bottom: 3px;*/ +} + +.wizard input { + color: black; + background-color: white; + border: 1px solid black; + padding: 1px 2px 1px 2px; + text-decoration: none; +} + +.wizard textarea { + color: black; + background-color: white; + border: 1px solid black; +} + +.wizard select { + color: black; + background-color: white; + border: 1px solid black; +} + +.wizard_head { + color: black; + font-weight: bold; +} + +.wizard_buttons { + border-top: 1px solid black; + padding-top: 3px; +} + +.wizard_buttons a { + background-color: white; + border: 1px solid black; + padding: 2px 3px 2px 3px; +} + +/* List +-----------------------------------------------------------------------*/ +.list_table, +.notif_list_table { + color: black; + padding-bottom: 4px; + background-color: white; +} + +.list_table td, +.notif_list_table td { + padding: 3px 5px 3px 5px; +} + +.list_table input { + color: black; + background-color: white; + border: 1px solid black; + padding: 1px 2px 1px 2px; + text-decoration: none; +} + +.list_head, +.notif_list_head { + font-weight: bold; + background-color: #ddd; + font-size: 0.65em; +} + +.list_head td, +.notif_list_head td { + border-top: 1px solid black; + border-bottom: 1px solid black; + color: black; + text-align: center; + white-space: nowrap; +} + +.list_head a:link, +.list_head a:visited, +.notif_list_head a:link, +.notif_list_head a:visited { + color: black; +} + +.list_head a:hover, +.notif_list_head a:hover { +} + +.list_foot { + font-weight: bold; + background-color: #ddd; + font-size: 0.65em; +} + +.list_foot td { + border-top: 1px solid black; + border-bottom: 1px solid black; + color: black; + text-align: right; + white-space: nowrap; +} + +.sub_list_head td { + border: none; + font-size: 0.7em; +} + +.odd_row td { +/* background-color: #EDF2F7; + border-top: 2px solid #FFFFff;*/ + background-color: transparent; + border-bottom: 0.9px solid #ddd; /* 0.9 so table borders take precedence */ +} + +.even_row td { +/* background-color: #F8EEE4; + border-top: 3px solid #FFFFff;*/ + background-color: #f6f6f6; + border-bottom: 0.9px solid #ddd; +} + +.spacer_row td { + line-height: 2px; + font-size: 2px; +} + +.phone_table td { + border: none; + font-size: 0.8em; +} + +div.notif_list_text { + margin-bottom: 1px; + font-size: 1.1em; +} + +.notif_list_row td.notif_list_job { + text-align: center; + font-weight: bold; + font-size: 0.65em; +} + +.notif_list_row td.notif_list_dismiss table td { + text-align: center; + font-size: 1em; + border: none; + padding: 0px 2px 0px 2px; +} + +.notif_list_row td { + padding: 5px 5px 7px 5px; + border-bottom: 1px dotted #ddd; + background-color: white; + font-size: 0.6em; +} + +.notif_list_row:hover td { + background-color: #ddd; +} + +/* Page +-----------------------------------------------------------------------*/ +.page { + border: none; + padding: 0in; + margin-right: 0.1in; + margin-left: 0.1in; + /*margin: 0.33in 0.33in 0.4in 0.33in; */ + background-color: transparent; +} + +.page table.header h1{ + font-size: 12pt; +} + +.page>h2, +.page>p { + margin-top: 2pt; + margin-bottom: 2pt; +} + +.page h2 { + page-break-after: avoid; +} + +.money_table { + border-collapse: collapse; + font-size: 6pt; +} + +/* Tree +-----------------------------------------------------------------------*/ +.tree_div { + display: none; + background-color: #ddd; + border: 1px solid #333; +} + +.tree_div .tree_step_bottom_border { + border-bottom: 1px dashed #8B9DBE; +} + +.tree_div .button, .tree_row_table .button, +.tree_div .no_button { + width: 110px; + font-size: 0.7em; + padding: 3px; + text-align: center; +} + +/* +.tree_div .button a, .tree_row_table .button a { + text-decoration: none; + color: #114C8D; +} +*/ + +.tree_row_desc { + font-weight: bold; + font-size: 0.7em; + text-indent: -10px; +} + +.tree_row_info { + font-size: 0.7em; + width: 200px; +} + +.tree_div_head a, +.tree_row_desc a { + color: #000033; + text-decoration: none; +} + +.tree_div_head { + font-weight: bold; + font-size: 0.7em; +} + +/* Summaries +-----------------------------------------------------------------------*/ +.summary { + border: 1px solid black; + background-color: white; + padding: 1%; + font-size: 0.8em; +} + +.summary h1 { + color: black; + font-style: normal; +} + +/* Sales-agreement specific +-----------------------------------------------------------------------*/ +table.sa_signature_box { + margin: 2em auto 2em auto; +} + +table.sa_signature_box tr td { + padding-top: 1.25em; + vertical-align: top; + white-space: nowrap; +} + +.special_conditions { + font-style: italic; + margin-left: 2em; + white-space: pre; +} + +.sa_head * { + font-size: 7pt; +} + +/* Change order specific +-----------------------------------------------------------------------*/ +table.change_order_items { + font-size: 8pt; + width: 100%; + border-collapse: collapse; + margin-top: 2em; + margin-bottom: 2em; +} + +table.change_order_items>tbody { + border: 1px solid black; +} + +table.change_order_items>tbody>tr>th { + border-bottom: 1px solid black; +} + +table.change_order_items>tbody>tr>td { + border-right: 1px solid black; + padding: 0.5em; +} + +td.change_order_total_col { + padding-right: 4pt; + text-align: right; +} + +td.change_order_unit_col { + padding-left: 2pt; + text-align: left; +} \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/css_2d_transforms.html b/application/third_party/dompdf/www/test/css_2d_transforms.html new file mode 100755 index 00000000..c0820cbe --- /dev/null +++ b/application/third_party/dompdf/www/test/css_2d_transforms.html @@ -0,0 +1,87 @@ + + + + + + + + + + + + +

    none

    +
     
    + +

    rotate

    +
     
    + +

    scale

    +
     
    +
     
    +
     
    +
     
    + +

    translate

    +
     
    +
     
    +
     
    +
     
    + +

    skew

    +
     
    +
     
    +
     
    +
     
    + +

    mixed

    +
     
    + + + diff --git a/application/third_party/dompdf/www/test/css_baseline.html b/application/third_party/dompdf/www/test/css_baseline.html new file mode 100755 index 00000000..198260ad --- /dev/null +++ b/application/third_party/dompdf/www/test/css_baseline.html @@ -0,0 +1,16 @@ + + + + + + +(enter your text here) + + + diff --git a/application/third_party/dompdf/www/test/css_block_height.html b/application/third_party/dompdf/www/test/css_block_height.html new file mode 100755 index 00000000..c42ba0c1 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_block_height.html @@ -0,0 +1,14 @@ + + + + + + + +
    +  +
    + + + diff --git a/application/third_party/dompdf/www/test/css_border.html b/application/third_party/dompdf/www/test/css_border.html new file mode 100755 index 00000000..f793c677 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_border.html @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + +
    dotteddashedsoliddouble
    grooveridgeinsetoutset
    + +

    partial attributes merged

    + +
    border:thin solid red;
    +
    border:red thin solid;
    +
    { border:thin solid; }{border:blue; } (merged, reset all - color has no effect)
    +
    { border:thin solid; }{border-color:green; } (merged, overwrite only color)
    +
    { border:thin solid; }{border:blue; } (merged, reset all - color has no effect)
    +
    { border:thin solid; }{border-color:green; } (merged, overwrite only color)
    +
    { border:thin blue solid; }{border-color:green; } (merged, overwrite only color)
    +
    { border:thin blue solid; }{border-style:dashed; } (merged, overwrite only style)
    +
    { border:thin blue solid; }{border-width:thick; } (merged, overwrite only width)
    +
    { border:thin blue solid; }{border-width:medium; } (merged, overwrite only width)
    +
    { border:thin blue solid; }{border-width:3pt; } (merged, overwrite only width)
    + +

    top:

    + +
    border-top:thin solid red;
    +
    border-top:red thin solid;
    +
    { border-top:thin solid; }{border-top-color:green; } (merged, overwrite only color)
    +
    { border-top:thin solid; }{border-top:blue; } (merged, reset all - color has no effect)
    + +

    right left bottom:

    + +
    border-right:thin solid red;
    +
    border-left:thin solid red;
    +
    border-bottom:thin solid red;
    + +

    Individual Attributes

    +
    {border:thin blue solid;}{border-top-color:red;}
    +
    {border:thin blue solid;}{border-right-color:red;}
    +
    {border:thin blue solid;}{border-bottom-color:red;}
    +
    {border:thin blue solid;}{border-left-color:red;}
    + +
    {border:thin blue solid;}{border-top-style:dashed;}
    +
    {border:thin blue solid;}{border-right-style:dashed;}
    +
    {border:thin blue solid;}{border-bottom-style:dashed;}
    +
    {border:thin blue solid;}{border-left-style:dashed;}
    + +
    {border:thin blue solid;}{border-top-width:medium;}
    +
    {border:thin blue solid;}{border-right-width:medium;}
    +
    {border:thin blue solid;}{border-bottom-width:medium;}
    +
    {border:thin blue solid;}{border-left-width:medium;}
    + +

    Individual side specific Attributes

    + +
    {border:thin blue solid;}{border-color:red;}
    +
    {border:thin blue solid;}{border-color:red green;}
    +
    {border:thin blue solid;}{border-color:red green blue;}
    +
    {border:thin blue solid;}{border-color:red green blue gray;}
    + +
    {border:thin blue solid;}{border-style:dashed;}
    +
    {border:thin blue solid;}{border-style:dashed dotted;}
    +
    {border:thin blue solid;}{border-style:dashed dotted double;}
    +
    {border:thin blue solid;}{border-style:dashed dotted double groove;}
    + +
    {border:thin blue solid;}{border-width:1pt;}
    +
    {border:thin blue solid;}{border-width:1pt 2pt;}
    +
    {border:thin blue solid;}{border-width:1pt 2pt 3pt;}
    +
    {border:thin blue solid;}{border-width:1pt 2pt 3pt 4pt;}
    + + diff --git a/application/third_party/dompdf/www/test/css_border_values.html b/application/third_party/dompdf/www/test/css_border_values.html new file mode 100755 index 00000000..99a6c6b6 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_border_values.html @@ -0,0 +1,41 @@ + + + + + + +
    +
    +
    +
    +
    +
    + + diff --git a/application/third_party/dompdf/www/test/css_color_cmyk.html b/application/third_party/dompdf/www/test/css_color_cmyk.html new file mode 100755 index 00000000..46a719e6 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_color_cmyk.html @@ -0,0 +1,51 @@ + + + + + + + + + + +All these rectangles should look red: + +
    + +
    + +
    + +
    + +
    + +
    +
    +
    + +CMYK JPEG:
    + + +

    +CMYK: +
    + +
    + +
    + +
    + + + diff --git a/application/third_party/dompdf/www/test/css_content.html b/application/third_party/dompdf/www/test/css_content.html new file mode 100755 index 00000000..4558df51 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_content.html @@ -0,0 +1,47 @@ + + + + + + + + + Look at the HTML source ! + +

    quote <q>

    +

    to

    + +

    +

    +

    + + + + diff --git a/application/third_party/dompdf/www/test/css_float.html b/application/third_party/dompdf/www/test/css_float.html new file mode 100755 index 00000000..5e422351 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_float.html @@ -0,0 +1,55 @@ + + + + + + + + + +
    + + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. + Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. + + + Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. + Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. + Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. + Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. + Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. + Mauris ac mauris sed pede pellentesque fermentum. + +
    + + diff --git a/application/third_party/dompdf/www/test/css_font_selection.html b/application/third_party/dompdf/www/test/css_font_selection.html new file mode 100755 index 00000000..68059ff1 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_font_selection.html @@ -0,0 +1,116 @@ + + + + + + + +

    Font Selection

    + +

    Available font-family:

    +
      +
    • serif (default) (Aliases: times, times-roman)
    • +
    • sans-serif (Aliases: helvetica)
    • +
    • monospace (Aliases: fixed, courier)
    • +
    +

    Available font-style:

    +
      +
    • normal (default)
    • +
    • italic
    • +
    +

    Available font-weight:

    +
      +
    • normal (default)
    • +
    • bold
    • +
    +

    Other variations are falling back to a combination of the above

    +

    Special fonts

    +
      +
    • symbol
    • +
    • zapfdingbats
    • +
    + +

    Font selection

    + +

    abcdefghijk ABCDEFGHIJK - (Helvetica) - (sans-serif) - sans-serif

    +

    abcdefghijk ABCDEFGHIJK - (Helvetica) - (sans-serif) - helvetica

    +

    abcdefghijk ABCDEFGHIJK - (Times-Roman) - (serif) - serif

    +

    abcdefghijk ABCDEFGHIJK - (Times-Roman) - (serif) - times

    +

    abcdefghijk ABCDEFGHIJK - (Times-Roman) - (serif) - times-roman

    +

    abcdefghijk ABCDEFGHIJK - (Courier)- (monospace) - mononospace

    +

    abcdefghijk ABCDEFGHIJK - (Courier)- (monospace) - fixed

    +

    abcdefghijk ABCDEFGHIJK - (Courier)- (monospace) - courier

    + +

    Font search path

    + +

    abcdefghijk ABCDEFGHIJK - serif - "font-family:dummy1,dummy2;"

    +

    abcdefghijk ABCDEFGHIJK - sans-serif - "font-family:dummy1,dummy2,sans-serif;"

    +

    abcdefghijk ABCDEFGHIJK - sans-serif - "font-family:sans-serif,dummy1,dummy2;"

    +

    abcdefghijk ABCDEFGHIJK - sans-serif - "font-family:sans-serif,courier;"

    + +

    Font variations

    + +

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:normal;"

    +

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:lighter;"

    +

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:100;"

    +

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:200;"

    +

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:300;"

    +

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:400;"

    +

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:500;"

    +

    abcdefghijk ABCDEFGHIJK - serif - bold - "font-style:normal; font-weight:600;"

    +

    abcdefghijk ABCDEFGHIJK - serif - bold - "font-style:normal; font-weight:700;"

    +

    abcdefghijk ABCDEFGHIJK - serif - bold - "font-style:normal; font-weight:800;"

    +

    abcdefghijk ABCDEFGHIJK - serif - bold - "font-style:normal; font-weight:900;"

    +

    abcdefghijk ABCDEFGHIJK - serif - bold - "font-style:normal; font-weight:bold;"

    +

    abcdefghijk ABCDEFGHIJK - serif - bold - "font-style:normal; font-weight:bolder;"

    +

    abcdefghijk ABCDEFGHIJK - serif - italic - "font-style:italic; font-weight:normal;"

    +

    abcdefghijk ABCDEFGHIJK - serif - italic - "font-style:oblique; font-weight:normal;"

    +

    abcdefghijk ABCDEFGHIJK - serif - bold_italic - "font-style:italic; font-weight:bold;"

    +

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-variant:small-caps; font-style:normal; font-weight:normal;"

    small-caps + +

    Font size

    + +

    abcdefghijk ABCDEFGHIJK - xx-small

    +

    abcdefghijk ABCDEFGHIJK - x-small

    +

    abcdefghijk ABCDEFGHIJK - small

    +

    abcdefghijk ABCDEFGHIJK - medium

    +

    abcdefghijk ABCDEFGHIJK - large

    +

    abcdefghijk ABCDEFGHIJK - x-large

    +

    abcdefghijk ABCDEFGHIJK - xx-large

    +

    abcdefghijk ABCDEFGHIJK - 10pt

    +

    abcdefghijk ABCDEFGHIJK - 12pt

    +

    abcdefghijk ABCDEFGHIJK - l4pt

    +

    abcdefghijk ABCDEFGHIJK - smaller

    +

    abcdefghijk ABCDEFGHIJK - larger

    + +

    Line height

    +

    abcdefghijk ABCDEFGHIJK
    abcdefghijk ABCDEFGHIJK 100%

    +

    abcdefghijk ABCDEFGHIJK
    abcdefghijk ABCDEFGHIJK 120%

    +

    abcdefghijk ABCDEFGHIJK
    abcdefghijk ABCDEFGHIJK 140%

    +

    abcdefghijk ABCDEFGHIJK
    abcdefghijk ABCDEFGHIJK 100%

    +

    abcdefghijk ABCDEFGHIJK
    abcdefghijk ABCDEFGHIJK 120%

    +

    abcdefghijk ABCDEFGHIJK
    abcdefghijk ABCDEFGHIJK 140%

    + +

    Font combined setting

    +

    style="font:italic small-caps bold 14pt/160% sans-serif;"
    (all attributes)

    +

    style="font:normal 10pt/160% sans-serif;"
    (partial attributes)

    +

    style="font:700 10pt/160% sans-serif;"
    (partial attributes)

    +

    style="font:small sans-serif;"
    (partial attributes)

    +
    + +

    inherit style="font:italic small-caps bold 14pt/160% sans-serif;" :

    + +

    +style="font:small sans-serif;"
    +(partial attributes - reset inherited)
    +style="font-weight:bold;"
    +(partial overwrite)

    +(resume partial attributes) +

    + +

    continue inherited

    + +
    + + + diff --git a/application/third_party/dompdf/www/test/css_important_flag.html b/application/third_party/dompdf/www/test/css_important_flag.html new file mode 100755 index 00000000..76751f13 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_important_flag.html @@ -0,0 +1,54 @@ + + + + + + + + +

    Handling of "!important" property flag

    +

    +Normally later css style properties defined later are overriding earlier ones.
    +Except if they are marked with the flag "!important".
    +Those can only be overridden by style properties which are also marked "!important". +

    + +

    There are two classes of property overriding

    +
      +
    • inherit (nested html tags)
    • +
    • merging (more css properties to the same html tag)
    • +
    +

    This is handled similarly for all styles, so we check only examples here

    + +

    ul { line-height:160% }

    + +

    merge a { border-bottom:dashed 1pt red !important; text-decoration:none !important; }

    + +

    dummy links, text decoration/border bottom:

    + + + +

    Inherit .monospace { font-family:monospace !important; }

    +

    font family selection:

    +
      +
    • (default)
    • +
    • font-family:sans-serif; (ignored)
    • +
    • font-family:sans-serif!important; (override)
    • +
    + + + diff --git a/application/third_party/dompdf/www/test/css_letter_spacing.html b/application/third_party/dompdf/www/test/css_letter_spacing.html new file mode 100755 index 00000000..fb813cbb --- /dev/null +++ b/application/third_party/dompdf/www/test/css_letter_spacing.html @@ -0,0 +1,102 @@ + + + + + + + + +
    +

    This has letter spacing of 5px

    +

    This has letter spacing of 4px

    +

    This has letter spacing of 3px

    +

    This has letter spacing of 2px

    +

    This has letter spacing of 1px

    +

    This has normal letter spacing

    +

    This has letter spacing of -1px

    +

    This has letter spacing of -2px

    +

    This has letter spacing of -3px

    +

    This has letter spacing of -4px

    +

    This has letter spacing of -5px

    +
    + +
    +

    This has letter spacing of 5px

    +

    This has letter spacing of 4px

    +

    This has letter spacing of 3px

    +

    This has letter spacing of 2px

    +

    This has letter spacing of 1px

    +

    This has normal letter spacing

    +

    This has letter spacing of -1px

    +

    This has letter spacing of -2px

    +

    This has letter spacing of -3px

    +

    This has letter spacing of -4px

    +

    This has letter spacing of -5px

    +
    + +
    +

    This has letter spacing of 5px

    +

    This has letter spacing of 4px

    +

    This has letter spacing of 3px

    +

    This has letter spacing of 2px

    +

    This has letter spacing of 1px

    +

    This has normal letter spacing

    +

    This has letter spacing of -1px

    +

    This has letter spacing of -2px

    +

    This has letter spacing of -3px

    +

    This has letter spacing of -4px

    +

    This has letter spacing of -5px

    +
    + +
    +

    This has letter spacing of 5px. This has letter spacing of 5px. This has letter spacing of 5px.

    +

    This has letter spacing of 4px. This has letter spacing of 4px. This has letter spacing of 4px.

    +

    This has letter spacing of 3px. This has letter spacing of 3px. This has letter spacing of 3px.

    +

    This has letter spacing of 2px. This has letter spacing of 2px. This has letter spacing of 2px.

    +

    This has letter spacing of 1px. This has letter spacing of 1px. This has letter spacing of 1px.

    +

    This has normal letter spacing. This has normal letter spacing. This has normal letter spacing.

    +

    This has letter spacing of -1px. This has letter spacing of -1px. This has letter spacing of -1px.

    +

    This has letter spacing of -2px. This has letter spacing of -2px. This has letter spacing of -2px.

    +

    This has letter spacing of -3px. This has letter spacing of -3px. This has letter spacing of -3px.

    +

    This has letter spacing of -4px. This has letter spacing of -4px. This has letter spacing of -4px.

    +

    This has letter spacing of -5px. This has letter spacing of -5px. This has letter spacing of -5px.

    +
    + + diff --git a/application/third_party/dompdf/www/test/css_line_height.html b/application/third_party/dompdf/www/test/css_line_height.html new file mode 100755 index 00000000..7589b795 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_line_height.html @@ -0,0 +1,63 @@ + + + + +CSS Line Height Inheritance + + + +

    Use only <number> for line-height

    +

    unless you like solving inexplicable inheritance problems or setting an explicit line-height on every element

    +

    div {line-height: 1}; div div {font-size: 200%}

    +
    The quick brown fox
    jumps over the crazy +
    The quick brown fox
    jumps over the crazy
    +

    div {line-height: 1em}; div div {font-size: 200%}

    +
    The quick brown fox
    jumps over the crazy +
    The quick brown fox
    jumps over the crazy
    +

    div {line-height: 100%}; div div {font-size: 200%}

    +
    The quick brown fox
    jumps over the crazy +
    The quick brown fox
    jumps over the crazy
    +
    +

    When rendered according to the +css 2.1 spec, +the 200% text in the second two div divs, those for which line-height of the parent +are specified in em or %, will overlap, the child divs being 1/2 the height of their containing +divs; while the first div div will be 2/3 the height of its containing div, +and its text won't overlap. The overlapping text in the latter div divs is because the spec requires the calculated +line-height specified in em or % be inherited by the children. In contrast, it is <number> itself that is inherited by +the children, which allows the line-height specified to be applied in reference to the font-size of the child div instead of +the ancestor.

    +
    +IE has an additional problem with line-height. +
    +
    + +
    + +Valid HTML 4.01! +
    +Last Modified
    2005.11.29
    © Felix Miata
    +Felix's Home +
    + + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/css_margin.html b/application/third_party/dompdf/www/test/css_margin.html new file mode 100755 index 00000000..0efdc932 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_margin.html @@ -0,0 +1,38 @@ + + + + + + + + +

    (margin: 1em;) The PHP Development +Team would like to announce the immediate availability of PHP 5.0.1. This is +a maintenance release that in addition to many non-critical bug fixes also +includes new UNIX and Windows installation docs which are now auto-generated +from the PHP Manual.

    + +

    (margin: 1em 1em 1em +50%;) PHP 4.3.9RC1 has been released for testing. This is the first +release candidate and should have a very low number of problems and/or +bugs. Nevertheless, please download and test it as much as possible on +real-life applications to uncover any remaining issues.

    + +

    (margin: 4em 1em 4em +1em;) PHP Tunisie has just released the second issue of its monthly +french PHP Magazine. In this issue you'll find a large plan on PostgreSQL, +Databases abstractions with PHP, your mini template engine, an article on +images generation with PHP, the migration towards PHP5 with +EasyPHP1.7... And many other articles and latests PHP news.

    + +

    (margin: 1em auto 1em +auto;) The traditional International PHP Conference 2004 will be +taking place from 7th November to 10th November in Frankfurt (FFM). The Call +for Papers has been issued, so if you have an interesting talk, the +organizers would love to hear about it! You can expect a gathering of PHP +experts and core developers.

    + + + diff --git a/application/third_party/dompdf/www/test/css_media.html b/application/third_party/dompdf/www/test/css_media.html new file mode 100755 index 00000000..d01cd732 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_media.html @@ -0,0 +1,150 @@ + + + + + + + + + +

    css @media media types

    +

    +Depending on dompdf_config.inc.php setting DOMPDF_DEFAULT_MEDIA_TYPE here the +background color appeares different: +

    +
      +
    • print: light gray
    • +
    • screen: light blue
    • +
    • projection: light yellow
    • +
    + +

    css @import media types

    +

    +Depending on dompdf_config.inc.php setting DOMPDF_DEFAULT_MEDIA_TYPE here the +background color appeares different: +

    +
      +
    • print: light gray
    • +
    • screen or projection: light blue
    • +
    • all: this line yellow
    • +
    + +

    yellow by import css from subfolder

    + +

    yellow by import css from absolute local folder. +Note: Only works if www\test\images/importabs.css was copied to /absimagetest/importabs.css +

    + + +

    css link media types

    + +
      +
    • print: light gray
    • +
    • screen or projection: light blue
    • + +
    + + +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    +

    x

    + diff --git a/application/third_party/dompdf/www/test/css_multiple_class.html b/application/third_party/dompdf/www/test/css_multiple_class.html new file mode 100755 index 00000000..c4f68d5d --- /dev/null +++ b/application/third_party/dompdf/www/test/css_multiple_class.html @@ -0,0 +1,18 @@ + + + + + + +

    class="a"

    +

    class="b"

    +

    class="c"

    +

    class="a b"

    +

    class="a b c"

    + + diff --git a/application/third_party/dompdf/www/test/css_opacity.html b/application/third_party/dompdf/www/test/css_opacity.html new file mode 100755 index 00000000..733e568a --- /dev/null +++ b/application/third_party/dompdf/www/test/css_opacity.html @@ -0,0 +1,107 @@ + + + + + + + +

    Nested block elements

    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + +

    Inline elements

    + + + ab + cb + ef + gh + ij + kl + mn + op + qr + st + + +
    + + + ab + cb + ef + gh + ij + kl + mn + op + qr + st + + +
    0.1
    +
    0.2
    +
    0.3
    +
    0.4
    +
    0.5
    +
    0.6
    +
    0.7
    +
    0.8
    +
    0.9
    +
    1.0
    + +
    1.0 opacity
    +
    No opacity
    + +
    +
    +
    +
    +
    +
    +
    + + diff --git a/application/third_party/dompdf/www/test/css_outline.html b/application/third_party/dompdf/www/test/css_outline.html new file mode 100755 index 00000000..00ce313e --- /dev/null +++ b/application/third_party/dompdf/www/test/css_outline.html @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + +
    The dotted gray line is the border box
    dotteddashedsoliddouble
    grooveridgeinsetoutset
    + +

    partial attributes merged

    + +
    outline:thin solid red;
    +
    outline:red thin solid;
    +
    { outline:thin solid; }{outline:blue; } (merged, reset all - color has no effect)
    +
    { outline:thin solid; }{outline-color:green; } (merged, overwrite only color)
    +
    { outline:thin solid; }{outline:blue; } (merged, reset all - color has no effect)
    +
    { outline:thin solid; }{outline-color:green; } (merged, overwrite only color)
    +
    { outline:thin blue solid; }{outline-color:green; } (merged, overwrite only color)
    +
    { outline:thin blue solid; }{outline-style:dashed; } (merged, overwrite only style)
    +
    { outline:thin blue solid; }{outline-width:thick; } (merged, overwrite only width)
    +
    { outline:thin blue solid; }{outline-width:medium; } (merged, overwrite only width)
    +
    { outline:thin blue solid; }{outline-width:3pt; } (merged, overwrite only width)
    + + diff --git a/application/third_party/dompdf/www/test/css_overflow_hidden.html b/application/third_party/dompdf/www/test/css_overflow_hidden.html new file mode 100755 index 00000000..a2bd2915 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_overflow_hidden.html @@ -0,0 +1,38 @@ + + + + + + + +

    overflow: hidden

    +
    + + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed non risus. + Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. +
    + +

    overflow: visible

    +
    + + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed non risus. + Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. +
    + + + diff --git a/application/third_party/dompdf/www/test/css_position_all.html b/application/third_party/dompdf/www/test/css_position_all.html new file mode 100755 index 00000000..0007c6d7 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_position_all.html @@ -0,0 +1,379 @@ + + + + + +Printed document + + + + + + + +

    Examples from
    http://www.barelyfitz.com/screencast/html-training/css/positioning/

    + +position: static +
    +

    div-before

    + +
    +
    +

    div-1

    + +
    +

    div-1a

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.

    +
    + +
    +

    div-1b

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Nam mattis, arcu ut bibendum commodo, magna nisi tincidunt tortor, quis accumsan augue ipsum id lorem.

    +
    + +

    div-1c

    +
    +
    + +

    div-after

    +
    + +position: relative +
    +

    div-before

    + +
    +
    +

    div-1

    + +
    +

    div-1a

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.

    +
    + +
    +

    div-1b

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Nam mattis, arcu ut bibendum commodo, magna nisi tincidunt tortor, quis accumsan augue ipsum id lorem.

    +
    + +

    div-1c

    +
    +
    + +

    div-after

    +
    + +position: absolute +
    +

    div-before

    + +
    +
    +

    div-1

    + +
    +

    div-1a

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.

    +
    + +
    +

    div-1b

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Nam mattis, arcu ut bibendum commodo, magna nisi tincidunt tortor, quis accumsan augue ipsum id lorem.

    +
    + +

    div-1c

    +
    +
    + +

    div-after

    +
    + +position: relative + position: absolute +
    +

    div-before

    + +
    +
    +

    div-1

    + +
    +

    div-1a

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.

    +
    + +
    +

    div-1b

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Nam mattis, arcu ut bibendum commodo, magna nisi tincidunt tortor, quis accumsan augue ipsum id lorem.

    +
    + +

    div-1c

    +
    +
    + +

    div-after

    +
    + +two column absolute +
    +

    div-before

    + +
    +
    +

    div-1

    + +
    +

    div-1a

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.

    +
    + +
    +

    div-1b

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Nam mattis, arcu ut bibendum commodo, magna nisi tincidunt tortor, quis accumsan augue ipsum id lorem.

    +
    + +

    div-1c

    +
    +
    + +

    div-after

    +
    + +two column absolute height +
    +

    div-before

    + +
    +
    +

    div-1

    + +
    +

    div-1a

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.

    +
    + +
    +

    div-1b

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Nam mattis, arcu ut bibendum commodo, magna nisi tincidunt tortor, quis accumsan augue ipsum id lorem.

    +
    + +

    div-1c

    +
    +
    + +

    div-after

    +
    + +float +
    +

    div-before

    + +
    +
    +

    div-1

    + +
    +

    div-1a

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.

    +
    + +
    +

    div-1b

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Nam mattis, arcu ut bibendum commodo, magna nisi tincidunt tortor, quis accumsan augue ipsum id lorem.

    +
    + +

    div-1c

    +
    +
    + +

    div-after

    +
    + +float columns +
    +

    div-before

    + +
    +
    +

    div-1

    + +
    +

    div-1a

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.

    +
    + +
    +

    div-1b

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Nam mattis, arcu ut bibendum commodo, magna nisi tincidunt tortor, quis accumsan augue ipsum id lorem.

    +
    + +

    div-1c

    +
    +
    + +

    div-after

    +
    + +float columns with clear +
    +

    div-before

    + +
    +
    +

    div-1

    + +
    +

    div-1a

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.

    +
    + +
    +

    div-1b

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Nam mattis, arcu ut bibendum commodo, magna nisi tincidunt tortor, quis accumsan augue ipsum id lorem.

    +
    + +

    div-1c

    +
    +
    + +

    div-after

    +
    + + + + diff --git a/application/third_party/dompdf/www/test/css_position_fixed.html b/application/third_party/dompdf/www/test/css_position_fixed.html new file mode 100755 index 00000000..e5d1a3cd --- /dev/null +++ b/application/third_party/dompdf/www/test/css_position_fixed.html @@ -0,0 +1,215 @@ + + + + + +Printed document + + + + + + +
    +
    + Header line 1
    + Header line 2
    + Header line 3
    + Header line 4
    +
    +
    + + + +
    +
    + +
    +
    + +

    Section 1

    + +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed non +risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, +ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula +massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci +nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit +amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat +in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero +pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo +in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue +blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus +et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed +pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales +hendrerit.

    + +
    + +

    Section 2

    + +

    Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut +orci vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, +ligula non tempus aliquam, nunc turpis ullamcorper nibh, in tempus +sapien eros vitae ligula. Pellentesque rhoncus nunc et augue. Integer +id felis. Curabitur aliquet pellentesque diam. Integer quis metus vitae +elit lobortis egestas. Lorem ipsum dolor sit amet, consectetuer +adipiscing elit. Morbi vel erat non mauris convallis vehicula. Nulla et +sapien. Integer tortor tellus, aliquam faucibus, convallis id, congue +eu, quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non +elementum posuere, metus purus iaculis lectus, et tristique ligula +justo vitae magna.

    + +
    + +

    Section 3

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + +

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at +fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu +lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod +libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean +suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla +tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, +felis magna fermentum augue, et ultricies lacus lorem varius purus. +Curabitur eu amet.

    + + diff --git a/application/third_party/dompdf/www/test/css_selectors.html b/application/third_party/dompdf/www/test/css_selectors.html new file mode 100755 index 00000000..baa7b8fe --- /dev/null +++ b/application/third_party/dompdf/www/test/css_selectors.html @@ -0,0 +1,53 @@ + + + + + + + +a[target=equal_1] +a[target='equal_2'] +a[target="equal_3"] + +a[href$=ends_1] +a[href$='ends_2'] +a[href$="ends_3"] + +

    +a[href*=contains_1] +a[href*='contains_2'] +a[href*="contains_3"] +

    + +a[href^=starts_1] +a[href^='starts_2'] +a[href^="starts_3"] + + + diff --git a/application/third_party/dompdf/www/test/css_table_height.html b/application/third_party/dompdf/www/test/css_table_height.html new file mode 100755 index 00000000..ec638b0a --- /dev/null +++ b/application/third_party/dompdf/www/test/css_table_height.html @@ -0,0 +1,15 @@ + + + + + + + + + + + +
    Some text
    + + diff --git a/application/third_party/dompdf/www/test/css_text_align.html b/application/third_party/dompdf/www/test/css_text_align.html new file mode 100755 index 00000000..c795af25 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_text_align.html @@ -0,0 +1,61 @@ + + + + + + + +

    text-align: left

    +
    +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at odio vitae libero tempus +convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus +mus. Vestibulum purus mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel, adipiscing nec, massa. +
    +Phasellus vitae felis sed lectus dapibus facilisis. In ultrices sagittis ipsum. In at est. Integer +iaculis turpis vel magna. Cras eu est. Integer porttitor ligula a tellus. Curabitur accumsan ipsum +a velit. Sed laoreet lectus quis leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque. +
    + +

    text-align: center

    +
    +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at odio vitae libero tempus +convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus +mus. Vestibulum purus mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel, adipiscing nec, massa. +
    +Phasellus vitae felis sed lectus dapibus facilisis. In ultrices sagittis ipsum. In at est. Integer +iaculis turpis vel magna. Cras eu est. Integer porttitor ligula a tellus. Curabitur accumsan ipsum +a velit. Sed laoreet lectus quis leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque. +
    + +

    text-align: right

    +
    +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at odio vitae libero tempus +convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus +mus. Vestibulum purus mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel, adipiscing nec, massa. +
    +Phasellus vitae felis sed lectus dapibus facilisis. In ultrices sagittis ipsum. In at est. Integer +iaculis turpis vel magna. Cras eu est. Integer porttitor ligula a tellus. Curabitur accumsan ipsum +a velit. Sed laoreet lectus quis leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque. +
    + +

    text-align: justify

    +
    +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at odio vitae libero tempus +convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus +mus. Vestibulum purus mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel, adipiscing nec, massa. +
    +Phasellus vitae felis sed lectus dapibus facilisis. In ultrices sagittis ipsum. In at est. Integer +iaculis turpis vel magna. Cras eu est. Integer porttitor ligula a tellus. Curabitur accumsan ipsum +a velit. Sed laoreet lectus quis leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque. +
    + + + diff --git a/application/third_party/dompdf/www/test/css_z_index.html b/application/third_party/dompdf/www/test/css_z_index.html new file mode 100755 index 00000000..0c097ae0 --- /dev/null +++ b/application/third_party/dompdf/www/test/css_z_index.html @@ -0,0 +1,40 @@ + + + + + z-index + + + + +
    + z-index: 3, order: 1 +
    + +
    + z-index: 2, order: 2 +
    + +
    + z-index: 1, order: 3 +
    + +
    + z-index: auto, order: 1 +
    + +
    + z-index: auto, order: 2 +
    + +
    + z-index: auto, order: 3 +
    + + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/demo_01.html b/application/third_party/dompdf/www/test/demo_01.html new file mode 100755 index 00000000..d4696381 --- /dev/null +++ b/application/third_party/dompdf/www/test/demo_01.html @@ -0,0 +1,214 @@ + + + + + + + + +
    + +
    +
    + +
    + +
    + + + + + +

    SCHEDULE A

    Job: 132-003

    + + + + + + + + + + + + + + + + +
    Job: 132-003Purchasers(s): Palmer
    Created: 2004-08-13Last Change: 2004-08-16 9:28 AM
    Address: 667 Pine Lodge Dr.Legal: N/A
    + + + + + + + + + + +
    Model: FranklinElevation: BSize: 1160 Cu. Ft.Style: Reciprocating
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Standard Items:

    ItemDescriptionQuantityUnit CostTotal
    1Sprockets (13 tooth)50$10.00Ea.$5,000.00
    2Cogs (Cylindrical)45$25.00Ea.$1125.00
    3Gears (15 tooth)32$19.00Ea.$608.00
    4Leaf springs (13 N/m)6$125.00Ea.$750.00
    5Coil springs (6 N/deg)7$11.00Ea.$77.00
    (Tax is not included; it will be collected on closing.)GRAND TOTAL:$7560.00
    + + + + + + + + + + + + + + + + + + + + +
    WITNESS: PURCHASER:X
     Mr. Leland Palmer
    +This change order shall have no force or effect until approved and signed +by an authorizing signing officer of the supplier. Any change or special +request not noted on this document is not contractual. +
    ACCEPTED THIS +  +DAY OF  , +20 . +TWIN PEAKS SUPPLY LTD.

    +PER: +  +
    + +
    + +
    +
    + + + + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/dom_anchor_link.html b/application/third_party/dompdf/www/test/dom_anchor_link.html new file mode 100755 index 00000000..851f2323 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_anchor_link.html @@ -0,0 +1,210 @@ + + + + + + + + + +

    Lorem ipsum dolor sit amet

    +

    Anchor 1

    + +

    link to anchor3

    +

    www.dompdf.com

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at +odio vitae libero tempus convallis. Cum sociis natoque penatibus et +magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus +mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel, +adipiscing nec, massa. Phasellus vitae felis sed lectus dapibus +facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis +turpis vel magna. Cras eu est. Integer porttitor ligula a +tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis +leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque.

    + +

    Curabitur ut diam eu dui vestibulum pharetra. Nam pellentesque, justo +non hendrerit venenatis, mi orci pretium mi, et vehicula leo arcu quis +diam. Nullam mattis laoreet quam. Morbi mollis sem ut tellus. Nam mi +massa, lobortis eu, sollicitudin et, iaculis et, massa. Maecenas purus +mauris, luctus sit amet, pharetra in, facilisis sit amet, elit. Nullam +vel erat tempus purus molestie suscipit. Vestibulum odio lorem, +sollicitudin non, volutpat sit amet, tincidunt vel, nunc. Nulla quis +ante vestibulum odio feugiat facilisis. Proin lorem nisl, viverra at, +rhoncus quis, semper nec, mi. Donec euismod enim vitae velit. Nulla +sed lectus. Vivamus placerat, lacus sed vehicula sagittis, arcu massa +adipiscing lorem, bibendum luctus nisl tortor vitae leo.

    + +

    Etiam a mauris. Proin justo elit, accumsan sit amet, tempus et, +blandit id, tellus. Morbi varius, nisi id iaculis aliquam, lacus +ligula facilisis velit, ac pharetra ipsum augue a massa. Etiam rhoncus +commodo orci. Mauris ullamcorper sagittis turpis. Nullam magna libero, +sagittis sed, auctor faucibus, accumsan vitae, urna. Pellentesque +volutpat. Aliquam sapien ipsum, eleifend nec, imperdiet vitae, +consectetuer id, quam. Donec a urna. Suspendisse sit amet +velit. Curabitur quis nisi id dui viverra ornare. Sed condimentum enim +quis tortor. Ut condimentum, magna non tempus tincidunt, leo nibh +molestie tellus, vitae convallis dolor ante sed ante. Nunc et +metus. Phasellus ultricies. Fusce faucibus tortor sit amet mauris.

    + +

    Aliquam enim. Duis et diam. Praesent porta, mauris quis pellentesque +volutpat, erat elit vulputate eros, vitae pulvinar augue velit sit +amet sem. Fusce eu urna eu nisi condimentum posuere. Vivamus sed +felis. Duis eget urna vitae eros interdum dignissim. Proin justo eros, +eleifend in, porttitor in, malesuada non, neque. Etiam sed +augue. Nulla sit amet magna. Lorem ipsum dolor sit amet, consectetuer +adipiscing elit. Mauris facilisis. Curabitur massa magna, pulvinar a, +nonummy eget, egestas vitae, mauris. Quisque vel elit sit amet lorem +malesuada facilisis. Vestibulum porta, metus sit amet egestas +interdum, urna justo euismod erat, id tristique urna leo quis +nibh. Morbi non erat.

    + +

    Cras fringilla, nulla id egestas elementum, augue nunc iaculis nibh, +ac adipiscing nibh justo id tortor. Donec vel orci a nisi ultricies +aliquet. Nunc urna quam, adipiscing molestie, vehicula non, +condimentum non, magna. Integer magna. Donec quam metus, pulvinar id, +suscipit eget, euismod ac, orci. Nulla facilisi. Nullam nec +mauris. Morbi in mi. Etiam urna lectus, pulvinar ac, sollicitudin eu, +euismod ac, lectus. Fusce elit. Sed ultricies odio ac felis.

    + +

    Cras iaculis. Nulla facilisi.

    +

    Anchor 2

    +

    link to anchor1

    +

    Cras iaculis. Nulla facilisi. Fusce vitae arcu. Integer lectus mauris, +ornare vel, accumsan eget, scelerisque vel, nunc. Maecenas justo urna, +volutpat vel, vehicula vel, ullamcorper nec, odio. Suspendisse laoreet +nisi sed erat. Cras convallis sollicitudin sapien. Phasellus ac erat +eu mi rutrum rhoncus. Morbi et velit. Morbi odio nisi, pharetra eget, +sollicitudin sed, aliquam at, nisl. Quisque euismod diam in +sapien. Integer accumsan urna in risus.

    + +

    Proin sit amet nisl. Phasellus dui ipsum, laoreet a, pulvinar id, +fringilla ut, libero. In hac habitasse platea dictumst. Maecenas mi +magna, cursus sed, rutrum eget, molestie nec, dui. Suspendisse +lacus. Vivamus nibh urna, accumsan sit amet, gravida sed, convallis a, +leo. Cras sollicitudin orci sit amet eros. Pellentesque eu odio et +velit tempor dignissim. Morbi vehicula malesuada enim. Pellentesque +tincidunt, tellus ac fringilla tempor, justo libero interdum nunc, eu +sollicitudin tortor augue nec tellus. Nullam eget leo quis tellus +gravida faucibus. Nam gravida. Curabitur rhoncus egestas +nunc. Curabitur mollis, nisi sed suscipit gravida, enim felis interdum +justo, vel accumsan magna nunc ut libero. Ut fermentum. Fusce luctus, +est sit amet feugiat lobortis, nisl eros bibendum libero, ut suscipit +felis ligula in massa. Proin congue elit et nisi. Cras ac nisl. Nunc +ullamcorper neque vel diam.

    + +

    Ut pellentesque arcu ac lectus.

    +

    Sed ac lorem. Ut pellentesque arcu ac lectus. Cum sociis natoque +penatibus et magnis dis parturient montes, nascetur ridiculus +mus. Pellentesque ultrices metus sollicitudin pede. Donec fermentum +est a velit fringilla mollis. Duis ligula. Fusce viverra laoreet +odio. Suspendisse sit amet ligula. Maecenas nunc velit, sagittis eu, +bibendum eu, placerat at, nibh. Praesent ut erat eget nisi gravida +imperdiet. Quisque vitae sapien. Ut eros.

    + +

    Donec eros ligula, dignissim vel, ultricies id, mattis in, massa. Duis +lobortis dui nec orci. Sed ullamcorper metus non massa. Aliquam eget +mauris ac nulla elementum posuere. Sed porta, augue vitae rhoncus +aliquet, felis quam eleifend est, vitae rutrum metus arcu vel +lorem. Proin laoreet, mauris sit amet aliquet eleifend, nisl sem +molestie nisi, eu varius eros ligula non erat. Integer ac +sem. Suspendisse lectus. Aliquam erat volutpat. Fusce sit amet leo +faucibus erat molestie ultrices. Maecenas lacinia lectus eget +dui. Etiam porta porttitor ante. Phasellus sit amet lacus adipiscing +enim mollis iaculis. Fusce congue, nulla a commodo aliquam, erat dui +fermentum dui, pellentesque faucibus orci enim at mauris. Pellentesque +a diam porta magna tempor posuere. Donec lorem.

    + +

    Sed viverra aliquam turpis. Aliquam lacus. Duis id massa. Nullam +ante. Suspendisse condimentum. Donec adipiscing, felis vel semper +sollicitudin, lacus justo pretium est, sed blandit pede risus eu +ante. Praesent ante nulla, fringilla id, ultrices et, feugiat a, +metus. Proin ac velit a metus suscipit fermentum. Integer aliquet. Sed +sapien nulla, placerat at, rutrum at, condimentum quis, libero. In +accumsan, tellus nec tincidunt malesuada, pede arcu commodo ipsum, ac +mattis tortor urna vitae enim. Aenean nonummy, mauris eget commodo +bibendum, augue sem ultrices nunc, eget rhoncus metus erat placerat +lectus. Aliquam mollis lectus in justo. Vivamus iaculis lacus sit amet +ligula. Etiam consectetuer convallis diam. Curabitur sollicitudin, +felis eu vehicula scelerisque, nisl urna aliquam orci, sit amet +laoreet mi turpis id ligula. Donec at enim non nulla adipiscing +dapibus. Aenean nisl.

    + +

    Ut in lacus nec enim volutpat pellentesque. Integer euismod. In odio +eros, malesuada in, mattis vel, tempor nec, sem. In libero tellus, +varius vitae, bibendum in, elementum quis, nisl. Duis tortor. Etiam at +justo. Pellentesque facilisis mauris non nunc. Praesent eros mi, +dapibus eget, placerat ac, lobortis quis, sem. Nulla rhoncus +turpis. Nulla vitae mi. Proin id massa. Nunc eros.

    + +

    Aliquam molestie pulvinar ligula.

    +

    Anchor 3

    +

    link to anchor2

    +

    Vestibulum dui risus, varius ut, semper et, consequat ultrices, +felis. Pellentesque iaculis urna in velit. Ut pharetra. Nunc +fringilla, nisi vitae fringilla placerat, enim justo semper erat, +mollis feugiat leo neque eu sem. Vestibulum orci urna, suscipit a, +accumsan nec, fringilla in, risus. Nullam ante. Nullam nec +eros. Nullam varius. Nulla facilisi. In auctor libero in +metus. Aliquam porttitor congue eros. Nulla facilisi. Mauris euismod +turpis ut felis. Ut nunc nisl, cursus quis, eleifend at, viverra +bibendum, lacus. Donec consequat lacus eu sapien. Fusce pulvinar +lectus quis nunc. In hac habitasse platea dictumst.

    + +

    Aliquam molestie pulvinar ligula. Maecenas imperdiet, urna eget +ultrices adipiscing, nibh ante elementum neque, id molestie massa quam +ut nunc. Nullam porta. Phasellus a magna in sem volutpat +viverra. Quisque aliquet nunc ac turpis. Mauris dolor enim, viverra +rutrum, placerat et, laoreet et, justo. In id nulla. Donec +erat. Phasellus nec mi sed velit mollis cursus. Vestibulum +tincidunt. Praesent dui libero, facilisis eu, vulputate eget, aliquet +nec, ipsum. Pellentesque in nisl in mauris pretium euismod.

    + + diff --git a/application/third_party/dompdf/www/test/dom_br.html b/application/third_party/dompdf/www/test/dom_br.html new file mode 100755 index 00000000..2402bf85 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_br.html @@ -0,0 +1,46 @@ + + + + + +

    Line break test

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at +odio vitae libero tempus convallis. Cum sociis natoque penatibus et +magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus +mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel,
    +adipiscing nec, massa. Phasellus vitae felis sed lectus dapibus +facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis +turpis vel magna. Cras eu est. Integer porttitor ligula a +
    +
    +tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis +leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque.

    + +

    Line break at beginning of next paragraph:

    +


    +Line 2

    + +

    Line break within a font tag: +ABCDE
    FGHIJK

    + +

    Line break within two nested spans: span 1 2
    break

    + +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at +odio vitae libero tempus convallis. Cum sociis natoque penatibus et +magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus +mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel,
    +adipiscing nec, massa. Phasellus vitae felis sed lectus dapibus +facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis +turpis vel magna. Cras eu est. Integer porttitor ligula a +
    +
    +tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis +leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque.

    + + + diff --git a/application/third_party/dompdf/www/test/dom_large_table.html b/application/third_party/dompdf/www/test/dom_large_table.html new file mode 100755 index 00000000..0bf54497 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_large_table.html @@ -0,0 +1,2198 @@ + + + + + + + + + + + + + + + +
    +

    SCHEDULE A

    +
    +

    404-135 - Schedule A

    +APPROVED: 2004-11-18 +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    Job:404-135Purchasers: +Komant
    Created:2004-09-28Last change:2004-11-18
    Job address:2904-26 StreetLegal:28B/22/032-5210
    + + + + + + + + + + + + + +
    Model:Elevation:Size:Style:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ItemDescriptionQuantityUnit CostTotal
    Standard items:
    1add bank of drawers - to bathroom vanity2$125.00Ea.$250.00
    2add sweep outlet - central vac1$100.00Ea.$100.00
    3run central vac rough in to attached garage c/w separate circuit1$120.00Ea.$120.00
    4add fan to FIREPLACE1$195.00Ea.$195.00
    5upgrade to laminate flooring - Entire Main Floor1$2,400.00Ea.$2,400.00
    6upgrade oh door to insulated (9ft)1$95.00Ea.$95.00
    7change upper stairwell ledge to painted MDF1$45.00Ea.$45.00
    8upgrade standard door to pocket door1$145.00Ea.$145.00
    9add RIDP1$400.00Ea.$400.00
    Standard items:
    1add bank of drawers - to bathroom vanity2$125.00Ea.$250.00
    2add sweep outlet - central vac1$100.00Ea.$100.00
    3run central vac rough in to attached garage c/w separate circuit1$120.00Ea.$120.00
    4add fan to FIREPLACE1$195.00Ea.$195.00
    5upgrade to laminate flooring - Entire Main Floor1$2,400.00Ea.$2,400.00
    6upgrade oh door to insulated (9ft)1$95.00Ea.$95.00
    7change upper stairwell ledge to painted MDF1$45.00Ea.$45.00
    8upgrade standard door to pocket door1$145.00Ea.$145.00
    9add RIDP1$400.00Ea.$400.00
    Custom items:
    1upgrade to brushed chrome hardware 1$195.00Ea.$195.00
    2box out FIREPLACE as per plan attached1$250.00Ea.$250.00
    3reduce WIC size by 6" to 8" to allow for large vanity ensuite1$0.00Ea.$0.00
    4add gas line to basement for future gas FP1$300.00Ea.$300.00
    5add pocket dorr to ensuite joining WIC and Ensuite. Delete 2 existing doors1$0.00Ea.$0.00
    6Main floor to be ISLAND Kitchen design1$0.00Ea.$0.00
    7price adjustment1($0.37)Ea.($0.37)
    Custom items:
    1upgrade to brushed chrome hardware 1$195.00Ea.$195.00
    2box out FIREPLACE as per plan attached1$250.00Ea.$250.00
    3reduce WIC size by 6" to 8" to allow for large vanity ensuite1$0.00Ea.$0.00
    4add gas line to basement for future gas FP1$300.00Ea.$300.00
    5add pocket dorr to ensuite joining WIC and Ensuite. Delete 2 existing doors1$0.00Ea.$0.00
    (GST is not included)   +Grand total:$4,494.63
    + + + + + + + + + + + +
    WITNESS: PURCHASER:X
      + Tammy Komant
    +

    This change order shall have no force or effect until approved and signed +by an authorizing signing officer of the Builder. Any change or special +request not noted on this document is not contractual.

    + + + + + + + + +
    ACCEPTED THIS +18 DAY OF NOVEMBER, 2004 +LINCOLNBERG COMMUNITIES

    +PER: +Keith Jansen +
    +
    + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/dom_long_table.php b/application/third_party/dompdf/www/test/dom_long_table.php new file mode 100755 index 00000000..86cf2391 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_long_table.php @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + +" . ($i * $j) . "\n"; +} +?> + + +
    Header
    Footer
    + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/dom_nbsp.html b/application/third_party/dompdf/www/test/dom_nbsp.html new file mode 100755 index 00000000..c49d040f --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_nbsp.html @@ -0,0 +1,6 @@ + + + + +

    a b c 

    diff --git a/application/third_party/dompdf/www/test/dom_nested_table.html b/application/third_party/dompdf/www/test/dom_nested_table.html new file mode 100755 index 00000000..c141ad28 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_nested_table.html @@ -0,0 +1,62 @@ + + + + + + + + + + + +
    + + + + + + + +
    foo
    bar
    +
    + + + + + + + + + + +
    + + + + + + + + +
    + + + + + + + + +
    a
    bc
    +
    d
    e
    +
    f
    gh
    + + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/dom_ol.html b/application/third_party/dompdf/www/test/dom_ol.html new file mode 100755 index 00000000..e13b0fa2 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_ol.html @@ -0,0 +1,148 @@ + + + + + + + + + +

    none

    +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    + +

    decimal

    +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    + +

    lower-alpha

    +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    + +

    lower-latin

    +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    + +

    lower-roman

    +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    + +

    lower-greek

    +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    + +

    upper-alpha

    +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    + +

    upper-latin

    +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    + +

    upper-roman

    +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    + +

    Advanced

    +
      +
    1. Item 1
    2. +
    3. Item 2 +
        +
      1. Item 1 +
          +
        1. Item 1
        2. +
        3. Item 2
        4. +
        5. Item 3
        6. +
        +
      2. +
      3. Item 2
      4. +
      5. Item 3 +
          +
        1. Item 1
        2. +
        3. Item 2
        4. +
        5. Item 3
        6. +
        +
      6. +
      +
    4. +
    5. Item 3
    6. +
    + +

    decimal-leading-zero

    +
      +
    1. Item #
    2. +
    3. Item #
    4. +
    5. Item #
    6. +
    7. Item #
    8. +
    9. Item #
    10. +
    11. Item #
    12. +
    13. Item #
    14. +
    15. Item #
    16. +
    17. Item #
    18. +
    19. Item #
    20. +
    21. Item #
    22. +
    23. Item #
    24. +
    25. Item #
    26. +
    27. Item #
    28. +
    29. Item #
    30. +
    31. Item #
    32. +
    33. Item #
    34. +
    35. Item #
    36. +
    37. Item #
    38. +
    39. Item #
    40. +
    41. Item #
    42. +
    43. Item #
    44. +
    45. Item #
    46. +
    47. Item #
    48. +
    49. Item #
    50. +
    51. Item #
    52. +
    + + + diff --git a/application/third_party/dompdf/www/test/dom_simple_ul.html b/application/third_party/dompdf/www/test/dom_simple_ul.html new file mode 100755 index 00000000..1d6bd959 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_simple_ul.html @@ -0,0 +1,39 @@ + + + + + + + + +

    Here's a simple list from my favourite website:

    + +
      +
    • The Zend Engine II with a new object model and dozens of new features.
    • + +
    • XML support has been completely redone in PHP 5, all extensions are + now focused around the excellent libxml2 library + (http://www.xmlsoft.org/).
    • + +
    • A new SimpleXML extension for easily accessing and manipulating XML + as PHP objects. It can also interface with the DOM extension and + vice-versa.
    • + +
    • A brand new built-in SOAP extension for interoperability with Web Services.
    • + +
    • A new MySQL extension named MySQLi for developers using MySQL 4.1 and + later. This new extension includes an object-oriented interface in + addition to a traditional interface; as well as support for many of + MySQL's new features, such as prepared statements.
    • + +
    • SQLite has been bundled with PHP. For more information on SQLite, + please visit their website.
    • + +
    • Streams have been greatly improved, including the ability to access low-level socket operations on streams.
    • + +
    • And lots more...
    • + +
      • Sublists
      • work
      • too!
      +
    + + diff --git a/application/third_party/dompdf/www/test/dom_table.html b/application/third_party/dompdf/www/test/dom_table.html new file mode 100755 index 00000000..e74af607 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_table.html @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    head 1head 2head 3head 4
    cell 1cell 2cell 3
    cell 4cell 5
    cell 6
    cell 7
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    head 1head 2head 3head 4
    cell 1cell 2cell 3cell 4
    cell 5cell 6cell 7
    cell 8cell 9cell 10
    cell 11
    + + + diff --git a/application/third_party/dompdf/www/test/dom_table_01.html b/application/third_party/dompdf/www/test/dom_table_01.html new file mode 100755 index 00000000..99bd9c8d --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_table_01.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + +
    Title
    KaireDesine
    + + + diff --git a/application/third_party/dompdf/www/test/dom_table_image.html b/application/third_party/dompdf/www/test/dom_table_image.html new file mode 100755 index 00000000..f563a380 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_table_image.html @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + +
    Some Text
    More TextBlah
    + + + diff --git a/application/third_party/dompdf/www/test/dom_ul.html b/application/third_party/dompdf/www/test/dom_ul.html new file mode 100755 index 00000000..7d64ec73 --- /dev/null +++ b/application/third_party/dompdf/www/test/dom_ul.html @@ -0,0 +1,312 @@ + + + + + + + + +
      +
    • Item 1
    • +
    • Item 2
    • +
    • Item 3
    • +
      • Sub 1
      • +
      • Sub 2
      • +
      • Sub 3
      • +
      +
    + +
      +
    • Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at +odio vitae libero tempus convallis. Cum sociis natoque penatibus et +magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus +mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel, +adipiscing nec, massa. Phasellus vitae felis sed lectus dapibus +facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis +turpis vel magna. Cras eu est. Integer porttitor ligula a +tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis +leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque.
    • +
    • Curabitur ut diam eu dui vestibulum pharetra. Nam pellentesque, justo +non hendrerit venenatis, mi orci pretium mi, et vehicula leo arcu quis +diam. Nullam mattis laoreet quam. Morbi mollis sem ut tellus. Nam mi +massa, lobortis eu, sollicitudin et, iaculis et, massa. Maecenas purus +mauris, luctus sit amet, pharetra in, facilisis sit amet, elit. Nullam +vel erat tempus purus molestie suscipit. Vestibulum odio lorem, +sollicitudin non, volutpat sit amet, tincidunt vel, nunc. Nulla quis +ante vestibulum odio feugiat facilisis. Proin lorem nisl, viverra at, +rhoncus quis, semper nec, mi. Donec euismod enim vitae velit. Nulla +sed lectus. Vivamus placerat, lacus sed vehicula sagittis, arcu massa +adipiscing lorem, bibendum luctus nisl tortor vitae leo.
    • +
    • Inside. Aliquam enim. Duis et diam. Praesent porta, mauris quis pellentesque +volutpat, erat elit vulputate eros, vitae pulvinar augue velit sit +amet sem. Fusce eu urna eu nisi condimentum posuere. Vivamus sed +felis. Duis eget urna vitae eros interdum dignissim. Proin justo eros, +eleifend in, porttitor in, malesuada non, neque. Etiam sed +augue. Nulla sit amet magna. Lorem ipsum dolor sit amet, consectetuer +adipiscing elit. Mauris facilisis. Curabitur massa magna, pulvinar a, +nonummy eget, egestas vitae, mauris. Quisque vel elit sit amet lorem +malesuada facilisis. Vestibulum porta, metus sit amet egestas +interdum, urna justo euismod erat, id tristique urna leo quis +nibh. Morbi non erat.
    • +
    + +
      +
    • Item 1 disc
    • +
    • Item 2 disc
    • +
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Item 4 disc
    • +
    + +
      +
    • Item 1 circle
    • +
    • Item 2 circle
    • +
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Item 4 circle
    • +
    + +
      +
    • Item 1 square
    • +
    • Item 2 square
    • +
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Item 4 square
    • +
    + +
      +
    • Item 1 image
    • +
    • Item 2 image
    • +
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Item 4 image
    • +
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Outside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Item 7 noimage
    • + +
        +
      • sub Item 1 image
      • +
      • sub Item 2 image
      • +
      • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
      • +
      • Outside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
      • +
      • sub Item 5 noimage
      • +
      + +
    + +
      +
    • Item 1 missing image - fallback square
    • +
    • Item 2 missing image - fallback square
    • +
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Item 4 missing image - fallback square
    • +
    + +
      +
    • Item 1 nobullet
    • +
    • Item 2 nobullet
    • +
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Item 4 nobullet
    • +
    + +
      +
    • Item 1 missing image - fallback none
    • +
    • Item 2 missing image - fallback none
    • +
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Item 4 missing image - fallback none
    • +
    + +
      +
    • Item 1 bigimage
    • +
    • Item 2 bigimage
    • +
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Item 4 bigimage
    • +
    + +
      +
    • margin Item 1 image
    • +
    • margin Item 2 image
    • +
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • margin Item 4 image
    • +
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • Outside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
    • margin Item 7 noimage
    • + +
        +
      • margin sub Item 1 image
      • +
      • margin sub Item 2 image
      • +
      • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
      • +
      • Outside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
      • +
      • margin sub Item 5 noimage
      • +
      + +
    + +
      +
    • padding Item 1 image
    • +
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
        +
      • padding sub Item 1 image
      • +
      • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
      • +
      +
    + +
      +
    • margin Item 1 square
    • +
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
        +
      • margin sub Item 1 square
      • +
      • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
      • +
      +
    + +
      +
    • padding Item 1 square
    • +
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
    • +
        +
      • padding sub Item 1 square
      • +
      • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et dolore magna +aliquyam erat, sed diam voluptua. At vero eos et accusam et justo +duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est Lorem ipsum dolor sit amet.
      • +
      +
    + +

    combined list attributes list-style

    + +
      +
    • list-style:square inside url(dummy.png);
    • +
    • list-style:outside;[overwrites only position]
    • +
    +
      +
    • list-style:square inside url(images/png.png);
    • +
    • list-style-position:outside;[overwrites only position]
    • +
    • list-style-position:outside;[overwrite attributes - firefox3: all; dompdf, internet explorer 8: only position]
    • +
    • list-style:none; [resets both, bullet and image]
    • +
    + + + diff --git a/application/third_party/dompdf/www/test/encoding_entities.html b/application/third_party/dompdf/www/test/encoding_entities.html new file mode 100755 index 00000000..79c66bfd --- /dev/null +++ b/application/third_party/dompdf/www/test/encoding_entities.html @@ -0,0 +1,14 @@ + + + + + + +

    é © « avoir et être α β

    +

    é © « avoir et être α β

    + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/encoding_latin1.html b/application/third_party/dompdf/www/test/encoding_latin1.html new file mode 100755 index 00000000..9a8b05e0 --- /dev/null +++ b/application/third_party/dompdf/www/test/encoding_latin1.html @@ -0,0 +1,1162 @@ + + + + +HTML 4.0 Latin-1 Entities + + + + + + +

    Latin-1 Entities

    + +

    The following table gives the character entity reference, decimal +character reference, and hexadecimal character reference for 8-bit +characters in the Latin-1 (ISO-8859-1) character set, as well as the +rendering of each in your browser. Glyphs of the characters are +available at the Unicode +Consortium.

    + +

    Browser support is generally best for the decimal character +references, except for the accented characters (decimal 192-214, +216-246, 248-255), where the character entity references hold a slight +edge.

    + +

    Note that most Mac browsers will render fourteen Latin-1 characters +incorrectly. These characters are decimal 166, 178, 179, 185, 188, +189, 190, 208, 215, 221, 222, 240, 253, and 254. See ISO-8859-1 +and the Mac platform for more information.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CharacterEntityDecimalHexRendering in Your Browser
    EntityDecimalHex
    no-break space = non-breaking space&nbsp;&#160;&#xA0;   
    inverted exclamation mark&iexcl;&#161;&#xA1;¡¡¡
    cent sign&cent;&#162;&#xA2;¢¢¢
    pound sign&pound;&#163;&#xA3;£££
    currency sign&curren;&#164;&#xA4;¤¤¤
    yen sign = yuan sign&yen;&#165;&#xA5;¥¥¥
    broken bar = broken vertical bar&brvbar;&#166;&#xA6;¦¦¦
    section sign&sect;&#167;&#xA7;§§§
    diaeresis = spacing diaeresis&uml;&#168;&#xA8;¨¨¨
    copyright sign&copy;&#169;&#xA9;©©©
    feminine ordinal indicator&ordf;&#170;&#xAA;ªªª
    left-pointing double angle quotation mark = left pointing guillemet&laquo;&#171;&#xAB;«««
    not sign&not;&#172;&#xAC;¬¬¬
    soft hyphen = discretionary hyphen&shy;&#173;&#xAD;­­­
    registered sign = registered trade mark sign&reg;&#174;&#xAE;®®®
    macron = spacing macron = overline = APL overbar&macr;&#175;&#xAF;¯¯¯
    degree sign&deg;&#176;&#xB0;°°°
    plus-minus sign = plus-or-minus sign&plusmn;&#177;&#xB1;±±±
    superscript two = superscript digit two = squared&sup2;&#178;&#xB2;²²²
    superscript three = superscript digit three = cubed&sup3;&#179;&#xB3;³³³
    acute accent = spacing acute&acute;&#180;&#xB4;´´´
    micro sign&micro;&#181;&#xB5;µµµ
    pilcrow sign = paragraph sign&para;&#182;&#xB6;
    middle dot = Georgian comma = Greek middle dot&middot;&#183;&#xB7;···
    cedilla = spacing cedilla&cedil;&#184;&#xB8;¸¸¸
    superscript one = superscript digit one&sup1;&#185;&#xB9;¹¹¹
    masculine ordinal indicator&ordm;&#186;&#xBA;ººº
    right-pointing double angle quotation mark = right pointing guillemet&raquo;&#187;&#xBB;»»»
    vulgar fraction one quarter = fraction one quarter&frac14;&#188;&#xBC;¼¼¼
    vulgar fraction one half = fraction one half&frac12;&#189;&#xBD;½½½
    vulgar fraction three quarters = fraction three quarters&frac34;&#190;&#xBE;¾¾¾
    inverted question mark = turned question mark&iquest;&#191;&#xBF;¿¿¿
    Latin capital letter A with grave = Latin capital letter A grave&Agrave;&#192;&#xC0;ÀÀÀ
    Latin capital letter A with acute&Aacute;&#193;&#xC1;ÁÁÁ
    Latin capital letter A with circumflex&Acirc;&#194;&#xC2;ÂÂÂ
    Latin capital letter A with tilde&Atilde;&#195;&#xC3;ÃÃÃ
    Latin capital letter A with diaeresis&Auml;&#196;&#xC4;ÄÄÄ
    Latin capital letter A with ring above = Latin capital letter A ring&Aring;&#197;&#xC5;ÅÅÅ
    Latin capital letter AE = Latin capital ligature AE&AElig;&#198;&#xC6;ÆÆÆ
    Latin capital letter C with cedilla&Ccedil;&#199;&#xC7;ÇÇÇ
    Latin capital letter E with grave&Egrave;&#200;&#xC8;ÈÈÈ
    Latin capital letter E with acute&Eacute;&#201;&#xC9;ÉÉÉ
    Latin capital letter E with circumflex&Ecirc;&#202;&#xCA;ÊÊÊ
    Latin capital letter E with diaeresis&Euml;&#203;&#xCB;ËËË
    Latin capital letter I with grave&Igrave;&#204;&#xCC;ÌÌÌ
    Latin capital letter I with acute&Iacute;&#205;&#xCD;ÍÍÍ
    Latin capital letter I with circumflex&Icirc;&#206;&#xCE;ÎÎÎ
    Latin capital letter I with diaeresis&Iuml;&#207;&#xCF;ÏÏÏ
    Latin capital letter ETH&ETH;&#208;&#xD0;ÐÐÐ
    Latin capital letter N with tilde&Ntilde;&#209;&#xD1;ÑÑÑ
    Latin capital letter O with grave&Ograve;&#210;&#xD2;ÒÒÒ
    Latin capital letter O with acute&Oacute;&#211;&#xD3;ÓÓÓ
    Latin capital letter O with circumflex&Ocirc;&#212;&#xD4;ÔÔÔ
    Latin capital letter O with tilde&Otilde;&#213;&#xD5;ÕÕÕ
    Latin capital letter O with diaeresis&Ouml;&#214;&#xD6;ÖÖÖ
    multiplication sign&times;&#215;&#xD7;×××
    Latin capital letter O with stroke = Latin capital letter O slash&Oslash;&#216;&#xD8;ØØØ
    Latin capital letter U with grave&Ugrave;&#217;&#xD9;ÙÙÙ
    Latin capital letter U with acute&Uacute;&#218;&#xDA;ÚÚÚ
    Latin capital letter U with circumflex&Ucirc;&#219;&#xDB;ÛÛÛ
    Latin capital letter U with diaeresis&Uuml;&#220;&#xDC;ÜÜÜ
    Latin capital letter Y with acute&Yacute;&#221;&#xDD;ÝÝÝ
    Latin capital letter THORN&THORN;&#222;&#xDE;ÞÞÞ
    Latin small letter sharp s = ess-zed&szlig;&#223;&#xDF;ßßß
    Latin small letter a with grave = Latin small letter a grave&agrave;&#224;&#xE0;ààà
    Latin small letter a with acute&aacute;&#225;&#xE1;ááá
    Latin small letter a with circumflex&acirc;&#226;&#xE2;âââ
    Latin small letter a with tilde&atilde;&#227;&#xE3;ããã
    Latin small letter a with diaeresis&auml;&#228;&#xE4;äää
    Latin small letter a with ring above = Latin small letter a ring&aring;&#229;&#xE5;ååå
    Latin small letter ae = Latin small ligature ae&aelig;&#230;&#xE6;æææ
    Latin small letter c with cedilla&ccedil;&#231;&#xE7;ççç
    Latin small letter e with grave&egrave;&#232;&#xE8;èèè
    Latin small letter e with acute&eacute;&#233;&#xE9;ééé
    Latin small letter e with circumflex&ecirc;&#234;&#xEA;êêê
    Latin small letter e with diaeresis&euml;&#235;&#xEB;ëëë
    Latin small letter i with grave&igrave;&#236;&#xEC;ììì
    Latin small letter i with acute&iacute;&#237;&#xED;ííí
    Latin small letter i with circumflex&icirc;&#238;&#xEE;îîî
    Latin small letter i with diaeresis&iuml;&#239;&#xEF;ïïï
    Latin small letter eth&eth;&#240;&#xF0;ððð
    Latin small letter n with tilde&ntilde;&#241;&#xF1;ñññ
    Latin small letter o with grave&ograve;&#242;&#xF2;òòò
    Latin small letter o with acute&oacute;&#243;&#xF3;óóó
    Latin small letter o with circumflex&ocirc;&#244;&#xF4;ôôô
    Latin small letter o with tilde&otilde;&#245;&#xF5;õõõ
    Latin small letter o with diaeresis&ouml;&#246;&#xF6;ööö
    division sign&divide;&#247;&#xF7;÷÷÷
    Latin small letter o with stroke = Latin small letter o slash&oslash;&#248;&#xF8;øøø
    Latin small letter u with grave&ugrave;&#249;&#xF9;ùùù
    Latin small letter u with acute&uacute;&#250;&#xFA;úúú
    Latin small letter u with circumflex&ucirc;&#251;&#xFB;ûûû
    Latin small letter u with diaeresis&uuml;&#252;&#xFC;üüü
    Latin small letter y with acute&yacute;&#253;&#xFD;ýýý
    Latin small letter thorn&thorn;&#254;&#xFE;þþþ
    Latin small letter y with diaeresis&yuml;&#255;&#xFF;ÿÿÿ
    + + + + diff --git a/application/third_party/dompdf/www/test/encoding_special.html b/application/third_party/dompdf/www/test/encoding_special.html new file mode 100755 index 00000000..5f9b42d1 --- /dev/null +++ b/application/third_party/dompdf/www/test/encoding_special.html @@ -0,0 +1,570 @@ + + + + +HTML 4.0 Special Entities + + + + + + + + +

    Special Entities

    +

    The following table gives the character entity reference, decimal character reference, and hexadecimal character reference for markup-significant and internationalization characters, as well as the rendering of each in your browser. Glyphs of the characters are available at the Unicode Consortium.

    +

    With the exception of HTML 2.0's &quot;, &amp;, &lt;, and &gt;, browser support for these entities is generally quite poor, but recent browsers support some of the character entity references and decimal character references.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CharacterEntityDecimalHexRendering in Your Browser
    EntityDecimalHex
    quotation mark = APL quote&quot;&#34;&#x22;"""
    ampersand&amp;&#38;&#x26;&&&
    less-than sign&lt;&#60;&#x3C;<<<
    greater-than sign&gt;&#62;&#x3E;>>>
    Latin capital ligature OE&OElig;&#338;&#x152;ŒŒŒ
    Latin small ligature oe&oelig;&#339;&#x153;œœœ
    Latin capital letter S with caron&Scaron;&#352;&#x160;ŠŠŠ
    Latin small letter s with caron&scaron;&#353;&#x161;ššš
    Latin capital letter Y with diaeresis&Yuml;&#376;&#x178;ŸŸŸ
    modifier letter circumflex accent&circ;&#710;&#x2C6;ˆˆˆ
    small tilde&tilde;&#732;&#x2DC;˜˜˜
    en space&ensp;&#8194;&#x2002;
    em space&emsp;&#8195;&#x2003;
    thin space&thinsp;&#8201;&#x2009;
    zero width non-joiner&zwnj;&#8204;&#x200C;
    zero width joiner&zwj;&#8205;&#x200D;
    left-to-right mark&lrm;&#8206;&#x200E;
    right-to-left mark&rlm;&#8207;&#x200F;
    en dash&ndash;&#8211;&#x2013;
    em dash&mdash;&#8212;&#x2014;
    left single quotation mark&lsquo;&#8216;&#x2018;
    right single quotation mark&rsquo;&#8217;&#x2019;
    single low-9 quotation mark&sbquo;&#8218;&#x201A;
    left double quotation mark&ldquo;&#8220;&#x201C;
    right double quotation mark&rdquo;&#8221;&#x201D;
    double low-9 quotation mark&bdquo;&#8222;&#x201E;
    dagger&dagger;&#8224;&#x2020;
    double dagger&Dagger;&#8225;&#x2021;
    per mille sign&permil;&#8240;&#x2030;
    single left-pointing angle quotation mark&lsaquo;&#8249;&#x2039;
    single right-pointing angle quotation mark&rsaquo;&#8250;&#x203A;
    euro sign&euro;&#8364;&#x20AC;
    + + + + diff --git a/application/third_party/dompdf/www/test/encoding_symbols.html b/application/third_party/dompdf/www/test/encoding_symbols.html new file mode 100755 index 00000000..c487bd4b --- /dev/null +++ b/application/third_party/dompdf/www/test/encoding_symbols.html @@ -0,0 +1,1400 @@ + + + + +HTML 4.0 Entities for Symbols and Greek Letters + + + + + + + + + +

    Entities for Symbols and Greek Letters

    +

    The following table gives the character entity reference, decimal character reference, and hexadecimal character reference for symbols and Greek letters, as well as the rendering of each in your browser. Glyphs of the characters are available at the Unicode Consortium.

    +

    Browser support for these entities is generally quite poor, but recent browsers support some of the character entity references and decimal character references.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CharacterEntityDecimalHexRendering in Your Browser
    EntityDecimalHex
    Latin small f with hook = function = florin&fnof;&#402;&#x192;ƒƒƒ
    Greek capital letter alpha&Alpha;&#913;&#x391;ΑΑΑ
    Greek capital letter beta&Beta;&#914;&#x392;ΒΒΒ
    Greek capital letter gamma&Gamma;&#915;&#x393;ΓΓΓ
    Greek capital letter delta&Delta;&#916;&#x394;ΔΔΔ
    Greek capital letter epsilon&Epsilon;&#917;&#x395;ΕΕΕ
    Greek capital letter zeta&Zeta;&#918;&#x396;ΖΖΖ
    Greek capital letter eta&Eta;&#919;&#x397;ΗΗΗ
    Greek capital letter theta&Theta;&#920;&#x398;ΘΘΘ
    Greek capital letter iota&Iota;&#921;&#x399;ΙΙΙ
    Greek capital letter kappa&Kappa;&#922;&#x39A;ΚΚΚ
    Greek capital letter lambda&Lambda;&#923;&#x39B;ΛΛΛ
    Greek capital letter mu&Mu;&#924;&#x39C;ΜΜΜ
    Greek capital letter nu&Nu;&#925;&#x39D;ΝΝΝ
    Greek capital letter xi&Xi;&#926;&#x39E;ΞΞΞ
    Greek capital letter omicron&Omicron;&#927;&#x39F;ΟΟΟ
    Greek capital letter pi&Pi;&#928;&#x3A0;ΠΠΠ
    Greek capital letter rho&Rho;&#929;&#x3A1;ΡΡΡ
    Greek capital letter sigma&Sigma;&#931;&#x3A3;ΣΣΣ
    Greek capital letter tau&Tau;&#932;&#x3A4;ΤΤΤ
    Greek capital letter upsilon&Upsilon;&#933;&#x3A5;ΥΥΥ
    Greek capital letter phi&Phi;&#934;&#x3A6;ΦΦΦ
    Greek capital letter chi&Chi;&#935;&#x3A7;ΧΧΧ
    Greek capital letter psi&Psi;&#936;&#x3A8;ΨΨΨ
    Greek capital letter omega&Omega;&#937;&#x3A9;ΩΩΩ
    Greek small letter alpha&alpha;&#945;&#x3B1;ααα
    Greek small letter beta&beta;&#946;&#x3B2;βββ
    Greek small letter gamma&gamma;&#947;&#x3B3;γγγ
    Greek small letter delta&delta;&#948;&#x3B4;δδδ
    Greek small letter epsilon&epsilon;&#949;&#x3B5;εεε
    Greek small letter zeta&zeta;&#950;&#x3B6;ζζζ
    Greek small letter eta&eta;&#951;&#x3B7;ηηη
    Greek small letter theta&theta;&#952;&#x3B8;θθθ
    Greek small letter iota&iota;&#953;&#x3B9;ιιι
    Greek small letter kappa&kappa;&#954;&#x3BA;κκκ
    Greek small letter lambda&lambda;&#955;&#x3BB;λλλ
    Greek small letter mu&mu;&#956;&#x3BC;μμμ
    Greek small letter nu&nu;&#957;&#x3BD;ννν
    Greek small letter xi&xi;&#958;&#x3BE;ξξξ
    Greek small letter omicron&omicron;&#959;&#x3BF;οοο
    Greek small letter pi&pi;&#960;&#x3C0;πππ
    Greek small letter rho&rho;&#961;&#x3C1;ρρρ
    Greek small letter final sigma&sigmaf;&#962;&#x3C2;ςςς
    Greek small letter sigma&sigma;&#963;&#x3C3;σσσ
    Greek small letter tau&tau;&#964;&#x3C4;τττ
    Greek small letter upsilon&upsilon;&#965;&#x3C5;υυυ
    Greek small letter phi&phi;&#966;&#x3C6;φφφ
    Greek small letter chi&chi;&#967;&#x3C7;χχχ
    Greek small letter psi&psi;&#968;&#x3C8;ψψψ
    Greek small letter omega&omega;&#969;&#x3C9;ωωω
    Greek small letter theta symbol&thetasym;&#977;&#x3D1;ϑϑϑ
    Greek upsilon with hook symbol&upsih;&#978;&#x3D2;ϒϒϒ
    Greek pi symbol&piv;&#982;&#x3D6;ϖϖϖ
    bullet = black small circle&bull;&#8226;&#x2022;
    horizontal ellipsis = three dot leader&hellip;&#8230;&#x2026;
    prime = minutes = feet&prime;&#8242;&#x2032;
    double prime = seconds = inches&Prime;&#8243;&#x2033;
    overline = spacing overscore&oline;&#8254;&#x203E;
    fraction slash&frasl;&#8260;&#x2044;
    script capital P = power set = Weierstrass p&weierp;&#8472;&#x2118;
    blackletter capital I = imaginary part&image;&#8465;&#x2111;
    blackletter capital R = real part symbol&real;&#8476;&#x211C;
    trade mark sign&trade;&#8482;&#x2122;
    alef symbol = first transfinite cardinal&alefsym;&#8501;&#x2135;
    leftwards arrow&larr;&#8592;&#x2190;
    upwards arrow&uarr;&#8593;&#x2191;
    rightwards arrow&rarr;&#8594;&#x2192;
    downwards arrow&darr;&#8595;&#x2193;
    left right arrow&harr;&#8596;&#x2194;
    downwards arrow with corner leftwards = carriage return&crarr;&#8629;&#x21B5;
    leftwards double arrow&lArr;&#8656;&#x21D0;
    upwards double arrow&uArr;&#8657;&#x21D1;
    rightwards double arrow&rArr;&#8658;&#x21D2;
    downwards double arrow&dArr;&#8659;&#x21D3;
    left right double arrow&hArr;&#8660;&#x21D4;
    for all&forall;&#8704;&#x2200;
    partial differential&part;&#8706;&#x2202;
    there exists&exist;&#8707;&#x2203;
    empty set = null set = diameter&empty;&#8709;&#x2205;
    nabla = backward difference&nabla;&#8711;&#x2207;
    element of&isin;&#8712;&#x2208;
    not an element of&notin;&#8713;&#x2209;
    contains as member&ni;&#8715;&#x220B;
    n-ary product = product sign&prod;&#8719;&#x220F;
    n-ary sumation&sum;&#8721;&#x2211;
    minus sign&minus;&#8722;&#x2212;
    asterisk operator&lowast;&#8727;&#x2217;
    square root = radical sign&radic;&#8730;&#x221A;
    proportional to&prop;&#8733;&#x221D;
    infinity&infin;&#8734;&#x221E;
    angle&ang;&#8736;&#x2220;
    logical and = wedge&and;&#8743;&#x2227;
    logical or = vee&or;&#8744;&#x2228;
    intersection = cap&cap;&#8745;&#x2229;
    union = cup&cup;&#8746;&#x222A;
    integral&int;&#8747;&#x222B;
    therefore&there4;&#8756;&#x2234;
    tilde operator = varies with = similar to&sim;&#8764;&#x223C;
    approximately equal to&cong;&#8773;&#x2245;
    almost equal to = asymptotic to&asymp;&#8776;&#x2248;
    not equal to&ne;&#8800;&#x2260;
    identical to&equiv;&#8801;&#x2261;
    less-than or equal to&le;&#8804;&#x2264;
    greater-than or equal to&ge;&#8805;&#x2265;
    subset of&sub;&#8834;&#x2282;
    superset of&sup;&#8835;&#x2283;
    not a subset of&nsub;&#8836;&#x2284;
    subset of or equal to&sube;&#8838;&#x2286;
    superset of or equal to&supe;&#8839;&#x2287;
    circled plus = direct sum&oplus;&#8853;&#x2295;
    circled times = vector product&otimes;&#8855;&#x2297;
    up tack = orthogonal to = perpendicular&perp;&#8869;&#x22A5;
    dot operator&sdot;&#8901;&#x22C5;
    left ceiling = APL upstile&lceil;&#8968;&#x2308;
    right ceiling&rceil;&#8969;&#x2309;
    left floor = APL downstile&lfloor;&#8970;&#x230A;
    right floor&rfloor;&#8971;&#x230B;
    left-pointing angle bracket = bra&lang;&#9001;&#x2329;
    right-pointing angle bracket = ket&rang;&#9002;&#x232A;
    lozenge&loz;&#9674;&#x25CA;
    black spade suit&spades;&#9824;&#x2660;
    black club suit = shamrock&clubs;&#9827;&#x2663;
    black heart suit = valentine&hearts;&#9829;&#x2665;
    black diamond suit&diams;&#9830;&#x2666;
    + + + + diff --git a/application/third_party/dompdf/www/test/encoding_unicode.html b/application/third_party/dompdf/www/test/encoding_unicode.html new file mode 100755 index 00000000..90c21044 --- /dev/null +++ b/application/third_party/dompdf/www/test/encoding_unicode.html @@ -0,0 +1,8 @@ + + + + + +献给æ¯äº²çš„爱 + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/encoding_unicode_wrapping.html b/application/third_party/dompdf/www/test/encoding_unicode_wrapping.html new file mode 100755 index 00000000..8c964d32 --- /dev/null +++ b/application/third_party/dompdf/www/test/encoding_unicode_wrapping.html @@ -0,0 +1,13 @@ + + + + +Wrapping of non-ANSI characters + + + +No se tendrá en cuenta el hecho de que las partes tengan sus establecimientos en Estados diferentes +cuando ello no resulte del contrato, ni de los tratos entre ellas, ni de información revelada por +las partes en cualquier momento antes de la celebración del contrato o en el momento de su celebración. + + diff --git a/application/third_party/dompdf/www/test/encoding_utf-8.html b/application/third_party/dompdf/www/test/encoding_utf-8.html new file mode 100755 index 00000000..21a1f2fa --- /dev/null +++ b/application/third_party/dompdf/www/test/encoding_utf-8.html @@ -0,0 +1,793 @@ + + + + + +Unicode (UTF-8) Test + + + + +

    Unicode (UTF-8) test

    + +

    You can use this document to check if your browser and your installed fonts display multilingual HTML documents in Unicode (UTF-8) correctly.

    + +
    + +

    Latin extended

    + +
    +
    Letters with acute
    +
    Aà aá   CĆ cć   EÉ eé   Ià ií   LĹ lĺ   NŃ nÅ„   OÓ oó   RÅ” rÅ•   SÅš sÅ›   UÚ uú   Yà yý   ZŹ zź
    + +
    Letters with apostrophe (hacek)
    +
    dÄ   LĽ lľ   tÅ¥
    + +
    Letters with breve
    +
    AÄ‚ aă   GÄž gÄŸ   UŬ uÅ­
    + +
    Letters with caron (hacek)
    +
    CÄŒ cÄ   DÄŽ   EÄš eÄ›   NŇ nň   RŘ rÅ™   SÅ  sÅ¡   TŤ   ZŽ zž
    + +
    Letters with cedilla (comma)
    +
    CÇ cç   GÄ¢ gÄ£   KĶ kÄ·   LÄ» lļ   NÅ… nņ   RÅ– rÅ—   SÅž sÅŸ   TÅ¢ tÅ£
    + +
    Letters with circumflex
    +
    A aâ   CĈ cĉ   EÊ eê   GÄœ gÄ   HĤ hÄ¥   IÃŽ iî   JÄ´ jĵ   OÔ oô   SÅœ sÅ   UÛ uû   WÅ´ wŵ   YŶ yÅ·
    + +
    Letters with diaeresis (umlaut)
    +
    AÄ aä   EË eë   Ià iï   OÖ oö   UÜ uü   YŸ yÿ
    + +
    Letters with/without dot above
    +
    CÄŠ cÄ‹   EÄ– eÄ—   GÄ  gÄ¡   Iİ iı   ZÅ» zż
    + +
    Letters with double acute
    +
    OÅ oÅ‘   UŰ uű
    + +
    Letters with grave
    +
    AÀ aà   EÈ eè   IÃŒ iì   OÃ’ oò   UÙ uù
    + +
    Letters with horn
    +
    OÆ  oÆ¡   UƯ uư
    + +
    Letters with macron
    +
    AÄ€ aÄ   EÄ’ eÄ“   IĪ iÄ«   OÅŒ oÅ   UŪ uÅ«
    + +
    Letters with ogonek
    +
    AÄ„ aÄ…   EĘ eÄ™   IÄ® iį   UŲ uų
    + +
    Letters with ring above
    +
    AÃ… aÃ¥   UÅ® uů
    + +
    Letters with stroke
    +
    DÄ dÄ‘   HĦ hħ   LÅ lÅ‚   OØ oø
    + +
    Letters with tilde
    +
    AÃ aã   NÑ nñ   OÕ oõ
    + +
    Ligatures
    +
    AEÆ aeæ   OEÅ’ oeÅ“
    + +
    Eth & Thorn
    +
    Dà dð   THÞ thþ
    + +
    German sharp s & long s
    +
    ß   Å¿
    +
    + +

    Combining diacritical marks
     

    + +
    + +

    Greek

    + +
    +
    Capital letters
    +
    Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ ΠΞ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω
    + +
    Capital letters with tonos
    +
    Ά   Έ   Ή   Ί   ÎŒ   ÎŽ   Î
    + +
    Capital letters with dialytika
    +
    Ϊ   Ϋ
    + +
    Small letters
    +
    α β γ δ ε ζ η θ ι κ λ μ ν ξ ο Ï€ Ï ÏƒÏ‚ Ï„ Ï… φ χ ψ ω
    + +
    Small letters with tonos
    +
    ά   έ   ή   ί   ÏŒ   Ï   ÏŽ
    + +
    Small letters with dialytika
    +
    ÏŠ   Ï‹
    + +
    Small letters with dialytika and tonos
    +
    Î   ΰ
    +
    + +
    + +

    Cyrillic

    + +
    +
    Russian alphabet
    + +
    РБ В Г Д Е РЖ З И Й К Л М РО П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я +
    а б в г д е Ñ‘ ж з и й к л м н о п Ñ€ Ñ Ñ‚ у Ñ„ Ñ… ц ч ш щ ÑŠ Ñ‹ ÑŒ Ñ ÑŽ Ñ
    + +
    Belarussian alphabet
    + +
    РБ В Г Д Е РЖ З І Й К Л М РО П Р С Т У Ў Ф Х Ц Ч Ш Ы Ь Э Ю Я +
    а б в г д е Ñ‘ ж з Ñ– й к л м н о п Ñ€ Ñ Ñ‚ у Ñž Ñ„ Ñ… ц ч ш Ñ‹ ÑŒ Ñ ÑŽ Ñ
    + +
    Ukrainian alphabet
    + +
    РБ Ð’ Г Ò Ð” Е Є Ж З И І Ї Й К Л М РО П Р С Т У Ф Ð¥ Ц Ч Ш Щ Ь Ю Я +
    а б в г Ò‘ д е Ñ” ж з и Ñ– Ñ— й к л м н о п Ñ€ Ñ Ñ‚ у Ñ„ Ñ… ц ч ш щ ÑŒ ÑŽ Ñ
    + +
    Bulgarian alphabet
    + +
    РБ В Г Д Е Ж З И Й К Л М РО П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ь Ю Я +
    а б в г д е ж з и й к л м н о п Ñ€ Ñ Ñ‚ у Ñ„ Ñ… ц ч ш щ ÑŠ ÑŒ ÑŽ Ñ
    + +
    Macedonian alphabet
    + +
    РБ В Г Д Ѓ Е Ж З Ѕ И Ј К Л Љ М РЊ О П Р С Т Ќ У Ф Х Ц Ч РШ +
    а б в г д Ñ“ е ж з Ñ• и ј к л Ñ™ м н Ñš о п Ñ€ Ñ Ñ‚ Ñœ у Ñ„ Ñ… ц ч ÑŸ ш
    + +
    Serbian alphabet
    + +
    РБ В Г Д Ђ Е Ж З И Ј К Л Љ М РЊ О П Р С Т Ћ У Ф Х Ц Ч РШ +
    а б в г д Ñ’ е ж з и ј к л Ñ™ м н Ñš о п Ñ€ Ñ Ñ‚ Ñ› у Ñ„ Ñ… ц ч ÑŸ ш
    + +
    Mongolian alphabet
    + +
    +A B V G D E Ë Zh Z I J K L M N O Ö P R S T U Ü F X C Ch Sh Shh " Y ' E Ju Ja
    +
    РБ В Г Д Е РЖ З И Й К Л М РО Ө П Р С Т У Ү Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я +
    а б в г д е Ñ‘ ж з и й к л м н о Ó© п Ñ€ Ñ Ñ‚ у Ò¯ Ñ„ Ñ… ц ч ш щ ÑŠ Ñ‹ ÑŒ Ñ ÑŽ Ñ
    +
    + +
    + +

    Armenian

    + +
    +
    Capital letters
    + +
    a b g d e z ê ă th +  ž i l x c’ k’ h dz ğ +  č’ m j n š o č p’ dž +  rr s v t’ r c w ph kh +  ô f
    +
    +Ô± +Ô² +Ô³ +Ô´ +Ôµ +Ô¶ +Ô· +Ô¸ +Ô¹   +Ôº +Ô» +Ô¼ +Ô½ +Ô¾ +Ô¿ +Õ€ +Õ +Õ‚   +Õƒ +Õ„ +Õ… +Õ† +Õ‡ +Õˆ +Õ‰ +ÕŠ +Õ‹   +ÕŒ +Õ +ÕŽ +Õ +Õ +Õ‘ +Õ’ +Õ“ +Õ”   +Õ• +Õ– +
    + +
    Small letters
    + +
    a b g d e z ê ă th +  ž i l x c’ k’ h dz ğ +  č’ m j n š o č p’ dž +  rr s v t’ r c w ph kh +  ew ô f
    +
    +Õ¡ +Õ¢ +Õ£ +Õ¤ +Õ¥ +Õ¦ +Õ§ +Õ¨ +Õ©   +Õª +Õ« +Õ¬ +Õ­ +Õ® +Õ¯ +Õ° +Õ± +Õ²   +Õ³ +Õ´ +Õµ +Õ¶ +Õ· +Õ¸ +Õ¹ +Õº +Õ»   +Õ¼ +Õ½ +Õ¾ +Õ¿ +Ö€ +Ö +Ö‚ +Öƒ +Ö„   +Ö‡ +Ö… +Ö† +
    +
    + +
    + +

    Georgian

    + +
    +
    Mxedruli (Mkhedruli) script
    + +
    a b g d e v z th +  i k’ l m n o p’ ž +  r s t’ u ph kh ğ q’ š +  č c dz c’ č’ x dž h
    +
    +რ+ბ +გ +დ +ე +ვ +ზ +თ   +ი +კ +ლ +მ +ნ +რ+პ +ჟ   +რ +ს +ტ +უ +ფ +ქ +ღ +ყ +შ   +ჩ +ც +ძ +წ +ჭ +ხ +ჯ +ჰ +
    +
    + +
    + +

    Hebrew

    + +
    +
    Hebrew alphabet
    + +
    ’ v g d h w z H T y xx l mm nn s ‘ ff cc q r S ( š ś ) t
    +
      +× ×‘ ×’ ד ×” ו ×– ×— ט ×™ כך ל ×ž× × ×Ÿ ס ×¢ פף צץ ×§ ר ש ( ×©× ×©×‚ ) ת +
    + +
    Letters with dagesh (mappiq)
    + +
    ’ b g d h w z   T y kk l m  n  s   pp c  q r S ( š ś ) t
    +
      +×Ö¼ בּ ×’Ö¼ דּ ×”Ö¼ וּ ×–Ö¼ טּ ×™Ö¼ כּךּ לּ מּ × Ö¼ סּ פּףּ צּ ×§Ö¼ רּ שּ ( ×©Ö¼× ×©Ö¼×‚ ) תּ +
    + +
    Yiddish digraphs
    + +
    ww   wy   yy
    +
      +×° ×± ײ +
    + +
    Letters with rafe
    + +
    v   x   f
    +
      +בֿ   +×›Ö¿   +פֿ
    + +
    Vowels with points
    + +
    a   å   o   u   i   ai
    +
      +×Ö·   +×Ö¸   +וֹ   +וּ   +×™Ö´   +ײַ
    +
    + +
    + +

    Arabic

    + +
    +
    Arabic alphabet
    + +
    ’a a b t þ j H x d ð r z s š S D T Z ‘ ğ f v q k l m n h -t w ÿ y -a
    +
    ـآ Ø¢  + Ù€Ø§ ا  + Ø¨Ù€Ø¨Ù€Ø¨ ب  + ØªÙ€ØªÙ€Øª ت  + Ø«Ù€Ø«Ù€Ø« Ø«  + Ø¬Ù€Ø¬Ù€Ø¬ ج  + Ø­Ù€Ø­Ù€Ø­ Ø­  + Ø®Ù€Ø®Ù€Ø® Ø®  + Ù€Ø¯ د  + Ù€Ø° ذ  + Ù€Ø± ر  + Ù€Ø² ز  + Ø³Ù€Ø³Ù€Ø³ س  + Ø´Ù€Ø´Ù€Ø´ Ø´  + ØµÙ€ØµÙ€Øµ ص  + Ø¶Ù€Ø¶Ù€Ø¶ ض  + Ø·Ù€Ø·Ù€Ø· Ø·  + Ø¸Ù€Ø¸Ù€Ø¸ ظ  + Ø¹Ù€Ø¹Ù€Ø¹ ع  + ØºÙ€ØºÙ€Øº غ  + ÙÙ€ÙÙ€Ù Ù  + Ú¤Ù€Ú¤Ù€Ú¤ Ú¤  + Ù‚ـقـق Ù‚  + ÙƒÙ€ÙƒÙ€Ùƒ Ùƒ  + Ù„ـلـل Ù„  + Ù…ـمـم Ù…  + Ù†Ù€Ù†Ù€Ù† Ù†  + Ù‡Ù€Ù‡Ù€Ù‡ Ù‡  + Ù€Ø© Ø©  + Ù€Ùˆ Ùˆ  + ÙŠÙ€ÙŠÙ€ÙŠ ÙŠ  + ÛŒÙ€ÛŒÙ€ÛŒ ÛŒ  + Ù€Ù‰ Ù‰  +
    + +
    Letters with hamzah  
    + +
    Ø¡  + Ù€Ø¥ Ø¥  + Ù€Ø£ Ø£  + Ù€Ø¤ ؤ  + Ø¦Ù€Ø¦Ù€Ø¦ ئ  +
    + +
    Persian alphabet  
    + +
    ’a a b p t s j c H x d z r z ž s š S Z T Z ‘ ğ f q k g l m n v h y
    +
    ـآ Ø¢  + Ù€Ø§ ا  + Ø¨Ù€Ø¨Ù€Ø¨ ب  + Ù¾Ù€Ù¾Ù€Ù¾ Ù¾  + ØªÙ€ØªÙ€Øª ت  + Ø«Ù€Ø«Ù€Ø« Ø«  + Ø¬Ù€Ø¬Ù€Ø¬ ج  + Ú†Ù€Ú†Ù€Ú† Ú†  + Ø­Ù€Ø­Ù€Ø­ Ø­  + Ø®Ù€Ø®Ù€Ø® Ø®  + Ù€Ø¯ د  + Ù€Ø° ذ  + Ù€Ø± ر  + Ù€Ø² ز  + Ù€Ú˜ Ú˜  + Ø³Ù€Ø³Ù€Ø³ س  + Ø´Ù€Ø´Ù€Ø´ Ø´  + ØµÙ€ØµÙ€Øµ ص  + Ø¶Ù€Ø¶Ù€Ø¶ ض  + Ø·Ù€Ø·Ù€Ø· Ø·  + Ø¸Ù€Ø¸Ù€Ø¸ ظ  + Ø¹Ù€Ø¹Ù€Ø¹ ع  + ØºÙ€ØºÙ€Øº غ  + ÙÙ€ÙÙ€Ù Ù  + Ù‚ـقـق Ù‚  + Ú©Ù€Ú©Ù€Ú© Ú©  + Ú¯Ù€Ú¯Ù€Ú¯ Ú¯  + Ù„ـلـل Ù„  + Ù…ـمـم Ù…  + Ù†Ù€Ù†Ù€Ù† Ù†  + Ù€Ùˆ Ùˆ  + Ù‡Ù€Ù‡Ù€Ù‡ Ù‡  + ÛŒÙ€ÛŒÙ€ÛŒ ÛŒ  +
    + +
    Urdu alphabet  
    + +
    ’a a b p t t. s j c H x d d. z r r. z ž s š S Z T Z ‘ ğ f q k g l m n -n v h h y -e
    +
    ـآ Ø¢  + Ù€Ø§ ا  + Ø¨Ù€Ø¨Ù€Ø¨ ب  + Ù¾Ù€Ù¾Ù€Ù¾ Ù¾  + ØªÙ€ØªÙ€Øª ت  + Ù¹Ù€Ù¹Ù€Ù¹ Ù¹  + Ø«Ù€Ø«Ù€Ø« Ø«  + Ø¬Ù€Ø¬Ù€Ø¬ ج  + Ú†Ù€Ú†Ù€Ú† Ú†  + Ø­Ù€Ø­Ù€Ø­ Ø­  + Ø®Ù€Ø®Ù€Ø® Ø®  + Ù€Ø¯ د  + Ù€Úˆ Úˆ  + Ù€Ø° ذ  + Ù€Ø± ر  + Ù€Ú‘ Ú‘  + Ù€Ø² ز  + Ù€Ú˜ Ú˜  + Ø³Ù€Ø³Ù€Ø³ س  + Ø´Ù€Ø´Ù€Ø´ Ø´  + ØµÙ€ØµÙ€Øµ ص  + Ø¶Ù€Ø¶Ù€Ø¶ ض  + Ø·Ù€Ø·Ù€Ø· Ø·  + Ø¸Ù€Ø¸Ù€Ø¸ ظ  + Ø¹Ù€Ø¹Ù€Ø¹ ع  + ØºÙ€ØºÙ€Øº غ  + ÙÙ€ÙÙ€Ù Ù  + Ù‚ـقـق Ù‚  + Ú©Ù€Ú©Ù€Ú© Ú©  + Ú¯Ù€Ú¯Ù€Ú¯ Ú¯  + Ù„ـلـل Ù„  + Ù…ـمـم Ù…  + Ù†Ù€Ù†Ù€Ù† Ù†  + Ù€Úº Úº  + Ù€Ùˆ Ùˆ  + ÛÙ€ÛÙ€Û Û  + Ú¾Ù€Ú¾Ù€Ú¾ Ú¾  + ÛŒÙ€ÛŒÙ€ÛŒ ÛŒ  + Ù€Û’ Û’  +
    + +
    Arabic-Indic digits  
    + +
    +0 1 2 3 4 5 6 7 8 9 10 11 12
    +
    + 0 1 2 3 4 5 6 7 8 9 10 11 12
    + ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ ١٠ ١١ ١٢
    + Û° Û± Û² Û³ Û´ Ûµ Û¶ Û· Û¸ Û¹ Û±Û° Û±Û± Û±Û² +
    +
    + +
    + +

    Devanagari

    + +
    +
    Sanskrit alphabet
    + +
    a aa i ii u uu   r rr l   e ai o au
    +
    +अ à¤† à¤‡ à¤ˆ à¤‰ à¤Š   +ऋ à¥  à¤Œ   +ठठओ à¤” +
    + +
    kaa ki kii ku kuu   kr krr kl   ke kai ko kau
    +
    +का कि की कॠकू   +कृ à¤•ॄ à¤•ॢ   +के कै को कौ +
    + +
    k kh g gh ng   +c ch j jh ñ   +t. t.h d. d.h n.   +t th d dh n   +p ph b bh m   +y r l. l v   +ś s. s h
    +
    +क à¤– à¤— à¤˜ à¤™   +च à¤› à¤œ à¤ à¤ž   +ट à¤  à¤¡ à¤¢ à¤£   +त à¤¥ à¤¦ à¤§ à¤¨   +प à¤« à¤¬ à¤­ à¤®   +य à¤° à¤³ à¤² à¤µ   +श à¤· à¤¸ à¤¹ +
    + +
    Hindi/Urdu letters with nuqta
    + +
    q x ğ z r. r.h f
    +
    +क़ ख़ ग़ ज़ +ड़ ॠफ़ +
    + +
    Sample conjuncts
    + +
    ks. jñ tt tr rt
    +
    +कà¥à¤· जà¥à¤ž तà¥à¤¤ तà¥à¤° रà¥à¤¤ +
    + +
    Devanagari digits
    + +
    +0 1 2 3 4 5 6 7 8 9 10
    +
    +० १ २ ३ ४ ५ ६ ७ ८ ९ १०
    +
    + +
    + +

    Gujarati

    + +
    +
    Sanskrit alphabet
    + +
    a aa i ii u uu   r rr   e ai o au
    +
    +અ àª† àª‡ àªˆ àª‰ àªŠ   +ઋ à«    +ઠઠઓ àª” +
    + +
    kaa ki kii ku kuu   kr krr   ke kai ko kau
    +
    +કા કિ કી કૠકૂ   +કૃ àª•à«„   +કે કૈ કો કૌ +
    + +
    k kh g gh ng   +c ch j jh ñ   +t. t.h d. d.h n.   +t th d dh n   +p ph b bh m   +y r l. l v   +ś s. s h
    +
    +ક àª– àª— àª˜ àª™   +ચ àª› àªœ àª àªž   +ટ àª  àª¡ àª¢ àª£   +ત àª¥ àª¦ àª§ àª¨   +પ àª« àª¬ àª­ àª®   +ય àª° àª³ àª² àªµ   +શ àª· àª¸ àª¹ +
    + +
    Sample conjuncts
    + +
    ks. jñ tt tr rt
    +
    +કà«àª· જà«àªž તà«àª¤ તà«àª° રà«àª¤ +
    + +
    Gujarati digits
    + +
    +0 1 2 3 4 5 6 7 8 9 10
    +
    +૦ ૧ ૨ ૩ ૪ ૫ ૬ ૭ ૮ ૯ ૧૦
    +
    + +
    + +

    Bengali

    + +
    +
    Sanskrit alphabet
    + +
    a aa i ii u uu   r rr l   e ai o au
    +
    +অ à¦† à¦‡ à¦ˆ à¦‰ à¦Š   +ঋ à§  à¦Œ   +ঠঠও à¦” +
    + +
    kaa ki kii ku kuu   kr krr kl   ke kai ko kau
    +
    +কা কি কী কৠকূ   +কৃ à¦•à§„ à¦•à§¢   +কে কৈ কো কো +
    + +
    k kh g gh ng   +c ch j jh ñ   +t. t.h d. d.h n.   +t th d dh n   +p ph b bh m   +y r l v   +ś s. s h
    +
    +ক à¦– à¦— à¦˜ à¦™   +চ à¦› à¦œ à¦ à¦ž   +ট à¦  à¦¡ à¦¢ à¦£   +ত à¦¥ à¦¦ à¦§ à¦¨   +প à¦« à¦¬ à¦­ à¦®   +য à¦° à¦² à¦¬   +শ à¦· à¦¸ à¦¹ +
    + +
    Letters with nukta & Assamese letters
    + +
    r. r.h y.   r v
    +
    +à§œ à§ à§Ÿ   +à§° à§± +
    + +
    Sample conjuncts
    + +
    ks. jñ tt tr rt
    +
    +কà§à¦· জà§à¦ž তà§à¦¤ তà§à¦° রà§à¦¤ +
    + +
    Bengali digits
    + +
    +0 1 2 3 4 5 6 7 8 9 10
    +
    +০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯ ১০
    +
    + +
    + +

    Gurmukhi

    + +
    +
    Panjabi alphabet
    + +
    a aa i ii u uu   e ai o au
    +
    +ਅ ਆ ਇ ਈ ਉ ਊ   +ਠਠਓ ਔ +
    + +
    kaa ki kii ku kuu   ke kai ko kau
    +
    +ਕਾ ਕਿ ਕੀ ਕ੠ਕੂ   +ਕੇ ਕੈ ਕੋ ਕੌ +
    + +
    k kh g gh ng   +c ch j jh ñ   +t. t.h d. d.h n.   +t th d dh n   +p ph b bh m   +y r l v r.   +s h
    +
    +ਕ à¨– à¨— à¨˜ à¨™   +ਚ à¨› à¨œ à¨ à¨ž   +ਟ à¨  à¨¡ à¨¢ à¨£   +ਤ à¨¥ à¨¦ à¨§ à¨¨   +ਪ à¨« à¨¬ à¨­ à¨®   +ਯ à¨° à¨² à¨µ à©œ   +ਸ à¨¹ +
    + +
    Letters with nukta
    + +
    x ğ z f l. š
    +
    +ਖ਼ ਗ਼ ਜ਼ +ਫ਼ ਲ਼ ਸ਼ +
    + +
    Gurmukhi digits
    + +
    +0 1 2 3 4 5 6 7 8 9 10
    +
    +੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯ ੧੦
    +
    + +
    + +

    Symbols

    + + ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    •bullet
    ¢cent sign
    ©copyright sign
    ¤currency sign
    †dagger
    °degree sign
    ÷division sign
    «double angle quotation mark (guillemet) <<
    »double angle quotation mark (guillemet) >>
    “double quotation mark 66
    â€double quotation mark 99
    „double quotation mark low-99
    …ellipsis
    —em dash
    –en dash
    €euro sign
    ―horizontal bar (quotation dash)
    µmicro sign
    ·middle dot (centered period)
    ·middle dot (centered period, Greek ano teleia)
    ×multiplication sign
    ¬not sign
    â„–numero sign
    ‰per mille (per thousand) sign
    ¶pilcrow (paragraph) sign
    ±plus-minus sign
    £pound sterling sign
    ®registered sign
    §section sign
    ₪sheqel sign
    ‹single angle quotation mark (guillemet) <
    ›single angle quotation mark (guillemet) >
    ‘single quotation mark 6
    ’single quotation mark 9 (apostrophe)
    ¹superscript 1
    ²superscript 2
    ³superscript 3
    â„¢trademark sign
    ¥yen sign
    ØŒArabic comma
    Ù«Arabic decimal separator
    ÙªArabic percent sign
    ØŸArabic question mark
    ؛Arabic semicolon
    Û”Arabic-Urdu full stop (Arabic-Urdu period)
    Ö¾Hebrew hyphen (maqaf)
    ׳Hebrew prime (geresh)
    ×´Hebrew double prime (gershayim)
    ॰Indic abbreviation sign
    ।Indic danda
    ॥Indic double danda
    + +
    + +


    19 February 2010

    + + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/encoding_utf-8_w3.html b/application/third_party/dompdf/www/test/encoding_utf-8_w3.html new file mode 100755 index 00000000..9a10ffce --- /dev/null +++ b/application/third_party/dompdf/www/test/encoding_utf-8_w3.html @@ -0,0 +1,220 @@ + + + + UTF-8 test file + + + +

    Original by Markus Kuhn, adapted for HTML by Martin Dürst.

    +
     
    +UTF-8 encoded sample plain-text file
    +‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
    + 
    +Markus Kuhn [ˈmaʳkÊŠs kuËn] <mkuhn@acm.org> — 1999-08-20
    + 
    + 
    +The ASCII compatible UTF-8 encoding of ISO 10646 and Unicode
    +plain-text files is defined in RFC 2279 and in ISO 10646-1 Annex R.
    + 
    + 
    +Using Unicode/UTF-8, you can write in emails and source code things such as
    + 
    +Mathematics and Sciences:
    + 
    +  ∮ Eâ‹…da = Q,  n → ∞, ∑ f(i) = ∠g(i), ∀x∈â„: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β),
    + 
    +  ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℠⊂ ℂ, ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (A ⇔ B),
    + 
    +  2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm
    + 
    +Linguistics and dictionaries:
    + 
    +  ði ıntəˈnæʃənəl fəˈnɛtık əsoʊsiˈeıʃn
    +  Y [ˈÊpsilÉ”n], Yen [jÉ›n], Yoga [ˈjoËgÉ‘]
    + 
    +APL:
    + 
    +  ((Vâ³V)=â³â´V)/Vâ†,V    ⌷â†â³â†’â´âˆ†âˆ‡âŠƒâ€¾âŽâ•⌈
    + 
    +Nicer typography in plain text files:
    + 
    +  â•”â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•—
    +  â•‘                                          â•‘
    +  ║   • ‘single’ and “double†quotes         ║
    +  â•‘                                          â•‘
    +  ║   • Curly apostrophes: “We’ve been here†║
    +  â•‘                                          â•‘
    +  ║   • Latin-1 apostrophe and accents: '´`  ║
    +  â•‘                                          â•‘
    +  ║   • ‚deutsche‘ „Anführungszeichen“       ║
    +  â•‘                                          â•‘
    +  ║   • †, ‡, ‰, •, 3–4, —, −5/+5, ™, …      ║
    +  â•‘                                          â•‘
    +  ║   • ASCII safety test: 1lI|, 0OD, 8B     ║
    +  ║                      ╭─────────╮         ║
    +  ║   • the euro symbol: │ 14.95 € │         ║
    +  ║                      ╰─────────╯         ║
    +  ╚â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
    + 
    +Greek (in Polytonic):
    + 
    +  The Greek anthem:
    + 
    +  Σὲ γνωÏίζω ἀπὸ τὴν κόψη
    +  τοῦ σπαθιοῦ τὴν Ï„ÏομεÏá½µ,
    +  σὲ γνωÏίζω ἀπὸ τὴν ὄψη
    +  ποὺ μὲ βία μετÏάει τὴ γῆ.
    + 
    +  ᾿Απ᾿ τὰ κόκκαλα βγαλμένη
    +  τῶν ῾Ελλήνων τὰ ἱεÏá½±
    +  καὶ σὰν Ï€Ïῶτα ἀνδÏειωμένη
    +  χαῖÏε, ὦ χαῖÏε, ᾿ΕλευθεÏιά!
    + 
    +  From a speech of Demosthenes in the 4th century BC:
    + 
    +  Οá½Ï‡á½¶ ταá½Ï„á½° παÏίσταταί μοι γιγνώσκειν, ὦ ἄνδÏες ᾿Αθηναῖοι,
    +  ὅταν τ᾿ εἰς τὰ Ï€Ïάγματα ἀποβλέψω καὶ ὅταν Ï€Ïὸς τοὺς
    +  λόγους οὓς ἀκούω· τοὺς μὲν Î³á½°Ï Î»á½¹Î³Î¿Ï…Ï‚ πεÏá½¶ τοῦ
    +  τιμωÏήσασθαι Φίλιππον á½Ïá¿¶ γιγνομένους, τὰ δὲ Ï€Ïάγματ᾿ 
    +  εἰς τοῦτο Ï€Ïοήκοντα,  ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αá½Ï„οὶ
    +  Ï€ÏότεÏον κακῶς σκέψασθαι δέον. οá½Î´á½³Î½ οὖν ἄλλο μοι δοκοῦσιν
    +  οἱ τὰ τοιαῦτα λέγοντες á¼¢ τὴν ὑπόθεσιν, πεÏá½¶ á¼§Ï‚ βουλεύεσθαι,
    +  οá½Ï‡á½¶ τὴν οὖσαν παÏιστάντες ὑμῖν á¼Î¼Î±Ïτάνειν. á¼Î³á½¼ δέ, ὅτι μέν
    +  ποτ᾿ á¼Î¾á¿†Î½ τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον
    +  τιμωÏήσασθαι, καὶ μάλ᾿ ἀκÏιβῶς οἶδα· á¼Ï€á¾¿ á¼Î¼Î¿á¿¦ γάÏ, οὠπάλαι
    +  γέγονεν ταῦτ᾿ ἀμφότεÏα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν
    +  Ï€Ïολαβεῖν ἡμῖν εἶναι τὴν Ï€Ïώτην, ὅπως τοὺς συμμάχους
    +  σώσομεν. á¼á½°Î½ Î³á½°Ï Ï„Î¿á¿¦Ï„Î¿ βεβαίως ὑπάÏξῃ, τότε καὶ πεÏá½¶ τοῦ
    +  τίνα τιμωÏήσεταί τις καὶ ὃν Ï„Ïόπον á¼Î¾á½³ÏƒÏ„αι σκοπεῖν· Ï€Ïὶν δὲ
    +  τὴν á¼€Ïχὴν á½€Ïθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι πεÏá½¶ τῆς
    +  τελευτῆς á½Î½Ï„ινοῦν ποιεῖσθαι λόγον.
    + 
    +  Δημοσθένους, Γ´ ᾿Ολυνθιακὸς
    + 
    +Georgian:
    + 
    +  From a Unicode conference invitation:
    + 
    +  გთხáƒáƒ•თ áƒáƒ®áƒšáƒáƒ•ე გáƒáƒ˜áƒáƒ áƒáƒ— რეგისტრáƒáƒªáƒ˜áƒ Unicode-ის მეáƒáƒ—ე სáƒáƒ”რთáƒáƒ¨áƒáƒ áƒ˜áƒ¡áƒ
    +  კáƒáƒœáƒ¤áƒ”რენციáƒáƒ–ე დáƒáƒ¡áƒáƒ¡áƒ¬áƒ áƒ”ბáƒáƒ“, რáƒáƒ›áƒ”ლიც გáƒáƒ˜áƒ›áƒáƒ áƒ—ებრ10-12 მáƒáƒ áƒ¢áƒ¡,
    +  ქ. მáƒáƒ˜áƒœáƒªáƒ¨áƒ˜, გერმáƒáƒœáƒ˜áƒáƒ¨áƒ˜. კáƒáƒœáƒ¤áƒ”რენცირშეჰკრებს ერთáƒáƒ“ მსáƒáƒ¤áƒšáƒ˜áƒáƒ¡
    +  ექსპერტებს ისეთ დáƒáƒ áƒ’ებში რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ ინტერნეტი დრUnicode-ი,
    +  ინტერნáƒáƒªáƒ˜áƒáƒœáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ დრლáƒáƒ™áƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ, Unicode-ის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ
    +  áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ£áƒš სისტემებსáƒ, დრგáƒáƒ›áƒáƒ§áƒ”ნებით პრáƒáƒ’რáƒáƒ›áƒ”ბში, შრიფტებში,
    +  ტექსტების დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒáƒ¡áƒ დრმრáƒáƒ•áƒáƒšáƒ”ნáƒáƒ•áƒáƒœ კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რულ სისტემებში.
    + 
    +Russian:
    + 
    +  From a Unicode conference invitation:
    + 
    +  ЗарегиÑтрируйтеÑÑŒ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° ДеÑÑтую Международную Конференцию по
    +  Unicode, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑоÑтоитÑÑ 10-12 марта 1997 года в Майнце в Германии.
    +  ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ñоберет широкий круг ÑкÑпертов по  вопроÑам глобального
    +  Интернета и Unicode, локализации и интернационализации, воплощению и
    +  применению Unicode в различных операционных ÑиÑтемах и программных
    +  приложениÑÑ…, шрифтах, верÑтке и многоÑзычных компьютерных ÑиÑтемах.
    + 
    +Thai (UCS Level 2):
    + 
    +  Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese
    +  classic 'San Gua'):
    + 
    +  [----------------------------|------------------------]
    +    ๠à¹à¸œà¹ˆà¸™à¸”ินฮั่นเสื่อมโทรมà¹à¸ªà¸™à¸ªà¸±à¸‡à¹€à¸§à¸Š  พระปà¸à¹€à¸à¸¨à¸à¸­à¸‡à¸šà¸¹à¹Šà¸à¸¹à¹‰à¸‚ึ้นใหม่
    +  สิบสองà¸à¸©à¸±à¸•ริย์à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¹à¸¥à¸–ัดไป       สององค์ไซร้โง่เขลาเบาปัà¸à¸à¸²
    +    ทรงนับถือขันทีเป็นที่พึ่ง           บ้านเมืองจึงวิปริตเป็นนัà¸à¸«à¸™à¸²
    +  โฮจิ๋นเรียà¸à¸—ัพทั่วหัวเมืองมา         หมายจะฆ่ามดชั่วตัวสำคัà¸
    +    เหมือนขับไสไล่เสือจาà¸à¹€à¸„หา      รับหมาป่าเข้ามาเลยอาสัà¸
    +  à¸à¹ˆà¸²à¸¢à¸­à¹‰à¸­à¸‡à¸­à¸¸à¹‰à¸™à¸¢à¸¸à¹à¸¢à¸à¹ƒà¸«à¹‰à¹à¸•à¸à¸à¸±à¸™          ใช้สาวนั้นเป็นชนวนชื่นชวนใจ
    +    พลันลิฉุยà¸à¸¸à¸¢à¸à¸µà¸à¸¥à¸±à¸šà¸à¹ˆà¸­à¹€à¸«à¸•ุ          ช่างอาเพศจริงหนาฟ้าร้องไห้
    +  ต้องรบราฆ่าฟันจนบรรลัย           ฤๅหาใครค้ำชูà¸à¸¹à¹‰à¸šà¸£à¸£à¸¥à¸±à¸‡à¸à¹Œ ฯ
    + 
    +  (The above is a two-column text. If combining characters are handled
    +  correctly, the lines of the second column should be aligned with the
    +  | character above.)
    + 
    +Ethiopian:
    + 
    +  Proverbs in the Amharic language:
    + 
    +  ሰማይ አይታረስ ንጉሥ አይከሰስá¢
    +  ብላ ካለአእንደአባቴ በቆመጠáŠá¢
    +  ጌጥ ያለቤቱ á‰áˆáŒ¥áŠ“ áŠá‹á¢
    +  ደሀ በሕáˆáˆ™ ቅቤ ባይጠጣ ንጣት በገደለá‹á¢
    +  የአá ወለáˆá‰³ በቅቤ አይታሽáˆá¢
    +  አይጥ በበላ ዳዋ ተመታá¢
    +  ሲተረጉሙ ይደረáŒáˆ™á¢
    +  ቀስ በቀስᥠዕንá‰áˆ‹áˆ በእáŒáˆ© ይሄዳáˆá¢
    +  ድር ቢያብር አንበሳ ያስርá¢
    +  ሰዠእንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርáˆá¢
    +  እáŒá‹œáˆ­ የከáˆá‰°á‹áŠ• ጉሮሮ ሳይዘጋዠአይድርáˆá¢
    +  የጎረቤት ሌባᥠቢያዩት ይስቅ ባያዩት ያጠáˆá‰…á¢
    +  ሥራ ከመáታት áˆáŒ„ን ላá‹á‰³á‰µá¢
    +  ዓባይ ማደሪያ የለá‹á¥ áŒáŠ•á‹µ ይዞ ይዞራáˆá¢
    +  የእስላሠአገሩ መካ የአሞራ አገሩ ዋርካá¢
    +  ተንጋሎ ቢተበተመáˆáˆ¶ ባá‰á¢
    +  ወዳጅህ ማር ቢሆን ጨርስህ አትላሰá‹á¢
    +  እáŒáˆ­áˆ…ን በáራሽህ áˆáŠ­ ዘርጋá¢
    + 
    +Runes:
    + 
    +  ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛠᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ áš¹á›áš¦ ᚦᚪ ᚹᛖᛥᚫ
    + 
    +  (Old English, which transcribed into Latin reads 'He cwaeth that he
    +  bude thaem lande northweardum with tha Westsae.' and means 'He said
    +  that he lived in the northern land near the Western Sea.')
    + 
    +Braille:
    + 
    +  ⡌â â §â ‘ â ¼â â ’  â¡â œâ ‡â ‘⠹⠰⠎ ⡣⠕⠌
    + 
    +  â¡â œâ ‡â ‘â ¹ â ºâ â Ž ⠙⠑â â ™â ’ â žâ • ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ â Šâ Ž â â • ⠙⠳⠃⠞
    +  â ±â â žâ ‘â §â » â â ƒâ ³â ž â ¹â â žâ ² ⡹⠑ ⠗⠑⠛⠊⠌⠻ â •â ‹ ⠙⠊⠎ ⠃⠥⠗⠊â â ‡ â ºâ â Ž
    +  â Žâ Šâ ›â â « ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹â â â â ‚ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ â ¥â â ™â »â žâ â …⠻⠂
    +  â â â ™ ⠹⠑ â ¡â Šâ ‘â ‹ â â ³â —â â »â ² ⡎⠊⠗⠕⠕⠛⠑ â Žâ Šâ ›â â « â Šâ žâ ² â¡â â ™
    +  ⡎⠊⠗⠕⠕⠛⠑⠰⠎ â â â â ‘ â ºâ â Ž ⠛⠕⠕⠙ â ¥â â •â  â °â¡¡â â â ›â ‘â ‚ â ‹â •â — â â â ¹â ¹â ”â › ⠙⠑ 
    +  â ¡â •â Žâ ‘ â žâ • â â ¥â ž ⠙⠊⠎ â ™â â â ™ â žâ •â ²
    + 
    +  ⡕⠇⠙ â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ²
    + 
    +  â¡â ”⠙⠖ ⡊ ⠙⠕â â °â ž â â ‘â â  â žâ • â Žâ â ¹ â ¹â â ž ⡊ â …â â ªâ ‚ â •â ‹ â â ¹
    +  â ªâ  â …â â ªâ ‡â «â ›â ‘â ‚ â ±â â ž ⠹⠻⠑ â Šâ Ž â â œâ žâ Šâ Šâ ¥â ‡â œâ ‡â ¹ ⠙⠑â â ™ â â ƒâ ³â ž
    +  â  â ™â •â •â —â ¤â â â Šâ ‡â ² ⡊ â â Šâ £â ž â ™â â §â ‘ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ â â ¹â Žâ ‘⠇⠋⠂ â žâ •
    +  ⠗⠑⠛⠜⠙ â  â Šâ •â ‹â ‹â ”â ¤â â â Šâ ‡ â â Ž ⠹⠑ ⠙⠑â â ™â ‘â Œ â â Šâ ‘â Šâ ‘ â •â ‹ â Šâ —â •â â â •â â ›â »â ¹ 
    +  â ” ⠹⠑ â žâ —â â ™â ‘â ² ⡃⠥⠞ ⠹⠑ â ºâ Šâ Žâ ™â •â  â •â ‹ ⠳⠗ â â â Šâ ‘⠌⠕⠗⠎ 
    +  â Šâ Ž â ” ⠹⠑ â Žâ Šâ â Šâ ‡â ‘â † â â â ™ â â ¹ â ¥â â ™â â ‡â ‡â ªâ « â ™â â â ™â Ž
    +  â ©â â ‡â ‡ â â •â ž ⠙⠊⠌⠥⠗⠃ â Šâ žâ ‚ â •â — ⠹⠑ ⡊⠳â â žâ —⠹⠰⠎ ⠙⠕â â ‘ â ‹â •â —â ² ⡹⠳
    +  ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ â â »â â Šâ ž â â ‘ â žâ • â —â ‘â â ‘â â žâ ‚ â ‘â â â ™â â žâ Šâ Šâ â ‡â ‡â ¹â ‚ â ¹â â ž
    +  â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ²
    + 
    +  (The first couple of paragraphs of "A Christmas Carol" by Dickens)
    + 
    +Compact font selection example text:
    + 
    +  ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789
    +  abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ
    +  –—‘“â€â€žâ€ â€¢â€¦â€°â„¢Å“ŠŸž€ ΑΒΓΔΩαβγδω ÐБВГДабвгд
    +  ∀∂∈â„∧∪≡∞ ↑↗↨↻⇣ â”┼╔╘░►☺♀ ï¬ï¿½â‘€â‚‚ἠḂӥẄÉËâŽ×Ô±áƒ
    + 
    +Greetings in various languages:
    + 
    +  Hello world, ΚαλημέÏα κόσμε, コンニãƒãƒ
    + 
    +Box drawing alignment tests:                                          â–ˆ
    +                                                                      â–‰
    +  â•”â•â•╦â•â•â•—  ┌──┬──┠ ╭──┬──╮  ╭──┬──╮  â”â”â”┳â”â”┓  ┎┒â”┑   â•·  â•» â”┯┓ ┌┰┠   â–Š ╱╲╱╲╳╳╳
    +  ║┌─╨─â”â•‘  │╔â•â•§â•╗│  │╒â•╪â•╕│  │╓─â•─╖│  ┃┌─╂─â”┃  ┗╃╄┙  ╶┼╴╺╋╸┠┼┨ â”╋┥    â–‹ ╲╱╲╱╳╳╳
    +  ║│╲ ╱│║  │║   ║│  ││ │ ││  │║ ┃ ║│  ┃│ â•¿ │┃  â”╅╆┓   ╵  ╹ â”—â”·â”› └┸┘    â–Œ ╱╲╱╲╳╳╳
    +  â• â•¡ ╳ ╞╣  ├╢   ╟┤  ├┼─┼─┼┤  ├╫─╂─╫┤  ┣┿╾┼╼┿┫  ┕┛┖┚     ┌┄┄┠╎ â”┅┅┓ ┋ ■╲╱╲╱╳╳╳
    +  ║│╱ ╲│║  │║   ║│  ││ │ ││  │║ ┃ ║│  ┃│ ╽ │┃  ░░▒▒▓▓██ ┊  ┆ ╎ ╠ ┇ ┋ ▎
    +  ║└─╥─┘║  │╚â•╤â•â•│  │╘â•╪â•╛│  │╙─╀─╜│  ┃└─╂─┘┃  ░░▒▒▓▓██ ┊  ┆ ╎ â•  ┇ ┋ â–
    +  ╚â•â•â•©â•â•â•  └──┴──┘  ╰──┴──╯  ╰──┴──╯  â”—â”â”â”»â”â”â”›           └╌╌┘ ╎ â”—â•â•â”› ┋  â–▂▃▄▅▆▇█
    + 
    +
    + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/image_background.html b/application/third_party/dompdf/www/test/image_background.html new file mode 100755 index 00000000..15b2efd8 --- /dev/null +++ b/application/third_party/dompdf/www/test/image_background.html @@ -0,0 +1,68 @@ + + + + + +

    Lorem ipsum dolor sit amet

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at +odio vitae libero tempus convallis. Cum sociis natoque penatibus et +magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus +mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel, +adipiscing nec, massa. Phasellus vitae felis sed lectus dapibus +facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis +turpis vel magna. Cras eu est. Integer porttitor ligula a +tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis +leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque.

    + +

    Curabitur ut diam eu dui vestibulum pharetra. Nam pellentesque, justo +non hendrerit venenatis, mi orci pretium mi, et vehicula leo arcu quis +diam. Nullam mattis laoreet quam. Morbi mollis sem ut tellus. Nam mi +massa, lobortis eu, sollicitudin et, iaculis et, massa. Maecenas purus +mauris, luctus sit amet, pharetra in, facilisis sit amet, elit. Nullam +vel erat tempus purus molestie suscipit. Vestibulum odio lorem, +sollicitudin non, volutpat sit amet, tincidunt vel, nunc. Nulla quis +ante vestibulum odio feugiat facilisis. Proin lorem nisl, viverra at, +rhoncus quis, semper nec, mi. Donec euismod enim vitae velit. Nulla +sed lectus. Vivamus placerat, lacus sed vehicula sagittis, arcu massa +adipiscing lorem, bibendum luctus nisl tortor vitae leo.

    + +

    Etiam a mauris. Proin justo elit, accumsan sit amet, tempus et, +blandit id, tellus. Morbi varius, nisi id iaculis aliquam, lacus +ligula facilisis velit, ac pharetra ipsum augue a massa. Etiam rhoncus +commodo orci. Mauris ullamcorper sagittis turpis. Nullam magna libero, +sagittis sed, auctor faucibus, accumsan vitae, urna. Pellentesque +volutpat. Aliquam sapien ipsum, eleifend nec, imperdiet vitae, +consectetuer id, quam. Donec a urna. Suspendisse sit amet +velit. Curabitur quis nisi id dui viverra ornare. Sed condimentum enim +quis tortor. Ut condimentum, magna non tempus tincidunt, leo nibh +molestie tellus, vitae convallis dolor ante sed ante. Nunc et +metus. Phasellus ultricies. Fusce faucibus tortor sit amet mauris.

    + +

    Aliquam enim. Duis et diam. Praesent porta, mauris quis pellentesque +volutpat, erat elit vulputate eros, vitae pulvinar augue velit sit +amet sem. Fusce eu urna eu nisi condimentum posuere. Vivamus sed +felis. Duis eget urna vitae eros interdum dignissim. Proin justo eros, +eleifend in, porttitor in, malesuada non, neque. Etiam sed +augue. Nulla sit amet magna. Lorem ipsum dolor sit amet, consectetuer +adipiscing elit. Mauris facilisis. Curabitur massa magna, pulvinar a, +nonummy eget, egestas vitae, mauris. Quisque vel elit sit amet lorem +malesuada facilisis. Vestibulum porta, metus sit amet egestas +interdum, urna justo euismod erat, id tristique urna leo quis +nibh. Morbi non erat.

    + +

    Cras fringilla, nulla id egestas elementum, augue nunc iaculis nibh, +ac adipiscing nibh justo id tortor. Donec vel orci a nisi ultricies +aliquet. Nunc urna quam, adipiscing molestie, vehicula non, +condimentum non, magna. Integer magna. Donec quam metus, pulvinar id, +suscipit eget, euismod ac, orci. Nulla facilisi. Nullam nec +mauris. Morbi in mi. Etiam urna lectus, pulvinar ac, sollicitudin eu, +euismod ac, lectus. Fusce elit. Sed ultricies odio ac felis.

    + + + diff --git a/application/third_party/dompdf/www/test/image_basic.html b/application/third_party/dompdf/www/test/image_basic.html new file mode 100755 index 00000000..30b071b9 --- /dev/null +++ b/application/third_party/dompdf/www/test/image_basic.html @@ -0,0 +1,20 @@ + + + + + + + + +
    + +
    +The PHP 5 HTML to PDF converter +
    + + diff --git a/application/third_party/dompdf/www/test/image_bmp.html b/application/third_party/dompdf/www/test/image_bmp.html new file mode 100755 index 00000000..2a574720 --- /dev/null +++ b/application/third_party/dompdf/www/test/image_bmp.html @@ -0,0 +1,130 @@ + + + + + BMP image test suite + + + + + +

    + This test suite was grabbed from http://wvnvaxa.wvnet.edu/vmswww/bmp.html. +

    + +

    Not every BMP format is supported but the most used is the 24 bit format

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    BMPPNG
    1 bit (2 color)
    4 bit
    8 bit
    16 bit
    24 bit
    32 bit
    4 bit compressed
    8 bit compressed
    16 bit 555 bitfield
    16 bit 565 bitfield
    32 bit 888 bitfield
    32 bit 888 bitfield version 4
    32 bit version 5
    32 bit transparent version 4
    + +

    +Note that as of December 2005, Mozilla and Internet Explorer +do not support transparent BMP images. +

    + +

    +The images (except for the last three and the OS/2 version 2 image) +are from Jason Summer's BMP Suite. +

    + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/image_datauri.html b/application/third_party/dompdf/www/test/image_datauri.html new file mode 100755 index 00000000..513c4e1d --- /dev/null +++ b/application/third_party/dompdf/www/test/image_datauri.html @@ -0,0 +1,35 @@ + + + + + + + +

    + Embedded <img> :
    + +

    + +

    + Normal <img> :
    + +

    + +

    + Embedded background image +

    + +

    + Normal background image +

    + + + + diff --git a/application/third_party/dompdf/www/test/image_gif.html b/application/third_party/dompdf/www/test/image_gif.html new file mode 100755 index 00000000..52845b7a --- /dev/null +++ b/application/third_party/dompdf/www/test/image_gif.html @@ -0,0 +1,9 @@ + + + + + + + +

    + diff --git a/application/third_party/dompdf/www/test/image_remote.html b/application/third_party/dompdf/www/test/image_remote.html new file mode 100755 index 00000000..c3ac5f72 --- /dev/null +++ b/application/third_party/dompdf/www/test/image_remote.html @@ -0,0 +1,21 @@ + + + + + + + +
    +

    Remote CSS & Image Test

    +

    CSS: http://dompdf.googlecode.com/svn/trunk/dompdf/www/style.css

    +

    Testing remote image:

    +

    Note: DOMPDF_ENABLE_REMOTE must be enabled for this test to work.

    +
    + + diff --git a/application/third_party/dompdf/www/test/image_transparent_gif.html b/application/third_party/dompdf/www/test/image_transparent_gif.html new file mode 100755 index 00000000..145d687b --- /dev/null +++ b/application/third_party/dompdf/www/test/image_transparent_gif.html @@ -0,0 +1,23 @@ + + + + + + + + + +
    + +
    + +
    + +
    + + diff --git a/application/third_party/dompdf/www/test/image_transparent_png.html b/application/third_party/dompdf/www/test/image_transparent_png.html new file mode 100755 index 00000000..686f5548 --- /dev/null +++ b/application/third_party/dompdf/www/test/image_transparent_png.html @@ -0,0 +1,189 @@ + + + + + PNG transparency test + + + + + +

    PNG transparency test

    + +Examples from http://entropymine.com/jason/testbed/pngtrans/ + +

    +Not all possible results are shown; there are too many combinations +of background colors and shapes of the opaque region. However, I +intend to include every result that actually occurs in a mainstream +browser. If I am missing any, please +let me know. + +

    It's come to my attention that my images which show how +alpha transparency should look are not quite perfect +in regard to precisely how transparent they are at various points. +Rather than try to modify this page to test gamma +correction issues as well, I've created a +separate test page for that. + +

    +This test page was constructed by +Jason Summers. +Comments may be emailed to jason1@pobox.com.
    +There are +other test +pages listed at the PNG web site. + + + + + +

    + +

    Alpha and palette transparency

    + +

    Expected result:
    +[Test image] +

    + +

    (T1) 8-bit palette, includes background color:
    +[Test image] +

    + +

    (T2) 8-bit palette, no background color:
    +[Test image] +

    + +

    (T3) 32-bit RGBA, includes background color:
    +[Test image] +

    + +

    (T4) 32-bit RGBA, no background color:
    +[Test image] +

    + +

    (T5) 64-bit RGBA, includes background color:
    +[Test image] +

    + +

    (T6) 64-bit RGBA, no background color:
    +[Test image] +

    + +

    RGB binary transparency

    + +

    Expected result:
    +[Test image] +

    + +

    (T7) 24-bit RGB, binary transparency, includes background color:
    +[Test image] +

    + +

    (T8) 24-bit RGB, binary transparency, no background color:
    +[Test image] +

    + +

    (T9) 48-bit RGB, binary transparency, includes background color:
    +[Test image] +

    + +

    (T10) 48-bit RGB, binary transparency, no background color:
    +[Test image] +

    + + +

    Grayscale alpha transparency

    + +

    Expected result:
    +[Test image] +

    + +

    (G1) 16 bpp grayscale (8 gray + 8 alpha), includes background color:
    +[Test image] +

    + +

    (G2) 16 bpp grayscale (8 gray + 8 alpha), no background color:
    +[Test image] +

    + +

    (G3) 32 bpp grayscale (16 gray + 16 alpha), includes background color:
    +[Test image] +

    + +

    (G4) 32 bpp grayscale (16 gray + 16 alpha), no background color:
    +[Test image] + + +

    Grayscale binary transparency

    + +

    Expected result:
    +[Test image] +

    + +

    (G5) 8 bpp grayscale (8 gray), includes background color:
    +[Test image] +

    + +

    (G6) 8 bpp grayscale (8 gray), no background color:
    +[Test image] +

    + +

    (G7) 16 bpp grayscale (16 gray), includes background color:
    +[Test image] +

    + +

    (G8) 16 bpp grayscale (16 gray), no background color:
    +[Test image] + +

    Miscellaneous

    + +

    (M1) 8-bit palette, no transparency, includes background color:
    +Expected result:
    +[Test image]
    +[Test image] +

    + +

    (M2) (4-bit) palette, binary transparency only, no background color:
    +Expected result:
    +[Test image]
    +[Test image]
    +(This tests a few things that may have slipped through the cracks.) +

    + + \ No newline at end of file diff --git a/application/third_party/dompdf/www/test/image_variants.html b/application/third_party/dompdf/www/test/image_variants.html new file mode 100755 index 00000000..04ecc492 --- /dev/null +++ b/application/third_party/dompdf/www/test/image_variants.html @@ -0,0 +1,149 @@ + + + + + + + + +
    + +

    40% of box width:

    +
    + +
    + +

    multiple identical images jpg:

    + + + + +

    multiple identical images gif (will be recoded to png by dompdf):

    + + + + +

    multiple identical images png:

    + + + + +

    local png image with alpha channel:

    + + +

    Attention!

    + +

    For external images to work, the following configuration is required:

    +
    dompdf_config.inc.php :
    + +
    define("DOMPDF_ENABLE_REMOTE", true);
    + +

    external png Image with alpha channel:

    + + +

    external image, dynamically created with id in url parameter at end of parameter(.jpg):

    + + +

    external image, dynamically created with id in url parameter not at end of parameter (.jpg):

    + + +

    external Image without file extension (.gif):

    + + +

    Background images

    +
    + + + + + + +
    +

    paragraph link no-repeat position:default

    +

    paragraph text no-repeat position:left-top; more text text more text text bla bla sdfjkhs sdfsjksdfks sdfkjsfsf skjfh ksjdfhsd

    +

    paragraph text no-repeat position:left-center; more text text more text text bla bla sdfjkhs sdfsjksdfks sdfkjsfsf skjfh ksjdfhsd

    +

    +The PHP 5 HTML to PDF converter +

    + +
    + + diff --git a/application/third_party/dompdf/www/test/images/bmp/test1.bmp b/application/third_party/dompdf/www/test/images/bmp/test1.bmp new file mode 100755 index 0000000000000000000000000000000000000000..a720347642fb2fd1f3e93ed731f6956fbf431978 GIT binary patch literal 1086 zcmeHGF%H5o40Hj}4I~}_O9i|lMBVuVPe5JDMEkTpg(omFpcvOq-M9-oB2^+ez1+nY zyF9xE@Nl#qX*M)H&5S-C@xKJJqW9p@1LW9c_=M&SJA^#I8rwNO0AFyTAn@)83A~#^ z;z5PPg99YtW=O)#5G#+JmB+TflyXzhUuxj)gD>(hrY0<7YLO+)9y>_6NoY2aUryv# zVw>J@E4C?%Q)dNoS7!whtb7(y^9d4c_W$=$XQdE+?|tBAYWz@LO^p|u%g~!_#lG^U R#flP4i`BKQAnJb8KOd6I`z!ze literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test1.png b/application/third_party/dompdf/www/test/images/bmp/test1.png new file mode 100755 index 0000000000000000000000000000000000000000..3cdc49815fe7d69106581c051cede54930dc11b8 GIT binary patch literal 642 zcmeAS@N?(olHy`uVBq!ia0vp^^+4>v!3HFaC$7i_QY^(zo*^7SP{WbZ0pxQQctjR6 zFmMZjFyp1Wb$@_@VkNE-CC){ui6xo&c?uz!xv2~W=K4TnXb`{cf*4SR3`j+Aep*R+ zVo@rCV@iHfs)Ac)QEGX9QFgI{bFc~9rppT$7#MGPx;TbZ%z1k|c2bjpgiByTYT{EJ z-ucVsXsBem9jkdc+kDl5NzuJFk^>e?#`R-=qEc08}KJ&j);OKid=l!2ckq!)9$`62wr}Y1s z&+Fx0%eta3LD+1Pas89L|6fnD&tgblp8K4gqiM1ATlc!>js+#p|IGSt#m3#Y_|2d0 z0~tW2i{Jj?K49YO?0duGoROD+%-zU$Y?~S{PyKB3mYpA{@29DK0Z_DZ|3hvm7WeYL z_urV=4qlx5Eqs@FRHdx6wKI_>F}d nliyspVOW;&M#7pV(l!h|a#L8$>i9)~se!@M)z4*}Q$iB}ioh7* literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test16.bmp b/application/third_party/dompdf/www/test/images/bmp/test16.bmp new file mode 100755 index 0000000000000000000000000000000000000000..a5a3195cc08e48c2011e12a94e9da7ddc91aff6f GIT binary patch literal 16438 zcmdtpc{D5c|3B~`7zBf05X&GK1cP7@%ODs8gJ2NLAQ%LL+-vToOS^#ag&S#up9?qkAI^HsGmAB3V+z>ayjd9bvt+=hZ+1x;P z)SYx^-3{(0cZ<8-9rD0DC=brV=wbG-dN@3sKb`LmcnJ8Qr_c-X76EZSiM}a*>4Gf( z+<=0>Vz4ZzGPowBUf2}c8rBis4fRC~Mvg>{i>9JyW46Wa;PK-4Wk8?c9Pk$5Gteg@ z9vmkwL;57=ptne$!9J1k@HlxH(Wf|vyhZs8^@)l{$EnMhKFvAoE!tzyV`f1Vc+dyKe-N0J|E`ee44N0FY{OV>wLfy@gzJMPrc`g=bER@ z6ZAs8NH5mQ;AQf%c-fs5W8RcE=WX;hdt1F7-f=vb9}gr55<#&r2}%~F#36~PDQW5H zS(4n0g3RKqGPE+gCZ|5PN!ps%k>6d=hYc2v6pa^8$!1HomF{qJ&X)uIf^)%Jh0j8t ziripWT#och&P8vPK8t-SbHibIInl2;m%LT^EcL0%jfU0bOuyz__Ezn)+@~)6pRIoH zmhzvye!~yI01nWA4p;_Ofpq}zL3{`w#z*h7;rZ&SP)WKF57_s{hUCw~l{v`VGGT7T^L}pc5<$Rt4(< zz#s7^{270}|BC;bzs(;EKm*7CHoy>I3a|v&1E4@GkP74ije+JsYoH^rkJry10BFG= zI3yf~)S{8N(ZsP7CVf0>B6qStQ#@5RT{%<3*3UN0wa#~FySMdiA6yvW#&=BZoL$_u zw8Mj!z^`!5pAX(Hd>;B-8jSNJFe-zw(q*Z>ql-FH%{F+d(*a?ckp?M{7PWZIe&-n z1?USAA5IikB7+hgdWZA{>Xr4^}b z_DNl{U+S6z($nMI|F)Fh)xPfx`+gVu$#ro0g|HA8(n6hZS-2`(7XqP3C=tqp>O)sT z*FtTfU>F)khOuFWFjJT%%pL}XW8qXd7j6tUhg-uP;kWQ^<=+O}F1Q0+7TyWnCAvHA zp2T}o?n}QvYbAGI!T#a{Wd|!CsClsdp(a!7!yS)wKic=$;Nv4tj6XSLo_%WD(>pwQ zVty4cB)Gsi|049I$P*TetB@hd1?aN$MeIwNCoYy(5kra#$Yte=)R!txTCA>OhBOzj z%i0&YFJ1aSTm8W;ktruL=X{7gg#;=VlBcJ0Y;*cWF#AD zh%`l7BJGh-6c$BAaZ$!7bCfm85%mo3S^jgt^MV(^7lo_POQM(KUP*j4<+b$Jv);&E zD>zhqxa>&f(V92w-)efh)za}!_q%=X4Zc6}!T5($AI(~~eZ0eqm&BI?!-5OJJDu}i ziM-$>u^bteT!`K&UB$kVdErTNIWerbki1j5N`0mBqLb8eW>|9}d#84l`|4Exo6&C_ z|K{`?ei1CfMYKpKS{AK})=(T8DG#G=%kTGnGA;uJAiLu8(u~;k> z%f%XF&9T;4N9-rOPx+q#p9{VKzZ8B2t&6^n`zG<*l<(5N&-x+v#{ygNv9jZpCu)AG z|GDXx)?Yj9-M{tyKKRGTpW}Z`{XP57HpdQcUNXNLPzx>s?-IV`ocD&4#np&fauIr$ z^d)Rv=8Y%Is|mH@BJwWfOVql`n@(0&GiuF6>|NTIxb==+o{>|$*{Bdv`9!JON z;+Er9C4#HG5}AJ*AOF$i^;o{FH>Ku z06Ilo!;EMyX7AR%%zeGIhPmbt=98l_F7}h_;PfZLiFhKN zs7qWwu!+cG>J@NlMG3wBukRr`4S&Xrjog2W3oBfn(Ro9 zbAvtOeG>c=gT$dp5y{ahFd|Mx(j@7qM4EwR%CgGQs_fdFhTLXpTV7{=PeDI6R5)5R zQ9Lc1E7@MU(}#!fYk^V0CEz{6SD>HU6j>v0?QN<Ul~*tDvzj+u7PXC z1X3rdM;oLHtWnlf-dsi2wluUhx3wud+j~0tJBO&zu8HpHo;lU_-krX@R6YTW2`&Zi z6}}36EAoX?o%3UoOVN9!uVUZIeDPE{L5wLbCGS2M={>|w({ONEyo=&Ih(wEa$)7R4h2_hjRj6^S4k*rB<5-)$@KFv?BrnBFw+!_y)fdU=!@Y?#FrwMN%ZJ0>27R~Y;XDHRaewr*KoDwEgCt0$w`59vBzs!TW`;L*I)8aJsl28F$X#FMS>RUM9fP<@Ln4LQmeW ze4YAUC7{#Q^~|_N&)%tCUea(nQM;ATysKpdYt>;mh!vWkDXyZ?qWZ=4o-hA zoQvnuxw_ot+|}ImTtJFQ2`MAhJKtAXliH+U9-2qyv3Z6(Q=TQyo(JV)`BXlaZ_GF6 zTk{?Hx47Nvd7IDe{&xf|hu#@+SM=TRJ>q+j`y}_HE7E<~e%XQYgH;dIKG^V3v#IUj z&PRG4?SE|O@zEzHo}4z%J+=Mmo&G!tzX6yK>;hMWZ$LkY{9%c>0hy5Oa?Zbj{UGzl zCGrMhLa~cnQNBU_pz^0B>IP;)vx{BPzQO(A(*N1&f7(+1v)6C<3*Z90fG*G#EElX6 ztQP9G~(U)DAZEJO>*LblLQXezW6+6$o~tcWV&ii}0(B5RSO=oz{zq8=o*`EdlZxHsKIIzq zqbh*TP%D^8&2Dy|c8&Y-RR5dNZyo>U^c((SxEL>{i*?1z#jC~Z#efWv5i&-mm#xUw zoYz*c1T7&;*b+mDsl-xZFM&$2QmT|IHI|x7t)-6APuxEB{LJTb|1W~R4E-u%J^E|- z8}YZucarbXAEZBGHrcWA<5eeWe`@%-`Ioj|JMBHc_5VKf$LOCEe@*{A_s@36&Olx! zzY)*~_JI3^haj6M5Y7}gA{xmabieeFb3PEyls6I@#U66M@(^WH1=5-7Mnl`WU8maUfoO za61lFU=>saS7EF$S6C|?6+Cx0FLz&$0DiD%m{+8C3=r>=e2?2@0;;^L1gV)eC zx|-#h)tdDhpcbhmYMEMn?Mm%ht*sU$P=X{_!a$e^3t=aqI;@VWd5Xfuk|w-aP7*DOR*;!3{c`a28BssQP>qwBi2YYa*f7DbECD<(b(tS?=|2{2Mh)eg$+llV@Bdflg3h+ zjPdM=yvagM$rL^ z`biW5=ZISnR&pi!p!7}bCs_!dBX4oeUr9cwe3SY~6+-8zTNqYzCHtWEP41_S{x_@N z8vf1eH~dX-6W&BO>6(_CR-4wFfM%qbXl9!A%`44o&9-KcL`jllNdsvjEu@`y$ca@XX@U6U(6Jx*=N{uT>Tk%%9RoA-Qy4t$l3bY|@L>tqlZ(C_wYqPb1N>oWIS*1Z~ zQd*RDCDe|!Q|(;4vEAHmZFjWa;(n{wZN9e$+!4GSc4y>WF?Yw`lXP$DeHr&>ujK73 z++T74KPZ2Icu?^WX;MB+J)(Ma;IZMy$DWvca>hLW)WXw?p*$(S4VV*L1)79!L%)bZ zVX3$cnUh?Fnxt=IzsN#ysl1JtQ(Wbof1CP66-rChZOokJD%PZZoBPG3|FhLgx0L_v z^&9>UxC8H?J9Hh(9jhJd9Y812Npv!u`p%WkwN6_nNTC!-v6O)_Q5MQhL0woE)x~ug zyUbnIE=Sih?$3HX=lguX3&Agjtwz2S^K$$vNw229mhpP_8+mJmhe{6PN90F|Hx+M@ zZ!0a-JF0gF-Wz^@?1RY?X?fqB8z;KM=-^s6Wg&J!zQ8Q*9BkoRMut>hSfTz-Q1N%1rJi}F{>uKI1@_u)Ur z{+#@4=I{A`795M=ynKE;pcPyLJ|cVvvWvpud~rLXm0W{9B7Fz5%fj(|c{`z1Tthyh ze8)K-PUoxJ8Lj3T_7UwnoPDGJ&FZ&?fAjhce;?e3_tAa2zU98vzV$w!AL%FhnSOo$ zO8;8Ftsfjf2gm_-z%XDMungD-AR417nxl=hnYPjnn&;u>?e6Ch$Pe)h_lok41rmIc zebf9h1v&ot0Y!nOU`0@Ma9v2FuqCuTtSh`1q9fFiOq52%Mr&iZ*d>Tp!0!OI39bbn z6}}7oCW7DsaR;(ZaxMC(^j+*X8H5+eJBV$HYsp8I?^3_1Ai6-^!EDo9%RZ`om-}sr zbiO({JuQT5S_#)UH@DN`-2b+e-__o7hQ0MP`M;~+^bf*=_#i!~8(bb-9b6v-hL9m* zh#ArktqiRV*@nPjbeJ4whYiD~Vau?67*bBjEOsu?UL)z$E5FJzsn+UOx{UsS6oLvrhJe3T@~S+?_{=Xu45n5 zzQ_IU(*N1&mBd!^pS^y=KLU^7BlL)FWO-zDWPJn}MMjBHW>i1AGP*Wu8wJPEF>;I@ zGmM$WEMxXDh`|_&;TR)hW~_{ZDf1}z#{DV+D?_TnDeNIEZqNuU7 zsiL`>tZQj(ZE0&)cD46*(4A_E>C$wwJz5plyA;VQ(R%h?_+<+BJn~wMJy<;Cm&b7PyL~aqzj$%3!3ZM$F=Wsf1K)nGy1LL-<*EKKMs%M zW z$`7bNRZ(=2y309#1N(&b1Mbg_{x_@N8vf1eH~drZ6h1{y>86&aR;SjdfN5l!m}aK+ z(<{?!)3#}F2Av^i*cro&X~r^RpMhA6rC5$NvS!xGI@ohO&hE4RVtFNfLveD3TRr}Rl*YsXXU#GsFxj|!OZ`9tz-Ml2? z74y4+9Refxr0_%NFOdi?7Iz~%Bu4Z}>4(@~G7(-Z?Ido`Y<#H2)c$bSBfXE(kEtJLp3pqWnzc`HPcKFD zWc(grr{G4=Ec^)iTNDk;#68GP$&IL4`VscGEE<=|dx)Ki8%eYBBkFHeG%Zv2FgrCj zI_E#){&wmAZ1vhR{3o^l9{*X9laKye{AaH})Bhj!zt4kH{V$LU?1Evzv|w4VFF+i| zQ5?q^IWuSF9NaS=&w4-S_k7?BAuoonM!gjKa>6Ugucp10`FhS9`D;aoN)J~YsXkiw zX5(8eZ?{{z-sydpeoy^A^MU3=_9Ly8`*R_Y&B3|*pDF^ig;*r%NH|D5W7Gx{_Ar+0ty{{Mac{}=c- zr~lV~=I{NPkI_YPkzF(_niegK_C;t3TcVb@CF7EL$?CjbeB$w`_h){e2YwOqW%yT7 z>#<)ae3Sfb+IN}X=lqcWW09@&SjF+`6Lmi|{@n6Q`>$R0-rwlo)qgO5YW`yX*8ame zmSTCO{9a&5a5MO{@MFj!iiJzXy~vW}X7p+4$CyJFi-t3 jOPZV6r?nqD=TBbyH>>|o|Nr*>|2zM0_itW*(*J(|%(#k? literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test16.png b/application/third_party/dompdf/www/test/images/bmp/test16.png new file mode 100755 index 0000000000000000000000000000000000000000..32a1cb30eece414e46c3de8a0f2383f2edce0679 GIT binary patch literal 717 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 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test16bf555.png b/application/third_party/dompdf/www/test/images/bmp/test16bf555.png new file mode 100755 index 0000000000000000000000000000000000000000..32a1cb30eece414e46c3de8a0f2383f2edce0679 GIT binary patch literal 717 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 V|E>Gh_r3qez~CtOe_cQ1|34BcUDW^p literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test16bf565.png b/application/third_party/dompdf/www/test/images/bmp/test16bf565.png new file mode 100755 index 0000000000000000000000000000000000000000..6223790718989cb68c3d142018c90ca166cb7ff0 GIT binary patch literal 790 zcmeAS@N?(olHy`uVBq!ia0vp^^+4>v!3HFaC$7i_QY^(zo*^7SP{WbZ0pxQQctjR6 zFmMZjFyp1Wb$@_@VkNE-CC){ui6xo&c?uz!xv2~W=K4TnXb`{cf*4SR3`j+Aep*R+ zVo@rCV@iHfs)Ac)QEGX9QFgI{bFc~9rppT$7?|=rT^vIy=DeL9n0LrPz~y+5-K5pw zdzs>GWBM6{JYM>1OgzY`a&xY)&H7bW1a3*4=efq^%XA@G_3w4_3)>EtoB!I$y6cVA z?)kG?%D!A(SiILyGdj|KINCe^(!$Qp5d*_rf2h z$%}8?S<#l4=QFcWuP!Br_rjd%YqP9hJSr}KP&8Zk!a0Vc#`k%5{SbU0v0&l+ijt2n ztqmUJGpO2&>|+b~bn|3=)!#ZG!}(D%gX;Xbf0Vv~ILX-z|K`-E>MQ)3lb;S$%Ob=4 z;tYTBv)|GVC;3~~Gft@~`(!`w^LFEgN%BJS%o;!6JQ3e$4&+EhGk^UbyA#pl~Tf1bqp;`wezaeF1dzcs4!_c61| z{QBuVZL4OCqT8& oTznQPICsH&2axf{uQAkHcx}kJHOVy&m_ivmUHx3vIVCg!02cOlJOBUy literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test24.bmp b/application/third_party/dompdf/www/test/images/bmp/test24.bmp new file mode 100755 index 0000000000000000000000000000000000000000..d6d9e6afabf523095848f67e8457b0f1e4d57747 GIT binary patch literal 24630 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 VH-HJ?9pDGRPk_Gw{su6>{{!$B+m!$S literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test24.png b/application/third_party/dompdf/www/test/images/bmp/test24.png new file mode 100755 index 0000000000000000000000000000000000000000..46211a8ca743619a0155efae9f41c869cc830e7a GIT binary patch literal 533 zcmeAS@N?(olHy`uVBq!ia0vp^^+4>v!3HFaC$7i_QY^(zo*^7SP{WbZ0pxQQctjR6 zFmMZjFyp1Wb$@_@VkNE-CC){ui6xo&c?uz!xv2~W=K4TnXb`{cf*4SR3`j+Aep*R+ zVo@rCV@iHfs)Ac)QEGX9QFgI{bFc~9rppT$7#MRsT^vIy=DfY0>vh;c#O+~uNsG?j z-yht!KXu}ItbbcT>D7`7=I3{WGHy+=eB!x3YSP5!;@vTmQfJ<(iVv!KU2FDN^Y+(Y z^Oj7_vGqJw@nie7e|ze!OP2^jjtc1f&uMgILCl+T=SzSQ#Ng@b=d#Wzp$P!qW7ft1 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test32.bmp b/application/third_party/dompdf/www/test/images/bmp/test32.bmp new file mode 100755 index 0000000000000000000000000000000000000000..9524f765baa549382bbab2b9d4b2108c9f416d58 GIT binary patch literal 32566 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 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test32bf.bmp b/application/third_party/dompdf/www/test/images/bmp/test32bf.bmp new file mode 100755 index 0000000000000000000000000000000000000000..0f41534e14e337a9c86e063141a09b3ef4f91e5c GIT binary patch literal 32578 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 H|F`}p=egeV literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test32bf.png b/application/third_party/dompdf/www/test/images/bmp/test32bf.png new file mode 100755 index 0000000000000000000000000000000000000000..46211a8ca743619a0155efae9f41c869cc830e7a GIT binary patch literal 533 zcmeAS@N?(olHy`uVBq!ia0vp^^+4>v!3HFaC$7i_QY^(zo*^7SP{WbZ0pxQQctjR6 zFmMZjFyp1Wb$@_@VkNE-CC){ui6xo&c?uz!xv2~W=K4TnXb`{cf*4SR3`j+Aep*R+ zVo@rCV@iHfs)Ac)QEGX9QFgI{bFc~9rppT$7#MRsT^vIy=DfY0>vh;c#O+~uNsG?j z-yht!KXu}ItbbcT>D7`7=I3{WGHy+=eB!x3YSP5!;@vTmQfJ<(iVv!KU2FDN^Y+(Y z^Oj7_vGqJw@nie7e|ze!OP2^jjtc1f&uMgILCl+T=SzSQ#Ng@b=d#Wzp$P!qW7ft1 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test32bfv4.bmp b/application/third_party/dompdf/www/test/images/bmp/test32bfv4.bmp new file mode 100755 index 0000000000000000000000000000000000000000..37060373ede2b8908ef5a2cfad9c06a7c2727c8a GIT binary patch literal 232874 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
    Y91F!!CIK4GWXB-lsqLNbco%xBkQDjvAeTh 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

    |nQNV?1D6KmQ;4vXe|0VDDt=`DFgV18(-NoO?1J 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 M2Ob^xEOp@j0eus$0{{R3 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test32bfv4.png b/application/third_party/dompdf/www/test/images/bmp/test32bfv4.png new file mode 100755 index 0000000000000000000000000000000000000000..0525bc743b9e06c3095c829196db44a12c2a0a9c GIT binary patch literal 126387 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

    Rw|K6D0HM5o18@2MMiUy&E-`@-a*xT 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 U_SKoV{{R3007*qoM6N<$f^cCRhyVZp literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test32v5.bmp b/application/third_party/dompdf/www/test/images/bmp/test32v5.bmp new file mode 100755 index 0000000000000000000000000000000000000000..8ad3cfa60d13f53371ebbdbff4567398a9073956 GIT binary patch literal 174858 zcmeF)eXO77Ss(C|ICHZyu)V>QxSm8LHVO=~N@Ei$h!=s>KPY4E7DhH2s}@w#fjIQg z1$K(e*0aXVPMIrtQ3M&(lq7ha8LY}kL#qL)58B2eY7paPnx|_1X98`KHCfuwvd{PW z{(etR)1-CYy8RJ!_vU)8`+C2x>w50zd49+FmN&ol!#8f^|L*s{cl+PFZrIp($p61# z;}-MA#*h8;8#jL73pVC|gP7^*jg5|6J&k4gzw3cReDlIl;N5Tfi?5DXBk*bjUX8#j z5rK_YLg=e9UyZ=45qLEMBJgT|dG+}A`G~;Afh&LE_NTw|d;Y`y|Lm9k!Re1}+7t2jw`0Ip! z`Ct2uANi3>_uTvIbeUl!I=BVDAL!Du+9fmmez=S!TciOx;Hg7jU62JJzy3S_n9DGn zGHMk}fqU+}h|(p?&0sWThXKO?kXhv#44}?}0VM;tEL{9+4u1;L5U2>eGx4lnE*Ez` z55WHy{e{ne?z`SEnug>^>KM|<7(n&_x&-cJ$v*9JNxMV43w?6Y<+4=aE<3uk5Depr z<Oe(Vn$&^lEa$Y+uY;l3q4lsj&^x<-u!3 zhOFb5mk+~Yi*YUZ3S3{dZV6cdO9CJ`d_G9LO@ocS*L}$!HHBi{pRcL zOkS>&8;#8NIweraJPFvD2wi~w=TnnJ1PyJB{>;J}sYWn?L9SVa|6g3gr# zE?HF|hN(RzD?1Ee``-Uig3@3igbfQNpqC3?xHJ^_1w&L}fMF{gZJyN;Uf#=Bw!i2p z%*|b5-8ky){-88!W+7W(Kw;r1yeu^Zml<9h32cro`-&h-N3U91!N;DFN$mcmMN7pl zmcV0Q4A>9AFI>gLbigkX%II*$+I6Jf<&h0wgN^jDkjOiws+q2gF zD}AtV$*`A&sOf8TQK1vXjP+>cwlN%@U__)q^rvefJCzZC5CDA977tGVE9GUoS5Jn%;4uC z)KbqcJrl8+8TAW+8-Gjn*2^fJOUW0q%yWV*5V3PcsOnrE+6|**1s}N>d=CzD1ONvk#mC_6 zVsD{KVH~{H!&ElaU47X1J5o2{joPpP@oVTAkfm`az#L5C@0`LGd*WA5J*v?OZcJi% zdB5rF&#nXt!jX${YHbg=yfD%|@DOmP*-rvX!czGTkE&&!IEqJ5!_ZeRyqz@%KcTCN z%o}?l>+!0=oUJ62*;ovlXdo*P3DZYb?PJ|dg6vtTU1pg9?o~7AB&ExMyY=P0^>Rc( zRx;wl=PNwNx7j`kNr=)FLnZ}}xbYkePrI!s5hOm-l>o(G#|#ceX$2MlqZuzEA3R@?U_!jHXO0Yd|2WiDlmtBOclfOZE< z%A4xiSpZGQZh2=fm)-#bƓ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 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test32v5.png b/application/third_party/dompdf/www/test/images/bmp/test32v5.png new file mode 100755 index 0000000000000000000000000000000000000000..659164e8ee577cfc89940dac73fd40dd252571a0 GIT binary patch literal 115023 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 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test4.bmp b/application/third_party/dompdf/www/test/images/bmp/test4.bmp new file mode 100755 index 0000000000000000000000000000000000000000..a064f66a72b23761f16eabf88455df0c9ea8f582 GIT binary patch literal 4214 zcmeH~u?>Py6h)uG#8x*jRF))v0b*<|S%DFtl+qPkffZ;Nz!hA<74V`MbFY;^WAYAp z-#o~P{LB9&?2pCTo)j2&s1qthEo_Mq4A)=HXUww9>bkbB>u@qfRj3w)KE+RkYEj>< z9fU@>3V}&PKZxFleq}wlF9CXfoPe(%PGIi+gLemk_Xu$lVrEM+8j{h7eq%j$Ujp>} zI00WjoWR`sCl@ZlUDz;d(R0x+qTgBHxGw>Eew=`>A5LKI{Zk5O0pAn^z9I_y-oGVLh=L^(e6whhk2{#;v!3HFaC$7i_QY^(zo*^7SP{WbZ0pxQQctjR6 zFmMZjFyp1Wb$@_@VkNE-CC){ui6xo&c?uz!xv2~W=K4TnXb`{cf*4SR3`j+Aep*R+ zVo@rCV@iHfs)Ac)QEGX9QFgI{bFc~9rppT$7#IyaT^vIy=DfY**wySH;Bax(1@_n8 z7557Lu5CW$q9Q9%wcx`4`{yKrUM(*bG*C`DvS_OOiG5bJ7x&ft>fV%7)ZHQRxRlZ8 z^ZDDmmbo9%eqflA=C}QRZT$7mGu~RPd-wd?Pvh9zCjXZ2Zg{uwY?)2?&!3X(fB)#M zk9+CbIgdwyn+C zri~=k!=Hw(8YHw~Te!UAdb@_bCAT1Rebq<@8kU+L(Oha i#cnQ4J;-4<_~!@cJe%{T>jyB589ZJ6T-G@yGywn$D9{rC literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test4os2v2.bmp b/application/third_party/dompdf/www/test/images/bmp/test4os2v2.bmp new file mode 100755 index 0000000000000000000000000000000000000000..874a277fb4c0c177fd419c57c7ef6b76f6109884 GIT binary patch literal 3486 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 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test4os2v2.png b/application/third_party/dompdf/www/test/images/bmp/test4os2v2.png new file mode 100755 index 0000000000000000000000000000000000000000..a939a515a9210f3fa1e93ee09a55c4a6c01573cc GIT binary patch literal 8711 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 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test8.bmp b/application/third_party/dompdf/www/test/images/bmp/test8.bmp new file mode 100755 index 0000000000000000000000000000000000000000..3be9a2066d73f03f01402df1400e23e4e264b1d0 GIT binary patch literal 9270 zcmeI&{aa*n9LDi`2_b|K!XShYk`Rp*LQ5V(2qA1Sl&`7a=XAy zOiT=7V`C8)7l-)xcqAkwATco!Nl8fvg+fS9PDV;f3Q|*3k(QQ*^z?LOW@aKQD+}Rp z7&$pP$j!|~US1yZ^Yc+qP=Lb1LKGDhp}4phB_$;&EiFY^SsBX9%TZBLfy&BCR8>`> zy1E)QH8rTMtwmj39qQ}r(a_L<#>Pf8H8r8Rxfv}jEog0RMO#}N+S}XF(b0j<&Q5f7 zb)mbv8$CTe=QnvRIhquw0hM@>u~ZWJRo)m9SD) z#>!a*t7KKIn$@scR>$gD18ZbWteLg2R@TPaSqJN6U96k+uwK^3`q=;*WJ7G2jj&NR z#>UwMn`G15|NrLyXP0yMq0VJB{~@^|WA}K)Su5O8xZU``;M$FXgN)mZ4~@08V2wz+)%eI*OT)ni*PkS=F-dD`IK;Tc z_}Jk3oq|J+n~hJ5HMC%TP`b(Z)L31^VFuSAC9W?@t7$mgxY78`;2N%iBa9o2&y7{J zU~O2s-uS{;MZ=K>*P$h@ElVqFILf%r_|o7yzJjBTYmKjrm9$_kAYEg8ZLFx_7=yD2 ziE{;M1r5g)>vK(W!MVPI(~S#_-;BjH&Y=H=7Y5Al0^@gMQH>9t&9Ch2 zNWuLxqVd`UiPsTGi)ho2AK3@N9|D{i?R?`8gV%N_bGQGWeGokUS<%ij{xlZW=50S8 xIG(;N!lc*y_& literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test8.png b/application/third_party/dompdf/www/test/images/bmp/test8.png new file mode 100755 index 0000000000000000000000000000000000000000..478703138825b5d9b5eaf8c412e2d4c5f111b043 GIT binary patch literal 557 zcmeAS@N?(olHy`uVBq!ia0vp^^+4>v!3HFaC$7i_QY^(zo*^7SP{WbZ0pxQQctjR6 zFmMZjFyp1Wb$@_@VkNE-CC){ui6xo&c?uz!xv2~W=K4TnXb`{cf*4SR3`j+Aep*R+ zVo@rCV@iHfs)Ac)QEGX9QFgI{bFc~9rppT$7#LeUT^vIy=DfXov8yRS!u4V81CG7_ zmA^@GmWg(0OsU_(bA8vWwuQNMH}7z4RSE72owp$L`01(fb%yVFzNpMx_LF7HHM_b$ z8uE-cBCLKD?JZVcpl+Oz{dsr6&(FU;{(67>lVC&d(#87ikMpz{N4^v%kQ8U|wV513!oK{P;7R>;7=xKhPQf(_)|e@0dr$ zw;y$%SGC)&yYB}k=kgEpyyzOK``Yq8HF_U+=6*c-TxkAnv3MBg6PsVoZE1_Wjlw*~ zzbDW4t^un4xbw*KZAZmP;rx01X#0ixigkDM4g5F#7u~x51!n{Es(Y9BdhY^89D}E; KpUXO@geCx~Dhhi5 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test8os2.bmp b/application/third_party/dompdf/www/test/images/bmp/test8os2.bmp new file mode 100755 index 0000000000000000000000000000000000000000..f7f9f57959864197786f8f1d4b18eaf8aa3f9f97 GIT binary patch literal 8986 zcmeI&e^{Mk9LMqZEQAn3W{8C_gb<>cFf{UG7(xgkgb*?zgfN5RVjT@Jj zmp5U;g#7&cf`WoclO|1`Jh`y2u&Ai0xVX5aq@=X8w5+VGyu7@kqN1|0vZ|`8y1Kfi zrlz*GcIworb#-<1_4N%64ULVBO-)VHrcG;ZZk|4U`ivPfT3T9KTU*=O+Gft2+1}pX z(a|w$)~wFX&aSSm*|TSNcX#*n^z`=j&Y3f(udlDazkgt0VD8+xLybycuqDx~WJrNj z7!7HV4jC{OG9e4HA%|!;c`yO;p#UbqWGI9pD25U!g)%6I3aErCsD>J-g{e>n_0Rx~ z&;-+<8K%PwXn|H}gPG6{9WV1 zhw-)%GgyUvjoXcPjI}jl_AK3Iylbqbv7Zr>bSY-%(wZ9k8@C$o8BxSgIKa5Yc;6VK z5v3F9X5#~64UGehsMAPMnvqu5ILNrk_|S+tmcqftjmAgDY8p{DlWs6RHdfU*#E4Rz z6m>ai6^%oU>y1y0C}k=fW?W}{YOJggMN{co<1=HF#^FX(Yo#d4N-Jp`VO(Q;ZbUU( z;Yj0Z;|pU&ji{JQR~cU#D`*^LM8RH)ioCSE#?i)=##crJ8Vbi4R~TO#%V|VhB3*8L zV=Sw2tPz=w6mg8SjK*=sWyZHgWLgTx8K`DM#P#5Cm9zRKN?GDL{KVSX#8X>u5q#v$*mMYthAWMDaHlH&qgHM3a1+98^0Kf zYD4k$u$PF<7j&NStFed{yUvYAZtl=?aQn33BD|L(g_joA{@MS~85leeIDNQtjo*w| z+@Q>B|KI0eaQ|lvcaHJ9F;bh~{@C?U`(w?-g3dPnFc#A0|Mv5)fis7T^&8Tk#t3b& U(Zfv{?kppgfJno?{NL~X0t#PvQvd(} literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/test8os2.png b/application/third_party/dompdf/www/test/images/bmp/test8os2.png new file mode 100755 index 0000000000000000000000000000000000000000..478703138825b5d9b5eaf8c412e2d4c5f111b043 GIT binary patch literal 557 zcmeAS@N?(olHy`uVBq!ia0vp^^+4>v!3HFaC$7i_QY^(zo*^7SP{WbZ0pxQQctjR6 zFmMZjFyp1Wb$@_@VkNE-CC){ui6xo&c?uz!xv2~W=K4TnXb`{cf*4SR3`j+Aep*R+ zVo@rCV@iHfs)Ac)QEGX9QFgI{bFc~9rppT$7#LeUT^vIy=DfXov8yRS!u4V81CG7_ zmA^@GmWg(0OsU_(bA8vWwuQNMH}7z4RSE72owp$L`01(fb%yVFzNpMx_LF7HHM_b$ z8uE-cBCLKD?JZVcpl+Oz{dsr6&(FU;{(67>lVC&d(#87ikMpz{N4^v%kQ8U|wV513!oK{P;7R>;7=xKhPQf(_)|e@0dr$ zw;y$%SGC)&yYB}k=kgEpyyzOK``Yq8HF_U+=6*c-TxkAnv3MBg6PsVoZE1_Wjlw*~ zzbDW4t^un4xbw*KZAZmP;rx01X#0ixigkDM4g5F#7u~x51!n{Es(Y9BdhY^89D}E; KpUXO@geCx~Dhhi5 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/testcompress4.bmp b/application/third_party/dompdf/www/test/images/bmp/testcompress4.bmp new file mode 100755 index 0000000000000000000000000000000000000000..7239fa6684873c10581ef64919942ad41b1a7dfd GIT binary patch literal 922 zcmZ?royE)m24z4}1BmN^*a3(c8CV#YfV2u!9>_!ip`oD+t5&UI`2YVuP}~8C8-Vx# z5Ci!RK&k5e2HoA_`QBE($Ug L1d+`}v6~S9TN=3< literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/testcompress4.png b/application/third_party/dompdf/www/test/images/bmp/testcompress4.png new file mode 100755 index 0000000000000000000000000000000000000000..29f1c3431869d128235f68e126feb68e05304072 GIT binary patch literal 472 zcmeAS@N?(olHy`uVBq!ia0vp^^+4>v!3HFaC$7i_QY^(zo*^7SP{WbZ0pxQQctjR6 zFmMZjFyp1Wb$@_@VkNE-CC){ui6xo&c?uz!xv2~W=K4TnXb`{cf*4SR3`j+Aep*R+ zVo@rCV@iHfs)Ac)QEGX9QFgI{bFc~9rppT$7#IyaT^vIy=DfY**wySH;Bax(1@_n8 z7557Lu5CW$q9Q9%wcx`4`{yKrUM(*bG*C`DvS_OOiG5bJ7x&ft>fV%7)ZHQRxRlZ8 z^ZDDmmbo9%eqflA=C}QRZT$7mGu~RPd-wd?Pvh9zCjXZ2Zg{uwY?)2?&!3X(fB)#M zk9+CbIgdwyn+C zri~=k!=Hw(8YHw~Te!UAdb@_bCAT1Rebq<@8kU+L(Oha i#cnQ4J;-4<_~!@cJe%{T>jyB589ZJ6T-G@yGywn$D9{rC literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/testcompress8.bmp b/application/third_party/dompdf/www/test/images/bmp/testcompress8.bmp new file mode 100755 index 0000000000000000000000000000000000000000..082f7f481c3977119b4dbf4c7e6c95b3c29e635f GIT binary patch literal 1820 zcmeIz|9h%)9LMqZIcJVxY=>cp_Y1=?408-)IYQ`=FJTBF3?U35M+id*A%u`GA%r1> zVF*JAA%qY@2>CLvwzJ>-2XtMJ?&o#geXhGc-Jj3BV4-12nR?A{66sFMc_-rip6>+6&L z{(dnUjbbvH#B4T;#bObw)hafdO$G-C#csEY!{HF8(BXE4f@w^7*_J3I!<^i&83;q+BjbrBabXDimYRCHNH`9PdE-&;agpS<-(Qt zPM2pLk02^Kk97jB!1v0n3@74p{GhEYH!j1Ex*Y2y1W?swStsLC{G{CWa0)KL&$v!3HFaC$7i_QY^(zo*^7SP{WbZ0pxQQctjR6 zFmMZjFyp1Wb$@_@VkNE-CC){ui6xo&c?uz!xv2~W=K4TnXb`{cf*4SR3`j+Aep*R+ zVo@rCV@iHfs)Ac)QEGX9QFgI{bFc~9rppT$7#LeUT^vIy=DfXov8yRS!u4V81CG7_ zmA^@GmWg(0OsU_(bA8vWwuQNMH}7z4RSE72owp$L`01(fb%yVFzNpMx_LF7HHM_b$ z8uE-cBCLKD?JZVcpl+Oz{dsr6&(FU;{(67>lVC&d(#87ikMpz{N4^v%kQ8U|wV513!oK{P;7R>;7=xKhPQf(_)|e@0dr$ zw;y$%SGC)&yYB}k=kgEpyyzOK``Yq8HF_U+=6*c-TxkAnv3MBg6PsVoZE1_Wjlw*~ zzbDW4t^un4xbw*KZAZmP;rx01X#0ixigkDM4g5F#7u~x51!n{Es(Y9BdhY^89D}E; KpUXO@geCx~Dhhi5 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/bmp/trans.bmp b/application/third_party/dompdf/www/test/images/bmp/trans.bmp new file mode 100755 index 0000000000000000000000000000000000000000..edd5ed812395f6ba6413a448bf06282b60711a39 GIT binary patch literal 218606 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 KrK%-NLjDKYnKXd_ literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/cmyk_test2.jpg b/application/third_party/dompdf/www/test/images/cmyk_test2.jpg new file mode 100755 index 0000000000000000000000000000000000000000..9b98229513f07cf90f65d2d6025df9bb262a64f9 GIT binary patch literal 607209 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

    Xc=dsa_fNm3Vce`OJF7DK00HXw&?R50Q=o93Nc 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%0AFxL7OnHk`3m%ofC-X~Z%O+8ZGg>9))ID(%MVo2) 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 KYuZ9|Mw_Bd1{;#CdlqHccT^WR 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≻1rdFDqt<`59t+C_TSLr3XqbyW*x+qq4DnCtU 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%0A-BT2zWO|z%ZETA! zTmL3Y{`M(n@%nY%3KbJU8bza#`nhWoOfrVjt&#`w?c(~&ouYah-NJghJ%fA3y#u

    6|s=ZP?-X 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%0Dk@$4HE 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 YP&dGNCNK4>Wri8xe878RC+>{=7yAD5Jpcdz literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/dokuwiki-128.png b/application/third_party/dompdf/www/test/images/dokuwiki-128.png new file mode 100755 index 0000000000000000000000000000000000000000..b2306ac9571f39c6f30c0a5967e5b520415b3d80 GIT binary patch literal 33615 zcmW)ndpwi>`^R^(IgB~moDVtWG?YUQ+YpLMQc(_b*2yWM9JU!l6iPXyOsNz_eM$=1 zoR87bA==0($2rew_s{qD$9>*?Oy|3$iU9anTrMnz=5Ehgb1c5-pM;z^3_paps z9sKaUbCb1i*WLvdOgKgWfqo7AIN@%zcaMoW>>hP0EGR0*H!=`J2nh2FR6cUWH#pEW z&^O?EL`R?{2$VE>#E#$=JLH!u{yi9v003jd@W@0Wn;nY^%7VNFYjMmd`Lh53K=9p& zr`G|>Gzr)w?2rJS6Znm_oLnv3!eT|2?v4p6+HsKSg!q!MDRs1`RtZ_$u)D?kJJoQa+d1<&Ir>qcf8ZzK(zD>T9p(gv43a$t zLLxIAKT66LAe9Rdg-#UnbtSDxbxKY-zvNx;^2EU211LG2jZCIU>0m)@tQk3{ql3{S zeA7)I?yV^LAcG>*E-lIq%oddi5S5YO^D`tSuNZ>VXcRv5*Y0jzd|?44BP+G!>C@uT z<$D%&6?M8bs>M^L&?dW3d)hvK`lIvRnaFzutw>itOJwDrME{z^DTS#Khhj5UB6n2C zS@d)NLY+T%X{FNK*x27%zZVK)zxE6jrTJp#_RUc5ypz)F0cX3X9TSZUpK>+i3l1WJ zv(d@>g&Vw@(*?5q4qK0_ka%}USIEgFkE3r>9%nA^9FJ~vrRfs?+B>H_jXiW8UdZe_ z;Do7&yh<~B0#VjWIu_{vO0Vqvuki$EmBPVePDdd5L!dG-x;Xg~R_Cd9@<~5=sA?kn zc%E>P?d+$Q=3eaI6VEb@rhkKYQvc=-%&!L?$NU<8<1-PN^zYsB{pwlqU~O5N^2)?k zsXxg=>xv>*@pyyanl#>48>~Fx8vC^?L$XBqGdf!jmFaTb<#?d4@7NeI7%E+VS$A&k za<`|ae4k_TxSL|ANQnMK0DFo$?rLbL60Scn^%rWdAz^0Y`%$vU-$OZ`p1??>+V2+y zQd_jtn%|IkJJ2y7BtRnSgcF_ZYX(SkjPeGk=gihh>MbFy^?L=In$GDnSpYJlxd5a0 zmXZ_prM0^X_#IaD5Kl^y=wmeim_+D&GP;Xj*OzC^t=(^EnXsAS%N&v$@hqzNKxwr2 z>ID_WLkmFp1Tn$p;Xaz!ffz^ziv$qOrQBd$_?d6OTVy8CLRk{H=^XCWDbW3NnC&sWOibV}WkpXd$nI}?ti3w~)T&T+3>0;@nbn~Ci@`tK($1CHcLABX z^Ydnf^UcA!Ib1+_r7_)^3lv=nCyBs z`#lII`d$KraD@tdjA%~HJw-V@OmY$7JD5FQP>>&MW=0m?=TiFi?VIqc|4}pC$2|r2 z{Nea<;=)8wwkTDy{_$f~WYW%#6cD_T9+`7uer&w$J5Pw;ua?#O3(pzJ`$>ofqOB`y1)K*NW8-W! zxXCqN8Xz`=v=M|LPkU$}pDH-4J*wj#QgWArgRbpBEo5nnJdgD7l)~JLw_bUSF_OKgl}Pjoj1$)zaA zkw)UXIKJ!GX}|>Xz`pq48BcCa69($yXMkA=&XHsB}A>NF69_c?Y6C>|&?M>**? z$}VMc<6_-am0}{YEXGdGT-Q~H7_M1HKXvgSo}d&LqjH~Oct$+p%BWv3KQu_!#TSq> z-^ZgGHT%F1A3F$tR*phH)Bnim%MWIPF0U9?Ifff!m);ofY;z@s8~w(KzTA~LQxgbdx0yWO7vVa`0@`Mkz`6Y=Vh> zE-a&PB_FG*^uETSIxqZnaB_LmeNHwv6R9;*HF?9{&5EwSFU=}$bU*E{X0IU(TpL}& zXh(eDaJNE65JR-NP2d>W}c_+3o+6A?}FqEhB z#WFtVe6qTLT9p_51^>cDqoNw_H!*i{9|*s4odD=QKMx3o+v}DcAo>#hx8dtbRR^*I z{rqkUti}X@Ze3f!E9~B2KJnUn;-Fp>k$os6UiB)8&njVrd)G~2>XC#3Q$K}Aj6@Edln%=@Ng2Z3hD$i3BSN-=Q>DEzqboUsA(7)iiJmH6~>APv6C5b_U}A<$)=i5CU5Be1iQ$)Z8T!b9zrAkHUOfQ&%qNs9J(*R#aeAzb=W9!kqtW-kh?}r2zpR7@Xs$9P4 zdz91jBsesXkJhhbZPYyyMPs_y<`NY1`O$%!=tNdxFK2NCMN|cSq6v)g9~Zhn1Mo4C zZ;ki7DhU~vWfiz*m^+^+^w!ZumM2593vyYeE^%k2KZ|AHQy=*2r?0(iXzTsIUuB*5 z*;$U>cmzJ7mX*_eLs6v_c00sQdwCmGRWH(QPjCGfLv-E+nKUMXbpBQ1c!rz^L&J7K zXt^^nKl?eVi82ER#HJaCzcEab5U{YYXzH(IpwI$ z_h%^l4K^OwP&!#a5r<&kn(wp21k{b7Yf4KoyhK3c8d{4NDb^H3T5KM?VxI&gv?un+^l<}t0R?2p^XMU85UiBeRm26 zm(%m6*&#&2M-tdGnzZjRpZER`HLC*YzV9K^wO3f&&{J=v!$ z9I`6x{tmk2W2Jnhr?GQ?OK)3?_I}-VE&bNE@ZEJeT7Q_e>ie;;YL6(HX~B$By|!0X z>kjfO3{Y+tK5?)t3kl-0=Y-LplL$guK^i~ACuZ&{A;YYBzT8c@+y{Vh{)-6Xw52!X zj4L808Z;^+%`;&RS|dqBL|1k~)fwwm(2UsZ!OQsc6D)vo^`I7o{E1D6O;oh?()GG} zIJ{XU+T9P7nUTlayhcnQNV z$RNT;fW;}4k_jFs zY0P%~J;FIx{$aDs-nt&n(s#}9lQ21Wi^5WkT5-DAp~N2kj$6vTyR>I++44fhY6r&1 z=Box!Gb5&LHD0{}Z!U7i-OiYt5#%^-Y*+`L9JcLmFscJ~@O4fW= z%-}yC!G$)hY&0#c^CxYhBN>33( z`0s*i{m1U-AyM7{?7_wcuJrt+*PUGqW=D7Ur{Ub+JNj{m8i->$sb5D$#pCYg?0@xC`l7%;JCE3TSl5?dQcV@Oxa0T-Vv`Kdo zt#MEX6XfU_)ShJu)0k^Ok_aNata=M!QLpNELNHrJZN4Rpxxr(`}YxY$oZuIPD7l%X_tUf$UlQgGZvD*H!v0#3med1yq^B#FN z(StU94Ha%Z_k{G#_x17xbo`aWGlC1BWfkDz=);aAqgPH3)6M`%l^Pwf7Jzy&{1mpE8`2z_>`PE+R?)W)trQzfFJyiC;O)p>;JsdFb` zIWxN&PuK3wvR_E?(l;a^ajSe4xlz0K1UQ|a5|+cWKICbK-acohF*te0#w1zS{7==s zOauE6)QKas$g3YGJaaXT#xTz-&r?6CL04{kW^gZ)f6qD%TUo1I{As9o?Q5CGftkfQumbEK-GFXQ z&Y+&sjQFRVGv52?3@Akq3OsH&As5P zOTk0CDYeFqwb}zG=N`^|6yoDs+qL{Q?(v~lM87ZroEB*QXc8^-Anofya)|W}Em6@p zxl;ob&z@%J2TEQ3x^}EfC0oLEI{@x}{#$ah^WzXnZ?5EQ33de(Su!Y_N|tTdzfPB8;#e@JFfCd0Avv>(ZuzY#u8A!B=(F`%W0i=LdCN zNqzIe0rN^=ZdH;Of0CB_cVqvUgF)S@gaBLBi0}yIoSKiz(A%Fo5H(xi;N$v@d^rP| zcI}~W1El}^?^eLjY~mAzea9cJKJ}S7-Cur#vY1i(r%R`?FZkCf-IGUwu6t!v z_Jus}*E;eCwyWwjgL4flU6~n`a0vd$_l;bbgBkjLv+7eH-Qo(^^j6+MRL1vJ=pBY0 z&PL9kEC1q0KwaqL%;2eL6XMmNKZcPBv3E*N#MI78NEhAPJajxP^3grJ&%ZTO-an_Z{R_xXVn0%BPP;YVyr6y{$}&b=?8z(zv%rd3{CMh(LM^bo z^-QT4ai;dP!!swsJ6>LNP>k2Z(bWfq(rnq|yj|n$Sv%BkzO7mv>zN$t&%=S)71On8 zXp+*cuP?6;{4P8gE3Vek`@Q+}?GgEMixJRoxziG6*UNj?!{e=+TSkH(=^mKV;^E_% zEn9bb&peK8@Q1(G{?W0s42p1K`!8$R$bL-eTX@x(;*!8b}KlW*z< zse({AZr5w`5GyQSZ|4IQr?SkBUz@n0~L~ZU({Qkv006*{CO; z)V!BXqXFkEYltl{mtw&fD^9_Ws|innY?Ja*^F}rMm?XSyZsx%DY?Ys=+b8nP^Fjwj zXl8NN@GIugMCt;rMhvmvh5#0LsfwRR4j^UB!UvUq^2dsd8kB}2qyulY!o;TwsUqIZnpf@LTAf#_$>F~kMvk;9b31u&95fZ` zawu_qL1y4}7>-AgkZnhKGG-jTGZlu~?behKRjaT9@Y}z;c`Twyh~HfMk}>k5`Zc5= zqy2>RxGx+0lE-&R6Ku7C`tj}TJ%5+T|AL5rA!nQz-();f$*H{nfrE3&kV$6hdG_hb z*Oc-J!wku(G{B~f!85M2zDgNoK6{94_zcO=C-#DK`|#h}Sd>Z1%Xra0D=VlbG2%~= zZnvwH*Zh3^$}WA@n`_(s_I@y3w|VF(l&2N7kVHA;qFX=lw)jN%D}2N{<5ih(&uE=A9+9ivm9ayI#Ny zN_v@0a-?FF1Bvy0&HUof7n|Ek2hEeDXVSn|KUK>kVxNiSe#1f4lzzm42DMQYaJ(27 zC0l?Z-)i+?Jl>jrjw8kq>LKQ0(Qv6F$HT`UKezLg5}|JaTh&<{wB}K;uZ_YP+D{mL z38E1$2N@9Ic6C;f`oXlKZ}#wm#0|ZZq52Bq{kN`j4GruwfRc8;6Xc z7+MRUH`@|<3H;-!&{vBoDGGQH#s5}8!RAgz-Xi(c01llYU$rr-;*^j7&Y&BTWej{M zGDh^8WRuqnaGG1H>PryON>JA-A1(G?(JW`jR-p@FDovrN z2+u(pWjpAvhi9|0UmnRvxeIGWQm!7*5+~@zxiqcpnznQKw1TNautJ6_S)j1IxNcim zSB00Prj*N%w*qA=RB1=pzuPY|tT)aM7fs#aXb{BD~{Z#DUkLj5gMczXMDiB*YS2+Sr^T*=Q)_+KijOJE&XgMRu zvw(SN0gbs0sr@K{+YN~2PO-#}+r!V&YfaUH-N>NJh4q4sSjm)1znh2cL^UI3=hzZv zTxsk4h2zIV$NroR7awV6I-jdZ+g*9I@55T9Q)+4QmBU#ml1%)D_b0kpgeSPB{-}iME%DN0|@Mnj8r44=)5#%_7_LUgh!E7MOxa^in%-7@NUvA>=e zaqMvCr8|F8-g$osX{S7hj`xpv;mKyR%kQ6H#@f{r@!H$yDy*GY$B$Yw=Hp44D+}-EYQgk({@z{14HBmrWWBTo5hcH$GFJ|hG z5a-;XAOFtHsa>Z_c0%`q$pY-b3>3TNzPlU+Q1K$T=%>o804{k)DC7Ah5_)ufd5Le` zie(G%YYn{JRJ+L-PWUW|ds#u=7!SWoGzaCPVX^LPZ2?<@vrpOk-=IY<~jv} z{1FWTA5l327qfP>MY~y%j|%2*6RgNU8lQk;y+6@3JMY2h;Lil)+4Y{_DmX1l*#HqR z3Xl3Htu?j6zhqQqj>hsk3K;Kf@}_xPZ0_?7eWzJgXtfdef%;_H0u7XJwyeSBXu+IDhfvZu}q1M1X3_I~Jy z>M_Rm2*)S>W9JWkdPWKK5KR&5V9u4F(VwwABzB8Jr8{3f;&H$zVF6o#Pu1#}TzlLb z1ZxO^mSSqGk1Ug@#cCAK%Zsp<8qLNV4sWA9f0s$dniBhrgSZ!C)F4Mb=p8V`7(4AB zxI#VG@ckfdbJC{WP62-^8l+@Wq855ljP?jY!GRpkG7lbD_Ryu`CSgy9UfTA*De*Mc zUO9!9nZl$r-IcGE`69zq=>+}U_UFGuf^8Fz6lG|KwFfU7HRn6T8GLG*TPm7Cdh$L4 zC*rOP;LA2=MUjVncXGE(2luMS@@6@-<*l<~Ptv}QOEm{z2awXzDl`qao1J4^(cP3Z(5%2lKS*9v_dIczOC`z3jyV$ zO4~Mk?6l<1=s>&2#4a7#>n4geN4pG?AW=fpXD3nb>I`?(+Q8&rCYJ%;|K1ve05e!tqwcdZ}|H5?AndUkOt51E0LNO zm)hiIOb*#fPd2U_Gc7k)FMN6YNVgbxAB%(V-v=fBhc#A8T$*_ZF4bg!E`*Fee3{aH zfogIxerFY8iB7(v@CN{@{N%s&r@mh$9M;^oX2d+dl`T+6>QnJ?#FLLgtwY3w^(RZ} zK`y_^qqw~&wNt-{>_RnAvmQ{p-+W_(vqF=87#ray6&OE3Sd~ObwQ+vQ-zoZx!?}Fn zw;v%P_uq+Hn6;6%1u$UPX{C5i-M%+h`QZju2)OG;asl#tu)ZH>e3BSG?&r^i{_cXl ze#|p=e9>jp{!g2bcNw6xq9y!X5N@vwRd2ns3Eon^lHb7gmTYg9>0dCkJakpqG6Z(f zPIbeMBG$u!hp_C4>DNa4Sz(N=1`PUzLi3lUJ+&tO5PCqgZfU2*f+G)-laqtaB<<_I z9_>P;-ZxH9PdBoxjY7HdkyWLxwj45xp=w;or(YqnNGcztt7|X^?zA?;E{*Rx91t&Q zk=v74#37Ej5C!0#0}c(N2+XKemB$FTTgNQQ#U}~=xEucMFEneMasyIzQNV4ByqD65 zHEcIJ(0{9>rwX|rN(Z+9Hgbci`06__MAI9&V#XDyOQ_TY!ep6z4P4g45cF2j?u3cIUW2|&zJ-r9T~sQ)nbUugnC*HG-oFCS_1xRD^`ZjO#Y`4aUe#;G0_Qk3 zmc20NI{F)mrc9`DUEPwXd^LSb@yx}fZ)#<4V)&+6*H|Rux~**hjy047r9|I(+m28s zXG<{d=2fx`<9W+ef?M)Ka6-D0+Wiz6It^oBYS5HbjAOj=G$G~*UoVAuplV7GvJQx# zWE5*ps-(8{stADG#*?tncR8uvZB%josAWO)$xNhM2{OQ}js9AXI>Idk-GuDV4VThT^0j0XC`Hq{C4A z{}ozj80wz?L}M0br833c7l9-P9*!7BP9b>sPzavh$YHMSmk}W6hFjHATzC>_d)*+G ziyp29+4Hipe9($TA3Hds9hZoCS(u@}_{;II(;D04!`5X3h@rRA?kuY8jY`Lnj=i2E z2L`(AX366&brpA=ReBp+BTG?}G@QHjL;-|6*cYwQ2m7W(pBiL46=B|F-8Up?xZ+0) z)FWJAHd{aGzFq{P+EPm@jy>w(0wMYaCC6OC=d8&LnLzl)ai#ZK=`ZnVc?AS8+SlY< zJn|f4K{2*@6*swj$t4{myR3)01D^`z-muoN=Q>Xs(CtraABXFihlcxY14?gADN^qH z_g*ZcR_S*SBA5EQK67!+^_c_2C5sa?NVU>Vl}Mb6}}{x+C8)1!{NlwRvpJI^$ERGn;1} zFC}&~5b*+=2n3S#9Vz<`^ocynQo9Nvbp6TKdJpDqIO_GpZP} zGFY1-NOyO3GRWI%4dGhc6l{dSaP)bw4`)ki<9JPZbl+2eQe6YEHfxG}y4Nmx#mbPJ z4DN&3OJ8o4&*h}FY+`;;TC6P)a>)Unx`b#BeoUp!4GJP#>y{ZKM4bI%1)E6HrR<0lD24xQxPFWgM5doLNGzOCKFdH%2ZsLXbD{8>H0L6^5|&5sWYV^c4)}a|^Bkz{^~~_s=tB zfJ~r3 zhUdGpEBGl6J?s()`=HJ<%q~>kGjJdrf&RCFziUInKM<{YHRT`B_zlhm_me8U>-p@( zg??QaB>^f=5=bRZj|_%^R_v9jOSHA;*5s>)9IZ^NZn7aJtz5DIAwQ3AfZrb~vr*;C zBDo;t7U5TDO_}lbnYU!=Oz~I?ni%Vs{*QFUzNm$s-!T~1$o=SrBFnC9Wyoc;5y2#c zw~M+^)~R#Tue=bWwpCy^C2N5|i&6Qzk^N?u#6JCzeT@VtpXy(HR3BIq&y{Vm za2fv(YpXe={2KH=qnFaU>{B01bnOqww~l~N3*W;3W+{=Z03KiUHC{MnX^}O|zGXoI zA|VeMB7Ydv8QeI<&u!28TIER;VdnEnRviG$^k~{2HaDCOLe0g^p;dlU(R&{UdKZQK zkrDu3>md;r9&e(&2bk@2{T8r?&zDwy?^Mm^Hb{XI=-2j^peN(TBWRH*-peLvTGSvU zR_1E3-b}2-YxTd*naEgi{@V|o@U{4-Lj_l5Fp*9(m_%G+V>U>4osZxziOfzztR2cd z-Ha}sNG|#Q4ykqRP^3TVM`voKJMAWw7DY%OTY4pfM7_rGJz&BfHl|2z(tiTK8z33+ z#3p02eVHZC>WT=CM{kd={=0+>{^I>D7`k|fFqnw^)0!$fO2_U9{plCbR_EC`3C8{k z0P!oY!Z_1^+bSD+y=r=%y;kkv%x?G;%`RX{)IlQ|t^H;kmBQ=ca4`**Fo*Sn=UeoS-bj+v0xDH0U*=gpnzOs2 zL#=)$TXnMYHQ%BC_|d3dY+LZxazYT@Tl!rxSZ9f3xJQ@>of{)9uT1sknTFwVTi&;c z1l||@@iHjbUsOgWn7cC}6dNS^nJf}W5L1iK6TUpS-GHllf5pXc+C{hYG%a@)Q}VSp zElkHmTP!Q#tXSE?1bdt~@a~$7?S*S{)VbbbMxwPT^f$?|cpJs#mob4KyA}agQ3)*# zRa6`91uz9{9$(f%^fG*p&OmN(s9i5Wei0)aY~gwAc?5F_6ipU9$RD&%+PYSR2O{|4BMrjuz~c#r#MF{P@R5VKMcIwt0^Q1jCKcAx?(;OIMTB z0NnD?ha^WKQy%lo(oX8}ar`(Q>QPzT5L^>Jqu8`<>cgN~03}}dKK6pCviJ5sohA)p zPI31AW|#A4`2Sp8TKjG4=)c#1x8zqhFleGzR`OM>kOr|XNS^VYrCR^!5N$cbLVK#> zR3*#tu-v+yH+`(|Av7PfPaSOyI%N`ImY>52JqNF-y&!f{WH6v3ZFrX0e0SDRx&k|v z9&2|yC7o=)fj7P+@vJ*Av<^@~NT>zu-{94sMV{5S4C3<5El`F)Rf>WkZj07^w+q6ojVz_5eW(A0 z1eI014#>`yL`1)802}`b=3dlsIo;9G)x~BL`3|WZM&-WNItBrOlhwgk9OU41;?54= zzpGCW2Wuq0z&sLR`+t$&(X&OH_7Y6SVJS5=HOgaI^9@74$!j%68kydR8&+9$SZLh1 zzrCdq=vWZt)2p6&35 zoe$kcnH%CGcMXU~Zv5RcrqzD%wvmpqeO_KrqHbK4W4f`c2|p;OLz5B;2Ft}$kU(N0 zqWYB?V{~(;f!?G7zl$YRxMC~Vp3y{6Aky%e+_yJ45W0ZiATHsDcx1&_u zana8Y5p_`;GSDVdqMQ_Z6leg5TpjfuMw{>qZ3iNAQn#X_CWdt<_9Fasn&yW`4)^(P zE!2~MoRViBANX!Rn@4)bTOvQv!5FxsDJqxyGl1fSJ7PT@Z&fix4e6n_su8zq#JXx! zu348o=lolVp*{HEZ5YqxDAXm$pOK@U+oWr(L=$sJc`5f)EHtSqs5B3cLGQb9O_?b;Y6NI|~)Yu7uVJsM*Ib-*ZJELDUe zlj>O$mC-fi`d}0h+oXVXw@&m0t)nnJ9I1oB;Xy-`#GCdu1V9J4PgvazhW|3aDMMA{ zGu;uV`4#Tixite0MtMY%Vq7ydmQH=CXdU0};yTh9&YM0$0}-s@r-{-C({jw6MmJs!|JdVn*g!snHKx!eL?Y3!= z>AP{^F$+pfBbrK>1>6mkM^Ojzp8#1EFiFuct zD-x5wfqi)s!EE1PK2#_(&Vs#P^ldxzPcP65TKr8F)l%cZqJM^3ZSAoK6Ed76F&7DV zZZiH@=LRDUDz$mS+zfN{s37LsDG5eX8|!moipdF={&Qs6{~@w zoxlI(QDl*4(K5i}y@$_?IE4PsU8O^bmre_XQ2yjSXT0W@fL2ZV<})?oXW>|KqLO(B z19`D8eplp>E5yiMRi%}otJ%chZ*&z$cB`r)D^Lr@b>|H8MkjuMKptX`vT^xNo!YOb z1dyz~2wSQs()9boBIfv``fhr2lklHsYqPk3lsoT07F3ZcCchP47QVxosk`1Ds&@XB7k9)`=~p`_-B`KF3lhgN^x=lit#9>8jTfcu5W%yk-dX zPH%a?lJcePGS^box%ZEj4Kdzwe*TkzFvYN~Jcx4D zf$2XaEn&=f(mR~W%3he6Q)oY9V@`1=IcdPVm)c?K6S8(Mqv)4-63gMJW2?E4ZF%vGvxS+6*Hck$*g+f z45vQ|X5=Z8DL2-J6lf=k6OF@<8X2S0A`H`3s*(_U^VwV{3s)JoBxHyk zIA?@SQdO$HD4y^PbwHN?Ri$;p7UV@`K1Y~kB#w*k;=kfWITPO4+VeHFbV)%W^$??l z^KVy^wl`RiboGO{sSXvXsZ;YbYv4l0fr@PzlLVm$ohisw^0SbJc%UbIor$2O?p4I7 zIs8x>n{6(5S*wz7GTy-_j3$*a2~uOpdX6{spTUk@?58W}3%K>RwV}L2RyG!WGD{&x zC2!u0M0PT&L0E82_IbX&EKBQU0NK45e6lGb(r~ACDJ5rG(^R&WJ%MH-@kXBZFtHJI5Kn;L3r|NA~)3wv{$gzUz@kx?RHi{d#s zqrz2R5emP-sHsHw*eymH4yyaItMevWW9^zDKlHaft0A%NkSI-OET>m>a$-*pY)FJG zp_(~n2PDY1$0o!iiQ!kTf*yW(X}fSod9SfJk$53Q3Uu*54rs}r*cZla>|9^`)syd0ll>WmMOK~d$Qux-5B-E7K{V>y(T z)@;fko=Q3CiF_v~`PoM?rdh2Y&_#YAPhyRCeK`m6hyw}hR!w}weTC3+5Qi2x&@3Yn zC7=;MqBvHU6cCdkP!Q^_^UF$dyWm{i|dfJqesIHIh;tW`$ede zF46gQ?Dj(nG^(2AQ+j2v?{P8a(}~f!j4)&j3rNn|GNhi^A`%By<`GT4L^)M8om;-^ zt4EOETwRf@28L>JxK(eO;gOUZt5(yI+Agu5<2NDSq-~(e<{su3;1UuEeV&<8=BNLc zwvc1?;jv}=xy!|rC7mi^hVmM)@!g?;SO4ky_GjeIJO9$Z=`M#LeXqt?l(khB4!~3u z>)^*YdLjEyAE8kW{*V}uj_u`aEMMvSY`B-hrJyVS81C$@-rFO69fOC#`=x$h+%4zO z?iCcT(<+JWU_p}TX=uo2pyR(hWNOwUU;gMEB5`VznCNCjNXa&$UgaJ!zhU}Yq*A#cqj-&yVmRTXy`FjAw^ zpwN@EoT}(qyv6myFiifjYvj`qZ1CqBLMOKsZrqfvN?2YTyhHKV{B{p^t@$b~hGd3L zBA8w!e_`+8sFp$-9SFnTSMNkha+)}k33w2*okm0 z`G4{IM55u^+J>A$5PaIrVg}<)k7k6yuU&IF$ao-g5cvWUOR>@>My$>7QR^y@QU7VZ z`2Nm45>oaX;q2Lct`iC1*Q~UZxv>}?i3{_{16|a$zRu(*4e)ROw+L%0zPdL!{?Fwh4-36f`+1ZB)J(825%qzw z2XB2n8xv}{Qx|=gBJAFe4UZ&OZ>j$JMCgyDpgcetAQu_VgixQiiFEivX$V*POqR_& zbizHzR*wdR;mG9>d$2c0T2bTh1rDgU*nbMm8@bN!UCxPHv8FZjFJP;-%#EvVSQzb` zJsn_{z>|gIB%s{*-MqF(SWYL$(6O+K+{3@*>W}>@5j?;rSuE(R%(4c8viV+0r9@}o zFBKSo%Rg8!Uhc!;9;ldVLOnYY5U(=mW@B%%e95Sf#J>UAxp#bHm$_0ktX}><9y>}c zjxP2Rh-fC^C*!8nrA)_%ig14A{EIFV@9%*llO2^sFHt99xjaCuI*vykU0F>*dfvE* z1e)zAURY&#^d|cHbu^DE>y6(*MHQ$jDaFn+{^l*B^9KeAr~HvfN1b@Fy__uj?(1|+ z3-quhs_IH-#}^JTr3AMp2H$IO%Nqr1vydcxPlUnoO`+~3=X3j!6_ijU3H30Ddv)2; zW&Q+>6r*IgQ}}^K`SZOBgB6byPOhMl0ak6`~w8v4RkHMgX^-9&9Nl%K83zB9?6UhlCJdhdFp zT`zgA`?qOW(EY(vHFjDWj%(Zz>z+Sr|8<8x%Xwpd%92MGlUC+?AY?6>IG#A}D<#Eh zs$c!=Ez=$>bnI`q?lAxUhg945-ZPKtnX`E%;|Y+SaEi^^e)!#kMZYgyq{2@%2|TPn z9V{0ltO`14*`9V@EE9GUbKCG{UfNVx$bI3l4OB&D#=b#+(^!g} zn5Sxw+6&cmgWhBD<(S96KmOH^!|%TmacODlieGSs_49u+9zsSpL)$nrmryOdn#ZrP z#~pt^`xkstB)Wdlw*Si;^;hS#zhm(V%6CVU1jthWgzW_K)iJx|^-n!)qwOz>fO_a;u|^n|%6^ zQX#FP?oq}NCs_6&mk5!US(v>%s&g=tK@J9`+kU_`l}mA$)+ELV&IP)tgk9!A%kKm9 zR?#X!F5)uM2&^XOroKzsk(VDt8nE!s_GH@s{v#ya!9-SzPR~^igTmmUdV8onvDfC* z$(sa%y?i`#-yBSYTTkuoPP;UNH@}TB5?DdK1H^75>!_&(u2~9U=RWUl_k{obD?uw} z6uoNK`NHUJ6@J7aD2+`*qxtscGDY+w%rOQs&?K3je z))siSy`gmd%^O3phyRm;__o=gs`H2g>qbKTYga1jY7?FIm%*Pm8&-Y3(ZgBXbRq_T zBpPcs7{8h{iGOD$Vy`HxO_!Y|b`}5YxI|;M>64$Q6LL@@_@MStIQ#Pq2HR#q} z`Ff2m&ga%(%y@PHuwD4DiF#>+f0aPA61p8vEZ%0N_98Rsx60`W8T3{a7lV*wjuO^) zkJ^WM1qnytOtGEU$X>Qq*WmU?PQuky#As31)oD0}E2MOcLwQn!V3&jH{HO%P2b=M>G@913PEc~Rx;gWUC*YxHj>Gvv z4dD^T6Q|!BXJ6~Dvy4Zw$iAS@3b6ceYv`Kw<`!-AYhFLHk`y11JtY<>>MKKJ%ZLYt zM??_wjRLDhrWs*=U_8ioA4rk@lrbHU-=*Ez*QN$O2TzzEEZ;yjkQ2P4FC2l}*Eg`? ze@HG+{$$b~9=IX{k0ypDybV!lDz7!gM0KxGKCTI25mf2hyyWpoAH3|o^=(wZxJdLx z_%!WAA4o*veue_`G+ZLU!az$5>?9d(h|=XTuRzTet7M;ja76-&*3jDYla6G{-W&y` zsARAU^45$WCZB&1SLCHG>{|pp!W|*35%)Sl4*w4`v`T zw)86@SE?Jxsg4(GU(4)M<$&I=fcj-jri?9 z;&=Df8#Yo;M;Ll?HQ<2ZnwTy9^nStpZ}h!Bu1c&*z;Io+8eBa;&ArsW=Uyc!HYfQo zIdkf`--VwkN}?JaRvXX1V4Vb4>6r=C_R)WRRq`Sf_U5?#m@VFf38t-=3`ua@O5t&94xl4*Rjh> zUg_y$=um6^)z3f=3B*wc`Jer6gO@zKh_uNU_t4JGt#Cebv;O}$Iu}Q#|L>3QW^8mvWm+?rb7Simp^*?vx@VMQo5?DPluWxh&VQ&3^Ci z?@!okd!3zgp3mpw<^LDsaq^_Tl)~SgAvg2$a!|`eIiQLl+PJF%o)79?iHzic2|sZY*n zO&;9lQ?WS6aXEZ{hhJS-TAX00M&IPVXW_EXsPY#EconZ^h@$Bkqgf`mXSL3XZ={FJ z@t3bI4UF3bH<&jfdPvI&ZEm*VDt|s3yp@xuw4&L@$`jEj}tAcvN; zCi6FcFa1>8)9R;8AXoVC*J(@zZkpU|P5#7?f*Kv^$Hr~wg^=vW4 zy?4XmC^5U~AtFpoma=&1#ubK51^V;u>FLx$V=UAL`@D#tODeiTc~bdG9RjxTU&JSP zV&=Z9<~R70elVjLpb&&E$dCAiA#JEcoRKxd1&&wdn2BdJ=b)1ISedilEG{x^L#KC>54V>*tsn@IUdcEW3Nwm03W^YF+~DR)eng4x)l zN&LRy_xW~JGh=cSLB|WBBc8yr!Rh!i#uNow)DVffNDUmdBZ$;@(;^|_xKkB7fT(+N zC;T1A3ht_Og_=Tpb8#;WRZ^%#^0~pm)4>~j0)wuDdIZXnhl)gwr$$>+%pLstf}g?aU2KyrPn zpti|W>w=7!m9>aqd=2vD8%@26smCIUS1mIOWcy*=20NMQdreI#u{N`3HHLB~M)MX? z0N$JMc zvPu;5hqm%`r>0v3$X>IfAG+|e8Fo+Oy1Yo9f4$%5kC!rWHG27z6gAg#z*GQ+ z59}ij6ija;4zY^^{Cr;$Y#o{ zK(9Mz&_BhL{^m8qq%GB`BJ~ZrVAv7&ASav!Kc5WFKC2n8L9EM_-F8JJVyWeOaL;pd zh$$kN?wv)3xDbqVKB07xYT)l@7MYY#$az0A%r*tZhn}DgGUx@6cz@R9ww@&2Ww%H8??ZJkxw}?4EMTlx5M{L-8 zko-tY+g#z@Gxa2S*;>TdpzwV(`-?O+mI2HjL$^H1t50^&zw}B)u8<%ytx%O9zRm0R z8Hty$Dqh$dVZuD0?zE!Q0k5vd4gXH*p!y7H4Vg?Nn{#8|u)YYPCP?y^bv zob~#*oQg}G7k37d$|{h%#9G1Hd^KF4)A5ep#YObEfQJlD3E_3F)0^fX6U=0H2f2c0QyEdwlE!F*6`2sFNPjD>FpL84Q(A@Ftb9qzrdZ z{w?QLfn)5J?%l>l!-PTAO}1XRyjb`Z>&n@y!cB)byxNW9EhAJ{bSdMmnP+Q5Z?tgP zJo>|$%!mUYR0Wx4X!}*=!!?WEiitib8)*8+iqzu&>{xkti1!SLl~Wq%rPi*la9z0T z!<|TRi9cqkjTw5Wgq-j@n(KG_Uc4wl9jw4R z%~Tg?LofT6%71^>vi4g7*gc8XbZ`Vhr;dIX_szf5eN8Sl3HQ^}aRC)RfYsuNt8p@O zU!9qjOln%icQF&~A(?_b7qXlZUt;m3KG1QoiDUt}Y$wQeL9B5zL*mp;LX3H^#J36& zqi92fXS?vle4deAxr7$-I>Qa7#GxIw&%f$*L&RNH^Xk7G4FPZPfp4091Z=Tp(*3Rr zJJ8q5-T2}USGnj6G_MixoreP8nl$Um1(EFEoy>O7h?>{YqXBYCN&(ll1R+@5^5p-v zeJ*oj9Pd!&$3cVstr8+JN1#l9eC>Lg32_JAWPf7e$zj!U!%sM~2CU~OU8+@E8%{m> z+AYq9x;o?{sR61eN83eE^$}5?fi#p485Z0K8c}M@m9%_8O3H-I9m^5T&d8WPnCKL< zLqTIajI`rcX4S&`CV>R%39inNh#@bQHS13hEDuISyQIeK*1wq|;EN4(($teh%Lk}4 z6XW1c0Nv8gs;(xTak@ZcaaB;1MN{~%VB-@q@V$N#w6^Qyz0GpC_7Kz|Jcn3vO$ei; zKa{7?N#fIG5O}v`e4+dScsCl}{$LwYMkXF9rEF+P4Ef1adj$fcno^ZuWUMXK^=9Ce z_l@y?RCz{1+R(lg`R%rsGi3IQyB;~!baMH`)7x3L$SQgUZ=}xrjotE=qy33{&Xd7Z zH-=e%-JaZMzhl#>eIS1D>CF9qtb80#w4r)__Xay<|Hvx(P4#wtJb4P2+7)LN54n?| z)PH*&!&a*{x_=fI@>!Gkw_&eZW6)#Me7`8tgw#F{v%OLwsWG+7Mo*5O%(r%XJv1lr zhTQ_LVfO73=MFFkA{+%5tx{pQ~mzO8rIIPEIrrS!_AGXfM~3jY_NaV zoi9F;a&W2SmZ8hF!_Q68b=^SWsoiWKB#&J)OpMKbFmO^;IYtx`L`Nu^}~7Y**Lix+|Ft_cHof(&f@g zn{#MNeIYWgUDEU`ySNv^9F-Ho@U?&T>4o+FZ0-(AI%djj9q&d9QsTq zZYau73a$C6m^SZ0TfqL>ZI=JlO#d<^OIU};n@1*JEf47ZB*i`gQq-h9xTS`YvxU4y z8gH{jo+7B$JcZW0lnvIM);|GsjB_{GuwQ@UXuf?7{UljAXlNRAx;EOo7%; z)T4NWNMg0v4w)WKGePy(ofc5-LY=*1f3$Eah<=sZe~z&F(f0v64fb~@&1Dwf{fF4S z#GT34j43OSJ&yo?+4WrCth=WNH`aQs>t1fIblCrdj&0jOQ~v>eYmxP3j%{)7TjS|j zRH3Wl|>?wz)|4|3QmxsyW%P+ndsnYNTsI^Th?{cU@$;LUGYYf-G=AvwR9PbO8BcjE#u`vxr)un$#>N-!0E-}UYTaRk|1aos@Pwa z%?bw7PIo3GkR_B$5=+0Ktx1{Wd!=amtMB0+f-0Jrg_~X}SvQezo;1j~xv-P|B6fW_ zmij5`g1Pu>N>-vwO?Q~fcWk?CxjbwTfupl?lei;@SvR}n!*E$oE2@F_%RkKG)gUlX zBikWn?^Hxv!X_d2gSimzrk7#%;Drp;P*!x^Iz;hznV%OaRV!k6*#P+*b1yXE-?BE3 z80_V*lBPq-)sV8>3x6TI2dPqbhBzWfP+w=a;h7S|BPkbE~d;AuXag)V&V^xp-B zn_QSY>;&GIebP!J)HvGtASh#lY@=kcHo)wA$B@Vg_kvN}O%GX~fE&xWRRjE?uVTS_ zkb9Ui$wFE5^hf1m#Cp+Br36>*b~>zCdTyyFSuq4Be`4?NyIB9{@A~_tT0isq?+znJ z2G1~jy(A&Fwx?)c4$c=z#>zBV?X`04n=6-1}YKj^k;E!Ap{l@m?ez4k+`Xpx7 zPp0#wQd$*8@4zC?Q(><2V#pUN;@Had(XL^V^fhuJEw_H(E*QEUqvf9 zmu4R;B4d6%Y?iD)@|^in@v*AK%jK_RAa(IxanOQ_c4%Qp)VM->tFd+IX&WTtq0U2s^GiplB`gKpv}ca?h!~!2r+FMy z*$PqiHYqo)tgK9(dF^Bau_$ll4_u)}?5oAuH;8gLy~1^5l!;>q@86~Z6fqmK?*bg2 z>=X*Wb`oe~D@dJn;wr2t2}|k|-7%zp$T!W)55r^3aVI5lNe!E~IjoHX$Yuu>0L{{g zs-Lq!yTp;N`S0HeKTPxs79pzcI@u`Yd}HqAiTwMJV>v@^a93+7g>dy7XkQ2^>xwR1 zw-BzYE$H|p%HPGoE9^*V_vFKEC9XzW%o4@9+stNl(b12?_Ec#SzAcH_UX?+8qcxC< zC-9^$=m7M&lRR;{$sJ8jPY`MKze`met)j84$zLX(X8gHhir#tTaZ);csV{`zD)N?BU1eg@WhSf#_Cdgi}sx+)Z127c%Hz$Zi>NsDR zpZvuM^l2vUc0Q53n}rz=4Xk5(p>3YQIk$;L<8gBy!MG0BSBg2Jo$XCiYL7w%-((zkQVIU~={u@^WCGc$}I zj%q}f%CRNE-bO-cLFrv5clUA*kSWYxm7)JrQZJCbTOJlP6BKl>+DUdzIr0k>v}V;tmf$F`ZuJ|WWU9v)Z1!vqdqIssiwbYYVhv^dj`wzmM+(3{ zR{64lABIzAb7ZDcBAXPw>S|0MY!BjN&co#kK|UoSXKmG+-6gbT@$kA`6q8yx;#3g# zrm2|hMtNc)VoZ00%R|*mzEb`KFZRkfe2}<)$|Z;M@lh|EF7`s0{@&Eo%voV~?fKIp z)MsW>dV>Y&;(rhezVg*F2uw}^kUd{pPmex1P#i@o_sg_UN1pOC+M(aU{WrCb`%s$K zz3!jFc(I<-9ZVICPM8XymhPonI5VDLDwrth1o>57`L`KHy_MH$+MJ^p#FJ`lSsuoB z>@TDBR;F2_M>bKjFKF$%ZFqsTNqYJo;uzEj`J6{^ad=8<|cKpoe^w45I`9#R18)+bH*@# zL4kBxiFt`reyxctLB7uH{Dy8G0b4v<+Z0;CBWzAmwa?u!YYw^AOM9-{k>76&S`f7+ zif#q49zQ{P9&A95+em^>pAa2(l`3$@!exx(iCLlP>hEBU-_+t`B*MP}0&XjGRH_2G zfok1((X2UXIg2xU;~tVfd_Fi~i)YFUj&%eo#_bN-mtD*^v2F$l#4sgofGEa;gt|V2 zzF-<%gS(u=Bx~8{!2Df0bB+ZPzA*Qx6`W9ks&ytYEHk%N?_l*}7;7N9H|$TN?xnW-mVL6-@wnLoTNXTP=Q zOIwdIjHe%EtB`*%&sC5eGH=hyOUe-*>Vk$^)}Lu39dQ!BG+uL^zA)nmwOrWREA1PrpVN{X^qSo5e^~;9{~NU z)N8)jt18LEimVGA@VAXNHY22Y=|gTUQfJn#*Viie;KW~>C4HC-;Z+TGaj(x?v3|aJ zf|hwX&WPr8%M%y){S2|W7vj+8h@pQ~BF;DEJEH}$4ofxWh9A*#brt5OK)_}tGRSKX zYIcbMTl~&cxsUyQ{h%*p8yQk<&03C%Vp4)=uTn=V%1ybXZD3iPJV@=eXN5g+q#;(# z`BSqaXgR7{nfXfnr;3U-64_!spa?~ zL*oaKyH3Fw#?NsHy(*Ok?@6ydsa&Zs840%s*G$;}u{BEV+zM+hk@ z03B1tbwPsk$Hg)}o;dAKtiSSC(wRuZ)0yp(3kE4XNp!;$#I>lV2F4m|P(we|DM2d+ zH=t{y5_`BF*D0KAN2|D!yYdGlK&6ZTunC{yE(n;} z%te0vy2gON)g8Ll#$1+;BAt!8mJF%dGfqK#uP52~-8ii{(ke$*Kk*)U(z`xc=&DO> znscCMjbB$U1^&`vARyZ^>5)KB^P%BjOPm*Ff#zg*53cldILbH3I_00Db9l5I-JOUq zc?i11WTdNswOtSS6>-+)(~*g5WkJz&r$=$5jqsG)lN%e3E(A(WI8s*ndK>OUJ zZFC>fra||-VJmbXw^FYU9~2|G!+iFDz9=%*-dlwjQ}d_-r2lPe)Od5^`{*^c236s% zC4iBQR%w#Lt`HG`C6h`FrGaOC2de z$qjQ&Ni)*OwA)P9r}Z{_gx&*wMTPm;h9HO21K6d1-O)uhUJYd=Z<$1&o)RvaAZ1B9 zjB`Xah()Z#9iN*Jp!WDdxxwl~^XkA1A-gycW_@W%k-nW#3$t+q=GrnCS2$W1wSQO7 z>!d?Bez9Ss=CV?y5`{%D^q)A+`}%ci>R_`FDCDe}#WtFhITm5r+wE>{SkfksD#bI4 zT^&p(gLyj#WNe(m$?(g<=~+==va$)TGM`am z2Vt5wM$<|*q(&&bs@`7i2T}z`ZQY+bI&5NE_Pw!`GuP_CcHVxHq;m&HKL!vQsAF55 zT#TcHSnDE6^;@^pLCs9acO4gF8=4M8`{TA9uDt80oFVyE5xW7loj6D+q+sm*L3gTo zOCmj1gSQoW2l>nM|H#q_kK`*?HvY}1ScC21mg-K$7ucVyhv7d&+kBnh*}e1V9Xmo$j!7F#u5cKi@Iv}@zGk(4FFj&P2L2d7fi8J8 zf^ytXH^U{TtH0mG)cBQ_N<4y*#vUR1g7XK<95JvhJV?d`d770@0x~TsNgWd#219&7<9VCA#l%iu6uy zhmH<2=!c%n_8>N54dPgNF*SCFwY-1_eOh<21dD2@Os^Beu1lFYSJ#qn!#%bnopHdIb=E} z7B73e@C)j~wX1zxkdK2nDAq0*{oR{Olj}Z6JGoDuxXSG6fi9dOsr;n_ecIK3Wt<@< zt8L`lw_nW3ZCFxw;|0h_{nZtq$^sUqW}=zt38?25_Qa->GLCdY2A{a5I+g*soK3rB zAVSIM`I6%0Ha7V<^|6L>&gilpvM&XO-g<57bVv?-<~!8(&b$=;UpMr-`vBbdu_y?A zhVo*fs~NM5@A)M?qUAXfEG3K6ERj55j*=9F)UW?^V6{{)qW!iu;b>1H^#T;~Ls~X? zOED-YfnzejnAPmzZvFD67KaU(m)%K7b-H=DggNd&Vz!Upb8;TeaPlIECm{uGZS;j5 z3c(TIQ{X&9O(^u^BLxwHOqNVXLv(fZ-0#Ov+net+BxfRcL{7qX35=Z1`dmjCb(%Y;^S)UG{RjKHkB zw>Wd-KairmKB(3nI>mE7?M$o0jkHDD^^!JbAWf}~fUv>FIK~NN8g>w#!H3eXm43J? zg9Y75D)==WG{ja4kVE_!lsZ)gIc3gWG{$m8SxOmY_QAg2iOtiMG*+XD}ORa860o{nqKQ!cq4WCxBSnZdn(&(^G0}vLE z!1|i0kE^_2`gU&dhZma|+kRVgTarLp24K>I>6yU_&0V{eCXEj%yQMp8!L8%x#^6&nWlN?~BuE3&M3=E4u)8>e zIz189rn#>T{9H9Zosnw@pOvtnf3;acfwdoWF*3#yi3AJPfMIs(=^;kZ8(o~H{zVDW z3xQrFM|Cp(m!1xefg59podx*YvmW*zI|zX zw<~Z`R$!3YEm54#qYjT2`||)2@ID86YIhQM$Z@DY5qap)OST^Bt_ z(%LK|^8k=ZSfz3%n0#bkbsI&YJ!&WtYkp)8=%kF{#pGnZm?Kl|v$)v#&xE{V(~TAK zFB}-i`CMXUkW1u}B9TKJnwA#}l;{4bSRC4YogTP-p`tB+Vcg`RC3SFTVbrY$191K(?jqO$@roAkP^0+J*?=KB zxBN#Fnk+$79vc7O+5<>uDJ^G>jrsa%GB2>lc$nIA2%oWw(b1-5_Lm?dY6?AO-lFU8UGeM9mX|b5}m|duO_n`zbPKFxMNIvOW<)OkTam!JFu7;+$0}Zb$2A z&t^vJFzgl~?aei7h6GvSuq4ew^1jtoW@iD=3LjggpJpK)Ec%+soW86`EGQ>#J!-lq#w^3_Kx#3Itfj8Vr0sq5Ks}YM zg|Xm?or>;}_>6F;V}}NLRth2YSC+T&lCBMHZRYu>5Kg_L5d!zP!|0E-!)d>|WTOLPqGf~W zaa^KxG7-TVKlmJV!LYHL>k1t?XrV%_l7U2Q2r=aejwxI4$XiKaa%@hZ9OT|y=YY)O zg{`hxCi~Aff~oc&S7onjl1plp_lP^OgT!|xz0otHr>W+Qu`BERMB)xXYE>f9<*c6I zx*>ey0aN;2)uITOWWP%0jB~yrpAQd&;D#(h#Ip_s;@-x=bmMiR|7+#HS9?zfgN)9Ld8=VGQuT@m z7mkQEs?_vJUqu0ogGO6u8wk&Ds#{DY&y#wABa4>+<#;Rr%Msnvr%>ikBf80#Wms94 zy-Y6yMH>(c00cWijI#JsxV0=Rus-fOZ4iN$zoa!c7T|RkQh4+D?l^R$lTK=(Ju9!* z6ScL_)XP|s8F6K&pOE$#ss&rjkSt#$@g!}$GL?L_=&1)_@WMt+FHPQEiA)RVG}Zq2 ztr>f9KM^yU?|Bojxxt!?I8q7sf17-k&O+v7+z*o>KBc|u=YHFh&#|Mw;7&awts{LIuK%SKB5~UdSJRyKje!%PJ%SkIufRLVT}fuho}`b+qDfn1Dq+1{5@mcrgZkII8r)Q< z;`r*-s~3Qfs*{|n@P9+Q_)MimNDAG91j7)b^LBmoRXMM{KX$WM|1WLhSJk}uO zhghn(Ac~R3UHj`zY~dl2xC$!tyaCAFhs;XV{6q<4#vkz4=(OWIbLh7nJh+KzFtRZ6 zn%{mn^uqpVJB~rZ(f5}}zTqmv{0XCycpZ|1IMEJlp}G2RU5|Pc5pOZ3jKBUve;g<*kx~nj%yHPzAO8`eX{7a`H6lx zWepiW9he__MJ-0rPT?c`=rmk&spquoLsu<*O*$l&T=WuX-V)5kxd73vk(b69+)70D zF>d|@njn(5JkvQ_zA}wr4+yRvet~rNy0ooRJL!}p1AbxX0HmM^UM#5UmeXDLanXiM13~qCrAmBbhrb3f72NM}2YNt^XtlN38H-FT zenGT;ds&5kkI{$K*J@|<8X#NMB`t0uMw1$YKX}0R>Kuow*{J~9meXn3j9PvcSeSG< z1Mj3Ww|VI=k33&b0j|$}2v2rSqB1*6{QKsn?Vc0&2}d#E4I{n9gXr4x6W#3Jzu|K- z?u7IMP7Vzz8Sk*#+JYEemnQWq(i(9wV&7#EtFKOy8cq&&r!wEYzY9P*k0zI2WpMdi zC_HrNmt24)agdC@_#AEF)w%_Vzty@Y{%5K?%r80ka2B7N2FF(7OWm@v@y?OVWWpe@SMf@hTaZ6~GM3svuREha!K@Z@cAuE)~0i)T| zSkvZ&wfq2J^^!pBKSfJyGv!K2nu$whrp`m=?~k-zQi5XI^eNfTtw!V`)BR0xla6`d zhsqZCHxX01?=DA8v?Bg@J3#uEd)~Zy&EMym0B#EG8*-BEP6EyPHc6|UFdrE?h11{p zl&oe*18qV3z_?2}vqnT$I4{?fe(@rYxGSzyq22}bnCRun>h3FI_I#j_m+=OyJl18@ zR(S%XcB)R?u739oYYkZ7yD;LOgiWOp?=7KJ(xwgYQ=#usfVc|t&i7+K)`Jy3el|9P zNo$dnOM5R$n)`5f;=*Gx!FDVW+L2TXfJn(#onYEWRza!)#efiAq~x4CM1hrFfk6)# zPrRcCbnf9MWj!v^w7#|7zFwgj|EbFg79k}L9SE7s*mW0O?nQX>igw0zU!M8~a03)| zKtq%H6SPiEAn&kePts67D*xgla3rRN{;l~;h8HH|Amczyz%6rjEeNXRg=X{r7Nl{8W=UeYFd1S*XIGDm20pz36mk!&eM(#Ysc}d!;ULJvt?o9XN)cf>PLN<` zc*944EP5O5;FA=Z%6`o{1weVwAmpl7laG)8H-Qx7iOd9B8x->P5zFXxaWG#bXfQ{5 zmfHu5%VfGV98`2z(gb`8Mvt&Bid65u#F00NvQRoq4kC`tdRY!Xj}ih7 z>1y+^mv5dv>!o;pN$roIgjNvdQ&mjHHD8Vh5Voo%XdjHZvq>m*e2ADFjtGg2(;b!y2 zX)-%4ov0QPYSg-vR@|I0`W9z;27&ZUX{GepkZOyriFz5a8wSw9`+3Mzt5);y-X+t7 zClO}N$^7d96Tc0Rcqa)mz!Lf3f@)3PKt^ES(C^_|2O)7%*^9+d#P64shGK)z!as57DR=ui7lifFxjCqAY}N zAO^OJNV#aQ^&3(nMuMe9z2I;m2AXsavk)6k{P!-S)S70quwGrke&)3Qc=rAKvC6F5 zQhKPOzS8dK$c<#`@KO}ou|C5z>Gl-q(!$|w?e_*3(F@7^Zd#9aH?3dq9hUW8YTQ7) z_l)ROjwUurcVm#WSmu>s+UC>}H1gDpg#*Z&}_ezjuM%1S?~qr-*CS10_q5UMQ0V=7@m zw#POX=9`dK7siOzDO>ieg?mkebK)ZKfhjwNbweMMc@d5ZQ%gv=vXHv(2x$R0p&sK3 z#69))zPP!KY^(ciDS}iNv$!uvAoFfy1bDy{rfa1}0^Dicp+NzVbwxr~Bg?WuAWFCR zFTM3JH2HzvN4WGuu{)ysc1eWaGkUXzDa7agU5wQGK-8I4K(Rw9_m_7>hpw4Y>o$Fn z6_I;Utp{E?BO=**(IYvhD<;gwwl>S1DEl&;@-QP^zeqdM+J@8zGMep`YV=4F!sH!u zltbMX;foWOhaz@)L?Z8-oj@*Gq0yE`wk%=<_8t4KeixBuge;%i-1ut(@L5t&(;*3H zUW3ToWA=F%&a5`XI(ZI6zbfnjUObSn{I?}cMAk)(ht|jZlw`fUXNO++(a^=6=huZX zcCBwi=yin<6C=&(D)21c;>Z~AG+iMOPopf(Er(U_NrC)LP#!vyEW-MQKy^X;_wS_2 zV*FF}lGrm#PKcw{-+UOyVM*D_3X>}@Q*!i=?i+G4obKM&W}|qiPNvcbf`n1qstl29 zjPcY*xl*jJxxMHU#$}z+5#K|ovX%lQ=AallIrFvCGqDkzu7#$rXobpoS9}@yy;%zh zr=>C8%Z~5kVOmG-$afv~Mxq|Ir&Rq!1Y=jA^l6*df3TGMFXfz_AIVP}GAl%c125SU z2VF=MCi6&Ez|XHNq<^abw%GiOBOg#=8(~KG!S_TjjET|w+fsPILnxPsQwv)3s5TY1 zMUe8Me?}&r1bW~KNf69^GwA+JiyY%VJv#IZJ#^`HUd5PLZL;XT#bW@Wb%MJ?#ylYs z^m`-$5VyAwKurA&gKM;Q{~yAJnLTVlX1Wv8mvDW*!w1 z(n(syJ=7Gxvr-?&QD?3GEhZU#^&&!5Y^A6*-ykkRay*%6biAG-*mc8NK#;f>wlL?~gxDAfvyu`!uv*q(WSOW0-MY{)z)1SNn}sKOa-QJm?vq5< z77V&kR`4^=1XD4DbvO~k{qzmKM9cOUl(<`SJF>E zIUkxo!|#&AJcf_2NVyBrN%3R6g8E#Bj~n>+0M2<)jtGo>q;DSi z{~dQy*o8&f-k)AKAr{Mxw2L<9r2rJnPVQ>2HxPgnk^=E5sW+0v*4)x`P|4-V?bsyX zQ|G}AScydEe{XiFtjHXHcuYKZPO8EW=POvsV&;37F^>^$I2Aa{mC0=d+`SkWOxUTA z|Hxc-MudpzV-l9!9YKPhVN5-f~EKJDx8kw+;Vcd zlglwkpFVl$KejGCaZ3QX`%Vkn&j?cP=Pq+1sQ!5-IKc+DkX&$m`^7>e7!Vs3fu?(X zX`-#|GQbC_>ILD^$d5m##Lnzk6(WKuaQ#Ulbnj5Ir5oCc9!!M)_y-*gmpJVz?Kr~0 zuuO>Sh&Xj*rP_)Rp|6D}Yyaz2!Sc=Xw>C>TQW;x<>zpsZ&|dBD5R|YrX~P;F2BH+w zHMfeyO3ne&23UoTmu|#lY#(t1pNZ8o`0pL9I!Yq)e5~nMOL76H`+)GU;V2_y*`0w#ByIvOrURCla9+6XtUlFrSsW-?r|FK{m)T4@>20Ug|WcL4cgD2LPxvw0b@`C@j%cNuc61>|7 zG;63i*M=|6jo2Js0Mh4i^Y|y$j0ac@X*yY#_r;~fr0lPxJlZS7a(~&)r zN%8k9OHlN4Ju-f^GPbkwX--W=C8bW@pWc`Wgsb-g1{V$@v%?MsT3byivh0F10B5%b zOLl*}n-(uS&V8r;F!W>?-XX|({ihg3qYg#MrD;(lpNP{h4d&F>DArcZ<0rR3UJEH# zmo-_d&fX~ZBQ?POQShR|(X?-KOXCrbx))j5703G=OZCQ_EWfDweTDKxz|X5S;$v_= zZDu&ATDoszD>5Y*iE8zq=;!kL9l{~ZYuAy$Rn!KPw5C)mfx;snJVU&WTun7D{Ph#@ zYaD}=QW*%9+qNwzVfoi~oDM!HVQo%=^-0eY<=31bb@H#Q?Uh>+G5Zz51)xG_r_nbA z?b|(LUSz zAwQF94j_U_$sCB~P2i2Ncl3y^?QrG8EpKz$uSTJ^wmM25Ih_+Z6-VKgvw+}zmzf~> zQa0!BPa`B_4NSLSGft@j0?ONMpx}$$!%+-s5s2rZF;s=YK`Krcae}C22e_CwxzStZ^s~IpZ9ZBV<|9yrRNdko z2^W7=i1L3<(mu}obfDe2H-k3QDn!HTM^J}SHrna3C5Z*Gc)Ou%R6x?8q(0M6Jspy-%jbOM?l8&@J=w!Az8G=syI-* zK(9|c1=bcn76qi=ZyzW6)P*AI|G}5+>v{0u_lEhWI|$%)m5+;J^Ojp{Q!0WrW1O^y z3qC~<>@_?@EHUSc0fy6JRLyD)b6HZq?w0nwMcIj7sq+9uZC93v;=PVzdaIiUqMM*b zx*L3~c?chvFtekF>v!uG2cx187>;gn0qLe?Px#?x zA&EW%sb?8!Sg>P$mV{54|M+FHQ))#i^V8uQ91Q*Ml^I#O;+_lokRRbqwkWShzW>Rbgbsi_g_YlKTJ%5*;P zzyJGswTxzK7w0pXtnULzpNc(e5~M8Op$w()4|@8OrL?->)W$5DsbGSU0o$vq4<;26 zDPfxgiyG5T@$$7=^lsVFD} z`hi;=$r6{W%)(!^7YZcXLJIE|l-|dT zK)q&u1&<)A_*M%^g4~1e4RQ;-Iby6fyvL4xG6@+UJArhFsu0!H<-T zrxQTH!@N0>U(Wg2n}Jpn2fXU~U=3I-5++w#PVbhgZy>A51&zN70R{2!!h z!Vi185u`OXuau)lSFFFZD8rh+TZek-+u9e+W@u8=WgT&Xkb=bSWgg$)wwPxw{#mSP zON?SD?;%4X;;nFx!R=D)Epsc}mp_Z~F&4|sXEmom5ua?%KHcSt49)_O=f z*Zu+0a&8Q1(k38|)K3}H4RqS>?jKvRFCX(9^D`cDRid34+ax2a+Ov=oFXxFo{_1up za8C@t0_d;LQ-l7^F}ziwUcJ*QW)#h2pV`~T?%lyKh-I8^#fAx5Qbd{HIHUesPfSSC z9V-8u+r#RUe#2RBpAVxQuffh=+5C6F?{J26%`>IA_yypdVAPQ8%YA1;b8n7${VK+0 zrb~=LiDH%-rKBH^QW%p{{O29h5E^_QmLtkxDj%J@t@==&$$nw9zRB^k}%y=7UJ zO$oudvLJ=|Jdue^lcc@l@ph}J`#%uZ9I3_edl)aZSH3=)@ByAm3}~C-_j092?k22m z+EFTTDgfi_Y+dlrKsVUhdIdyVKb4Zl#AJvd2X1GpjGOwl{^O`L#dCMSm4_N6CQ4Bm z^{_0j2+%X-k%yPiB|!7t>gUr7G(ex-L9_>(1D~ES%0YDSyZ1dZtq;ULz7C^~D$g)sJQ_xzXIm31K7H=rGBe|{PO zdc6j2tl^qejddz#mZMF3`8y9IIvGWmc<(z|SZ8aDeO8ls(1)XhyDbO^4uJmL0a$bY zTXMWBI`D0gnDE-lefHN=!>wM~zVTDyX3eHkVLV;d4NEEmq`}$L?q_nTzfD*lZdIdK z-tI*urw*)w8ygfx&LVb-ebJ>gxjU&5Yv&pUxp}8K;4m7@yT@czakF*N1ymr@1uQ-SC+xqcKaar8oh|MU&H1v4MvT0IrAO(4TPjMFIs+|9&26E}FjGgS5p*6z+9;z8y%n%!xt*r`d_UI*(eX#$TM? zNfSanhWN<^2H@_Ufb$x3f{Wv_5VGh6h_>MSm*>dzwfUg>6cLz}*VZ>EdbQ*`rF^@k z{r>q^#|fv_6&2Km!-%PTgr7F3=OEx@kvLT14>7#hlq)kD#6R84frULO0pPS1+ zVEyvP)h>Dr>mU^$**@c=Q)S8iyMDA>a_fIst<7;sOW3cZvH-zu7p7pG*)ERlG@6$HiPfWFoG^i7;MVvOyj3vH}SzmAfmTVVH)otQ3I6a-& z$cYpYpLe&Eul$5IeO%^nCsh6QW@5=VYdpBgxq|#d0U!r=Lrx#bRsJTT$JL=;aqsWU zSBiVHS|ReU5I1)mzsusy9qYr?R_}_cBIrQyKy~`USX^ZMSK!Fcrm=;Jh%!u=MsTQ_l_K&8)u(0a|2Fh&v=~3$!qP2J%7@zOa5`Htvx10KmA2;7Sb8JIb+kkIH zG)C0E-FhWTU%fBiAi$sM(B7_nU7lV4(mtre$sBuIJVlgpWyd>Sg1<6r`RIqXE6J6D zUu=Lf78t_jYz;;)4|G+eG$^gT?)B*lDx!~dGv2MI|6c&N07(AR>0sw955EN$+af(2_un#j3nXn`TW@sXStPEgg`SRuBrt)uhj}`s?&-CLjE6)vX zF@@_Kq6&LBq;!DwIL9|e7It9i!^jHE<*d+R9b4&wD*^mRD+#bA09@|J#r_XX2>%#> z34!6!?u`F$&V>E>`&;-QyTpE0MYk!ymi{pY79Iw0eGh6^5LeVwr6d3dFaVqlR?V7g Rnxp^#002ovPDHLkV1iIzXKw%i literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/dompdf_simple.png b/application/third_party/dompdf/www/test/images/dompdf_simple.png new file mode 100755 index 0000000000000000000000000000000000000000..fd3265e54e36674e48d2a30a0ce12d02a07ae2af GIT binary patch literal 4739 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 Rsqz2-002ovPDHLkV1o7A8Cw7V literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/goldengate.jpg b/application/third_party/dompdf/www/test/images/goldengate.jpg new file mode 100755 index 0000000000000000000000000000000000000000..42802744d1e183d304053bcd7908873bfc9357c4 GIT binary patch literal 21766 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

    ^rnb}V z3(TgRM@kddBi0hh!2ov(HJAbMgF}*_BR6u zv~kGyIphP3^Q1k_?{b21c@TC@J=#00|P(TonqOus8&>*z_FTYgCywk97v1W zN1ik1$GFGeMJ&eKC0o;$nSqI;49r+a3k3?G5*>(P$J+-y;G@m6KgQI-+<;o?cFWdQ z#%qgFL^9ILG{e8Uk$?ftc|YgQi(2;8x~4aVo{E}TPGkQ7Qcwc}oS&;07|wb37(8j; zqa1W2*Q=w2BaB8VY1p%?6(O+4#z205O#Ab;3gINK?qQ_$6f7*jGZ3M2#Q7N{j(n9G z=f2{z{{U&gO(3TfRPxdzLuR2@sGRo7V_xAH_Fmw8amEIJ#+^`Y=A`eaYlIW1V&s`h z793~u9Q$&8vy5XJ8CL6Pf}&e}Om9&l_b68FX!}6OEPQ@!kLRq(yy8D7ZXftWrNYGB zzM;=~#GHO#q@FYTxyL72T*{9a=lS+T7V`=H)}^48t0a=Dot8C6B2u7$KQB1R^Ui$# z03)WfH|py&A1hB!D+WHHX=7$%+%h=>?T^3whKl{mbgr*m;w zRlcdLxVj?pW#qDJ%M3mntiQaT=^vBFTaUF@*4E#zw|j5r^~S5>VTICnC9c0*&hMPr z|FXB-Yw>^WFY!~N^KPfuFR}ms{{!uz5m5Ze!pOj&$e;rg2hmV$5@2EU4+D5gv3dX)M1FjVu{01 zj^Aa9!dQ>gXN$pUjKOb^t89+IZjQflkiT+~zi*egc9Xq&mAiYDynLIQu9i1`m%3x1 z+NqdIf||UAoxZr5Q;49ziK4ZOqQZ=#!gi_MfUDY(r^cSHm9VjBm#oQ>HFa7{Ne2U$M0MK^SO5S30d!JMQvg8b*k%9#00Cl4M??UK1szBL000SaNLh0L z01FZT01FZU(%pXi00007bV*G`2i67<3<3voqWS0m008JoL_t&-(_>&@V2FlS*fPmN<2ym^1ibP9uN>x=>RJhhcL}b;Hf^?)gLu-KoAQ9Pwyxh28O##MoR}f%e z;7_kkP4rR{<0=geEh%O=3Eh#Q?Wnd4mN^$lvRhQ&uED9|ubYx)D z^S6)ESCtcDWh^c#EO2085H@!+if|X_U@i&`Ey%ZJV5pNvQgj=yq{zjBekc9Xq&mAiYDyndIu=W}y{ zn!JUbzKEc}|8sNidwYwb!i=KA-h_mYrNoh^#*(PU=ZuV%tH_tE$(gOnoUqKDvCX5l z(eIp`sk_vyzSgh6*t5gh@2#!gwY~4w*3#no)Z_Zrl9P0002eNkl%^t9BJ zMJ!~+g!uS)`M6o*j6r}wl!uFpor9f~ zjVU%JDl)>DftfLrMF0pm1wj08u(2+Q3Gs1~V1Ae(NWdA$_Y-yp@k0$j0*>)RY3ygCMGa` xfFel1EE3N5mjely8W|br>uRg3D9Fpm003uhH3Emj!Pfu)002ovPDHLkV1l6}LW2MR literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/php.gif b/application/third_party/dompdf/www/test/images/php.gif new file mode 100755 index 0000000000000000000000000000000000000000..f352c7308fee4c5cb1ab4f2e3dd73d6af6cfc6f6 GIT binary patch literal 2523 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 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png.png b/application/third_party/dompdf/www/test/images/png.png new file mode 100755 index 0000000000000000000000000000000000000000..f0b5b00eeed41f8e1b91a62f387974e0fa55bb8d GIT binary patch literal 1001 zcmV}3k zU{`fxU36w>xmZMmZDgWmN04t+uW3tFfXJ$BOjm)yg?VsUfyP*Z#gcV*U4+C-q)J|d z#DaU4e1V9yZ&RdqUSWvCVu{0Lio$1$!H0&0uzOZ%jKPbCj%<#=w|HxAj=#8iWO9(d za*@Beeq?r&y^@ZMf}Lu)fpB`2yNi#odzHMci)+q*T7H+h#Dr(ef?TzYbb^|^t&oDP zk$%65c;bCvp_Q4_hhK%AzS4+Y(}`fkkZHn_X`P&-tCpRmnV!#(V#AYj*o8NwD!-BxIs;Rrwu)D>oyw&WkdF-!xtH9K* zzSrimg0H~X)wiv$#MraL+QP|`?zn`v%H8X~lJCBa?ZJ@V#;57Up76w#`NN3d%B{W9 z=g`xx;>)b^$e8oWoW|DT@6Mpp)6>_}(e%%v%-ZqD-tzX^vDD=H?c=`D=KI#<`uE_t z*5&%v<@?v=``G3B*yj7$=KI;_``YLF+UNV*=lk~M!QANk-01w=>HFO2{N3sM-s$_^ z>igg8{OalH;OqS0?EK;E`{C^T`s&5v?fl~I_v7vS?C?)~uX?DFyS?eqQY^!)4f z{_XVs?)3fd^!@Mk{_yqw@b>-j_Wk|%*YfxM^7sDp_x|+w{{R2~W>QP3VV9Z!0004W zQchCl$fr)NKyx%f?5MW?fWftwsBNJ$D=-;w(`BI>OriZYXQ-TW%hiCnY zrHk|#VidUfqtXhBOKOYk7cX9*#h|2T9g&_@-jEnsCbw|jTr~z!OD-{6R?~bz4Wod$ zb7mxqDhDQ^t(x zlPB~^fE=c6=gTfqHGS&jiTyo7Ac2q+*TT-}QzlO6?P})*2^j0>sHrH*N{S2cadH9x Xn4(mS6?pR-00000NkvXXu0mjf%{Dl| literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/gray16a.png b/application/third_party/dompdf/www/test/images/png/gray16a.png new file mode 100755 index 0000000000000000000000000000000000000000..946006b12b0210bb730ca71f0f4677176057d761 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^p+IaWzyc%}#5;2XspFn5jv*Cu-rh0fJ7gfhaFF}d ze$M}FGu0<}-0YG(c{gk({aUBmI&JO4u-|9S6juG&e0Izopr01KyEd;kCd literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/gray16b.png b/application/third_party/dompdf/www/test/images/png/gray16b.png new file mode 100755 index 0000000000000000000000000000000000000000..46aca9ce88af7127f00f872fcf7cf4ba25ab8127 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^p+IaW03;anZLh=tDW;Mjzu*Q&EAiB)Kwhn;0#X-k#-B1lQIOFx(ru}~zH0H1|v3hQO Q19S+3r>mdKI;Vst0K`a3n*aa+ literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/gray8a.png b/application/third_party/dompdf/www/test/images/png/gray8a.png new file mode 100755 index 0000000000000000000000000000000000000000..df7cefcdd0f35a26fd85dbc8c7de1a9c70dfa7da GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^p+IcM!2%>doS*Ljq?$Zk978JRyuD?})nFjNda?J( zy>;Ki9x;Y&DCpq+d}*mvow&zoLDw%Gdv@C=&9Blc()l1FZ!|SQ>tIOJN|s>GWkNox zGrSC@e)zKO*FvY&vw%!Axfg=3-?W8q^TH;VQMylm-tC93|BEMnH~@4FgQu&X%Q~lo FCIC^hNXh^J literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/gray8a_bk.png b/application/third_party/dompdf/www/test/images/png/gray8a_bk.png new file mode 100755 index 0000000000000000000000000000000000000000..fcb8483a46851dee6000eff74f4d2f3ad469d022 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^p+IcM!2%>doS*Ljq?nSt-CY<04n8Y72IMt)x;TbZ z%z1mukgLH!fc0YUlY8sFhdp8p*-+5I{rS>TsXB3w(}J#FI`-_gPnut)SETbnMBZp> zg4V&1rj;zgoXdoKRA+b@O#Sd>+pmRAt7ie3XmT$EU%zP!-{yr)E~9jx{=C}{UH=zP S{BQv18U{~SKbLh*2~7ZEg-tU6 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/gray8b.png b/application/third_party/dompdf/www/test/images/png/gray8b.png new file mode 100755 index 0000000000000000000000000000000000000000..9ad1ab257e7367e7326dde2be578649db8aa853c GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^p+IcM0VEje*K)`MDW;MjzhH*OH#&8FKwgNai(^Q| zoVPc;xfm39oDXX4-9EqjwO~(E_kq(^JWFRgdH3_5yl``&Sa_}EQ;84|xH5b9(&L%T vD?q?6%Wd-R;5@5b22mim>goIUclku#YHwDyn%oz4AX`0M{an^LB{Ts5`2#fC literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/gray8b_bk.png b/application/third_party/dompdf/www/test/images/png/gray8b_bk.png new file mode 100755 index 0000000000000000000000000000000000000000..ca246e81d9fedbf1b2f3a2bc480acd30059308ac GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^p+IcM0VEje*K)`MDW)WEcNd0$gU^bNfp{fBe!&cl zZ*=PVfV>b-7srr_Id5-xb1^9JI3Lv7yM2E5Yr&qT?gOW-c$Us~^6uw9dEw?lvG7{S zrxGC`aAo%HrN=XwSAc+DmfPgr!Fg7>45C1A)zkOy@A8Sf)!wXZHMuY9faWuJy85}S Ib4q9e0BQ3%LjV8( literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/pal.png b/application/third_party/dompdf/www/test/images/png/pal.png new file mode 100755 index 0000000000000000000000000000000000000000..7fec549c90008fc98c77fc1367b9416dea80ee95 GIT binary patch literal 1136 zcmeAS@N?(olHy`uVBq!ia0vp^p+IcM!3-pGC6<3=U|{kI@Ck7Ra)&fHH0 zz{CR#f1oEC7#Ql0F1QHfA1Dd(3%0Q^G0@RaQIL@k5#ZrqVQ_Hq@CgWsh)GDv$SEkP zsA*{F=$SBO#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS`S9h(9|jf<9sv;v83h#$9Rm{! z8+z*xK6h|30|TS5r;B4q#hhddAMOJMKNw_g+`f4$B04f^#_XB1B%~#!Uc7$!DkD2H zYsKo7t2DGVwN9KqdCJ4v)2pMqvx|e9lgq%s$Z+$9O&f~~iV8n}`1JAc!4)ePFYB9S zmGuh5xOC=9b3s6Scyw@VXk=hqSX59Q+UOjsAga6m;^1UvnI4!+K~B~>>$8-VfuZaD>BFa3=cj|p4Nq4;mvv4FO#tV#6Kwzh literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/pal_bk.png b/application/third_party/dompdf/www/test/images/png/pal_bk.png new file mode 100755 index 0000000000000000000000000000000000000000..1923b0381d1445e658201cf8dbed8cf96cddc103 GIT binary patch literal 1152 zcmeAS@N?(olHy`uVBq!ia0vp^p+IcM!3-pGC6<3=U|{kO@Ck7Ra)&fHH0 zz{CR#f1oEC7#RLD{9iir`W>Lqfs!Dge)104+&1sMqu0Uiz(1_u`ppMa2vn1qy! zoPv^ynueB+o(WTC%vrEx#hMLUcI-KDPp|}3va|b5_{lb{!?e20!gh%=zkS*-#;uumfC)vV>`#`}D2ALbTZ{CWCj*OZy zd*&<&X-TOUuV22($j;1Kv3lhy4Q)-W6Q@s}^6>Wb>gew5;^5}wGB7YQ+`M7a#^Qpa z!p|Q*eLQ?{#mdFY`es>Wy#g^Vow?Fn5D*_89UL1P85kE96%-Q^F=77n*^}o^ojGyd zv{{qpOqn4dFD@-CD=H}{CnhB%BO>wO{qxt4-#&f$@ZGalkKR0a!N87WV&5z;<6!=S z2mjSpe}8jtYw_`KxzXEm?rkYN{Hrwk`kJ_{MMpoSdQaDh+fs1wPi67*GxJP~kA2Au zUhXr`q|m88KHtAQJl(xII@`NAIGI_d2j)_cleNzJEM;Y2=z4$p@F~{$>AHH0 zz{CR#f1oEC7#RLD{9iir`W>JUW0JSK%MlSC>4!kJu&0Y-NX49F3m@(S1wR;MZrr|k zDo zGc7*$B{O)r&peYtr~3GO|MKv3_v+|u@8aNOW|T7I_tBPm4Tt_{prJ}Sm&pM O@}8%wpUXO@geCyVZ?%{J literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/palb.png b/application/third_party/dompdf/www/test/images/png/palb.png new file mode 100755 index 0000000000000000000000000000000000000000..65a8351c3808efb94d4fbdc635e1ac678095781e GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^p+IcM!VDx=yzu$}r1%4TLR>8w8h}h7c4%n$|Nno& z-nczLK4VFcUoeBivm0qZj*X{_V@SoE2l`!GkkOU*(p51QW0nlgQu&X%Q~loCIIliFRuUq literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/result_16ns.gif b/application/third_party/dompdf/www/test/images/png/result_16ns.gif new file mode 100755 index 0000000000000000000000000000000000000000..55c4a396b2104580ec52f37877f337889afb95df GIT binary patch literal 2958 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 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/result_1trns.gif b/application/third_party/dompdf/www/test/images/png/result_1trns.gif new file mode 100755 index 0000000000000000000000000000000000000000..8a98130925f0c03f0dc7aeacada08ed2579d9b51 GIT binary patch literal 2460 zcmeIx`#aN(AII?tYa{N+T?lP*4w2&=u6s&J zfv~o=J`2dsb^v5&y8=ig9{`CI1OQrAb{$Yw76$-IrKSR?)NBwa8_?KD0sy7a$^bMP z6~JUR0)Y1R(g3}^Ou*1k?=L@lfn#iJ2mo|uW()w7$D0B0e*5^__HRG`^WOsh=LNKX zeZa3@06}&^_7H^(e%-BejV{cl}d#>kzDe5wgmm6b|KrCAQIA{-ezeX60oh&K=L*~NB)}s4l4WF$J&!tT7$DQFDv9T3m2k~xQI3ZN} zoSdQbcyr4auwC?=AMriTACXd6Bq8+13p?oPoB-P*!(7E|!sl_Bg|bVmYxTP*!ok zX9U_a@}6y>JalZ!2oueXLRa9rf22P-&zI=)N)c}FE4xmy$GuJ4=>T(+6eTm<2=HBF z8L=K(lvY7K2BRaCK~L4Myl?&O!q2f@g<<$UYUyp1>+ct`rIxn_F9RcvDkN9mkKV?JD@?)+9| zjq=0APE#E!zrRMe1+aFF7#lB%;IVlg@;28`j;pYDRS#Y zE1jLX^n>};5jN1esRyl$Nx9X&M-Ggtdew!7U^0AbaQNliiSN`7)~UZ&l4SO3DfOFq zxRiy1Q*{IrU|0o6c%SJfq{sn`7n>{R+sp+5ILsGRnQixM_6c3t|v|$;GhPdtDo{EYCCGSm@_t z3&WB>XqCZm;>X&DAJ6IaRG3~hcr$D2ll#}0o8%++#F$$~!9!ms{8PH4xuK=HCezVx zb&_XVb`ti?9;-p(#M6)HqV{DSRr`K5M-Ec9KJf9%(#CMoT{>Ti6k_=O$LjvW_ zD!7m_tvH0uzIbFOGoWjceLteVlDNUYOmC$I$9^+c6kMvdT-#a=B^>aa!(qEO5kuj( z7z9G@HWHGane4rxz_%Hvk6hD>svqFK?^I`T|IEeiLPV6rZXW6&(3&lzdLUM6ryud% z!y-o+-h%aID-J;~e&Lv>_i$hPmQ)LYWUjpI0YS;l*hR{9DM|ildjd)f#kap!+@FLN z7M1?&{xQf~MDcMC4`CmSNiCJHZf7zRKE=TYm7yIq-S88``ra0m4@^h;hB(I~DXnub z$7(aC5GLAEr9$D4(`a*gs1wnU)aB)DwIUjkbhyV2&cL3OB8KLvZC>?ZY4qwVXBYVQ z`0iG=KOdzv$U=)-{w`Z?t z=qd(Ym_~w$(odbO9kl3Pofq>ze^5DraAo)@x>FRHE^rXNe7%5)$GP+FJr z76zA4WI20%*IIQuozjyxI3v4?*D2&pzQTsf#ZqI8O|3$|sI!K0`|XE?xEJ*vpG$1g zu6W(YOEh?Wm9JyV3z}0_-%CpkO!UTXIax$B_^N01g#5X9pY%feDvv5N7$|5ZSQhzN zh)<5JJ081d8+_q4%5}7JEaE5W#&}SGIQJ&~HoeYr<#pIO?x4{ky-P=DBV^CiY@(q4 zFU_WKgHjt+wZM)J9qmZl`Ux%D!p;%qS~xtbU@dl=G258wmvzE^z<3nHiwcQ(#V~Me zQeo|+PH9$Seom{!Hd8fkH7lh{R7 zYwsGzYgJR?jaX;Z8P#i?YP@=X#QW2I{)F%Id~aA;p!B>w0hRzR;2+?BK%rn540=jI z0g6PzPHAbu^z{`^nVBhIFvwF_EYi(Q>y)pr79OvEDm+}DKrlN+CSx!dEEenL=H~0` zi^t=`!@~�vP}xlga7n=`%WPIIn!LT*KMEb5I;K|P6gPN8B(4b zflI62R@j$e3NX#p?`p6yBtTDd&HH+<{#1GESG9BXaGJL9=&QQ<*FJAWerl9@&TfzH z{GD#4SI_AV;@&mKNjEI@-{L-2OK)lPY*m*rEELrXwi%)66bWj5*R(bf_K2}3+7{t6 zRc@QJcI@bN_g#^zN~Bo(RhKzA&-ubJR{0K_sy})xcHFQ?!Kc+b<1<=5b`QxIBoyiy zcyBeXPrvaZwsUtD)p<@Z(+8v&;f<;5xU);dFCejHJuh?-5%@(!V&i>6aX0bgL>vz1 z+5Fc_Ceapp{w<&Zni1Eo*?aM39_nV@KU(<2E z;~ULGeHPTgoh8c?$nAH_~F-gi}%Rkv$D77X}ai{urz0eg* zPpY5=WeXQ!Fr!M&wri<)oXccw=jN{+At}5@D?rt~bB7!Gk#?Wzs8FB0vKKIx!CDjC z0#aQW%-9H|^&JUmv^;g5RY~^ZMdK@yN-3*ZL5$f|!2bAeTh(axm&K@~yCe4);|$23 zZ7FsTc*px+Q{m}j@gMHCG#VJ;yCqHxE8EUpWbIJ8fA0wXc`R6OvrpNbr99xBiVUnM zbc;h*&YXcYbqIH%0;aFZUiR)^{iqhnuR33GxgDmtrIZgoFaIpkhArbwcQ;|L@LEkA z;~6hgwUKZjXyW(>Ps~acD%$o#tsVh;({_U;4cft%Fu zBp2GyEA;&&T1Y#T2(eEDil-#<%QYkl!WW5x(8MJ(9W`j+E=gH(g=LWB%>pNT{mi7-b=rUQjS`Y;nk(q4+9Qi<@*6f-GS zeG)dmRJ0D)uVw%x8Er2GJ(sr73W3J?9~X;fqWUDd&L$z_e0ZNh{V?auWL$@WK&xfF z@ihI3%=Q8|88HmK6h^hF<%ldD_MJF{CA+*VITw!T)xb_<#!rz=O=Hmn%xm`W>wi zI_VtIa`iV9>+ck&DI4W$$T|Hn&j~B4uv|Yyr0*t8mq38?nA=j%qz9^TPL5GIOdc(l|vG$-X{7Sls42* zthK<71Z~OkNgE|o8RU&b563j)TS#lorm0=zOxbt@M*-h<6EV17#0*-O*HmS0HHu{C z>3(qaXH91OdO%GZtFkI!_0V=2vOLxB#{GAk?3t3KYTE%9L0{e(CQCIo<*7nXz~iNi zr}>s_6*)m!o4)bC3S!41phsL}ZaXS&A#e@MFd z!xrN+QMfnFg}->o&{q4%EkjZvp;W_Le>ihnhp8HoX<53P_g&hVf||c{woB}94YYA0 ScVdRx*&jXLEAa6F4F3nJ=)7G3 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/result_dith.gif b/application/third_party/dompdf/www/test/images/png/result_dith.gif new file mode 100755 index 0000000000000000000000000000000000000000..b76f48475b8ffc78ab3f96aa0a0da46669a8f316 GIT binary patch literal 2065 zcmeIxi$4^k0^9-HfJ4Yzw{8IdZx0>( z@Bae-sRFRW0}fvRC`theipGvi11Ex_hMrBynT6NcDqsg=^&6l1NJoG1jjz>+>?fTv z%3H)~M0wnScsP77(fsOJXz9WkL2x5376Ak2Za&t+c$ccB#SibN$g<()+W;mY?W%;ZO{E!YYat)5T$5)D^C9iYZj4 z)Uxx#+HswtAYNmU>iwPcHo??`ZIQWh!1v8DITeO2DKLDaw}o&UY%zrpeU|laMZvxy zx97)SNqr&r`R&P{hm!5uR%xj_+qb-{Ml(B`uw|nzuD7w>XCz-J3x1T}1vgwBvHUGa zNMOX9XmlFrA7YS~ynd~&@2=_2l^aWZ?XYlX{GE>xJJ%4idE6t2(4a(`d@){*QX8DN zL7bewUI>Q&L^c$;Q^@k;1EC2J32`nAPk$6l%sk+G*doKU!qVMb{(1)j!`ieKYWtrvC6|C%TlRMfq95!G}thAIevnT ze4LSMT6Z;Z4i9kz{OK3FN-x2j&7xENJOT7_dFEXHUCtUO>RB>oZH*zV4w=5z zP~kgmT1U;SH*>1APAyL=@lp~n`zH0Eb@Zhnv*ril7!3vqY$j}E2kFJK=xd~U%**;U zSfr2*6*5{Q>KhyB)eQ4izN9uJ^TaWGixyhQaY4hgrrm27_}z%e2f^>`<2!hMq__rw z(u74}o!`!rOClwhfG#$)XLRq1rv*(t=|JOXjo;4w&7K%fU$0e3n6c_b>48`SliK9w z7RA(ijXla*^}JzCt@zE+wMjCgE4%Y8Xry_Xn)s53X<)LT@DrNF-iBUQHIMV^Z8;`M z@fgpTrM^~PfKeBlYvQ(Vj!qHV*p2i*nX&2oVZn%N%^3%Cr88fk``_O1^h+tzIDgP8 zF$0KZ)sT~DLe{o+0*)C~csyxVArfXw)SfHedG4rl0>Q6+gc^H|q{=ovE$T`a4z6J0 zB&Elbx_Qkqpo-n~7u)My8%J04U#!b+I%I4P==ki3-WY9Utc|=9_^kK%hwg7q!Y%j2 z!)86_F37z%1!Wsw!tVcAPQ~tthuTInb{6h!Fo^0^*aJy-oZ5ku51;qhK~M+!(JAM5 z!<%u!-q20ShweqBWtL2o=Ml)qu0^3Gfv@Ghch{~b=Q+$31T&BUuXJmkRm&U+o^o?& zFH)DP5{z(ykLc2xU)|l3id*E!ly&;UEg!WqXy0VpIGxr*6g=v3xlYwb*MnrASUmdksoQRDChKbCx#6daomvg&BS!P1$%d!-(atJE z-ajw+ju?)WIJzZ@@Kj*ca8OdkrI3PDtD9jb`MBO+WAigiR!?gm4fF(7GIMDc6#)rt zLy`^=(XsUEnYd%GATDZV@5$9RH6BI6XAenzebvyohhE^6Z*eoq5Cq!;g(Y!Izc|;N W`+otoTYZKA literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/result_gra.gif b/application/third_party/dompdf/www/test/images/png/result_gra.gif new file mode 100755 index 0000000000000000000000000000000000000000..fb348ff9fdacd33d37a9056b30da739efd7f3c20 GIT binary patch literal 2821 zcmeIx`9Bkk1HkdQx1rF3RSYo_V&!p0azvu!npuRoa#PK*+;bn5Tf>*f`BdiG44bP^ zCZrx4Cbr~w$gR=StMy&qKjQn-^ZpY)uh+-=+EoL6?>hh+z#-rlAP^`aApwCvl$4az z)z#r}xFHV?XU>De+4A6Ujy$=!?mW4P9IX>P9PA(5JSNdMFO%g8T3CnhH7bo#==!s_bk_V)JS;o;AJ{afJwRY3FC0l!`V z0J#7spj?@G+F+_MNXjzPfo+y9A`ixuIh?VQmJ)Tm9|K2Q=bXM`egG*zk7lUJHdq=u zs#p|g*^l^sd+%p~myC2RLKd#t7hg=~I3G;~+^99qB3vq~`SU}gL#=J4E$P|xbH`YJ zzyRqvg22ZQgcw(ACU*#dA#T{}&=j($jBeTY>M$JTgsSrlwx%V$U(O%~BKAjX<|`GO zA{}r3w58XNZ}~dV4xTT!`ivekxUSgj-YK%6nyFE`l}eG^TVKYqTha$oK&b|rXW*cb zyjyh)Z8V6^hJ8#jnCh((Jxq$xYl+5bj8)m((p7oLEr>O2aoX?QG;?1q1xr` zgY2QfbdxITe$>0k8hnFis>r92E6~7+K^J$A4{VbAof$qE zl=nv^3@WT|vwAwAYsp8#x*BI47SPxmHkkm*-O=y=D9UneGI$-;4 zNH@&~i0G=#1&Z2cxCb5gT%8L(5oL`EmCasd7A+4Gmk>&wtF!K^BZ#Nj2hA&=;@d`> z7SkZMSxa^Z8AffUa38}p#qud#vEYT(o4OEb^HGIxXHLnWgF126r9`>s5LpUNxLca) z^AF6sJROjk;^m|*Lq*etX&k!t)dVJ#1 zH%_5Rx}DGbDeg*4b?hE3E28q;!uRTKENv#dD2e~JXM`X+M57c~YoO50F|4@LD%F8% zihYT+3#LZ$tNT9WK(ku2JMwo6US zS<`lqPUu|?7L$%3Q{b)PkO=QDUN*+y3z6`n4+_hIuwnK5#~CVeUd$VTX6G9wawbJ< z4-}h*Kvj~dkdWL{p{|xcK614%^}s>I zr< z5hEx4_sUZ3=JW*wtqo+fb5^)^HS*y7O@r>b4X`R>x zDq2$QuD$oUsodfDl@p`NO)Q)fu7Z;MmiS306TMz41pNyXOOL6kbpw>$#t~pHoy?N65D}NiV8hMm!_G8ImNgZ}P?t%b3>B{Y;a|p;xF#$8KA?7*2=-ZnXN)p%f zLa|b0Ae>e$uPZ*t0k;tXtL?GJ6|l;N#4+v$+)xF08$B>P5r-kfkv2p*>kQeh0b+{Q ziy%q-%&=aGkVXC&>Z^vDO?5m^ zZlBW%kH<5nO6bHUaZPU|*6p*NUT242*gZ8)uU?pIPi1p(U^B{{eJq+X@?bN%SQNP{ zHPo*ES4kT<%JU!v)5{nS3nHWDw`h#Ej`$bx+rjOfTZfmp_Sz2;u^xxu5=y!WA$pK9 zKX**9p8$5#Qhtm4x?bEnD6JF84rYmeKny~;5vl!+(o#PUhXyvEr)l42$tah;l80`G zek1Fi#&`7?a-U}-#yrIPW!`+vYcmUDQevaV-<-JGmS6hTcgQHV59GO1R7r6u@-`%5 z?Jw+N7MaUp3Xo3ihGxsAdDllA*Zpx0kyY59W zsedcHM!uclhy2uo1*sIq4G>L#uW-`(EZ!c6N?RvYIbGT?6+KPUk!dHu$AYDljp)I` zdO5*AKBFw2PApqtYFf>=qVV76oh74hMW}9FBTs$YG+j?%|6morV-`Xy$<$r@!1$K$ q3pz^9{olkRDkUB++87@7i$HgxmFHQY@EEGB=T4@@yb>QD!1%wegQXY% literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/result_mag.gif b/application/third_party/dompdf/www/test/images/png/result_mag.gif new file mode 100755 index 0000000000000000000000000000000000000000..fa72b5275efd9c3965e213bb86999f259f917b1c GIT binary patch literal 2978 zcmeH``#aNp1INF_%+!4=u`P#MMC6bh+Q=PBH1cR2FeRE(&YHtm!kSYi5{gZfkeKtF zSB`5chq#T%DP@Y#tO z#Np`oaUm{OQ^13GJj^8T-}4*L2le$~CIyf{fD%qZlasQ`lPIAO5(;IPm!ail`1(5Z z@4z~I9Y6rU0gwd%1po#BO#t)(zyV+h03HAW07L*t0Qdnw27n3x9RLOZnE7=HGw~V525#&wE_qY_0I`npg$CQEXdFB}T3u+Jw)-d@daX@g z_4)&!b6r^{d=aYk8LkQYd4B0_bHwUW??C%Pfa9fqM|r}ovO zNV8VP=#Y6Gz8e)~v7r)Ll6P*(H>leR8D0~x{vaYj+1QPAD+in7dAF3px~kJOuf*`m zD;o3N=#f;6Q5Fd=x^q+EN|Bv;CDXKm?ni1@CmPnP@4K}bNl{EPyJ_Q=o{{JD z_U@;UgG2W&={rA&Mvd8wB;bBD6b52`oVXmU@i56dDoUg#o4?ZIJ;zvgF4_GcfSByV zI;yZ=Euon<?A`c+Go(GyfwaNtB^~M^7p2- z4*m+Fiyh4=?f&V$NM<{~BUThz>3Ne|uq`(+<^Jk2OS}hje!`|f-RDZ;hyr%_7@}^% ze9P7&dm<#ZJD9giD7;S<6TuYy3*w|=Z$KSz)g*_G84a}x8bY&bx=}{AOLogvqqEmL zx0%eRZ~2q;bNZO91(v0hQu?rWZLIj2^7@w0k?4p?g~f?=SS)qV#`IoBEJa$2l}wVTp zaO50Q6-3S#R|uz157g>Je+us3ge14ynTsvfEVxcfST}Yi2Zf}{Os)(z{MFmkPhOcF zarlHZ8#-Mnc9p3JT#+rKy%pgS5*8cy^hP=DTau|aF1#ObY<=}{I?iH6Y!yY~zW}1J|D>QqAc5ctTN2{-&-Ex2egVYPLB3XMnXi zCL=xKscJp~Icg~t{s+yTrO>6$G1i=Oh*9ji3|%?gwmoSecHa^A?|q3~u%{~weLK~i zg--1s&*|L=D`P4}&vV=5?UOX1*=1V9ahTTj$R5ATzXq*#DmI@EJKwq&LgUP>--TTJ zV6Yc`hyPScH|WmhVA8e_8!Kh6pv>Lnv&#QTZZkVy!-%n)6nemIb0|9!3p^%7JCkk2 zV7f`~3@|GMzO`-rV03PIu7j7RS%bUm?GXPtg&@Z^pEW|9wnq^<{yRRvq|z(kxR=PO zq0?$EBPCpJy)X*T@PYx>>~P>{Rwq$-~4+zp};THG((NqwT=Ez12#>;4jLt+TN%e#!1^bb?nG2psT5gN!wsMwlm!5dmFRi z$C5;BiRdgX?pS^0rIj+Ixanwzig9&Hz#?g%sq+gw2EmW-kjox_)1MGtS7a98>o`8P zS9YfPSnR%?I5!vWKj#`+%&Wm51mtoj(K$YWw7MuAE9C4%Y}cf~?Q} zKf5QE-pMyKfA~y^@pGN|<1PYTvFNGa^0wEcy|y4LD0IPgLU7sf+2AgZn9Y`vry`?P z?moTXe$%&FYNL((?((a+pVJ$bcb^V%E5oYGCXDPoIz^HP-MSaX|A8U7w~f9;rH#AJ z)nhyKvMZv?m{W`R0X6K>Qp8d1X_d6mwywN#&$O3ra~;T@)pLi!F4>ZD_SJjbZ7r0te@BNyb{y;QVH?zD3k5V8GC zLt;LcIS#ElbxFc%lI5<=>pnwvq|~ow^lTlsaoN_Z3=7KAH=93Eat<`Dg@euI92?A9r*%4J~cfrJ$p| ze_0Zl=2qV-^_2a$Ab$*BIA47uP082Ak-}@LAZB#w1h_SzUor)UsHyCEVu~~Gl_2a* zm)a73OKz{D;425o`m7M-@;8acX=|_3h$_o{yDl)KeN$e*)s9cSQ2*AIwtBXcCS05T zJ1{K$wekXN-So{w_6C1<{l%0s=virvuf>Vl!Z20lxb5}2`b!I9VS4nUn{~^mJMBqrZFIWVVV5_K m8EXwO(VtJWP~T2e$Z?jrOOg3hhmBi1pA9K5Bc$OFWcpu0ox3yu literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/result_magthr1.gif b/application/third_party/dompdf/www/test/images/png/result_magthr1.gif new file mode 100755 index 0000000000000000000000000000000000000000..478250fd4f78a70b2866d34543b984aabe5e927e GIT binary patch literal 3019 zcmeH``#0171IOQlHn-f$hzR8_=_w{Q(BS<=qs5opDl0uMu+GZC>8%OYYa?3mfpR<$4(H|e$$>T%(WoUUBCg960 z3m}02CIAosFaYELKmf240DS<=06+qO2EY{nF90wAU;)4ZfCnG}015y(08jy_0-zoM z8USzR&5rx>t8M?|12asMmPKCxEobd0jPB~S| zpZB5q7x6uc_a?8O*mxOn3@y2c#$qZz4R7eNTg2^;ZOo4 zi;7DlY+@mi6fwAxp5NUhkyHs8H5+0tBQ@iJh67Ai9!<%V*FKa_{3c`i^VUJ`@vwe&M80Y4PXbINKyv^#r;y2_FVxbQ+x9*LRMw-t*Dcu`4 zXQcFWd^p&tbQg_ae3sebKRY(zYqi8?$m{ZcBih5Cl$Z&x=o}fbS(y_N%iJAQ5gouh z&wm%~q296fj&a^F_@9lhabL>TJQYZ)J1=rcA@z(McpQD+hurekauU}jl75nqWz6x5 zEAWu0B03dVze?uoTfg&Ps$TaAym*+8xwI`T;!WsJ%LTuTB7ef$Elxp>fo?il5q16% zX*ZcT-5A+`NSV@tBViec^X6y++Px^1Ipe7hRT7R%Tj z@#+mfRGuze@g|(kuiKp)aJKYi!&pnr%ld?+PD-R*6P2~A(x1e+{G_mF*kth2{UQTo zZReSeu7)d9ADdcFOUn4WE?c6^^JKAHD@Vc*5iq!0Ureu|r$t`Av>#T>u;gL`SJTEM&fI_Bs5 zG>saYFS(7H-E-905adFI_A>HA-R$D*i|gnI9jna`jIG60+>;z7?iK|JAY~?72zOR9gEbR+ zTS9J?EnC)Tn!^1neSL4xYEvU>JoHYgux++x3JtTLERH2hT4+dRHQLY8ui>v_Yg}TQ z^3`U}#gBE>e7diEfF<*iAZ`%`C-Lo8X!*$|WKF&n!ZyHiImPb8q|j#YpvbGdBxA(1 zh(~7MO7*oYS<1BPsW;B$rY%>ub!%*~9JIBS@XX{Xs!iwkiJA*dh;C6g6bnkb^@LF1 z%HE0JGjAS_pIR;mmJUS-Y*;J$^0^-28e*k_$1^Y7^nJL~T6E%*rDVBl@!_XLf0sSB zkTfUNRE8R(tnR388@%c}H@&vu!mvdbW)>+;!IK;NP-neLK7Z5c%eh&6pdzL~^;Ur8 zF{Fd3Yhm$(d!6;j#({bEwQ_f1o2pv9uE*cMUsOC0!|pgt?6i_J%q2}-6krO;pEit-aTI}au zFkY1V^(Q=8v(PQE4xjpIb=TAhJD-5kl9i}nMTUYyJ^N}9HsmRQ?|BxrWtr9OCB#vQF7ic zuIDffZ@Pq5^m$6z#q@!@9ulGz@{=gqYHXOZ9$G%rfwEKD5!NdsDwl4Ea<;tIHh8&J zS#u)ovCn#Y`D9cCYCGmt$@u-Fu_=VgUdm^dRmVNrQZ&A6f+zHWIUd?0N3eWpR4HIAs()@@Sk#6YTCobMm+?!6lfQg?CAV{K6TF`W zy-p|g&RE8h6mx>ttTwQJ*+qq-h518P&Ti+J(MTSAs zdK1J4sswz7h+2qzD&}P{=Uyxdsn+6wVMWSXGzbFb(ccjL7#2Mrug;wo4c*5IZohtt zyJ)$^c3h2Rj&qE{DeU<hOr9i+{CM<*W65Nzp|ZH1p*ybJdAMeL!D^QHP~ExJh3n!6cA9qBF{~f4~8TX5)_3vi%p#iKb9E9GPzONE#%RIr|)iW&Reb<;f`57 zvTAI57F~n--Hk$-Ka!1fYJKzjGjZ6?yU$yx+(WJ|U3{N=yv31-^`0n46nT2{@Qlm$ r#9et2zoxcokgE6D>t!>#=M=Y)*gvbkmEGCrC3=)JY^b9NL3aNEsyyq; literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/result_no.gif b/application/third_party/dompdf/www/test/images/png/result_no.gif new file mode 100755 index 0000000000000000000000000000000000000000..e64739a4de95fcf5f1f4171bfb8b29a499709f88 GIT binary patch literal 1410 zcmZ?wbhEHbjA!s*_|5}^0Llvt9RC=IQCy0T-UvP-vwV_AvBC1vMH%A(U;eqKy*o-UZE7BaIa z@oc-f`nHtHpftDH)|qUqwS4e06n$uXwGjby@b> zE!peye1o>WJGngY*T1_KCZ``B5#(3vvDx|Xskoq7IiG~p;g?swMopJnu>1S_2Z#T4 z%lq%!^YinA>CPez`}Y3+{^7X2-ATKBe}DhjAO0@Ve*gdf&vU~<>KVi`63Vyhx-vAf zo6U%C;xc^kpyh+3$AlJHc}+*vOYtG8RWJZx8~IzHP=d74L3fyvSpi`tKIK7G_J z=_DQ-Z}M!%T}R_*FCO$+{92(jA%@d3CDv7H=b|LhuPamV$i z&1)3f^}Lh&Xy%JWMVn5DES|7UQaPZ@Eh}?|nOFJCWivh<6=Wg=uj+UN5VC^-FufLB8zF4H2rV-)uS)Wcs34 z#%QI&q|092v$rbovcBDH<$7Cp`|VwBZ@1p>lFr-ubWye5&ev(Lb9c|1HCu1D_R-aO Xdmn4L=KFnk^;&Po45Qpnq3Lc-DYi;ImdV9&|S9gD3edo8mhMBwV_4c=pdzyu{ zzeWAfcyM$AyLn%S#irC$6-&RDLEpFG>TTP=Hf>Whmjejl=#EA=&MK6Au&vA?rk zI^5iBdHtT3KzZKj-SWTw@$TGq?BNm7{eGP`J5#o~&bH>i^JB%Am({Dy_w?DW|JK6D z@UKJOf8U;;pI=;F9e;k`pYoQ6w@=Ua-~aFD$=h#V-#>qUZ({4muj&sP-qaooZeUSc zv7ln9V(Wt@fp6QT^EbL?ENt<(TlTQ+o9~Vb%`$B>=C!jnYCP(E!unmYOJ`PkjE~wj zjYmZ>Co>*LX&=pa+;)|<^hTfVzVFHtG`L=hO?3TdqB2SG5xd-EERKA)HMs8V`< z16x*F+eXeTjRjiMDqbuq+jm1`@q}HT$-YHySubZ;{0n)xbWYVx<%+p&uU1aV>&#j; z%`LC$)zX#gv{p^d{;*RjD@|{umiFRst<=|R+vlCUvThF-*YZUN-Cm_HJnB@H6L!Yz z^_$IMg0B{D>AU%D`qrSJinZHrI+^R{+}-E$cKeO6(`$F$JLQtK^U1v1>$bn>;$FAw e_MzYF_Pn_y{chL0SJLl;{tA`mJ2EmdSOWlN1V6<9 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/result_ok.gif b/application/third_party/dompdf/www/test/images/png/result_ok.gif new file mode 100755 index 0000000000000000000000000000000000000000..f8699883913c50c8c22634cf1c92ff02e90494aa GIT binary patch literal 3547 zcmeIy`#%%<9|v&v&1Gze&7GuBLdsBKxvtw%$t5u>6JoZxj+t#Xmo=A`%P}37hG=p+ zEyNs`(A6!<$)!zwqf$ggr<(6}{)q2S-{<4=ct75+&o7_HQL=Zth?$BdsnDGSZ50kwLnUNC=q#1R?}Mrz2%TkVp(t+S6G9GO+3lkmN0&z4AWKHT;_+D0o;S?m z^I801j*O7Q8RYQ!9BJe~=gJInxx-vOpDT?50aq}`lNsjmp7R6(o-_&;_%d^R{sLbh z;7g-W$QMfMvOs1*AXpX%g#u|5t_x+Bh09n}af&!!n!CWj5zzHWy?zmt{8B zWj6ose>{PmvKJtG3vxh-+_DJfhZ9xNfLeMx%k9MoDhP7W33@_wKVQ$(hnox7>RYI9 zOV)+qG5$;g|9Yp6+hV^`brg3MpusYz}I$>AImvd2uU3UJ2?J;gS6(K+`O!rze{RfLM4)&!mQF8oAPeiStVN zdUiph)qm8j6q$Q-cI5SKJi2OE)X9SV83i(QA&@O5iW3*BTG0J$5bAlHydV~4pW2gd zH+xTi^*zYEFF{?83NW-P2};zpK65iDdw+#v<-YPgrn58J#Kl{6kFV{b$azwg)#naU zdVUFJHAU-^Z{BEywoiRsq&;kl4ESeW`4;8&Xbjj7EMFduJ14_P`=lGhUKUkb?CC@w^BM= zCt3WuaP=vKiS&wZhvk}=?DZ(w7ScvhINAi)SKe|5cV_F;@7ar(NdLHw*SPQu zPe#t_WmTPGqgrddV5Qb~rd)OSL*pvwDU?~N*&Eo__?;7@+e^EYZK6pzQyDXUA(Mu~4@?$*2u{c!QuKGm}Jq(HD?uR|?`styS6 zp!Gdg0PMbVWvsc8VG#U;Blxb;bLo0?(i4NTx?ZS-Fw1Gi?RyM?;bMZO`w#CYjzbP5 zPeUQ}KcZc4T?`3nw`qMjBp;5_Ki5k|O^5rw@R)jpyaib9$M{(}H19s~YjpCT3&JSL zNc-)tgdQTqcqi4$G}Gj9cZbn3iGZD&d8#4?Rn3Jq3^RSP75wW&QhM1l- z2y7zu36qJBA_sm&l{EPOMl_OsWJ-j;_pZia758Dr;f}^LBo05@`~$zUJ7B4BxLZ(3 z?iX0Z-A;;MrPjE&2VwR*n$$A^SJQOYEUpQz$0QsGJ`3>pW2`risS$;8=e|DI3-i4m~r@lSob#%={2ZPlZ1#6(A#n<_T{}A z(e^aMxt{wjJ-vx$6{09dzX1>#rD(X)qvE$BuU!Pr*>P5^e$JkzKWNYJXgAlqT-0w8 zAfFqOi-8nGtJqr>=N-Lyh(SNUYvr8>?ezU>z+TD#IGs|k4Jxm8a>pQ4)KiT8nGL%1 zz-QmSY}I&Ho!(s!FIS7t8mSrmMsp~p8|p(63-7Ni{}8E3#woVyn(J?=pn9_*Ds1{2 zElZdZGO$GTc(sC-xIAYUrRGY~5yc&!;Q)u(Y)!v+nAMwG{5r?WG z#9$vIr#m&>`w?ChxQ8akdTT#FY4mwj#Bi2QX@maugBn5*!wp4f#OD&f%8iug#&OedwX46N8R->jG>gd9yEFgG;o>ZxgqPPkvTYgr%0&99;PT zq4X$KIHFaLLF4qg3{)ob_x^DaH6J;G1PIt#c;m!a_gx#u5$O>vGZU9oKjn`)%thSN z_>~Rz`f(=j{pg)7phzga{Dgzq7$`RNlF=8qP66*tyYQsx&bjQV_3j_WD-!%9HQd<3PjR<<=E_OQX30v@{)|H-q}8(BB!pAeyOF|f)9c}D6`}6)Q@ei+&{*o{2(urSTD{IBn$fK0kG?%o2qPCskaH)}d2OZ?18?2P}3CDY_6@^Fem8yN~G zOg5wfgVNP<(+$gXL5t>}RFcED;~$qLY_<`9m69FS@k~u@#G_%BA`@#U2I71_hXSGSZNXI2g+Fe*p#9xTSQRyJe(Z}2`+p* z?1fa*SwG$7a@xnB!j*FNT592^p!{R)g^1q5rFPv7V9|F!hM85NQbiH4qsSEkmXmY) EFN?=bKmY&$ literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/result_oprbug.gif b/application/third_party/dompdf/www/test/images/png/result_oprbug.gif new file mode 100755 index 0000000000000000000000000000000000000000..5fac687a43c9639daa5a902231868a08914bd51a GIT binary patch literal 2427 zcmeIx_dnZ<9>?+2h*b_f<=DhNQB>TkM)lb1)Vz+pA}UsEN6_}#wGWz7l_ExrNDxh> zHI7grTB>>kwP%c4=crMd-f#Oi+#k>Lhu7ot^ZW7mSlL+WU4#39tU<@1Zy*qewzjsu zzP>FWFV7i}m*)w{0y1G0NC=Wm+VgNuX6fA&3sRML( z69GW!bP9k@?*@#H(!cpi2M#846aaL7o(TZTV$B0s-|c;O{N2}o{IkISe}OCCKH%Fg zfOy#;Ctm5S<#bvanD3H#mgACfCXWn%`eR3hfgdjkILD&35mvcUCZ>nt#R$d&)t~U@ z`p!yb#Ts_>z|-+tX5}JLt{9JpEW1ZKDMv0R?~wL2hS{X+!MMiv^^P^RPi-kp69nf3 zPf#y~FbU!SW99upDIDAvWv^!mr*LEl`~(|X>!qdn2&1hwG-${EIikrP)W`#cOt^&3 zrS}bOQ*^<>Ymuu%5D(a`VKEHs)35}{y$w8EVb{srnW0K-FuMgz_jr4h?O)xvfX-N? zWeTd=d)LJ0OZ7&q3g37^J$Pg45WX|}>F?~ZAc?}DZLwYNm(5-snfa|pIW)~^_TZFJ zjpgYAEuWxOfW=3zkMtK<_=^!gJfCnPJl}@w%}W zs`Lb{5UoKRnnkMJ3|{aQ+bV_s_d_=mm#in*FjJt2XRRcb4JZX7%_aE|_a}+;+Aw7h zTG5|t8Lt@8^9ikxq;s1gQN%U&fEjC($?)@)9tA5u3AJZ?8L$+O(xqCbBq zI(dp$&2K3?RYf}&bRf!=WOFtgI5Z>|Kx$MpGQ&SWO{LQQvyB&q4RN0Ks&{Kbnp9Uu zPpsAW**0xe5GTYJ2@9g)>gDaI#0{dAASNumHZi-YMW)9v{`MK?}>=`LFLz7Tu zqBeP|(8J>BgcGJXpycL%m7cGR{6G$F8D5K?CAT8Qq#E!;va$_X6LQ zR%1>fV|f~vXl?!luw?KUZAR|Z7ZYBELjMjvbbVnen;+V`7%!m3rD=8%c9}GFF?V87 zJh0CLb!e^?vO}5l&z%Et1vw<6xWhWWpm^kBh5L9E(*3XTsZ>>@^4)E(G8MSO#pbw} zuBgH(n5Bb1LG&&~#-&NlDV?r*%S9%y-Ku=5%L?xljGu*!-7}b1*&v$o-){$@7qxpG z^#Z6`%*Uygazy0=AGaI2>%!rqU98Al`mO)v)oy;^X_HNhNT-0)U&$3KJ zI3vc7h2=5Wu-UtlFe7!uR_WZm_d`_HuUNs$tA-BR+g|-K;nLshN5+3z>?cmo_`=phJ?X$bn0JBKNB}W#%>>ycAp3$~%)nNDNx3M~K{1POF{0z&N5G zYdhYF!On}QHgsS29m~#7sje4Res~kF6~5gsEhZxI@?BJ0k#8(S38`vxW49n`t-sh6 zeL}HQxtbLfE-$hfY;LGflsfxf5gbxwB19q^6(abx1rl_BRME-E4TNjTHU8pz6p`7; zr6O6hZp+DbOn7i!%UNb)v|Z$!EyfNH*d3ql3?s*sw<^KU3T<9%z+iDJTnK%HwPh@H zH%~X__vq&#Z|wP<%5cp!MhD^}|M^PXOH*#Y?D% zkma2YpSELIFpJGMNl%Wh+$`2uBk()=V&6aJ+j<=4*#el-EPIJ&2)BI@|fx}y=`mh z>9!6Ye_?YA=ZuKcSjT7&nT4rV!;T>w$Nu>Br0bd@w_^x5WVN_hT&o;TVb8~={ TR5b2;Skck7{hPHh2xRy_4e07{ literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/result_thr1.gif b/application/third_party/dompdf/www/test/images/png/result_thr1.gif new file mode 100755 index 0000000000000000000000000000000000000000..66ee0f62aa012544c612286439f1e7535b675db9 GIT binary patch literal 2490 zcmeIx>p#&T~~WEKQDcn8cMV zr)zY%tfWghZ4Mz+x^_uazg^e2>tFcYy`DE-kI(J*; z?EdS^zyAKue+&Fy3uyiLfFHjA0`outVA%uy{NdaqB9c~xE-PmF!g8YcJ1$Dr2uXS!a=GtN>(JZ!N1JPEJZPx5%@f4O50=oSXz}q2i6V4y%Vs%(5NRVEh%ZM_ zL`uWAzZ_{Udq>y~=xIUOoYwjTKTgHM0_4n1k= zwNBtL-d@(`$(`=CiAqhL59|HfeH>}5L;+s&J;u8?c8Ph}udkQA-Q7Lo+}1UooU{}(FBe{Ov&7`cTqqHnk4?3#g_Cn2blds# zrhC$Gzt5KrNQv~Yrl8=y8*pslTG+W)kda<@at>5ulkNSdxh?0q)XV08{Kci&m5_l; zNppo4#a>|@En7XQ=}{(k=6xmS4MQ>!>^Gd7eB5_F+4fQA-EK2)q=pu^Si_YQrDyGY zh_d{4s)d6U@Fp^rzeveTq)Yww+XOpb~*w>x!3 zf7NrVUgoRXy8_-5zbyd?l~j^?bHLnTWXp?Tqn6gp@QHxZU$Qqh3YF&4)H`-c!l}9C z4DkKCL#Ds@wYiO)TrDJ}+ALmz=`B=u1aU=Qw;bbcg_3SdLMYvw)82_afCE zHrEb#KXz(}LQy)T9V5$@{P()Yiz^}B#c4e6?nZcz$ZpotM1wOH&@#v9v6mn3a$8-3 zzqJn2M^My0VjZ~y4lgV>8t`xrLSI!%+J^kLIjcXeM9It)EJ+3{-M&2sh6#G zWmmD<_u#csBj&|$7J*z<4>N0$!a0TB`XfO`_J3-&#^DuNz6MDC^uFwH$+8Xb=S>!|k6+x;Yge2ow80o|(8-NF;wg!ls3|39 z{giEtlAx;k1Xh$*cli|(m3(N4Hg&C5j|np?K4HG@Zo{aFAefJQaP;Ed1h}WkSvAjkGv{ zZ|=F!64Zd$>A+D^Ip?cK|HOKmO+nSd+wEC1t;7!8=Bt?vhrZtWv}m!;0iWmjmobYs zPWx>h_n(*lxnx;eCkdIZ`T5a4{X^nz6ne*AF=(A}Fx8pa;>u}op)m&YVzYv{%D9o) zry^*r95Kh`PVs}MqW;fvE0h9PJyM1tb-H*RtssbD|5G_uS3%;)3Ptw~l8+CB{s+p= B-6Q}2 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/result_thr128.gif b/application/third_party/dompdf/www/test/images/png/result_thr128.gif new file mode 100755 index 0000000000000000000000000000000000000000..998fb74e2444b1ddea6f3366e24119d44e27b4ee GIT binary patch literal 2036 zcmeIx`!^E`00;1SZXUPhy_myrF^?F^gmY0QQXcn)5HV6=-ejmYYojeR&)BkJB&MQy zWsJ%rk8T{wD~~)PMjj1Gcm9j}L!a|K-#_4c&ey>ag)|TF2b>1*0S7=J5Eu-GKp-#} z3=W4Q5C{ta0>MszKyVTeG=<_WK%saG}FgSR?!509aeSkd(svAgXOBI)pJ(cDXD36>A*$ZcLO>y7<*?u2# zuEa9E+N$ee#bCK>i4)z4{bZ=pJuw=gW0sT~Znn|imq0-m+8{9B2tp^7Z;I?Uu-dMF?BiIYNBRy24KFx{UfmvGTJ zo_pa%=t#?L{d&w?PqJwh4f!LY?;Y+WSzNzvbL7Rfv8KD0jn%=N=R$)Xm>)X4dCgd| z_5|eE>`?aNr#ECP(*>@B`97)B+8rCXRHh1y&~Ic%@d|=Tt5#~s?lQ$bg`VRtchS>T z3ViQ`^?=fB+-VrnH2|@)pnz><#?gaft|s^<^GC|nQ;y7-XQ!5ION+}xN7BFf~c>W`QdGnSuy_*u`zBI zP(jUDnND2gG!D~^IL*zfLz22HO2rQvmT13Nrr$qImRkSa2DG-CA4qlKY-@KGo21nG z`|Qp={@jAy(gIfQk*3-X^BJ8jGjkbn7BOBs^O}ea=F{k}J!+Hfq~>oDyr?aFKc2?7 z+MB@OS1T`dca_u1;b|gTryojscC{-ut=%>ZD%=}4s~2lqBO-gJ#gZIylu-tx2^;B0 zlC}#cnA_mL?3^_Y`IBr%(jC)XV*}(8b>+LajPH0s17#`-RNmX`kS~lsg5VS^84NJR zEjdrx5v0pvAnyJ`qg8A-P`Vv%xH-r3s<{nZnL?M$B>5TXpPtk!BYIi**Co(SIj*UO z3F!_+O9Z#|%E4|RlOQVnmWJ*=!;7S7S9$70HJ}`^i)k59rhNKiR3^hc*Es0URo8VV zuWBlpC7=EdiqG}iUC-xMIi>Ily6pqk3!;|LaPrl+!Puy*uDzh6_mO?@jHtY!Sq(%9 NyeGT{t_}cL{s#`uD3AaE literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/result_thr255.gif b/application/third_party/dompdf/www/test/images/png/result_thr255.gif new file mode 100755 index 0000000000000000000000000000000000000000..a7b719ce52f0dc824e6aec11cd3c167f6de4c12e GIT binary patch literal 1574 zcmZ?wbhEHbjA!s*_|5}^0Llvt9RC>DIb<9bEI8Q2 zEG%S`5%AEVjaOE$MWayZaF>9f))^0mWVe11)gqS4z$eFh)n)rkB!g1DrsyV4^VxAJ z)n}G|;k}v}lb@fPWyC*8o3>_rTjAE2`PA&rt!>${TRq;E>HONB^MJ9^`P19i z-_|`?*v@OsW+Q2M_h5%)@!B=p3!a~tZyEngN8#C{eKX{R*=(&$Q?E07|F^v>wkc!d zq{Q}Xz5(A7Z{>vF@4J1=EPt6-W3}yRsqcA@6>1NM-3vAS{IGa#^p~}htgc_b(E3ka z{anB{@AnKv?fdQQsw;1>U9=b9e{a{_J;_hA@B8nwclk4S;qm#^Ec-%b8cH}L7Nj4& z_*|jsY34PFW@f1f#i$0&8*}Q#iXz18L^5y0wR7iH1ShFxM#xw2ZF(LMrOPRBpvUA| zhis=ski_(ozLOD;`;}isJnH57v|>WP{iPj?s&sF;PoBuBI5UO8chifcsWy(1x2Jen zoqRGi;gHJR?wE5gp4KErX$qH1d(K=ktDvqjt!b)ZsM^$wbCnA_KORg^pILcKa>bk} ziaYMk|EMG2@vXqivHZ@BtYk~*k5BU{yCRt_G zD#Wp@?ESY=&oX0yhR|27-i=9?*^4&DZcClH`qin`3v8B^z3y41ru}-uM%DHe8>-oE z&)wXhwJUqe@;}4Y%$=zW>~Y2Zi-}riY2QpDNg8 zn0BLZ-2<;ZAJaQ}|7={qrQTk2ig7Z}rsMj*cIBSYe%<|X;}PnlchfS9VSOq-}4yl40JlX>7?=Y-vO7N$LVgpUi<6h)}2<&vR@bfOIrHvR?ha= nt2f;a-z}LNKVA0w%+l`cZ+vGiebP0)QGeUE{9FMm3xhQP;0%GD literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/result_whi.gif b/application/third_party/dompdf/www/test/images/png/result_whi.gif new file mode 100755 index 0000000000000000000000000000000000000000..74ddabc0cb3e979e2d6fa0409a7b814057ee4972 GIT binary patch literal 2453 zcmeIx={MVn9>?)mNB(AWCruMQyPRwFbS2ZKU_t`4{ffc|CZa@8i!o-)nX@2xFf+AY0Hr=qE53EG{lC zBO{}tqN1gxWnf@n0w55O00IF807@dc07xWv0EKcF0JNwm7*JGnA5c+|003H3LjZvY zfSMW-ps|qx0NUPO1ZZ!s05F*~0HA||jexUc`s>~T- zm)~Ly?q183zk=MA$+_E`3YDf=o4BZ1<-i=7euu;UR)rFgHz~Kt%Z^Vk;W(}bLjg|Z zX6bbEPo>o(mCog;VpQYH(N`{UQK0vYuWo^Oc){ZE7rH#Wryw%$h&f9p#o z7n0OQzsXXuN)%MVs}nk_>HOMl$ajt;`wM3JO{tZjn36>z=&)YaHegVJa`6OZ zy5ZIkILe4VzPX8h8?&>?J~rO=?o5-s6s9ZASnPeOAHZ>FLuCDd^a)XCj~Y(!1Psyr zkEQ6-t#$r8d%|vTpEIcvT>X0+2*zSx?xkQOF9j3FrT)Uq2T4XXlTBfNw$kN2wm6fl z`P_V8*fs|rzI-ZGHi6kvDS`alEjX4~W!LN;O&^Mu_TmnW&4kV=(mZgFFAGfgQEn3_ z;!i8>E7?demlZIa8m2q?x9>gkA=49_;|fm5gSO^d~1a6aG4?tG*5nxi<6UUz#4xqvbd~7m}5E?Ox!(Qd&j%Jp-=aZaLXh z7Es2P+?EQ@b2S%y)s()fXMCuJY6x1j*HtD~mOjgUe51o?<>4cUj33TQqiP`=hCCu$ zlCh&uigXiGBZO-fwRR!QT?12=r>%DoNUe@)#1vozGKvcszFL)8?au-N@@)$W&b>Ty z6i<78{bluYT30+GIQIfRUZ>oK@##f_!k(#5#h#~}F1j|Xsob_`@9kHEua0AS1fG<*H;Ebe-yz;vRiiRTf>NT z9rpF5jqz_aBjzo%3$C0lUx(8^t_5B!BD$Z(Fsw2CA=Ubw((I0hNQb2^#K%gRg^P8;9pC6r?NX~Q70c=b>L-XIyLfmZS)teo2z3C&Ct^N_<(F`P^PH0U@|Z_J zZjt?g%TnHj;lb+sNk}2BqAWZ_S8Wq7Y|y35Cz3Vg%_mCP@-`8>?8lV-g3>U=PWqL@ zjwVCjDeg~4dql*rW|jX^j1_`@DM3PX=QeqT4dC3^MPrAO6w%!M2SMyKkHCTp?TcIrmEyIb_LVG z=IoAEcEodP!+%X+6U~YiVwcVSJE0tlu$&czH(QvStZU{(dF>3-K*KX)VNnewYjxwM z?C#$a{=K8L`M&23^MsyAeue)2`*;Uu8-+jn`o#&$2=^u^;-TWktl*CTGahX^feST! z4vFz@6WCmHl_05{=mxf)UVD;4PbuDLy@i-w4U5z;^oB%wo2WAW!0GeP{H3YcIqXDbkDH|KER(gPU>yf;t_awecx?fH6-O)3Nl%Q#E zX!Jp^m7HF7B!8Kdd{EDyb_~~TKGgYcgsCMnl$_Gs>a#V42X=<|%j%~w<&i^V;)aiEj4_H&)fpGVrP7Yeu)V$= zQH2aOKY1&+tB8yAWX z`-FMVrOv#r02j9)A|XTBN~6%o=}S32OgOoRq>h^J?VpnUQc*!#)$gfjE3`aEJR?GN znzggH%5W~XWUm-rH=&hK$yB?6YO{bA2VDSdpS-WnM$RKfBwp(xjcOo{o3ybMw@Jn zW#kv@P^EGw1~E5vN<`RRLt2x=yf6&Sk!>-1|MqBxQON0_5zU0m#t0W3z_*L>IUT& O*WwP>vywp|v;P6AlG~R6 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/result_yel.gif b/application/third_party/dompdf/www/test/images/png/result_yel.gif new file mode 100755 index 0000000000000000000000000000000000000000..681d0883ddc3a641a587dc1d4be4bbc020a57e15 GIT binary patch literal 2963 zcmeIx`8U-69tZG`wK2k^uV(BNX;8K-Bb6;%NZe~1Yh%swm9aJ{G?rmd*6hkx(ijmV zOO}#db4wZfAToRr<=YGu@2h{~p8Gtn^El6+U*|l{EzR_Fy*(idhy(o&391g-ASb_@*f`UqLcszu! zawQNT!huwKA_NhM5Rqz6CPQSJRc2Li z00ICM0P+B!0nh*d1As9ARsh%o;0gc^fFJA=b695kQfBttrp!$0OzqbIv_91VW6zoLutGoOHqNb^K3x>&uq~XK|cE@{B zqJs7jF&a4YbV(!Qe^A-D!4xIrV^fU1f=Tvin?9f2QD2kdBR3p#U2<49d0GkVf9<^Y zx2-%!sxugPSo5LUuF|U1iuQDjVjmk0b<-$L5Z7xs$}k^F;O0Aw(hHL_O5_ui(u;?T z5{YoJGj0RjFM3kCJ9uY+Q?0EaxWZrBrjf;Oinsl0t4a>P2CGH15 zIWA)+(s^h$(0}a36!ymZq|)H&*p*W66m&Bx>{Vg(wX}ZpxP3akBY@%Zl$u=bR{yns z;SN)bQJk82-mikxdt_2PKttZLi1_|t9)nCZipAZLX0qk8NyWQ z(UuS6kPM50WW68Nm7#J!EaYM%%L1hC-`rO~ly40>JtlKps%0Mr+mlX}@c3D>5?JSp zuKi_h1DAKYt?A+&xnC!w?3)?t80%beVif&XO|>u|PnG*_pkLB4SN{{$4l)v6S)E)i zG6kn@l9bKhT*JzR>TU3qoMQU*0BWi$iSh(HHMo{oW9t(_%zv$?T7(*Elc&zcDOaQ} zuEIB32NkvN6DZ9^#~KnmQdB!+(O^i`0ZP#!|B@{#&$7x)XN=}Vg^?)k@?4>ogvy@}L$13`bX=tG*0##sL4O-KGxe)F zr^sWZv6_e``}Qm9OKiW_enHr#Ap6?yW(=UmFngi-4LJ#J`OoTBj z-94-eL}63JrOLfOO{8k~nx~%*+i-ZI7pb~)$99BT`0of8~?G@-v<%Ee~J z3KikYdRPX;FFc5<;@b*qlpbpQjL6H|(M$qoFM7Up?e-3gRM4%rg|3(TwUp;sw!2)a zHD`c$S1#mtrKZb0ZVf-Z*UcNV=CRS4a_+U5@QqF_*&mF4ZgD$$+`!$rZ-z>3D>f?V z-O94R>-yu{CWYb~w`Jye{SA+x=+P{^+mZsyaIqr`UsfrHxaDQ!>5B;cxLCn%M!x1^ zo{8RXH<5!QPhr@t>WM?RvhBZ-T9Vi8?nsT4&H5-APA7<@rmW3wzN_v$-nSSWMHx%+S9SgiTUC<~!jql?u*D$Aj-m)%1gtwA6&)Mi_;a76tj2zn_RaZA{D=qx& z!((Cty<+xfvef>-ZI_vwT>L?i)3vS?uD0ma6-A`tt-TgyoZfsgQYRlRS=t^7$d+7I zPdm3%reuz~z&x#)w2Cc9e}|dup3fqQujqq>`n2-16$>j*49^LRWSN^P$~pyJ zq#9hkC#|rg;ZGXiDGN(ij_?t@BG84h4NpGyMnZzr+BY%y?cR;U$FoOYj8 z&Tm+Z3=UHwFh4y-wr;qG;ui#KF47A+!{S0BebZ;BLZj=6duL)|CB43x<#)fa*}O41 z%^cN4(xhU;A~r5Nt98BROV`8R2hDsxIo?6P6r{2`%z!x{yVRQ1 z@8HuXfR1CgEVCiO{1=YzQ0uGL3gL0?1W%+>OqV7*Gy}7a6)DzzbKb0eKip=-D<#dk zm!ch>j;@_UEk^aVi>bxp4_}j!eekAIaU*YbMnu3GRJ5d|eoVQ!JoXL+{X4~EIPJ6+3odg%m+0Wa= zJ%W5TG2^1Lt>G$}uDgCOha)`nq9;p3zVbUy&gScqRy*c*^m$b*uC$F7c;rRgpI+@s z{_#OgJo4!k>1*crn^&KQey3Jb*Hmis8NI?sJ*lvDBh1fCLFfJpMe4Gq literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/result_yelthr1.gif b/application/third_party/dompdf/www/test/images/png/result_yelthr1.gif new file mode 100755 index 0000000000000000000000000000000000000000..6049157b01ee7f59867b9e38e5a1959d4b56ac74 GIT binary patch literal 3007 zcmeIx`8U-29|!P{eJo|DG+oQJgnSJV5z=MIR$R?3dqvg^GSpb6tYhCIWE+uv8Mka> zX@uNCm@Kyu24k5fO9m}y@&4-H_@3|cyw2l1e}0|wG`BQ6r|WhTvVeA=UxC3OI2=MC zAUQcmMFrB-g!J?vJpuuRf=~p!l@(-lU}`WL4WUzmotz-2Y>c}*OrP!IZ?9E}Fi=H%#fh|WgL%|UYqa^P$>#OA;`9Eh_6+u4D34g?VR zbua+n03ZO613(1;O#t)&KmlL{02%-%0Neq<01ylS9smLWsQ_dHPy|2)03-lf0H6Rs z1%L(s9e_Ci*Z^<<*a82~|LzBnzZURo3lMA{a)U|16ykeg`31#I6Kxla;svCI2zj>h z{~*ML(RV{N-OW=ZjZvQwS?+@g%Ev2B_0T6xvec}p9(&`SCWT^HyKKitZ0j7Y=&x6I z$GmOI43Zko50utSRN0nU5v^Kk-`1hSf}rk}I(vw#R|sL03q^DDi6G7e${NS;2}_-e zf{bGbLdVoy2D-_w5?;z#z;xWW`I3*RIyHxG#qb}J)Cpw1dtPRq@%tZ2=;e~^mB}}^ z`VVWQ*r_>_@33ejye?->MEXYrOe~Mr?N#D2Eu4ts8P@AOt&nA;HkJP7hRI_^5>Cyx ztq@4UtlNZ9?1$(I8T>HmZLae+$!qfN-~aGCL`*5Rz6+pOn@xG6oF?9C~t%+}_g%60~@^wBLeu96V&~l$cj|v9h;fTm+|>czCPD zBtc_Nxy=8>^t&e^{xQ2IXzX@1%N`fLB71*yq+dDzGIz34O>by(KfwMi`d*>^_lx#o#GIlsS`yFqpfX_PN?#6Bs| z4j{Ui71GPX%mk2i>*AH95~_sIEi6@2_+LudnGYYDGnFjmy1hF(3nRPuc1d0$#|E~- zI^G*Bce$EXul7yyOMU3Xd{g4|3*fxquUOkdPhYOu>DR~WHiXrad;OQO{ZFS=NSR_2 z3ELfr!y<}Qncu96hh>!=f(L8TPas(1hqNV@aQlj^%L!sEc*4V7o3ol6fd*|f9re$O}$ zA4*B{$>5jad$8hLnAS0a{X?UNF%>)e)oVw$`;dCbqQd;1gKTVn&7IJ7t-1I5{V(>u zSeT9(%ypnpJ`_5i296>8lo?oMu$})Vapj22 z)->64*MIm%vi|kYU%d?h*XBKkldc~{5Eo{*8n7aFOArcerb2WprJ2b6I{CAG}6mNT%?bL zn$NSulIqsWR5jaAkSwl5#;wcBM^;<#&yQr>jGUyjL6XWX!VQkif8p%{Y;Rxn%*@ZwfC? z&!>s7F0kMIDQ`EyH+l2}tGQ;Z_$W-i>0j5Gb8Y&f$<0O422~0ZH7HA^%q(JOdE#)a zm}kW2;`&#f@~l&Rw+qDcdWue}<~ta>>{Tmi5*IJmRbLI-7{|waQWR269>IxEq;8ui z<+`k1k(NJO{*B?Ro#4~|ms2pY*G0wH`9GPzO+VyugVnnVNb+k$EePMR@H^ho&8P0? zChRndl4y+LL%J*o**!xYt2N^L&*g6a!@{{MzhLA5-qi! zB#fJ?^YpX?xm~drPE8q3GSal^QLJ}M!MITMB^t9T>OD2<9BDY5(D)($qZSya^@i4# zztcYYVem7X$z*aXcR)Cw0b@~Shw?h-PVk!W_0eS9%W_J9FX+6^g(r6}NOR!Xe6=!a zc|8f%e)vq`c@|B#sep1iq9Vm@zZmyw`cPnqpbK+0`S>I4v6ELI{9>>8WY30m!2SG7 z^CLKV)1I{dZBpU%I(J?t&wfL6zpzIv6|HD`VJrOF4_C#`(B3y+>i6T!3l}7v+g};b zgA)7kmyIN*2Kuh~WjP}klxB{<)~;+w`&sCYj6}S+VD{`&YFUm!hT|J#y2c~o+VY3h z$1kr^w{i@Jml&(LLn&U`6sZRu7AB#Cr*RFbTlj@l-`x>?+O|J-$XQ=B!Po7^W|{r{ zRju!PgIdJ__ehsMSofdkOR`zBKIbciX6H|OZD>`fO0j<0oalU}bGM3JzfOG7?4EA( zyr#@>xm9I@oVKA|u+8MX^k#!Y}o7PR=M~g3P!VA1d*>Qyw z&#sVK_xks~ozo*y>0e53KVUWsH8Smkbg~rEe6@kzyR#c1t@V0pY>$Msm{Nmt`8&v! zt8DxTUB^F1p}}7-vfu^lV*9nT0i0a?4@R_%PM@%KkjF~{wjj^7hKbHK!gt1-f6a6& zpId)=8oTrUy4hfumJJ7O;=FLgtF7xxirc;K&Wq}^0Llvt9RC>Dc@!KrC^$B9 z2uhjEFnD;ViC5H4MIi8jOP8p=+m#uGNk<#ytnL1sC`|TfSC^g^GE?ZO$3$+=ZCid^ zO7Wd$9(%0i`9{TFB3_dMN2K}s`}Ct$o#UoqTAlw zUJ-x$nC|Rtx9;xo|6M0xZIN_Kxm&vakM!bCPwSt*lldT16?bCs%4qi9y$c%{9vuGH zE$_c?PvxiWyS?qs@7w$P%VpNOa{v8y6+gN;Z{NQ!XYbbj`J?)SiXSsY9yD+qS}xVZ z!!}`_?*`Ku3HiHZH5S(LYo$JH{gN7SyG`bsdt$C&TgSr=_srBsoojY}6Y9{O_FW;? zu2%erWEi;W#F3t7X%$%f|X0L( zmN=~1wraXx{<4ght1}k;xE;FV*{av;LSCk+bnZ73*O~KEGgN1Tzm#;ygcEwF7jHbQ t=DKL}ajw}po9$e!gNv_Zbzj+br0TTJ_M36px!a$$&0e=9i^O$SUDsdHYhkYatKP9 z%rJO(sEJq9PDUW`flHUDzT1@7BW-lsmDZa&uv?NTuSks zW*&R2<>Ul)m-$A;ULszTH9Qt;mkRM5*s}8S@_@x&bG^2%y1K$yk&WTN*45Y7Cmil# zy?yza-{w?SHjQ7!uWxKGc=*r7TKsurOLq3I-qYLl8=CDHFN@AGIB<4vopAS2iy0g5 zZfSkb<*;T)(e(wBHamr7NEoG_p2}<;7A2ng{L*|!^}L?S;)|CTtFI3GyJJh*?HvDn zAKTgbnTPf#ZWrMamub;Y=dQfhSt8|`P*#4fQe{?Y+{uLI%11BK=hwXR zyzgD<^iyqS&#|z?$a1ZywAqt)xvA8v^6gqaZ&r}T&4qDcT3L%#POg}?ptWq)t5rfX zt!6HHvqb3BO7GCBtYvFvZkjba_lV$w*Xs|kX}{TUglo0-s#&7PgBXsQy?(QKvs?7t zDO>Ea-)`OiOzUlVBU|U&?dOzM=hk#qalhMn=+G`T=cjhDy~} zJM*93v?oce`s(EXcipcc9#w1BU0s;e`~HY4|C-YM+`@mhUf-eT`|VWt^xOak1_o;Y DT8Me+ literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/resultb_mag.gif b/application/third_party/dompdf/www/test/images/png/resultb_mag.gif new file mode 100755 index 0000000000000000000000000000000000000000..f051aa46d4308d20425a0f0f2862b4f08820a179 GIT binary patch literal 1442 zcmZ?wbh9u|jA!s*_|5=zwwnC@(N@{A1wcknu=p zIM~d_Ddf@-@X(=+U6!k5Mu5^$Mj`H?k_y9Q_ikxNr!Nwdl25j)i!XDr3{r8Pr0aVu z<>#eT=h=dVVN)U}Klhz#-1sfz$HjEN#nzqcY%~_Eyu3VMvDaL$t*frC4yxp0IIwl~ z_4NsdyI7+athu>4R=yin+tZ*Xg=5%&IfYDdwnL(0nj_i}a`KkPI$&7byW=jPip7P%|yQS9aH!WOkvFBY|lsUKK0!R=N0;s?B6RxFvJc58+6^t4x+3)=j?zg#i-U8JVh z+)1x8r#xI~wQ6>!${evex{H}{Pve%^?>BAF?s?9Cp7(#xd(MBp=RcnX$=t}$(;Zj>KEMoN zFc<)|VkQv42S$Ma5S-dAt|L+s$SN0+a>TI3egJTvc#8-K7Jkgfcsmx1SRY$KyTuIj ze4Ga#y%$>1ZiBPtqmLlKvI=i)@G2;W2Ae=VbSPs2z%SQ;5$g;<_K+CfT9;H?3Ngy5 zA?;g%lb{@LgeU+Y3X-IHdz9nx34fCD{*|TuUv@(%Lph5GF-C|15JkC`AiN6YCV@>| z04D_)sj%&5LnIXezza2SJd{&}at%oPf}jB9$|6KbOi6Hp-B2##Ki8zZTBBE93Nb%h z0_8ek%yPv#;{+LaG$jP9C{@e{xXX$NY!U-C+ka76*Tk$>W%4;*;hSd&`K4GRl)Eg~mk|OK(MbSgzXM%w?IAlQqwBLVFQfUnTeNfG!JFipS@dBA0W3}O@qqiM=37|F_6(9J|D;fA%F zb=5Oe*3SWKl$}1iaQJa~cQ^oaBqs=ql8VBAy%#IM?g9{71EO10kW!Vykz!IrgEZa2 z2T@z)4yj8z44B5s?Kgj!7U1fCRJ4|{^@O#YUtJ) z{q(w~X{LUVm8?~=mgQ~jU}@Q=ih>vU_P4EAR+V>Ov5%;VgQm*Do)V9Tu^Uch6-DBG zUgR8j_Mzyn3crrun@|skEN`H`2AE(7vOD=R*$(g#K;h|`g;7|v~CbFls_|H zI`qs-v@qpOT9A92iIhvLb*;AdbAJc_jUSJlo#@FU2uw`s%5mMIG6|RH&L7Bqjr8G! znsn;W%Sw86u3PFt>rm^$Y1@Q@w1qL$;rnX|3OWlD-OX$1xxPWh)UpI7!LcNw-UdJR z{6hTd+i=>7-^8By{r!cMRbRd8jC0P-J?>r$xe5beo28wYk)oX7%&3S;$LtGV%qpmc z_w4ggB}dCyCSDQ^d+m8qGfHvDA;e58J9al^qe`rgT-6Jp{z3FMO=HfI9G`;LFc~JD zHEN!Q;_3*n{(530+1`Bjmp4q;EC&-$4PHw0ITkW8%G}~Y>W_Z^Yj0PQdtQM?^3FC| zZaP_lI(F-9m=Za~DIwJLlz6uDyG*;~w0GylqfR7cGBhaa8PS|8ZlPDqiB0J=eIoNh zu$({-Z7OD|hlsx=)gQI=<~2$@;^VJ(_Cd!lmR6*rs|{{~e-qIz9hp zfh#(elU|g|34D6*##FZ}D}&pqJj$9DAJ4GDZ&R6R5>fD-X%vrZ<-MdZ8wd|s!H+gf-H9O)0aeE)~=Q;={3-#|G zNWNPBw3@@qzE`*wG2i(WziwBY=#sC&WBte0!}pE9`S`x2Ya_kCqS%=p-13^zFke+m zcMEKD$Rw5|ouK*#JYp5cll!)5Z@o_q47Z_%H&f3?`1|Bcn&>ssxl1KS!Zz#7JP0w& zV3}UgmY@zY16_}gM6GlzUf!ipOnX2&w&wWUG3E5~1l#VS%z)Kw@A7botIjT7`LngG zN$a|w!|jKsrer3o=R0esr?;Lrok&3Os%0^!(6-Obi`pC4jBIf DmlzXp literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/resultb_no.gif b/application/third_party/dompdf/www/test/images/png/resultb_no.gif new file mode 100755 index 0000000000000000000000000000000000000000..9cb7801e90a196d575b25febab140ca6babd1dc9 GIT binary patch literal 1724 zcmZ?wbh9u|jA!s*_|5TS8Vw&y%#lL+|o{MyEf&(A~)rmerZui-z}H*brAhx<#i z?_E8;!?0mr^Hrg~oEb(>8O_D5@9Av&^zh_-P3d>tJJp@e&IvA;&HZWo`a+%ef19+YsoV?9)Ud{6t7kcN*`-rPIetUOt-h6#~yQJUWpFW>a`O@?G+JM`7e+_?7SFE~2Az9$p^Mw4bSGQhixwZA!{MM4WZ1 z2i@;?9T0VR)Wj0kA=fr@Ys9=BwqqLi^Cjl8E$MV;nz^XYOX%hWhK7%#sfj`VLYGbn zN#j&5zY>;=VAg zdD&uCi-V?3>e5{PZ~8Ay$yF1irY~&kJoakUnq5&Vv~pgl{&=-v*0-+b>;K*T6|io% znfIGn&5Jq`!`Qc0t=f3hYIgG4k5|77ZN8qRt+zI7-;5i6W_Hqfo2}<(_p7z{in_gC zFprNn;lOc)cAZZrRHoZ(+I>PS zJ)bYA9*)pH(s0*n@dX!i-lFqg**v3~{K9!RT?{H-J?#>=VeZ!p0hj+Q+!R|MYkF-t+ue zE~*z-@z_#1PVdyD+rB$b^q*d9akMAD&-}@yN$U!Fxia;B9iRLDhr(&0mHT!*<+y+P z-Yfm>bzio8JE>>&_L85t@^!Y@)IT3jsQZgHtk5=<{(Lt0_nyxevn}?1an#kR{b~}I yZ~NUd@xAa5<63`}^0Llvt9RC>Dc@!KrC^$B9 z2uhjEFnD;ViC5H4MIi8jOP8p=+m#uGNk<#ytnL1sC`|TfSC^g^GE?ZO$3$+=ZCid^ zO7Wd$9(%0i`9{TFB3_daeCBYyKN*gP&H9z)t!1_sU%x(m)>J#&oNrIB9{g9Y z{%=P0_w}ALw_l6;x99%MhqH@gR$tjuz0Tud|8ehI|Nfr&xYk{w_U6g5_?R0@#S;>* zt}In(dZf7{-nnw_)A`kcua+z1FxzQNZ}{}`xMC~gl#EB68p~EZ>e6g_k>sWXI!10AZPh-TJo$)*;$#tG#<{8+ZmZQ$3JVubMG=K7WH|idYlht zrP+N^UtrAV^*nLAZ`+DF*K}7UH}~0{N?uZ(7M2*<9yM#xq^?897befGs#2P{P)bxe zZrLS^rBnVHyt<(^Dd*6v#p#5Nu(_68f# z<3StGhGnnay60U~>~y`r>bKh;h$%eVynpA*IolsDJN;(X1+#0xg}YYR-MOyn>bLx^(NfFz jx4+(&n}2re@sjB|<#&sA%Wmg9}^0Llvt9RC>Dc@!KrC^$B9 z2uhjEFnD;ViC5H4MIi8jOP8p=+m#uGNk<#ytnL1sC`|TfSC^g^GE?ZO$3$+=ZCid^ zO7Wd$9(%0i`9{TFB3_dcWOsb)Ny-7|9d_+H$7*X!LQbHM)G6&`Gv}p^xl5ol6poueDku`yEY|H z-jsfN?b#h0&feK2`dRLcm^$NwgD3gKV{Bf3d{RH%*!-VNRs74w+56Y#?bZ9X$7|=m za{1q~f6BT}9G{+F6PNJo-RqmL?pi+B`}Ie*b9b5jJ?nqlzU&k~(7+;=@t~1It>Qub zbk>OZO#*Hjip>mmY71H<(kv8O)0bYGz#!Eoq1c{waG6kt(y|>2oeSQo3wCK8lVIr9 z{in9L$0X~!SdV$v4CPXrZz~@5d$DS&w7FQNKbfe!X~kV zS(U$Pcf2akS=;wbt8Al_+3S_**UDcPsab`*S~ve==cV-r_Dy>ga7663^um)`-ZB%y zUA5nCx#H(4J9l26`%WTPZPF1Sd_hP$CI+zH@Cj&(|*7E;j-v; b{vYR6>o5FS^*V3=msQ>C_bz5*VXy`Ou0S(X literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/resultb_yel.gif b/application/third_party/dompdf/www/test/images/png/resultb_yel.gif new file mode 100755 index 0000000000000000000000000000000000000000..969db3d18044529dcc2d7e3bc21487ed6a138c16 GIT binary patch literal 1442 zcmZ?wbh9u|jA!s*_|5gu3ME`|eJ zS6^SBaJY*#dcm5Tn=>x2itP?-2wIl>_|)9f+t$VI&THknVYPjI{JL^xZoS#lpWWNv z@suwvX8Q)WmKtI2f2Vd7-8!VK?0+w3r}4v1Q`7uuZ+33JJ!6r(vR-cFfiqWD{oSyU#oIee%K6{Tox+g!Ai0%)`(Npw@lTtoi*4S`(fP7_t8dWycVDf_ zdh)mbD`tPQcjL8>yH2k!{c~f%kB_fzZc6_#ulmo|{JV?8YyNM#x0jJc<3R(9SjK}! z)^E?{Gk7^09yANMtw@OGdG;isMIue&K}-7FYnNN4+By{4(*&oBbSN#eQ0Q#oO`X$a zz;z;tQBA8QsYmHtgtDXgqZJGL&g^}W+~pt^9? zn!6>jc}ZS&Ga}Tf(a?sgF`nk-PWSX*+zs?z`ISe!rg z7*3i|^^06Wb>3HIBub4RC7mqZ`hEk@o7WIX_oCbL6JI?F;UR`aHy?#^k>7zb0Zh)D z-x9`~uKw|aJKdJ>!XZw(t@&L?`jm)ID#1#-a)6AAZ^v3@pOa?D*U&KD+(6uSeOR6L zR^-q*P52Y>{$ueEHBQ~K;D$9OjIk%OKCxGBEKQZ3-P1X1mX;`Xz)ag5ebeyi9bN74 zkM7&n6k%VXw}-^BJ#|35?{qdL4A!^!>e$FflDjLi_i)D!VWcBHK9m#4IGsMr6l{Z6 z=1w6!yLL3ddsOn!ZbtT0R?I=tI(>GE!|ez+tiW7w0jp_vNsNikM2X zq#>)4)l76`)wWfmj0|+%j4skS{j?#X8r^UxG-Yd}?!LDHdcNus__e&+(cxlUIWb^k zv?3|KnpOGJ*f$LNIoa*lYyvfWmJxW8)R?$Km0Xyv2~$Dkw4ys`>oRtw%VJZ41ga<& zn&a7Aa@zjby7T15U(32qhBp@JdO)J!wA5#ZT3H|LWz8jCN0^MB2s}5yU*KX)V+w8U zNi)>M=oTTx&yE=+r2cRNj4p)U8xs08)kRb6k_x*6j&S(Fl(+@nptK1~7mK#B0xiEn zuMZHCafPn?&pHk9{*JvJBm@|EqY1GX)0YsPHJ7O2?| z(D7G*z(=4l7cp`x>8-a#=ZefUyHipBqs7vg-0kz(CUR_syj z;)3K1mLYx9!Ls`Uw!dwpRv$Cb#S87UZs;FoAc?Xb2jw9}Mw>~1X( zX-E(A)KfX;u05JD4z7CfabbisJAOd!__Plo9nCwf6ZQ9>-o1v0yUB91gZhQ9y;iQ4 zWSE^`=;FfqfxaX86RrSlHJ>g$8+2!zV5M`Mrk%m1MExzt=*7Wmuz;jV!* zvSIzw{d#kogIXe}M;Un?DC0xC2mKMF6*tP?gIzCnBbF`)WO8clc$#LXguD`CH){wA z*6(U^{2nTHpY`>2f8kJnbyr@@iK~t0qMUJ+jJ^h=1(d5{+Bk-%fr5pjFCu&4l?R?# ze=r;-d0vyji^bxI1oGeuZ4r-Fux@R^N*C*&WD@IXvD4|cfirQbw3-ug7t{8jEU9zx zv-JjF`=&F>iSY+We+6WGXjD;Pa9`hj;oRz!pXpv@#dx2sPs^LJtbi6eATF5Kt1`Zs ztAj<}elt_#8^X4(Po6Hg60)0mUiyteQ|N+uP?P-xCygH$`EDtsF#5`4_)Sji(MMqd i{3K`Zd9HiZ@{iBWrb0Z7n_WvWh(+qu&ma&0;QBAc4z>LN literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/resultg_dgr.gif b/application/third_party/dompdf/www/test/images/png/resultg_dgr.gif new file mode 100755 index 0000000000000000000000000000000000000000..17fbb6c821496c3f59b22f07a2dc736b8d3aed19 GIT binary patch literal 2576 zcmeIx`9Bkk1Hkd+c!tP4#p8Y+IWieJCL<3OTmCud}2P$-oA{Coz3QCC;j+}zyR z**W;r;ppfnhr^kjo#pX(TU%RudwYlf`LDqLaRJ?*2mE{iAa(#S5K|_rCG{lzBL1r_ z*>%Ax1*jsCOmjUsAo=T2RCtsD);?Xy8onc+g=M9l`mNj+hSIRff;bKOe0%F_lP7Zv zP4Ud;IZ=&>U);Wq`8hu}PpdyCwqQM8;rtk0pwp}~QG@noKj3Z zx4q)u&D|M~Fz;Tr%;`diLSqE0E#L-$9a}rq6i7Nq(9)YWz5T9=4vbW}Ecm!Sv1G&U zY;VWU_e^zZ>gP0F9ol@9!vb`<0SkkSgZlWium{2{Bb1Wul6rwh~$5u7jte^z@!eRN>#+xe53lnksJe zsh@gc`f}yGuu;LPdc1Y!8La<|G+CWMhcP1(JZ0s_-C*Yx7*D1X}T5f2?@EXqO?F4M6A~p z9dVYpNnDoGDQ%`IQ0hXzPBCjqUX`l`54@YiTPl0EfKV4&#@#zoK4_hw(_^%z>hi^zx6rQ*)(3i=yl!s z!i$f$Cp^aUcR4Wph|&9N_b-PZOd*TnTE-_vhp;n$yF;FRz~MG_C;!}6{xWN~Jz_ka za?IRqnAGQFvAW`0 zGF!;S7JTIuPwKUdJf?+Tz96KqmWN z{peR%HNa(gc;5gd=s-@lWXaIM_#og-s98r&uSvQ7>Hvr=SGFLYM($H@c@isG>LNX0 z4+nEVB)dy<5^a-kEiK#lZKHWf8Cv%b#u>ba<5bCO`5FjfE6nvo>F8(Rpj3TB647hM zS>tQ}IaPLy$-82SrB#iK(Go&`kjpeqi6=^5d@D@*NYH|Hv!tR>!o|ujMePEJDD*t# zgu}838camn%~L^S#)KKZ>*a=XW~>cj0a?^vVDN2tRpTV0E!|=6YP|RaBqA| zZJ=oW@b_#lV~t_b7MC^Rz70EuG-ek`GOX;Pi73oGMb<%66b&Py5%W|T^72d=8W|MB zj_x{`VVG$0k=_#7v_ac)!(rCzaISk^)N<{=H#EL^VW_3%hoK064 z^~uE1dBH1YMc+pKN3(NFV^=Na>}wNO$4h_gteokIcD!|+kiTMEVK&8gj(UZA6p7^X zRZYjPyN4Hj*x}g;2VTgR3$M`F<-_@&PE_4Ps2BEySevS63vg7JV~CQ57| zk6kmXN2I;os*INXoh)K5JXqT)wt#|Nl>(8MFn(!??*hHrs>fOlsrAlMRo3=**;zU} zWqun$+ol6H>1e}p((c-&9)Vj&Rz$V-`E|(g6?o5=tcJs~Dl1Eb>j1p@DT=hOdv$}~ zr3p{2>%0@>;XdQmeivFD16>cUyL+B=ufK`X9~`*MoMyIssm~Z$$L?WV79Ty;Y;~%? zog;APq(nT$Mg)5*V7N_LCR#7KT7hlto?DS7%p&T|X#1Lex(_~&IiedXv+ngt2+!;- zcyhHyeXO)Rr)V7-j4#;dP9pFfZn8RY>bXv|5RaY>-%qi9N?vQ|iHNmZN58RbyBet_j?3Emp0CU~hP0>3Cx{{<0D$@b00fFwe*gdg literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/resultg_lgr.gif b/application/third_party/dompdf/www/test/images/png/resultg_lgr.gif new file mode 100755 index 0000000000000000000000000000000000000000..68914a2fb3134736bd79f67b8546d9ca6651ed73 GIT binary patch literal 2551 zcmeIx`9Bj51Hkby$0|(4gS2ABkZ-k)Wsb-rY$&!+lWQ`!%#}N4Lz*Mzn21$#4KZd@ z5sHK)N|vILWBD=(%f7|)>c4n?_`d&y&+GNEL0KD}@%9AR0>pqnKp>E^va-6my0*5q zzP>&j4o4!9mX?-iG#Z1!;BYt}AD^J0pooZw`1p7-nM|cpX*61CX(^M*tgo-+ zf>vj1vKufAyx+n??HoyF=jzeRofX$ppD9V3hwWs9kwJU*Tr9R=5GgPJ1NAJnZ(EfG z87o?94e)~jEzWY$A68em*F$LDq40O$thgXWKj`RW+1lC zZ}>i{DBI-B`Zw8~xMyigUSZzPIWSvZnHyKOzq4ygo?A_fAU3@mZGimVSPPhEJ+Lc3 z%9BKWyv2 z^}6zlYX?$H9fyB}Ta10m#aMR7Lh2G#EUd?j9m}TYWdi$fNR7PS5X{ z`?-~jxzbb==H=n&R$`GL4MTF(!2sPg{0c3?>Cgnj<E+wRd6)cM8cLoX26beH-Gt6{w!Lx+=F;SW%{TD=+Aw-<*xGwh$+`pFsEZsv~|f zaGfU&THAb!e6y^-6kQwbTA%eH?x%(0$8Hl=A?LAtXv2>?0R&3^GFP`Un0@5alZBoE zCVMTd?L%s%_2MEvi5>TVwM1|X>y?Ln3#mSmiCp$-x2_{_f?W)++Nh^f>Yfg&3ct6b zdv)3QI@_Anozj#R_M3f2YL7oSQPj_RIESX5>?xKr!n$J5n`pjhVbBjgJ6z>(D6MUC z7yntZ^rzYiD9J&PcbJgK}8#sWcho7 z@-RDH@vBIY-thDd%?+Lmp~@IJ8^lfA{6fA7<2Ekh0?y3D6lDbp6Z7r6rfOWZcxm(} zp&Ikj@mrgJ<8wkxzWUjn-CV9=bv%~s@?4P!jH6q2FSOk5Fcl`uH<*Y5w=N_uc7wM) z=Nq9@KNol=q8n=+kCaR$V+TE&HjIfkxieF@%ai8hc@l?5ad&sAUzgL}yQ~9FZUuUN zl`}dkp@UN-i~G6=V)LJri%F`6Uu3@*b*{tf-IWqN0p_;n-mQm{>jymVMy6RR)gC8F zn?lyC{Ga{kX(Vq!a9;fwy%XRIj_C#Yld}o7MjCVWsSZyvwnHx?b|4;6p3VrQP)4S* z82wBuZTwPLpXFg(W4d}NL(c6)542$=i23Vn#OY3R@ zyL8qtBz8b?A-rf`SRZ79W>yfESIkg=oiM8y^o_2d4@EMKecMt3K4O4lPj%(kHMt&h z3RYcP)M;SnCdvnjrO#T;BFp&w{@v`dcP#|dDCEUk!6!39*{{xY1q}LRpRB0b?{Dn6 z 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 literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/resultgb.gif b/application/third_party/dompdf/www/test/images/png/resultgb.gif new file mode 100755 index 0000000000000000000000000000000000000000..76ecb5458f7302546a6212c00c9e037364db5766 GIT binary patch literal 1538 zcmZ?wbh9u|jA!s*_|5^O$SUF@g3K|YJvvCT! zbObzfXk(WZYq4-x#Ly+G8gymHL}iz53CFS$iA&1PlaxiLx%|AC;yhh2Q7vR;<+u73szoU9k^tJ7ZHz~z2ARwkL(*S}Sp zYJ2;A?(MaW-aG+RC-f;bweLv5v z`17&o!|d|@a%(EzUpwEXesbU5@H<}Tm5=mo+E@GV?m-tB?|)m5%hYVuWS?2{?Q3Xk z6ThCgVtA9Nhg=nV+4h7uUL|+gHes$U59=bPW;|-|>D>|;r?xHQYPlktMpDMoof*kt z0!=q0a%}IucpPlGtRg(x`ftXP7OQ7VyL;_y~^$vb^7yW{Rz3PNe9HtXX_k3dhtiW z@gq%tHdd?-^Zv9^cy`X*HB#%(Y}&$V-G1$a(RZ)UbJiEm{=Clm_vxwU?Vr!e-ER?i y`_-jcr?d-?t)F-2(=LDZTK$7I%4}^0Llvt9RC^7{T;Vkxr1ae`|t+gHs6D=#k(SnM^|YwN13tAiT37!GV*eSLkx z;VxF`1#50@&bYiPwmYoh+Qx#%r&7JQ=f!UK+J5Tp>FKNQ?r%8#=;_IT{QHNKnYEW$ zODs-2GGVXYyg6d|Cyq~44!)=J<56Ja3}fYIdmAu|uIWuTR)2kGUFNJy%e~jtP0uKMTetI{ zaUHkax*s1aPtUgBUuKZleE;C){PiUcHE%y(HJjJDb$>nM&(Lr8(*KJ_gf`?>UYp&> z)LD5ywbqEcWu&j%ye@Ki+fJsa*X?_c?ab~xxap+&`lE7EE9TlXzI+qX z^v&f-!R5ZlwF{VoX0P3PDX)9&g}@Ls(oem%ckAy Tw%(gG`~BXB*SsAZ7#OSp#DFmx literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/resultgb_no.gif b/application/third_party/dompdf/www/test/images/png/resultgb_no.gif new file mode 100755 index 0000000000000000000000000000000000000000..a2453e4241cbc2483d5231b701cb5185bca9f359 GIT binary patch literal 1345 zcmZ?wbh9u|jA!s*_|5^O$SUF@IHYhkYatKP9 z%rJO(sEJq9PDY^c!I3T|wV<38g2~6b$Wo%my>*^ za!1}PnJJv+KS!X}NJJ{+nO~=S?mrf(1uHKv4_NFq*K6yltE+=5g?JbitiHZJ;c%C% zwAkvKn>`eZR8Mcqy}h|$t(L7u!rI%rD;SU5oo%}8?w*F@pJd;Bd3OIm$6g_|JzMe~ z9q$tVoLeJdlyGu#yV9B*N&RPgXPKA#{jtmoY@Or2U$=Ie-l;3APHxJ}6)DTvxcRJ< zY{GA|8+RgR{`$rfv+mlx!@I@I=S?dw+J1U_kg>H=j+%1`+b4w?d9^`sQ-U^*Z({&*Wkf<;$9xxy5k{Dk9AKx zDCM);ai>Jc=|^m=sGrB>07<_W;q3=jvOmiC+WRB2Q_ZU_sjFx1G?~_L!_q&L3D%Wn6T)CwGv*L~?lTFPkWu}B2(?~6L4&!_}wK#R< z(@8OQPo7S9i`#i=Mv9Q;Q}2vrCsk^s#jY-!ZT_s{)|?VIPWjYIvCQRt72h-;&*x>; zdNHwjSH$&&`Tv$DyS2$lsd!H0>RRG8_1np%K|0gerYySu(R}WTn-is8EnY6vnl3#_*;g+- zS@z71yn8b`M7{sr+Og@@c4KA#c{w|cAI_d-uKn#!rNgBQi~djAmhb`)-cWm))(ELF@T`SjFwQ z^YUL+Igeedn|2+3{eeIv(hKBzPY#I+5Si~$A)J>Oc zo8a(I^2LK@ex(;;83JJ$iVZ@GuFlTqiF=XQB3bt=s$G6sMM4K-&WeC$wQU*7!Fm;2I`#eL$REMzCB-qN^IWxCllE%myqK)-FPASgvs|@& zsb6K*vXydIUao4H+$JTzW=h-5%d5ATMWxm6w986K+iPW|v2X{Q^otGJQnNMY8Huf4 zv*667$QPTByPbZxef&@nl-|)va7!tLN>i+IV~E?w3us*X_|> ztNniW_ha39`+mQwUefdVTXg;bJH|8mK_B>P3=VN#f1-bw)!gRF;s0KHL>w6z8LR=z CqCG4C literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/rgb16_t.png b/application/third_party/dompdf/www/test/images/png/rgb16_t.png new file mode 100755 index 0000000000000000000000000000000000000000..37682e9b3a27a53ed858e880fa644ef03f88a255 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^p+IaWzyu^)O=PYEDYlXzzhDRZ1|Z~RY4!q&JoR*O z45^s&_U^`9XG0Md$5RD~A*qYBHizCUPq?~3{Eg3{FAc25Onc^TKJn|H{kiwIvitQU zH?J?An_YEu`P<)>bFW|j!lQO_zFPgPKbfDF6JXr>z4m@w`rM0(J_WxoKk=Vz@B7c> zCn3h$zt`TU+g?j9J2~Tb)w<_jIu!GWvJC8?yEPAEzOhdirdvV9*IB%TCVtUA6A{mkz}|qAUYD=x)u!m~ZUU XMfnfmHucGyzXw!*cHQ2$|8LH>%{R}d+0RB|XrHXUf0X;&bIo;^@83sg igB!Fh_m+6cUxqCkIrnpER__A3i^0>?&t;ucLK6UgL1iug literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/rgb8_t_bk.png b/application/third_party/dompdf/www/test/images/png/rgb8_t_bk.png new file mode 100755 index 0000000000000000000000000000000000000000..89ce912b1603f452eacea0f6549b9ac332bd9a3b GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^p+IcM!2~3)E;%p-NU@a!`2{oBGc+(XI7V$q1BoPg zySp&_2eSUlsZOo~(mkFojv*Cu-rl&#+hQQV9N2tGJV4Srb;_}+4=1O^G2aXPx5@WH z*rb(l1wOg|XWfjxU4N*~?Dx$#>6_=DMKHEaee&k-0o9*fxA*P;oAYh+>vYvym9u xC#&xt6_!nzw67#LYST^vIy=DfXan8#!wz;ICc z)ZtIYbEZE{R#@(^&?%E)Vrbf|;?$iHJ9i(BGB&Q}|C9LMzTI?ln(eP&pMM(ptADmX z_j~P3)9m-#-D5e6_!nzxP6kC$FyUYLo3=IGOXC6IzfPsOL z)zif>q+-t7+lF~e1_BHRl}{c1WISj3(`1F^4hx+!8779N%_>ga8L@Ns;V5I{YW_co z@9o=7H>cVD`t|vzk-z$9`*Xk7&NR(_zui5SWYnfTw^Kr<1DV3Kfp2EDI+o z;1oPmn*Qpsq;_z@cJJwRI91^?Z^t{I+Ovgy>uWgge8^1i62fN_7Bl#=&z^bn_fh$Q b_4^nd!ux*zHc@T?1`&g&tDnm{r-UW|v88!+ literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/png/rgba8.png b/application/third_party/dompdf/www/test/images/png/rgba8.png new file mode 100755 index 0000000000000000000000000000000000000000..495d8c329d2808ff64b9d92e06c5b5f7816d5722 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^p+IcM!3HFwj)flvQdd1)978JRyuIVtakw$0zp81A`JnwB3!>s*~%0^i@w6 z$B>FSZ|^vEIT;E#9PF#uu=D1TYU@9iP4OQTGelFacYipsZS%J?hI_7*rlrlF|9|$( z-{SMzznv+xG(J)6!rLJwV5*SiaHU}dV<7V)Hmm|W&Yk)5=I^uYnhAUNUTMOk5Xq?Q z^D_I7zx-=b9m0R-+9vlj6 z9ol$h^;$Fpl@4`@83tWBG2yXer?7R^o);IC7$!)%PYRi_DaCu5bnLMf&7d^jS@NOt zLOMUCI?ZSH{WeEZW3 su{eEs74K@%+^ChF^Cy+w4twjjv-s_-wbIjdj7p68kAU~Q7oq2@BfF!SLH^BtqA{7;nq-f)ji zN|g>3PK%IH1rX!x7h(I>HvJd?sL&B??@DPLB+P>Q%3xm( zBmy7tDll00;m?IBRMekzy8g1yn4@&QzjeQEzE#&Z82dHji6* zPFeLX#B+8nU@zrq#I2N;R4nQu)JH#Ri~0x&b3lmqG?V};6x0>LJ0A5uW$NwR>Y}$l za>(@L5`z!sP_dwj2(e!ZJXvf3h;y`gH}77}GCR3|`VbY%Om>-xH_K!i)0iNE_%dwB zM9D}Z^xNF%!JxXHL~@>^O%04an_~RMEO<+@(vZnikxaxWOCO++o5n`;m(IA{W9meB zpK83F68i?9A4j4U)P;!qc}9pOcVg0~n7)58?<_kGUDm|_pr%z9MQHyvaSL=Cv2-IQ zR*Q;)C_#KP8|qG=iQ_E2?88R1AG)lI>#RI~$D9<;_2k~phWMs^1RDYnhYLMl=ijn0 z+?{onONX!Mz#o4BVD_d-iKkP9)83PD5je|;vkW*(_mQiAd8U7f@2vxiy~h8VQvd(} M07*qoM6N<$f;2oyhyVZp literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/images/what_ordered.gif b/application/third_party/dompdf/www/test/images/what_ordered.gif new file mode 100755 index 0000000000000000000000000000000000000000..63de445a3de304f5bb7d8e1c0becf5e36540fdc0 GIT binary patch literal 33998 zcmWh!c{~%2``>*THfH9Y`x?!eyNzM)GmWT`D^ycRy0*FINORvcX9yt`rP|z7LMkeK zrYNM+txLb}@A>ts?<5szeDhubw8{a($edt^A(=8 z2v07PWrsny0(0Z9_p>q@@+AVCslVX_wnOIRka(gSpf8cGysv(dFboF-npJ1TR(sOww(H|FpNq9 zGqr1B(Zdz6OL*iB zb_CaV_RAYDTPx)n=Ur!B{VWIpo=dL7agg|MVX5*&oH+XL&cew#Tw;jon!JrWtylvjI1K#eC>$D>>5{jwll0 z>{JBwvqpLpc9!j*!78PB97RG}3X(nsLgR!KkWCANW47f*JRjh;iF1@ipi?R9b%^<3{TKkG}yphXH`Ds?F2shG2&H@|ROj3^+ zrAL*W zeo65Z91MvAgalU!R2io2&AcwxW-d}d6pz*`%;N>>3FC+)}awP(Ec91f9 z%<{?V;C07O3iURIIiN=nxet{vsBR2-!}>Q*!l{RD$JZvG#*WsfxymfpqRfK?$V->e zxjTe=U2G5lB|iaD`Lo@0r|z-f<_|ca`5+inc0G7v9N7DaYH+gE5Oi^bEa+D5Z~V3l z&HQtKUEr-NSb7LEzMRy(JLVJp6hRO*s~8iwRFDPZy*C4Z)9ewo24=?8NtL2$uwoJK zCI_@_`#kZ0nWkCSBQ3^RqR(suW-mvopl3{>_>h*P`kLAF^}U7{JtKcEu}Y@VI$+pN zQDsg$l50$VTestc#k04~Nf2zFBspup(3?kjt@-{@*blu846sBv3gBw|+|rL9r<6h; zPF8RMrzU(6$A8A@*}?o(4q98VFO!b+hI8i zAkKf4{@kp}j!_N@;3R^bs-?dhPuC`&^OUvoqdx`2W}C(7<^ahI&mu&>08NztY>o8t z)CJ-!DHgnY2V|-@H6+#bq!p>dQmga!xuVIlU#&D0`Tqm^Cc-jKiF6eMIcFD%!2MQ$ zqe+6nAIS!p-(Lq45pV_hNX>J=R9{4XMq$~O08QmJIxJUsFh1nC*`&Tuv}I2Q_Bz_{ zn}1lC%WEfP7(+-A!o%d1F7wDW6LGt?LGFAr4s}32QUp@7G==V8bSumha|%{zZhMqh zYU?r808cAOw3h&hSD?rw2fVSG&)kN4bAur0{iM~}NP^#|_fPXY+XM1$!zDP+D}h<4e*E_;IGrzwiF(kbDWTIruO4%bQ3Wti9997j#F&TK>z ze_w_->ms>mCTjDtf77cp&{-Cx4I$i@i6-w#`{M-oWUZlc|LB+`GX`#E0+pyD7mLjC zSciNWRO&2Gn|&Uxh%f@qiDloZLPaZShEMV4g%Z%W-NTYq*GFu=u%{)Ih(R1g+2wm>2O)UtL0N?ZPAp%HJf6y z&U=X6LT8!i)M4#acV~US{Lc4vqi*AD8EL+_Srsa5$|B#C%3m(-w|kyX7WY1U^~DIb z>XUic@6~?~Uh8NWvLnA9>)7z8q^lDsf%!_%yKg>UmuVcS&X0t-^)_qm%8AMJIp`@b z&7-3DW9sjFeYmt8O4fFM;B5lL-iz5<+dgEAhC2Mk2@!~|Q)eQ3I6l5+sMCQ|#a9c? zeh7`JG z8apH#v;S#aNTFOtN6Th@#IX>{aU~vPX|qxLVRYZFor52#H8>-(h_35g1V%Yo=D*z# ztGUiV8p9URzoNpiaV&xb0ugGrwnwUMj%_&}p=l&q0T?+NdV#1Ro6*E5*U96d0ppnm z!YLK%Rw#=*L??Gva@AcWJ|$*wC$jh0T>2)haWwI@$)e)H+t6S+C1zh%NJzbCaoDGA zm_ykZ@3}JCIHtm?*$!n1?rNp?D;GqvgH8+5N!5N`I_wErY;`BhY3O+mHHrLf?M4Oq zdhxSi#mS$MjxYO@K=}gjq3bRhYLoX;|4qoQ(Q@E(4A%=zZYqBSn~6Wpq%N(Z^vfPH zQ9k8Db1h#Lj3>vR_3Z`bS%a)oBSm(kjFPGG-|b6s;+t9}>_9h{^|9JR%G!lWe~bk$ z6L&(RK{tfMRz&GM#-Qst;v%4PKo-^#v2i$ZG1Y*z?y2eZ>5QpFJSGOpkiU{1F)8EO zmjMI~J3MMyj53&aCE?5^5P7jk3qC0Ot0$-BAezFtKMR&?esAR{UjO z_{&uTnY3MLILCPjh*t?Zlls6=zpm6we^`SiNTqE0j=GX|X!s(BPe`(r;H+S27ld0e z;@GC^uhC<>ogmFmP7Hm9C%6DpGy?SMWk|cVTapr@K`4pozyw+Md8&!swAyHla}fq$ zL31Jrq@Y`RZ&-lhgbH@2DO5ovBha<6SPqVj~ zTVc{xny^bigBfV~8>9={Xr~UsYtzlRh}}Rq`Uiw6TMZc#sNX7c{pl(@!qk{EQL+4i zUw2ip$xcs#$F^lqG`<5FWNQ6U(nE4|y_p_C91UJhRn9xwz&jiLK42 zxeuGehw4dE-73sF)mCySY7Zmr4XL%sY@DANk!cajlE@v)I^?g~@K*9AHRQ=23#m({ zpgtE406tGXxkDX!_NXT6t1FF&SuK?UL6G#-kknM#r1P!`#EB-h>k(EekEP{lnkO&B zOwT5wdtCA@>GtEmm_+@o)aV>?hT{*e!=P~)%Z_gTLi&HYWHZ zrY^u@-7$4!HaX>bjLpC>vQ8WN@!PTBJ}hQjeN8twP8;4{M|~*cuuE_Ttzk@RG)+91 zdnHz$BLqM4(@U=B;xNc>86>1NI(F0kmIi&4i0Bn+eH5S^c6;4Vw$Lgras8TupN_No zT&_UI&jNR)aFvp&sZ|hZH=S2bQrl;TTvMM&+5#M?b<&=xmPCh?~L_~<%S z^$2;*b)EJ)q=q0!Isi`-afb1i6;3L)l%mAe-j1MKSiRCjhk!lcB#kV|2V|75!05$++RVT+ zO+U$US?=#k)jl)L(Of}BHa^H#W+hQ`yDS9BnY508?0LzOx@}z!#!zp%VU`sjQ-!z& zE7(m&v69$if}SQJ7w0W1QXyKY6XUcSPMn&y^$jtc;ul_a%Y6pe)rHU3dW^1Hk*ey` z<*nkln=0$mC#D7A{d4YfA#HA5g5+PO>A{kYU6FTONwx=0-W)G$&@b8Z#j@)lFZE~X z-HC9&>j!pmLVQd;t|pdFq^54H%hrS^W=?AhX2FlBF|IvrjsVs!rsIQEm?2JMV~<7D z3iy;bYizhv?st%7;^nGWNToWf#HJlt8al0FaGf)L$5A)8w|?W(NW-sME*jx=rI|1f za}}~JtR8I|td)aI&1r2D#q@=gT0m9(w&b`Sx4L zU(QO-dnG*ZQIR6~5^*e?aN1@s*#Cbc%M{;HSK^EH`5NNS+S!(ksPw+qW+Q~X%m&)AMVQ&gZ z-k^Pj9y@2EHBPajuT!NU8EBMQ*nrba4TPv2oiy zjfoM!{*|Tu!)ZL(4ySd!{@<{@IpCkm;nsAJ;bqnX!K|v|nEesCq~4jdQLEl4n%@T= z{tZ5!$Gba9NG%5+#Mn`8|7Kb-5ASI>)@yl-M)g$YL*;yB6@?`fcBKk1wf2=$MZ*P6 zS>Yctbb&7=)pqr>5*(6LSpF(t4TFey9DazMjP;{E922Q>r1VRWdoKaCP99R_=Q;yx z%7y+jDD@qX!)l@^x4eOgneNL%{RvYy8VjZEm`Dp9jXpIRy;07TgDa!1{NUi*ztCJS zpKa`N)ENkXPq*f5%6=9PD4sZ@OmvL38_x(G2WXBRp02vqVw`lNqPeBn%yg$7>(X1% z9dB3J?H`5KNy)*(FdnCpdXtF+wZLM8cd|}Rws?*+0FjNo4hwl+-&{M}zo?s&cN(?g ztu{bwKP1OY4D05zL5PXvP5iB>yPw6v)|&g1BwQi+Mn|(`Xma$-C`S$en#hWbtqCoRfl!wS2(OzNIWl;xYdO1*o#P4 z_d8??2fTGbgxxZJtzX=gG}YBVHzu1_sx`pO#{(a+HnRtGlkTReANOYy$)Mm=I<-)B zPlMOb>ipmFkBSet8s|$8hIea|ZIx#CT#larFZn>=5-VXYd6TIy*@^b zkj$Gq#0rMly(zNaic@5EKG<|PHl0Y0&|tAHXkX&I#rC-*CiuvCuI7UuZ2Q;UIBor$ zQ~qZo0@07lm1K0>-%)`lA9zcM>S_xJmqHB?a;Rpf!<9$Fk?B|;*_yjme@h3wO!pW9 zweBU1#&#xYD=8eP&s{{ELhm`6pR^}f%5>J;D@Eo&w)yEL>lQ1H{cLE zuA+!y-MU_=H)Ih+1HSrF7R#+!U@KW4!yoqReUodV-_oJl#1bqRd;EEtFdUZp12}hU zfi+8w&6E5Hh}5LMbPag@A`c!R2N+ih06cPOyU~RQ)CXk*#S|UgCUseUr>-b;&E5)Z zRnP?IJV|-R^2I#SIXsI#c}U|Q=C0(NyvHce56;|G5Q@B$m;u(n@-NbYee#$q1vFY5XOp8HUjO@}uG*r-o9$&AXqJAPog4Y=JJK4jK4n94Um= zkc@9%-hV(Saq>L;H0ear#hBy9(PnI=Q{y+UFHN~PoYW5c1z4FHxayN*p;Wg+Y1!Cz z%w)D{*YBoX!|a1gFpXfn(~#q{aSk8w>iyEbfAvm`Z6y!Y9F`WLXVkoihQ&(cu`C-R zAFmbxGNPOGlJxs~vG>L5!Fa<+lRR$G2`?_lar-&-ofdZ3VZ@5)%OK2&IfuyqV2V4}wDWZg&rN|bQFs<462<)NP5=8w=SkT8rF_e%e z%qr=09CDHdWn=>~;aZq6lwDSOwqc2xGz2~j;KHqZXmFSFP_{q34@f+B4qPEL$Cye$ zxEcN+E~q@W3koO53(BGTnZ21Fpyl(x^by!hVfqDjBj~w9w^qpc_?yZ#TGi5$nHlRd zDWq(5<#W^@DJe3hU^8=>Z7vun_qB%BI`UQlr6ohLn-AD=4}_OC2OyI$9$a``<7Qhk zQ9j2=?5l-M7o~&XziRXbGhP)9VQIos3~&S>{iJSpAzw#=;_Xm-6W2`uy{;jxMXb)( zn^qTP+PZGWBCp&_k9PsxZV^)=HQ`ChI!vlGTUaP>+9O;6Rk~GdO=b0E^=Mx$QxCC7 zJ@8cof{x3O8BqYE9Qa$y(|?HoVrh)ziR(xf@gsb2D)&!PL=MWud(II-CI*jZ-UI4E z1c_Ut@&Wq}%lRgWIA9@}ouaTYeozJ%ssE)9TEHoQ+TZ{JL23UE02)u$V+yS2lx{Q$ zatoXw+doi;?nJ)*(}48ZI5nk6KMlsQ!Qf?HvROX#Lw-euNsKOK;U5Vlcq>uUGfidZ z3^!$z4Q#(c6j&;{*EL^FY^foS!d56jd; zIP|tvxY=ar{IEs5fk=ykLAr6u#wcW_$TN3Py+Jy)YtsT?*JsQ>B*P$HrljdbsTO`@oDGZMamYt+HLxmWzVqQD?Gq^q0SLmmV(-W8OZWM_0zZsJTMaHCsL&dd<+X`wx0Qp3iN-kil=bcmNGk6LK+-(-TE0u~ z12cekuX{H zt!m0qOP&eg5YO7hCVHFuRvB1IPfdS8rVc-|;Dh-mR-jObxXaW3K@=g+f-T&F4f)Oo z-UiC}F7G%@jTHdxyJ zGAtmQlYyr`l`2^6$TSS_(~dnCEU}^(xWBgUsea=@Z<0+|TJV0X!SPqiq{1aTz?|WH z|7waJO+H&P=edw;{EiU}ki|1Zh*QVO+}ahXhHAzJ&$cM@a_dUuGZ+856zh@P*gKne z{;d7eBXO6-g~}%PrkF2?G1+tK;Wke^}Pdl~uq~f_#?^&*)DgPpChpvyrfbF6X(}DPBWJkf<^f z{VoT4KyWz<3n1B&=Uv0i1r@kxOy-E@l{Z`QC0Rg-z#C1-X_3Ta?Qfe&mnWH7era;D zNt?j$y`$Ipyz!FhO5N*wo-wijfH%sG0-zloX`$1KQQ8SW<*F5s2|voRe318#MFu3P zis=o1id7Qf++FQr)wsZtz~$}1E<->W`fXPf$We}nv}rJPx=`<~$c=5v<8<$3_3zzJ4$|EDiL z;lKgPsY@u_5BFVR!sfEQtD!?fQh~kMq#|_+W1T!wWBwM)laRAhn5SQHSnBZ4o!!Qd zU0TWDIo0V6b`f&7c^Wn8=)7-22t&5;fr^pD`(G^{C$BSDf>*#NIfc78RFT}@QdZ7Z zct$<>kwO9XLIC@ojmGJeV|#BeYDNtx^pD`D~Uj5oOOvs7}0 ze`Qfw)OOs=afv;|JonM>jdT0n`5}P?0C-V8MK+Mn{5@=* z30H1DZ!9%T(&ot#YElz$elIwd(3hsSr)HyUJ{x^FDcZmBYkp;D3E48FoT&&z8}lho z(*zAZWKa3M;h}KlNBSxfxfU8kK)upT;n*v-a})bNqdA4~HAoS>F>R8n(=??$@HU=) z+k5;%Pr|6SNrB211FGDsOjesyj}aUK*@0Ay%d^g})_C_knSJz59Vc-)s5c&az+YyY z{q$^g{~`=eY3bH};gPAg=R=Rli#rZX$G<~P*GOE)tW>~W;?-mWhSaJmDoVW51ZU^*Z~EtHDQc`PUsMx+CN1$^FMBw+N_NP* z@BPNjB-~bKse<*dnQkrKvU2?(d4TF>LD?&N@cEi%=gFlP1vCJHOtcIOchU*3-6 zbQ%#L<)u|*;cH{OTNVhli%xBjUHXuGiI-Us#xwde5)f99sV@6uBxL%>-ivFWj@d0; z^eL^BJpXjZ>(l>E8fb+hW7jijU(3@vLf9|sf@}}DNT=DgAh)`jgvra3FRyNG3r`}p zChd;;?o)|)DR^|2YZH=nMbvu|Yxo9QD>>upfBodV&F;17gi%+Adhp24dDl40M@-63 z!_Q`rKR+|CG6rx&?zV3)FaiDn&~Gq#{oRSXBoQFF1%9l8yPzRF2E5(L0L^x>yEJh~ zu|fQN6E)W!kU;SZ#@-p%jufkS@G|oWomG_-d`8x|n=!OJoL;NWBCcm&lf-S!<14hyx&QQey2~lRRCML&yGe$~;=*V2a_%15i!(%4crM z{S~nHI&wNtKrk!ULfl=qAWcrScv)wX;z`d8rDr9Ko1_9|EAFV3WOb}c->X(CmF?K% z54yCW{5jS9TPi|XZhjKI*v_rQa{`#pyOEbCN7$Cc^U;Bn(ljmL&bZF=>O;4NOh)Q% z)SC9su$z$eO<^`FQ8p0ApJNJ$OKan|_cFQ%0^Dd2*Vgt)hUXPArWDs1UiU(fBft^1RO^zS^}7a&)UAh);%AtdG=)hN5x>n>9E z9HiZzy~%kK>voOfOwt>i`fcdT%e#u=TwF7aPs}!AUZA_(zo>9mK3vL%g1PdmE3^nR z(GQ5E3kE~Io+NmY`m&6R+c&P}yfgDqUe>+on0dOb!xB-Pwra0p3i69Xw$*?XeLbIg zdOx}Eva-ST1$$6L8Tky2Q`kExEa1#GA>FGr%VNCru|C8gp;0XtR|$6dkL3g+8B~LqSQzK-`zEa$^91T12XajJ9ilo+It)2#jSvY zGG50E@2#$Jr#zv=4XJhtP*JeU*~AePIR%#V!yfXIh)^cSS})#{vq#Fx@(U#NXHb4H zMFBJY-5dc$j?Wu#u&3j6SSm=*^l>tY=-|B z|Gd`(EsAo9w1_*r;lE>L^r(~VVLNL)Ca-6;w%AE`AE61Bi2kfTcJ#Nub?qZ-=Ue8F z^K+}4%GsrM`h6J$-0({0^ zKPg*2k?YKWw3A_;aljD!ph&NvsME40^1Xrz^h@B}V7bo`V??b9dr5FG$4pQZelHmaLRaSQW$M zs5x+Ke8_*W#5T05^yjU@7lZr6fs5cuN)=Vj=%&PaE2z)wzssc6n);Mk8~+DIHD(!Z zH!<{9uaB`faPaoX0HxPbf6btr};90zGzdj!X^H$3eEOl z_QEm&bdcX}R$=*ULM9tj^0lSCUtc0H5b0xv3$yAPPR&(_ZCbyX)hP*h?_16+rgifa zY!A-2`sxrFat8$!r<11KS5b+wqn$r%r6G6XhJ3c4mGPr$B5}t0dV5Qbo(peLPuM(P z&nVcfSMF-V8GpecvVByJ7P2Nde>}MMVh6A1)03<7`qON2FZ!g31&r(}Yyns2avc?J z)W?BcPd!(P!8D{mI>xhah6mox#&D9=yI zU9K$JP6NKcc)i)$qacesmZwNo06shb(&ar@V>Ibc8? z@I8Xh^=dl*&@a-ocg=pJEztr?aNH#4HTEIOjW(6u&9PZ={}s?`Vi0te2%PSxvAtzK)^Ta%)6Q*t z=`KFD|a<~r@_J*wXt(_#X*)!_v zXC+|AF(A5>s|Whfcwt7fk)-@)N!`!N11G?Nsa(kxu^zAFh~%ZESrx4w{g;W;pZZ?R z+3bHv>oU`7?@u0*`~#c>$mlI+%q7$1)FnO`&L^-ssz9#Urk$<7durH)Ya`1h0(w^H0>V%dEm>$Wbw!cU`t`jxzVg&0ucQZi!I&m;Kmg ztKj1^8V-&T*AknZ>>O*@r3@a~_M2?<=^cf;b-n+_de?UI7TK<{k8b?jHney_v?AUL z%#nE`(dQI2D@X0Vd%#YkEBDz=SIPe2Lv9V?%4pNL3uJ|9OAcaKb0srX;dDXz?tD94 zjMv^m_Yb@{r|IQ=lOR)m>^WyAc>ii!&5P53+%x%@`%==3%F)2`}aPH8@Lub6Gq3qdR(%u-~3MYUal?qR@Um0z=^0$ zUINeoJ`Mm+dF7&a=Y?a4TCfCbT?#Wdn7Obz-xK1*5xuk z9qQbCVZ)LE@4LgHFZ?${l%i;cggmZ?KXV_dXtMlSLQ%}RRgB1VJU9io@?U1UVPC!m z^ZvZ%p>cvSC&il)+*G7LSLFxGcH$oWa^A(3TdXj)=9>XHpJ#T5nfbmrkP_u{Bo*-WZ-Y&*SFplgc!mxW;*AaBG>y|`L6oo4Bz9K_D~|y=EICY7`i1rj zpqZt<%||qT{J_0jR`h6!@MzKJ`Xh#Piks%@%EPZZ+p5at7oHfi8VFgpv3o4k(jCPE zoSQ23kHcKdXX5ogS=ok41%0jVPUPR;4fdFBwK{54eIj!^GL&OnER~$A^7nSQA(DiW zvrwI1-_Y|8ql5AQOcE>O>}J(gm&(4AU1K`JPE0`5)^%g?<##&I4RwJF-WN0P&l}&< zaM?=N`4JsFq3~{Q>ZN**!_mpT;tY2$DTCdG`ro7n8F@b6XWmgtAL=NYEh3YdLwDEg z^Q;_P z0oJE<-mnG~PJcnF`1bbdt=Z}MLsv&+!jA4etgEiJof&*InSc)6I^m(vaFLeUCfC4ZiG@KbSNYC z-#ZA(j472<*)fU7z84L(&%ghbUkg`jXrK(le6;x1{5=8&grF72%>rmH>RNom%wxuT}87Xi1y}o1qdgx?d8moV(nm7sN zJn-F_;gcu?DRtMR-X2pwXPCx4VcT2Lh$m2V|E`Qj>Qp@s~h74706%grq3iJxhY;)V|ME&vafN*M`3F>$u1%-b8f-ehvT7I_Xc+eSogD0d7Ov>^LE~nHN6}8c%mO;wUTn9biWh$hIdrB9P|<(g>kHS7Lpu zDg2~uiM`!1%(ySHAgIGdLKThe8vO4f9W7S^6K?!oxgD!qA23RgGFN1-)VUN{jsmS#*-vE}!(oV?_(TBdHNpA;>?)L)BCnU+2Y5a` znt5aZX>NmvJvex0x+TJb$_OHz?7^T!-NhZ#Mfg>&n&z7c1tq%AIx2Z*5vS=XWJ?kDxxh zmmmIOa~sUCYd7&EOD8l6?PpgJ^ZuYS768l)c=YaGG@-E~yn$Xw%(oKcHu^}A135YAlH`}_VxDKpui0nJ^?YdOY;sW;6A z3}O4L3*eK-vni)N>`W^va8e@<8Us5l{%JbGqqmn}cag8dwT|L!Uz$VUT0$#Q$vMeT z8Ykow3)^~7ByH2B8CgSQ>_I@H>#_$jaOeWxahFxQH&);54)Em)GBy3{@W*2t9DLe`6M4U=4fIpbKURU-wANfVQM zS+!&bg5HbOhu~;~LI^Y5AoLFeenpWE#dpyou{-{!G_$pamLQ3bJ9ZS$6#?DGZvi0g zM(tY_w|^ZNm&$(?dg%)r2gpJ_2Fd+;; zddr$ZB!>Sz8Uso|_jp(fMa3JS?ZUwv!$Lot$gn~wj7b`1A7>1WZ zVk8NaU1MQMPIXEb;WqsU&|z&SwqrP8>QaMo5>~yI8QtXn=)5sBPU<_O;2&#-vvV#` z`T_Fb>^g-a%P~Sao*p-8&<6uGR_KpT-2>IU=C$lL%mvvzSywiJK+z-KJqX7Vx`~9# zZb>IM<@$z5?yOGlAxWQ`T+|EeEFj1c<)@wNWXVPE+B&Lqg%48hpYaj3Y0x4lS=M9= zxMXrq`dI7UV~)u!+qZo^DHkx_gRARB?1tsGdY>gx$nx#j>|)YvPO+6bZ}~mk<8ulJ72g>I-ev^dDqP~Z8U^e zRE+W;bpd5$GpD7>5Qv~LG1*}v8S-UTq$b#W@c1+|n21&AnA^=DG%L)YI7!*>tj_&c*QX6;8I&SfepXI!D1 zR7f`O$+@M^!ceW*^CWT`)Juf>Y6Td+<68>RJN@Jx>PxZYFs!_nu~xL_*SI5k$qAYX zf}2mP0V75gue5ZMy>fwjd)Foo&~uzxY`9vDark`fW4p{Ky8jfX)&6?78;Wvt zfAj(cf^lIr0QDO#m;8E};gi|f;`?S9L)OrlBKHRxLsr>W zuWvhPRIXb#s~=N7>UYU1nb54Ux_;TAfXk4_RcNmkk>4kqX^j8WgFZ}*vmg72uCw;7 zs_HR)T?3)U|LwTNe+zPHlYuQGW`D=c1{xA*axUwoMxA7~R6sV$6$_Bhybz_k95Kt{ zzEg?n0sz;BWC*aguHoA&9Wfstes9G`4-@n*T$Re~n=>9GwimT1I!Y-Ph01$Q^I$7k za?-IE9M|~_yy5{f%8PT9L2WPBvcM3N4 zj#@k4-qC3sV=Sj6^AbH#Z22XA|LIgnIiGOg%DTa#G4~QAmbCm(^F8In2mq(x)Ts_F z6T6*ka>5bQ^|U4&6CfA<09XohWyth#%7tASVB8;WqvS*VE~?{WzwSsXxIkKpbPu77 zQtB_QFPtqy7w_LJc)UXC&frNQGU>NVQ>HU|JZmpQ3Vxno@0AR%?+`97NUVkuiPOTE zTFAgb;uDT!$WKvG<^^!KHwIUE7J~r>3na)$cN}**kBz_P!rX=aY7hzw|2csXnT_^+3!GvT?(X?HEYx&nR3TN!IJ5B^h#Sld~-T1{!)+ z^64@*0}pR&|8L*C7rp^7`Gsu?9Y=S-j(z1AkVS__WPM1(3Y*HfpoR7mg`Ywfr_lR} z{)0;7QPS2@S3({D7kmdh`uuC5JnDdx_5)vxaABF<@<;SL5&UgfQgvNHo#t%&r|Nm) z>$J)X_$gWKcC;^pagA7~vP}8A38)Wyb$2W4@gm60Yg-~#ZkYNN1x0hSb22QRU4XoI zb^f}qa3(8K`Dqb$$Vc#WrjMfJIW(OK#y#Wy!sNWr$9^&LlO?bp^7fjxvi}rDDE7@T zx(8#-OBGH5Hq4hS^B>puQQ|Q`@gGm1_p@q(*c>uB=PcWX9NTe!$PB|z9EMR6UhZom zVsVv+SrHNn3;$EL5QOt(qW#6a3>s+OzGyJCCGt4XMNE*Crk?LVm=|cb;F9EqR?e0f zV4mp9b19t%R8S?US`-VIDJJX3sYq)FuErlg*#_#K-eCH$)bURXd4WM5CRBRwGG}AL z8}drN-SuP_1?h6X_jYlX-H39qy2Ko0dRwbn-f9?rPF6Q0M}m;v=SP*s-fuie+dq&| zxGar)!c#LX+U<7VtU0UiesN$9;D4qf$5OT&WN^$p+p11zwEBRg<^BhnYl~ERH?sdm z?-*z6`H?_8imhbSn42^)i?HG$?mGrjeAP?<-m7%ooa**ZIrg;OYI5#JNRyFUx_=(i zerY`@)2k=+vM)}sb;YkQew%SZ0zv@yWOzVtKk=KHi|#~dm=(KKpo^tTEuCsKeSz&I zRK`g{)Jwxd4~O9^+-SQ&pYrWWWsgSocca=CeG#y;cS_PyLazNMan;VVoTECn2_a}n zp%&Z6WjzDi&2ZJU?w1`>^A+FM>8E?$X3G!wTOs(vtKJO=ZzE54n`Uo#lE0UTTZhP! zsL7Dx|2KfpeSq7h?ti27QjT^kKmV|J?fXdli-jSsrNp(x%;?^C5hnfvReq+wGI1N) z*!;R4vTtySi~gD7nz<2$B-LxlMK7UF*Fl4i#B)G~XxX>u(+NF!YMh4tI~DrF%tMo{ zFwn6!t*1!wf7-yeo(jEIkJp$pjSAUKDS_l}s4U6Ve|tvy;4rl-PKrk>w9wZI27lhH z9S+@nmbiMnMpE#BQcGDFd?Q5LgYRXeqdbMH-D|5+DEWRJ553hW(n4~HoHIkYuaEL@ z(;wZ;;kX|x0X@zl1FZ#vU+Z8f<&Lw~i)Hq(J@fF{-E5OhUrhpJ^i;Y!x_D>o&?({I z(?h(#ZL8S0K#rPbi7Mwv7CpR@N=_;>-0-a<=Ex^k&cF~JfXr0g~wK`}k};lerUt=P$3eQ^@!GIY1- z#&*xuwu&55*UFK~PfOc<{$v;aMR=249_4iL%^m-(XJL_IL#j*%**p3t%rXQ(ou@Z%-IYa+>2UB!VYRV`rWt14`DxYVUA+iPs!T*M3HqwTZr zm+@EjK3aLF8u35lOkJ6n(MC!5VzN(mT;4d}ad>W;V7q|b^FPmm>q+HLLaz}Cbt9*5 zKtr)&h)N=_xvNiAWYmk%Aud{K+*71!>&xBifRss!K;14G?OLC$UNibT32dt9vEGr;9Y|T~?}5d#(|fPl z{`RIsZdglvj!B}8eO)=)IF(%aut3;jeWcs6Z~R?{o&rNf=H09KGkKT1wy^_lD~@ZK zgS-H5{@evYmi0-L(tPYNOwSw`!ua*E5h}tzb#!|73aGiLw<-#{@0hWgmB2WbpZV;@ zgh(Z9Re|imfY>ijE@gb;2}hOnIZ~w&Uc!uM z!Vy1L-edi%y(Ba)?X#OQN%L~4*NAs8mVYxC?Bm)V71{~B<5Wjq3;~+>sI{MV9Q$`h z!LB8!mKEmDuGWQgo{8Z4xzmsZ)EkAQu$?(NFcSp|CdB&@WP9V?p|>*fYae&ApR>n7 z+KrzNNdIu(u$Yhx*!NMPB-fjhn_-U*2>7VG_mV{gr}98~!wbw#a<7DalJM|p=i%`X z>$WFBo-1DwJ3X1#AB7VfV|qg`UbWOH{r-se@sCP*rUsm*a zS@21r0z^QCkUxJ+?4H9#{!Y~rWC;IFKJxgbfCuSsK6$(uYBmdS8P+!W4Dr^}7YMIQ z-R4Oto@I4>k*ZkIXnoZ7$+yEgI-Ul(il_SFKP2t5>l(>Mr^00xPpcftjwDzyW?Ee*2iMUIDpY?tInys{gu%rDPBU_r`tX63RY)s7ISsf zEOWE`5=<=mea>7joE$wVZaOTEcFl?Nl6Ov-zcrG2y0+Njz8g`_$%K8`)O%l04FBl$ zg`;7==2lszVg<3W(QD^+fIi_k}Y52Ul*u2GJE@(O;2k&a5f~6?B?&8`B$*E9N=spR13q7>~;)* z1VnsFTJG#{67HAfDF7s1OoDuFGi3Jw)s+mRj~9S-?Jt$gO}>4(_s;)eT9?M|txcuR zQ3c7z0phqGeQnK8bGheNo$pH30H#x$ZK~J)+Xt8$-xuh~J7BAv!Eli%J0>^9Z0FhC z)=5u>;uqnhcO5&yhR?aNKO(+cdPq64&mES4S_g8@o#7F@-w0XlX=A6%yVpM&yxT!X z?#2B$RmgFEuvzt${4ZX9DX~LtuWJTC8RGtexIBk=t7JImQ6~LT;iC$ z3;QT7*ZA_j#RDO2w=d3Y_6~(Mmc@P#0LaF;B~=YBf5Yl|CSSPW%I1CzqOlVYd`%RV zXX?dU&wi#>HC^XyaK?aQViOzLV>t@22*I(Nzndtf#p1tsj2_5(s|Rt6!t()VWe3#< z*gEf7z+XY1=^KyjXmp@le#8u$ZpdeiVhSUDsJVP%`k}-UIs?iFbF8o}kc+J&Am&$Kyo> z#w9&k8w84^QUBfe;z0Lt{ggkrev2+$C0-M^)>D_b)p3H86n(ll&1k%8v$#1A$S@d( zwa!WA`-QFzL_QPodOz&f_0sh`KC1v;c6#^GNp2;d4dh?=nz3Q+O5<46MgaDE( zfk}T(bLu`xW}v7BLvb`ITXD{3-leA~4YMnp7gux)D*74p;6@j`#y-fFEDcusz0hHf zrC%q?RoF4ijNH0WOvvW%O&}QV!ZQUgHFX;ev9v=>C~cyz79@)t@*%qIT^yKOX!B40te7{x*PO?YeJe@6{4^mBSvD}vb~C%6 z&#$7vvkjsF5AiBx3zX*G`NBSeLg<4|Q`^X1Wxo*B&Xq71EZH zDGJ1q=+aTqFSnPy8its3qbv1A0zk(dJtWXG6ahS(B0wAjg(t=fc3?pJ$_=&m;I7Z> z1;zBs!R*|zBh9FG&AaWo1fIc}>||8n+Syy>Ra@|2YjTcz6{-u_8E2;N=D&r|d(C;s zv`elb0B6f;FvAm$y^DjPSJGL%>yQZ63;rWom{(l~-kZmNI9jDbCIDvc`YOC^ zo{mQkEt*Rn^fsr_fqh`Sde!cqGK))KZllEu6Rf^7bLg<`*X@(%oh;`kozAs;aGDs??e^O!nArWt75wg5);G&htg zM~aqhnV1F@3&i}Ow(PXWMc@KN}9MkuBDpVMxYi zw1{u`2=Q)(16O{PgJ0ED2>d1!lXK)S>KA38b~K2h9XV@mhw$Cjnb%qQxTvzPoyqDv zNO&3m`@MKR^bk7V~wJda$*lz7q}>pL4Xk?aiPC@d1zcDw#|V% zv5=h^j@l-TF33xwF|`jpwzX@AArZ10KI)QSy}{rsM_s;Z->#qHzjE5i3n8RBx^+V9 zCVn!s9@FsNQ*EaU2_AB_mC7k6DS0CKVoP{RG-{A-#qPAxkcZC z7a5m|yI3}HrsYK4vGZ+As_^(P`PMyJ$kJ16jqm{&e5v^rx#-suy)!FrK}<~ zHFn-9@IpdDty|LJcFxJS!M@?LSRVhUquBy&pe5g#mpR$DA(CL3aM^;WJ?+~U206Uz z5}rrfldAd_oXlfbDp&Ux$MJu%bfd+Vw$>9M%59GHfb7|Tm$X8J-FJa%L*D>Y;yCZz z9vUZS_x?~tsF1|D<`9Rl6^^f-0C?$~Hrv*gP0O#Uc_2W}Dw;D?K{{-$L{>#jfa-9P zb*-YNAU}GXIG(lfvP_`DBoBu8CY4ifX?RAJY-g-=F;h0z^*A3}t)r$M_@BI9{~_h( z-q=_}Fn;J^IVM&ohc_J_L0a*(`Ia!Nx0N$(W1a*`51K5g&gDkL{~>CebxnLK96yFX zIi8Os)b#v$eu%vL$a?Q7O;|5y3UzwY3H&q_QCY)DZOlD+k;v4EZo1KY5hEm8zYD=1 zLV~iC^DL_qy&sgrR2);NOwLykmlIc_Qw2ms6SUeO-?Oqt)KSSRsEZYD*5qnq*Z&Z5 zN5&T>3L^_&DK;A%U$LZw9%XWhZZHJpUTv0)ybY?+c!2>);@L7Q;dc4nxx|8)t9KR= zGJVTy8-XIG{+$5h2+-nsrtKJge=?!7NmXtDvTRoISYfq}86UtG>lAD0N!)G-i7Bi7 zT?uxn{tY?(?H9(;Ihz!*QhH%kv<5t$VjxH8_E)RmdUff;(t+O%@z=BR^buqxqXq3@ zryxJ59%uJize}$7zD;Bn&}3>tbO9f_Tg~y5Cx?%n9S*yR^VP z3{*Dqqxr)^zU)tgD8X(xRUzj)+-bacV zcRc;G9C$^CxnKb#Q*5+ovx!W=_~UmYmKP7$eYycpuUcOPBl!Bf*P&6^H|)-9M)iq= zD^0t=L*y5ipUAt}&<{bXxi20#Ic{4Ofw+kR`dZ#Bgb!?L)yBITvBzM3om!Rk3gIp zgA~`avwi}4LRNFYKKPkIR{oDEFzX;j=6HR8NCOYg_OQ|!ITtU|zKWOS6(k1?r6Ucq$DKh900AG8>^ zAW03#d&4luQ#xN-%*P+ispL+>J&PsVP8UAAuUY5!pAAb8S!WDzPkSzdHH`G1A zC03VM$XltIJn3o+o)=^uCrhe6I=T9dlCHL7Kwf)qs7UQN0wDJh-*wu!+rO3iio8i~ z4^85V1o1t^E5H)b$S_rd&cv!nc1wtxHQ$FXqAn&RD-}~}dOL15qC`waZbJ8&f zDD!O-NvE#NupdBTtmKKYH&)0ljW#FOjrxOiEg&=^Ii!;V__x1)yiJ*S&*|3{a_ z4KM91qiks`wg0_)NvG;5Wc5*1uOlhW!Q&8fGQ@{-4VNQ+j0nf&X!^0`)S6G$W4>%J zwUuEc!67}0bZ8!*Mn~7L3<98-<6~_(3)_&_zINi;fPg94(Hy8?&??HOD8i)hpH~PN z|7w`VRQQx=F&JcSHHLekpx471x*cW%{*0`iZ;QpEeFijQEc&|NQU1QAMCNk8Oi~^s z^iuC}_)I97Zi&$vvr{Z>vX`2{g5WFh^Iq7HL;hBS1c3SKmP-#U%m*$1`wKN!Yal5^ z>zIXS9={6utIOeeWE@;FY{G2tD^jt|Uf9C=YK(gFSnH2?{ptwI{Fa|JSeY<}^_qkN5hg;FZ-i2B2CVUvU`-WJQ zHJpO7z=djl``mw+gyiD07ofW%<9B;ifv03egIQ!Zo~2jrwn7(d11V{lSKOY!)N@W; zoMAZig0CuG2%cHu>A><rHFS=L&UCkC#sT73Sn zh_*%ZOI2_cmOI7=G`cqPG^zz{yMj)Vlm7C7a<9jp`{WOCDWG&88EPF;rzP%#mqbND zcAP%iK0P|Qy*Dn)GNhQxz9(+$bysC89;4{7W>3Swx@3#1Uw|T$vRa?8viD{6UEX16 z=*+1eR6=+m=)k3G)23(x@^;Je?0A{!7kFo|Dd01LMsaz@a>~1)r+jTCG&qM22EN9i z)PRO1HyzAl!rJjC4icM}1}Flvjqj*P`&3w#`n-KxPLm5ds4NFh0ZISUk;Uh||HiaPCSKbt?m_xY>_;e!1;7{BY~!xea# zufY&as`uR|m_zt^PWR2M@TOsZG#3Dr`eAW*CpBHpN^!|Pkkj)b{7Ldcky|;Nf-013^32Fny51HbbCSnN%gR*pSDg?iLxd@%}N6o zIY$mCm<+E^)syx(`i^X57I6+xDC;~P|I_jEIOXr*CcN&m&2vV5sJi6Rm1XTzpEsW* zn6o7#bPAm#@_0fU)lBA+u2q(H>9jJYsI&B!beY3XYOM<`b}7RBMTF&`h@Trf>=65X zT;7UzZAd%{9V#PrA@tdo3Ckw|pc=rL+xBe8`-1 zii~S^aAd>^WTo-8*jcM96z$+2Qw{3obFF_1!AUZ(TVpL8EoT+@Lcpu%OCmP4vGv6PeKxc-@V^3e2DPbIX)(yuS&OyDbo!&J=2{EmpvH-A5hUxT@21OUeu>0`7nP-^EHf z*v7OdGab?qTTcF*>E(}gZjQZv`O*i$ojrXv?PLqbARor=K)2*YXE+Y@q!^40<_H!ZSXT(Jw z{1K|*j_Cad9+1|17bcFQ5_(@hx@(wq2P7^F$-!vnH@t8aF1Yh*CTujR;EzfxJR_Im z?J6anm8AfEsGrmRP%q*s$XZ0sfD@jkXg3p5gQnvJ>IlSXvEKo(r^)XIOadYOu^8Z4KONnvH_Np>DFLi-@X4D-_{S2Db99=%%-f~~G z^y5_FW~O5@u8|X9nP>GW{&{QQP?Y713+;ww_t72$mXIj9A!o+x4$J7Y-D`knv3?WC z#*|zugypkh!d;<*-x}ahZIks^!xchFry%9F2xh^7giK-YX8+=Qo{}aU@izb6``b&%>cB76RZ5V*y?;;TFf-Anl<3%1r6Iad3lApjFg{cssCm@E?=>PX-&RKK zg~yZgDwDDsVF}?|>&FkS=?4+qKyp2tS^17f19>O!N<-F`kBDyJ0G5+lRIuWEF~4y< zc7o7eAhb3INy=kYo$Pou>q& z8~zY;@|TkUuE^X%Dk%bhfUtvtdt_6P*(ZLkYXbzvTI!qGE-t;aTy5@t9GgTU?a3HZ$*W^MO>xd0sJSyqlLi$rFp zRZGwS%+X~>E%t*st(+hsRsf-wy|6&r|2WF`&BOOguP|d_;p3P~!2bTh?EdoLB#JFB zr3W^l_;)KbPm%4K*|`9d3POV{8_YIRfbh@Np>Ih(MPc9(mjq0YhDbR zy58(V$B(HbyJF$RH?%w7K!(mln*OS=(yNt9vA5f=(s)_psh~>457U=aS`zwSoEYfX zm8Y5|3wQ-nr1b1xa;D`0aUhG)Ecxg~8r`^C-|&)Sn{{nL(3+`4{OFxuv3k$$ci{FR zSs@O5*uTnsTbup8J_3>j1Tz0u3}2iUiq~1rF{b6A9p+mu+F!jVTpH@B=VJ*Tb|kz` zIJy&8jIjO_SE=zs5*9?}83H^NZ?)7G^luMZnDWs0D;li7F-InYc$iioIlk5h6fi*& zC55tf40YCzu%)>JbdQ19G_Bnwu5^;~&77%oN0ZtvM$MHBK*&5xw?H79u8OB%w7y%R z?tA{03dJ`W1LqkC@jM2=y-~yp1m`SBIPfNY^XCb2*|Y|H?6GBlo>3B%U=~q?<4Oq0 zxV1_OV0kJK+gTor)E%zrRD|EgMkXfec0H7Ul*oZyrQ#NfqkGHuiO{dBksV2Dptvej zsh@FCZgk)eaalKYGWmFan@_fU-kw!f=J|4P#^j=NkDvJ3ij;d3WYod7WGJ%C*gbsCcfUF;2l zn#xUnc%X5V1%~SQ0Q;ilyb{TZZLNmiwfIT&^%I3dV|fh-pC1+kf0wooBrOX!*@0a1 zZR^rilKX^hUGP>fM!GNK&Faa4a3?YqcW9*Iz&Sh-<>x~ilSm1E`wKhLK-VI+c6>Rb zq?7R$p|q16myT9Ew-M>>K02s}TJt20p6?5p{Mk8M|8hN{4LfKvtZs>B1F{q2Ze!C! z%j-kHTn^bD_)}Ql^0xeb5R9kuB0Hzq;>U|SJeFbC?gy)$Oak_fb-3!g9`!2ALx>PT zDB4Egd&gTieiT0u`R6|5Q(IA+ks2lnE^S=qHpZt?jQTPpnIX=hU`Z2N<3s3Ytt2pT zvlt$QvQTy`fJzde02Ub=B`+t&)!pD1`IU!Seg_b9dt?KR%*K|Gt7H3ABnnZL{B&3j z3%*N+_1aFzlX!&E?1WGHOy+vYmm>F0k!IICo-+WV2Zg-yv8$lB8c$hMy3s`~J9%yJ zFFGqy;Jm;f!1C`2M5@q)%Z3CPE>Q@AuI{BVO&1!6ZfecQ#tAEDP)akPJm0yso#Ce} z$4t-c;Cm_Uh%-xh5Pdp35U0)P!%K?<_F>2Ona6s_6!qu(x6y+IrVrxiKZ)#;Le?H+ z4wZ*${Q~_m6jT>mQ^*>LxQrwo@cnOkl1|6hV{k~Vck+ZM7D9^#R?p)fF;r!61v z_%%&EdUTnwn{eoQ?yp@wP^?WMW3W%(qoPCvMOD@35HZ`7Tv|dGe^9LkpW{^^ejhv> z$}4%ORVfe%^z^zWpGU|ofbK?D7%Yb&+&F3ykX1|umi@SWko%xU)2OadIuhiz0aB_} zKKfFURPM;W!aI>ZhI3uWinOQhG?@P@&OJ43izBT^+6Rfd#L6pl; zIr-#wylzBZ{64KYb_k@XxX}3Ntewe<PkL9SYdJ_y9M94es7WY76OYis`4T(Eo)3d9ku{p~rsc z0Q=pTgR1R%s**1GLVz*Gi#vJ3(6Bub_WkS(AsV;AvEqZK8hs#&G|lh0fVr4pQ}$Zw zyw3FaH8BLcB(p-U!I>09#V-Qoa5S5YlR1L&1><)5R{U3L5JM`~5Rv*|UWr$a%BTqf zq4#NSi8U6;$6XMVNA=II+kTZaNt{yCn2{yb)mJ| zjy1=_+~!_B9CE}T72M5=es%x|H&hz@l-jc_6uG`k$cDMWK;le(3&nS z=ndiS#GNe&Z(y7>oy2%qQ|=wOuVcWyOBuWD`w>XSzi6!e%}&g@H0G#jybzJOa@U^3 zW1b3?(0wUWQ1P(Ug0)#79Jgw~p|A*!2L%0fR5 zy!ADXY#=FUymO7+s;@WwT4Zmj($47O@xb@9Rs2^N0t?`q*Py)KhdB4UuCZ+@fL6%W z5f7ZSmG_TN{NWe1U2b>RQ$Q%a}*7zdouYaC&L_Qz;MC z!I0xptm_g;tr@j|oB==-%`$|do`crs8&_=E;`Mz}fJ}q*4Q8M;&Ae=YpziI*$;L%c zpdmL9`(G5K0EprhvtxAXw|?~hCZvZ`wE-I`ajEB~TSTJcPwDn52%L~S41-8R`1cmz zepxp83PfngNd+d?b$arMTm{JMqVY&bf+fXTW*{}fn zYw4iK&CM%Z5}LLKWXr*i_J(<|c~BvmA}-W6h~8rwJ&$%)AX~1b#Ra9>$3El1fof2L!Sx%^F1GWD@pLmm@A1=Px}eq z$~fWe{2ZXwl^jN1EY-1cA8Z0mkHeun(bpCHHY2M3bZU^;0%uA2<@+kTz2GJJ@Q)(s zz#!L)JLr$qiVxZVmK1DuxuoE>Uo7mn4@4_R1kxKHCu|$_xP@rUD#RUNVVpDEaR@Fm z$h5B&T>bsD5{nqlfqNM62U5sKR;0aq5om3}aT59jPG2kAlpm^h0Z^&jm5mwW*G{5! zJS{uwt7I=^o(|BDP%gsTM20Fl>W8DUv!qjW1P#*sp4;XU+_XY2KytI9%UmsbrY|IQ zKvI+V42^_eCRqH8kT>{}=35O+xtLU>EOu+MvX-O^EC=sXt6nV7C=)?afJ6~u*1*LO zA{6#@1FS^k6BW}>0icQ!0IN3;NrX_NU|R3KlpP*otK9IR9HmN@DX&h7@^JG8R4&As zmL#OoFxVfuF4f@{bg-5$JA%jX$Af{m29ULQgS8C|o}gey&Bs^@%rf_ozCcyiq4;E41XN66As#;^HmU+sX|_ z2=&}9UXdAAz=ZJc9C6ETan^-mE&aOaEV&yrt-B<_Y`NGxw(`9M8{budpA5 z1F8im^u54$3q*~Rk>A3^FfaTsm}lfnhtZ%{+yTCi8&~T;6fixM5#pUJ+6N@mXztp` z%h3cc9ysZX+1@XkWkN6HDF}vUQhZ?=7*J4=nU$Wy<`q3JL zDu-3VQd#7==S&rVh%G|Z)!fmi4SJ;6mc^z9bPW}Vw-1{m@Q@U=?Hac6dGS4p_sVRcKlM~ZXbZW?9 z){=r0-$7^-JyHZ;M*Kff57I9yt5ucq2XTxVVmcCX`mRA2AP0NOuga1JD451$E)pGO zqpwdD{q4){`IS}DRBHwvX|HmB7gu_-=xhthP5%aH(#sE*gWjw=HACxBVEH=(M58KX zt}`N{9~J?dVy9S0_3@Sto+infBWu6;DmilBpO9QhH+5|>*FEabZ2(V^`%cl$?_B2r04(c(Ex4}-4XeQ>!kKFEhG zj;N^k%H}Qq9{&6VNa)w#_fW2QZj|b{KhXE2qgP%P;y)x$0yfG9^YK0ASxS2fTEX*Q zg@Z0~q}SA)jUfI3(>E?Z4)T+nQqi%}f`P*I2q7(GlBI8DLZ7@*tL2fYYDT*D$%S;O zVtLV7g*mEnVkCiAA6(B;n)}7)VsS%>IXv8X?{tw@aJ=t>(TL6#VwhVZ1B>=%0hZ%* znFl8u>Xfa##_uX&ZuyUk(#83~#m6_?uhYSH-T0Jftea1icRM1kZ(4c(L8t+a>0lBc z+R=RoEtAVoT7X^bxo%G#^3x4#_Y&}%5;?X2%`d-poE>%g2Be1(J6eQ{(Yocvg4I{> zw!XL?4p;P$g+sZ3Q>o8rx0>oJqUajsI`5W;&_sdY{nGz@=6K0>W;p>-al+5*tyX4= z!VF|^6tlWT9Vwx@Dlv3>p~C_pC-T<)Bl%W3cy#ZT1-?g+evbU^4r%VKT!;@ow2E&R zOjrUiyQAy?`quqZu1`PUiD%9!W4*iTW`8(%%ag#wJYoz@&)v;%KYLLY0aCAnFw6Nw zslv};k84G}ei@YE6XS=H#4OL08Z*9IGQ1<;>Xvi z1xm_kJSAR>o&>x*oY_d6IEGNp`1c*jw{eTL3y)?cpg?q0sN3H30>3)$_$V5dAtfk= z3ay25Pp=<&pC4=ySuJ^of1EFThQ@xWxI`>9(qhVdpr5!mK2L~4yDmkok+BMg5IRa; z(h4I^MhO4s-Ty3BmFln5B4|Gg{pu!}{Zog18nk~~P&c3=ktuy-KLN)%S!S>Cu17CO z_naiY?kin`J(Vf+Krbb4;Vc`QTh433(^~3r58WEo5(9$8Arhx$7gt@9Pm52=)~3`4 z+WKlH{SAEaLzp*T)p_%DKVIscj^S3&3PTaLs3tKAmYDvr3~Iqnj}70MPE;H$R{FA- znaoQyt~k}|fgDH5X-g?6%EiW+KN}wGj=QNpW)|Px=c&Sj60<#Pb(WjT zKR@oGV?43|`ynKDMw{>9o<3M&RhLP98QidHC}ZYZjC zaktjc9P1eYeK=lPhIRg`L5E6*08nf7l#OtHfii*3FlN(eWmK4=Q7Od3_UFw7HY~Cp2VO z(Wj^O*G@kYX%0P_Dvxas1eM*7^w$y8=uMc-mkA{CxL01YtxL{#oz7~#GjjF8YbbB0 zkmhd;=-=U}yTN;RA7VnGyOFQHTd{0K{x=3!3z? z?8wrOPKP13_z8aWb|wM6UniWn6J#;k9-=sda#dsRU2)g)buZCQbEaj<&Nky2#;vPh zx)`cI^BL=a0lS!yITo*QjwA9ODESsi_Y~%dW)c=ROs+; zFvR*eq8S_RaMZdAEa)Ec4=MgqHok1x7+2X3elak?JPg_1e#~dC5K#T&N^DdI^k*}s z*at<@D3?zEDsY27t(a$9p%FojHEM?gmFFNclStxvI<)$sD-4hZ`E269=zw6uA)?l0 zH{1bXD}&;rJOWPuwnU|Di+o>zcoAn~VLVJUo5ID90VH9?3`!hl54|I`u_Wu`2`puc z%y0MQTY}2Z;@P9P$^ryv2SI{okX>4Tn-FUzn2~+I)8RU<>l;S#IHui%E%Emxu=5Xb zA?*@r>~|M0FP;^6knI%nVrM8AdUl_TZgg37+&v-f0^2_u^a*}{=NpxWHUk4rz$7}z>nF7%euo4XTvlaSQMK^*vjrghJ(ANmLg9u)B~+_W=-5P7 z{+c3v%!bj#L*i4$6IWpy9igv@*e3X+yfPR;e6Whd2JlEUf=uOZZUeIml;V8T_5pSa zV3@QMd0Y{Y?F66n6bHCHI*EXQ6-0Sv(2>azE8^!e;%1 zzAjOWwC#kL;~5{a6jWrP$MD_lAr(HUP}^P;oIYwzyNm6ISeolhLV0Q@2R2zLI4ySA9M^JrFreIP3pAD?MeHkj z=SLno%KADOU_X@KVHba zn%fZ2vmrJtc@OXESV=xQ2={3|WV$Bm5VhO|b+?2pR zjm$I3x!h-$b!GL@=i5(f*3OGT959J6Sjwk-rMt+F_#)4hbs#yFFNXc#SM2u8<$N!H)Wqyo&Kh2 zQ;~-|$VLndHJ~Yy(Jw(JR$8e%X5^j-SF>o;pH@BrC;u0x+J}N#+yyzH~c1lj-+T z+B7}^8JFfm4DI~_f`8#^=n!5$-Prk!p=Z`yBqwEfX5yd(lCyrg32zvg)iyH43=b^(hKJ9pKJXE`V1P+3g4lGJa(G^9x7#r z=s|LhJ@HJd3Ch;V8B_ZXBp8OZ!j}%4GwC;H|&W(i3EO9{Q*yZoWoyz!=8y6GA@&Y1%@gB2KKj3 z9k`H}bYW$vz$|d7dyb6c0Nu$}F;a=c{`BLY8*}U(f-ppV#+;l1uny#}Sk7SnynAT; z19bAhRWREFkLkYyL8_CoA=pC3f@!Py!=Tr!f?qS5RdeZ)@r@NdfHE&nJHXR=IEXb| zGP-e9q<9?;R?;5%r#-4X=>uHe4nc_Bx$4lgCKs>5d}v8bbgi-|!mN<`Im;2Qyv#Ov zOB%zVXG7>xb67a6ch;jbTc=}(0oq38TlIx-ReR(wVmg6*EoaZ?hrO5toQazZ%-uOB z{f`1!)B=n=9P>u96{T?Yk3=&!QJ9i?VHplDaU)jal%MU9`mR!-;RWGUA@Wk^|Eq~Q z?UzxL9C^C*_clRa1H|IO1>^6%8LOOaMigo`Pnyr2d?T?S zzx~X-%C^=Ltl^$DTX4jD3trfLsoUjkr{JFa3BXC~n7~R?VMM4nF`0cZW69S?ZsY5} zJ!gI9&Fts513Gu&YqotZ6}e80D|0W@21vWb@$N+-p!Nk5x-=d3PQy*n<=kBxf!nG_ zJ!tU%F&UA$*^hw2OO+1sH+8TIL3r5b4(+^`WJr1i}cp^MS&bjy9Me_7A{Xh*hN+gZ{yzhOQh^T0@4_w z`0*}@Om^zR-@;6@(Ym{oGIz9h;k-h4_{%@D#o-OPgWJz#U*9a@cRPu_^HRPx?3%E~ z{I{%3BqW245*?|nDKe2f)&5sbz%50&7$e`>Gy5w}dO7IRbx)KqCp-75Y)rIXl^Vv2^4Xzc^&Rr)SQaI9u^0KH^>sr- zB({LfKO(^m)YlXe`t=_FigFhBFR>&#W#w?zFdGpD4|bg0D0$bW#! z(=i?JTtm42lZQ7k@NnR+>;HULJZDAXA~>aYpguQ63`Alqv(CQ9v?|>T-kc4fU~X-! z$sp*+q>`+?p&9|>N$s2h2-Sq^@MY`?6?UTF!~K=T8C_*2av;)B$Y_fMfOZ8atZl62 zolPl#lK>{)G!`G5^1n(KN{zc)P%Jv4ERa)#Le)VeT(e3By1q>##AtAduWAaz#(HU0 z0<%C>6c?$A;z?iNm+uplx2wBwDfjD}-t}VR{Aq|NmN51kYc6z||BROThfemY>?1MC zu_xK@C0KvXf+gTJ?EdLCmDtAzdH z$h$YBcO!QUCqOCtcS=q8Cw8I4eujD);qCyRHogmr7kekfp1_OV>m`iRiY$NMXy(n@ z`XDYALDoa5P}U2?L&sq*DxzJbKYInvMoLT=)t2-Nb3%I5h`9#9)~$&Uj@A%NEEd56#Aa1o>5)T3PVWS?U@}V=V-gC%I2cDUZZW>J&H|<~$3zQFM8tML z7!LJCaX)v!Qh(L5+Fv{-`iKUb5xT_S=g8<`Z7#c92Wle*fUKo7!=9ZI`VM32J+yJr zjDK3t60h%{)^WcH*!X)`nk}AzFA^FpS#+^0-|Brszf25;W0-VqGfLq`^w=q)O3NNV z6=<2i!y{@+z}A2zBy7#;1hd0D2#qQGrY~-X6h<*BbEtv?3!7OAbP6MfW+_*QygF?% zGKVrAcQ|%Nt7k@OGJyWo=yD{AzM^&Mj3ac8?}%W@b?aY6tZ)2Eo1lvScuoyYGL(x? zDFZI@I&U7BYd%a{o?OSgIg!ftM&4dSVvaS;*X+7&a>M`#BcBR z$UKLO{RmzS!xZ`PN!uG@#%uoO;k|n1fl!0`RI$cPMsWhG<=q1!S3Wbnk&p zex?I`nG4cR=R?NkOPO|R55Z-Qvst=@_k%=;W+h);vuq)})jiHlOi)tV(rn`J+D;WP zs@0E37+`l3YXlrw3U9xP+I(v^O0O~+0y6`e+O{g69=K^jabjcDMn3el&Qexd(+Y&w zey5bMT0f%Vkvf*MR6s>Of$fHtUO+s|lX=6!66;|ba#jWUbizK$YeOP_II`@ID~ zgNs)B*pmAM^tA0!mF)9Wn=;Sm(w?g)^m3IekFrDCuM=H=K5^YhlhZ5!I!({Ftw8@J zrHg-ok+yUDy8;c=PF}#X#E~`b0zcv-6L<{oE%m)(XvuZFW@E2p7PG|ikqGml0aNZZ{b&ox(8>TshU-aHJKxEh+|tzfAFr8 z*|Gynp`C)7?)~b+XqW*__==Q8Tw%+T`^She&#iu`N3J!LTr$7h027Pg&8W3&jmj7B zXDY>c9cA3x;vHNzewjDxW6ElLPMcraJc5fj+Nb-S}3!Pt^-UGr&hydJaafd*X35x$x)5rwGtOt^)c^yF}znQ^FH7%3s-tgZv%;P zb27}*U;+);OIBi6diF10DrNqNK5oVm$p11abArLsP}~|76i6#_-@-uV`xFdsRt)Ey zb7__)`tE#mJzC%Jq4Tv}lK{OB9H@}}%E?~=2!7^hFg`T??lf!4$Q3MAZr@oe$Gv9A zDHAn*WYWEoKOtG5MPY{dbSQqMoSUJ)z({57EUjO?z?+hSg^n+tNU&Z>!MEdEdY;zc}(k8w@+?kp&T z@uanMYXNa`8EwujlhI5Y`qMdQh$386LzslA-HzGVl29dY(Wg%ooEh$|!f894t>`Q2 zmzK5_ZLaDWev`s@TdGsh(8nW`1iBT$`5p%`DG|u1tWwRoN?M>_)dq^!Tz&FKi3aR! zyHMDLLDoX$A8{~RuSi8TdZKksacm}9;Kk!jC;zge0-aNdUir;Kr5bS%nn(%1cErGe zYFWFAiqBh#VrsTinT3x>2MUReyG0H_#2ze*s4<@WUjS4DtNRQQ)bwRf))diT&J;z{ zN3;Ww@jEdI54asv*WsNQHKZvhTrd%c+UPgnYLA~f-NJMTJe?#*cp*XEU6AIEkt3ez zm;^3)MM7o>K_LwOF15V$dfv<7nk+Ko>@6UXw1P9ClX1N(L5K&$oA1T-WH(1 zJ&VG4pkjI`bO_V8Rc|&?OmE@HuTU=RNU5hfVhNjqK4{fk0qkJ`UPtINRT)!|fZ@lg z5gfUszS#b%jd;q>0SEh&haq!g*see5$d6-Mu!^kj5x=X~;UMVI93Jb5&^paW+k|8# z@pIzMk$RKQfa7v);firVTPUS%r3uZTA*ZOCCLEf`MuFhuzdJyYD_MjIR}zuch-CP^ z895@Sk&#EsSSR1O#p#Z9QJAcY@i6BnE$?Xeo`wx6KLQr>@EPMaM8ChfBGl;Z9a`HS z$KF?C2+vCmL5OQz1ubxp%rFSoAcIm=5F2Cw^EFrW6(IEBHuDRI+C^V2fm)Ax)|?;s zmdicj`J@p7mvrEI4_fLSjWk$wR2hB}+D!$G`3g<)1}$vGj~j}Mp_Aen?D|HFPPg+9%XyM%gg;RLvzeF3>+-*rO^ z%{K{*Q8)t*@H|RC0#tk!sf5yYyD35!@q*{*e}axP0g=w}f=dV{FTl!K9B|caitC28 z9)*rNF_+VP5?t8hyyVDIN7edx=5x{pzgBNNhXGp^_a&2xOEx{Nct~34jnar){sE2T z;o1#_$ab2qd4bM@qDX<9Kha3H`Y5>y+7k|vt3dkjdF7oWeddDMQmQRLWuDlA!M~Ui zC;>^KA$;u-QFt`p0JJ;)gWp|{k7UM=)cnog{DwKu&j)D*BgWK3Yr=xo zZ7V1OKBJlu6bCoX8duGU literal 0 HcmV?d00001 diff --git a/application/third_party/dompdf/www/test/page_pages.html b/application/third_party/dompdf/www/test/page_pages.html new file mode 100755 index 00000000..a9f2fe02 --- /dev/null +++ b/application/third_party/dompdf/www/test/page_pages.html @@ -0,0 +1,201 @@ + + + + + + + + + +

    Lorem ipsum dolor sit amet

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at +odio vitae libero tempus convallis. Cum sociis natoque penatibus et +magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus +mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla +massa quis velit. Curabitur metus massa, semper mollis, molestie vel, +adipiscing nec, massa. Phasellus vitae felis sed lectus dapibus +facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis +turpis vel magna. Cras eu est. Integer porttitor ligula a +tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis +leo. Nulla pellentesque molestie ante. Quisque vestibulum est id +justo. Ut pellentesque ante in neque.

    + +

    Curabitur ut diam eu dui vestibulum pharetra. Nam pellentesque, justo +non hendrerit venenatis, mi orci pretium mi, et vehicula leo arcu quis +diam. Nullam mattis laoreet quam. Morbi mollis sem ut tellus. Nam mi +massa, lobortis eu, sollicitudin et, iaculis et, massa. Maecenas purus +mauris, luctus sit amet, pharetra in, facilisis sit amet, elit. Nullam +vel erat tempus purus molestie suscipit. Vestibulum odio lorem, +sollicitudin non, volutpat sit amet, tincidunt vel, nunc. Nulla quis +ante vestibulum odio feugiat facilisis. Proin lorem nisl, viverra at, +rhoncus quis, semper nec, mi. Donec euismod enim vitae velit. Nulla +sed lectus. Vivamus placerat, lacus sed vehicula sagittis, arcu massa +adipiscing lorem, bibendum luctus nisl tortor vitae leo.

    + +

    Etiam a mauris. Proin justo elit, accumsan sit amet, tempus et, +blandit id, tellus. Morbi varius, nisi id iaculis aliquam, lacus +ligula facilisis velit, ac pharetra ipsum augue a massa. Etiam rhoncus +commodo orci. Mauris ullamcorper sagittis turpis. Nullam magna libero, +sagittis sed, auctor faucibus, accumsan vitae, urna. Pellentesque +volutpat. Aliquam sapien ipsum, eleifend nec, imperdiet vitae, +consectetuer id, quam. Donec a urna. Suspendisse sit amet +velit. Curabitur quis nisi id dui viverra ornare. Sed condimentum enim +quis tortor. Ut condimentum, magna non tempus tincidunt, leo nibh +molestie tellus, vitae convallis dolor ante sed ante. Nunc et +metus. Phasellus ultricies. Fusce faucibus tortor sit amet mauris.

    + +

    Aliquam enim. Duis et diam. Praesent porta, mauris quis pellentesque +volutpat, erat elit vulputate eros, vitae pulvinar augue velit sit +amet sem. Fusce eu urna eu nisi condimentum posuere. Vivamus sed +felis. Duis eget urna vitae eros interdum dignissim. Proin justo eros, +eleifend in, porttitor in, malesuada non, neque. Etiam sed +augue. Nulla sit amet magna. Lorem ipsum dolor sit amet, consectetuer +adipiscing elit. Mauris facilisis. Curabitur massa magna, pulvinar a, +nonummy eget, egestas vitae, mauris. Quisque vel elit sit amet lorem +malesuada facilisis. Vestibulum porta, metus sit amet egestas +interdum, urna justo euismod erat, id tristique urna leo quis +nibh. Morbi non erat.

    + +

    Cras fringilla, nulla id egestas elementum, augue nunc iaculis nibh, +ac adipiscing nibh justo id tortor. Donec vel orci a nisi ultricies +aliquet. Nunc urna quam, adipiscing molestie, vehicula non, +condimentum non, magna. Integer magna. Donec quam metus, pulvinar id, +suscipit eget, euismod ac, orci. Nulla facilisi. Nullam nec +mauris. Morbi in mi. Etiam urna lectus, pulvinar ac, sollicitudin eu, +euismod ac, lectus. Fusce elit. Sed ultricies odio ac felis.

    + +

    Cras iaculis. Nulla facilisi.

    +

    Cras iaculis. Nulla facilisi. Fusce vitae arcu. Integer lectus mauris, +ornare vel, accumsan eget, scelerisque vel, nunc. Maecenas justo urna, +volutpat vel, vehicula vel, ullamcorper nec, odio. Suspendisse laoreet +nisi sed erat. Cras convallis sollicitudin sapien. Phasellus ac erat +eu mi rutrum rhoncus. Morbi et velit. Morbi odio nisi, pharetra eget, +sollicitudin sed, aliquam at, nisl. Quisque euismod diam in +sapien. Integer accumsan urna in risus.

    + +

    Proin sit amet nisl. Phasellus dui ipsum, laoreet a, pulvinar id, +fringilla ut, libero. In hac habitasse platea dictumst. Maecenas mi +magna, cursus sed, rutrum eget, molestie nec, dui. Suspendisse +lacus. Vivamus nibh urna, accumsan sit amet, gravida sed, convallis a, +leo. Cras sollicitudin orci sit amet eros. Pellentesque eu odio et +velit tempor dignissim. Morbi vehicula malesuada enim. Pellentesque +tincidunt, tellus ac fringilla tempor, justo libero interdum nunc, eu +sollicitudin tortor augue nec tellus. Nullam eget leo quis tellus +gravida faucibus. Nam gravida. Curabitur rhoncus egestas +nunc. Curabitur mollis, nisi sed suscipit gravida, enim felis interdum +justo, vel accumsan magna nunc ut libero. Ut fermentum. Fusce luctus, +est sit amet feugiat lobortis, nisl eros bibendum libero, ut suscipit +felis ligula in massa. Proin congue elit et nisi. Cras ac nisl. Nunc +ullamcorper neque vel diam.

    + +

    Ut pellentesque arcu ac lectus.

    +

    Sed ac lorem. Ut pellentesque arcu ac lectus. Cum sociis natoque +penatibus et magnis dis parturient montes, nascetur ridiculus +mus. Pellentesque ultrices metus sollicitudin pede. Donec fermentum +est a velit fringilla mollis. Duis ligula. Fusce viverra laoreet +odio. Suspendisse sit amet ligula. Maecenas nunc velit, sagittis eu, +bibendum eu, placerat at, nibh. Praesent ut erat eget nisi gravida +imperdiet. Quisque vitae sapien. Ut eros.

    + +

    Donec eros ligula, dignissim vel, ultricies id, mattis in, massa. Duis +lobortis dui nec orci. Sed ullamcorper metus non massa. Aliquam eget +mauris ac nulla elementum posuere. Sed porta, augue vitae rhoncus +aliquet, felis quam eleifend est, vitae rutrum metus arcu vel +lorem. Proin laoreet, mauris sit amet aliquet eleifend, nisl sem +molestie nisi, eu varius eros ligula non erat. Integer ac +sem. Suspendisse lectus. Aliquam erat volutpat. Fusce sit amet leo +faucibus erat molestie ultrices. Maecenas lacinia lectus eget +dui. Etiam porta porttitor ante. Phasellus sit amet lacus adipiscing +enim mollis iaculis. Fusce congue, nulla a commodo aliquam, erat dui +fermentum dui, pellentesque faucibus orci enim at mauris. Pellentesque +a diam porta magna tempor posuere. Donec lorem.

    + +

    Sed viverra aliquam turpis. Aliquam lacus. Duis id massa. Nullam +ante. Suspendisse condimentum. Donec adipiscing, felis vel semper +sollicitudin, lacus justo pretium est, sed blandit pede risus eu +ante. Praesent ante nulla, fringilla id, ultrices et, feugiat a, +metus. Proin ac velit a metus suscipit fermentum. Integer aliquet. Sed +sapien nulla, placerat at, rutrum at, condimentum quis, libero. In +accumsan, tellus nec tincidunt malesuada, pede arcu commodo ipsum, ac +mattis tortor urna vitae enim. Aenean nonummy, mauris eget commodo +bibendum, augue sem ultrices nunc, eget rhoncus metus erat placerat +lectus. Aliquam mollis lectus in justo. Vivamus iaculis lacus sit amet +ligula. Etiam consectetuer convallis diam. Curabitur sollicitudin, +felis eu vehicula scelerisque, nisl urna aliquam orci, sit amet +laoreet mi turpis id ligula. Donec at enim non nulla adipiscing +dapibus. Aenean nisl.

    + +

    Ut in lacus nec enim volutpat pellentesque. Integer euismod. In odio +eros, malesuada in, mattis vel, tempor nec, sem. In libero tellus, +varius vitae, bibendum in, elementum quis, nisl. Duis tortor. Etiam at +justo. Pellentesque facilisis mauris non nunc. Praesent eros mi, +dapibus eget, placerat ac, lobortis quis, sem. Nulla rhoncus +turpis. Nulla vitae mi. Proin id massa. Nunc eros.

    + +

    Aliquam molestie pulvinar ligula.

    +

    Vestibulum dui risus, varius ut, semper et, consequat ultrices, +felis. Pellentesque iaculis urna in velit. Ut pharetra. Nunc +fringilla, nisi vitae fringilla placerat, enim justo semper erat, +mollis feugiat leo neque eu sem. Vestibulum orci urna, suscipit a, +accumsan nec, fringilla in, risus. Nullam ante. Nullam nec +eros. Nullam varius. Nulla facilisi. In auctor libero in +metus. Aliquam porttitor congue eros. Nulla facilisi. Mauris euismod +turpis ut felis. Ut nunc nisl, cursus quis, eleifend at, viverra +bibendum, lacus. Donec consequat lacus eu sapien. Fusce pulvinar +lectus quis nunc. In hac habitasse platea dictumst.

    + +

    Aliquam molestie pulvinar ligula. Maecenas imperdiet, urna eget +ultrices adipiscing, nibh ante elementum neque, id molestie massa quam +ut nunc. Nullam porta. Phasellus a magna in sem volutpat +viverra. Quisque aliquet nunc ac turpis. Mauris dolor enim, viverra +rutrum, placerat et, laoreet et, justo. In id nulla. Donec +erat. Phasellus nec mi sed velit mollis cursus. Vestibulum +tincidunt. Praesent dui libero, facilisis eu, vulputate eget, aliquet +nec, ipsum. Pellentesque in nisl in mauris pretium euismod.

    + + diff --git a/application/third_party/dompdf/www/test/quirks_center_table.html b/application/third_party/dompdf/www/test/quirks_center_table.html new file mode 100755 index 00000000..d0a45366 --- /dev/null +++ b/application/third_party/dompdf/www/test/quirks_center_table.html @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + +
    ab
    cd
    + + + diff --git a/application/third_party/dompdf/www/test/quirks_font_tag.html b/application/third_party/dompdf/www/test/quirks_font_tag.html new file mode 100755 index 00000000..6b0812f7 --- /dev/null +++ b/application/third_party/dompdf/www/test/quirks_font_tag.html @@ -0,0 +1,70 @@ + + + + + + + +

    Font tags with absolute size

    + +size=1 +size=2 +size=3 +size=4 +size=5 +size=6 +size=7 + +

    Span tags with absolute CSS size

    + +size=1 +size=2 +size=3 +size=4 +size=5 +size=6 +size=7 + +

    Font tags with relative size

    + +size=-4 +size=-3 +size=-2 +size=-1 +size=+1 +size=+2 +size=+3 +size=+4 + +

    Span tags with relative CSS size

    + +size=-4 +size=-3 +size=-2 +size=-1 +size=+1 +size=+2 +size=+3 +size=+4 + +

    Nested font tags

    + +size=2 + size=4 + size=2 + size=4 + size=2 + size=4 + size=2 + size=4 + + + + + + + + + + + diff --git a/application/third_party/dompdf/www/test/quirks_html_attributes.html b/application/third_party/dompdf/www/test/quirks_html_attributes.html new file mode 100755 index 00000000..efb6b264 --- /dev/null +++ b/application/third_party/dompdf/www/test/quirks_html_attributes.html @@ -0,0 +1,55 @@ + + + + + + +
    + +Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet +doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit +amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt +ut laoreet dolore magna aliquam erat volutpat.
    +Ut wisi enim ad minim veniam, +quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex +ea commodo consequat. + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper + suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem + vel eum iriure dolor in hendrerit in vulputate velit esse molestie + consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et + accumsan et iusto odio dignissim qui blandit praesent luptatum zzril + delenit augue duis dolore te feugait nulla facilisi.table testLorem ipsum dolor sit amet, consetetur sadipscing elitr, + sed diam nonumy eirmod tempor invidunt ut labore et dolore magna + aliquyam erat, sed diam voluptua.Duis autem vel eum iriure dolor in hendrerit in + vulputate velit esse molestie consequat, vel illum dolore eu feugiat + nulla facilisis at vero eros et accumsan et iusto odio dignissim qui + blandit praesent luptatum zzril delenit augue duis dolore te feugait + nulla facilisi.
    table testNam liber tempor cum soluta nobis eleifend option congue nihil + imperdiet doming id quod mazim placerat facer possim assum.
    + Lorem ipsum dolor sit amet.
    table testtable test
    table testtable testtable testtable test
    + + + diff --git a/application/third_party/dompdf/www/test/script_javascript.html b/application/third_party/dompdf/www/test/script_javascript.html new file mode 100755 index 00000000..84efb467 --- /dev/null +++ b/application/third_party/dompdf/www/test/script_javascript.html @@ -0,0 +1,24 @@ + + + + Javascript test + + + + +This page will be printed automatically + +

    A title

    + + + + + diff --git a/application/third_party/dompdf/www/test/script_php.php b/application/third_party/dompdf/www/test/script_php.php new file mode 100755 index 00000000..ad75b6ed --- /dev/null +++ b/application/third_party/dompdf/www/test/script_php.php @@ -0,0 +1,28 @@ + + + + + + + + + +Here's some dynamically generated text and some random circles...

    "; +?> + + +Current PHP version: " . phpversion() . ". "; +echo "Today is " . strftime("%A") . " the " . strftime("%e").date("S").strftime(" of %B, %Y %T") . "

    "; + +?> + diff --git a/application/views/MaterialIssueList.php b/application/views/MaterialIssueList.php index b683ae89..948dfc2d 100644 --- a/application/views/MaterialIssueList.php +++ b/application/views/MaterialIssueList.php @@ -64,7 +64,7 @@ AcceptedQty; ?> ReqStatus != REQ_DELIVERED) { ?> - +
    +
    Bank Account Number + +
    Bank Address
    -
    +
    @@ -681,10 +685,11 @@ function ValidateUA() { ?> - Bank_name ?> - IFSC ?> - Address ?> - + Bank_name ?> + IFSC ?> + Bank_AccNo ?> + Address ?> + Is_Active == 1 ) { echo 'Yes'; @@ -967,12 +972,7 @@ if ( $('#companywebsite').val().length < 1 ) } -} - - - - - +}
  • + + +  -------
    +  *) See Monty Python's Flying Circus, episode 15
    +